Raw dog parse for python bindings (#6970)
* raw dog parse python Signed-off-by: Jess Frazelle <github@jessfraz.com> * add tests Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
This commit is contained in:
		
							
								
								
									
										20
									
								
								rust/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										20
									
								
								rust/Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -1815,7 +1815,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kcl-bumper"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "anyhow",
 | 
			
		||||
 "clap",
 | 
			
		||||
@ -1826,7 +1826,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kcl-derive-docs"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "Inflector",
 | 
			
		||||
 "anyhow",
 | 
			
		||||
@ -1845,7 +1845,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kcl-directory-test-macro"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
@ -1854,7 +1854,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kcl-language-server"
 | 
			
		||||
version = "0.2.70"
 | 
			
		||||
version = "0.2.71"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "anyhow",
 | 
			
		||||
 "clap",
 | 
			
		||||
@ -1875,7 +1875,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kcl-language-server-release"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "anyhow",
 | 
			
		||||
 "clap",
 | 
			
		||||
@ -1895,7 +1895,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kcl-lib"
 | 
			
		||||
version = "0.2.70"
 | 
			
		||||
version = "0.2.71"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "anyhow",
 | 
			
		||||
 "approx 0.5.1",
 | 
			
		||||
@ -1971,7 +1971,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kcl-python-bindings"
 | 
			
		||||
version = "0.3.70"
 | 
			
		||||
version = "0.3.71"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "anyhow",
 | 
			
		||||
 "kcl-lib",
 | 
			
		||||
@ -1986,7 +1986,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kcl-test-server"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "anyhow",
 | 
			
		||||
 "hyper 0.14.32",
 | 
			
		||||
@ -1999,7 +1999,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kcl-to-core"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "anyhow",
 | 
			
		||||
 "async-trait",
 | 
			
		||||
@ -2013,7 +2013,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "kcl-wasm-lib"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "anyhow",
 | 
			
		||||
 "bson",
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
 | 
			
		||||
[package]
 | 
			
		||||
name = "kcl-bumper"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
repository = "https://github.com/KittyCAD/modeling-api"
 | 
			
		||||
rust-version = "1.76"
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "kcl-derive-docs"
 | 
			
		||||
description = "A tool for generating documentation from Rust derive macros"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
license = "MIT"
 | 
			
		||||
repository = "https://github.com/KittyCAD/modeling-app"
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "kcl-directory-test-macro"
 | 
			
		||||
description = "A tool for generating tests from a directory of kcl files"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
license = "MIT"
 | 
			
		||||
repository = "https://github.com/KittyCAD/modeling-app"
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "kcl-language-server-release"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
authors = ["KittyCAD Inc <kcl@kittycad.io>"]
 | 
			
		||||
publish = false
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
name = "kcl-language-server"
 | 
			
		||||
description = "A language server for KCL."
 | 
			
		||||
authors = ["KittyCAD Inc <kcl@kittycad.io>"]
 | 
			
		||||
version = "0.2.70"
 | 
			
		||||
version = "0.2.71"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
license = "MIT"
 | 
			
		||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "kcl-lib"
 | 
			
		||||
description = "KittyCAD Language implementation and tools"
 | 
			
		||||
version = "0.2.70"
 | 
			
		||||
version = "0.2.71"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
license = "MIT"
 | 
			
		||||
repository = "https://github.com/KittyCAD/modeling-app"
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "kcl-python-bindings"
 | 
			
		||||
version = "0.3.70"
 | 
			
		||||
version = "0.3.71"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
repository = "https://github.com/kittycad/modeling-app"
 | 
			
		||||
exclude = ["tests/*", "files/*", "venv/*"]
 | 
			
		||||
 | 
			
		||||
@ -227,6 +227,31 @@ async fn new_context_state(current_file: Option<std::path::PathBuf>) -> Result<(
 | 
			
		||||
    Ok((ctx, state))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Parse the kcl code from a file path.
 | 
			
		||||
#[pyfunction]
 | 
			
		||||
async fn parse(path: String) -> PyResult<()> {
 | 
			
		||||
    tokio()
 | 
			
		||||
        .spawn(async move {
 | 
			
		||||
            let (code, path) = get_code_and_file_path(&path)
 | 
			
		||||
                .await
 | 
			
		||||
                .map_err(|err| pyo3::exceptions::PyException::new_err(err.to_string()))?;
 | 
			
		||||
            let _program = kcl_lib::Program::parse_no_errs(&code)
 | 
			
		||||
                .map_err(|err| into_miette_for_parse(&path.display().to_string(), &code, err))?;
 | 
			
		||||
 | 
			
		||||
            Ok(())
 | 
			
		||||
        })
 | 
			
		||||
        .await
 | 
			
		||||
        .map_err(|err| pyo3::exceptions::PyException::new_err(err.to_string()))?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Parse the kcl code.
 | 
			
		||||
#[pyfunction]
 | 
			
		||||
fn parse_code(code: String) -> PyResult<()> {
 | 
			
		||||
    let _program = kcl_lib::Program::parse_no_errs(&code).map_err(|err| into_miette_for_parse("", &code, err))?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Execute the kcl code from a file path.
 | 
			
		||||
#[pyfunction]
 | 
			
		||||
async fn execute(path: String) -> PyResult<()> {
 | 
			
		||||
@ -534,6 +559,8 @@ fn kcl(m: &Bound<'_, PyModule>) -> PyResult<()> {
 | 
			
		||||
    m.add_class::<Discovered>()?;
 | 
			
		||||
 | 
			
		||||
    // Add our functions to the module.
 | 
			
		||||
    m.add_function(wrap_pyfunction!(parse, m)?)?;
 | 
			
		||||
    m.add_function(wrap_pyfunction!(parse_code, m)?)?;
 | 
			
		||||
    m.add_function(wrap_pyfunction!(execute, m)?)?;
 | 
			
		||||
    m.add_function(wrap_pyfunction!(execute_code, m)?)?;
 | 
			
		||||
    m.add_function(wrap_pyfunction!(execute_and_snapshot, m)?)?;
 | 
			
		||||
 | 
			
		||||
@ -39,6 +39,33 @@ async def test_kcl_execute():
 | 
			
		||||
    await kcl.execute(lego_file)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.asyncio
 | 
			
		||||
async def test_kcl_parse_with_exception():
 | 
			
		||||
    # Read from a file.
 | 
			
		||||
    try:
 | 
			
		||||
        await kcl.parse(os.path.join(files_dir, "parse_file_error"))
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        assert e is not None
 | 
			
		||||
        assert len(str(e)) > 0
 | 
			
		||||
        assert "lksjndflsskjfnak;jfna##" in str(e)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.asyncio
 | 
			
		||||
async def test_kcl_parse():
 | 
			
		||||
    # Read from a file.
 | 
			
		||||
    await kcl.parse(lego_file)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.asyncio
 | 
			
		||||
async def test_kcl_parse_code():
 | 
			
		||||
    # Read from a file.
 | 
			
		||||
    with open(lego_file, "r") as f:
 | 
			
		||||
        code = str(f.read())
 | 
			
		||||
        assert code is not None
 | 
			
		||||
        assert len(code) > 0
 | 
			
		||||
        kcl.parse_code(code)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.asyncio
 | 
			
		||||
async def test_kcl_execute_code():
 | 
			
		||||
    # Read from a file.
 | 
			
		||||
@ -97,9 +124,7 @@ async def test_kcl_execute_and_snapshot():
 | 
			
		||||
@pytest.mark.asyncio
 | 
			
		||||
async def test_kcl_execute_and_snapshot_dir():
 | 
			
		||||
    # Read from a file.
 | 
			
		||||
    image_bytes = await kcl.execute_and_snapshot(
 | 
			
		||||
        car_wheel_dir, kcl.ImageFormat.Jpeg
 | 
			
		||||
    )
 | 
			
		||||
    image_bytes = await kcl.execute_and_snapshot(car_wheel_dir, kcl.ImageFormat.Jpeg)
 | 
			
		||||
    assert image_bytes is not None
 | 
			
		||||
    assert len(image_bytes) > 0
 | 
			
		||||
 | 
			
		||||
@ -129,10 +154,12 @@ def test_kcl_format():
 | 
			
		||||
        assert formatted_code is not None
 | 
			
		||||
        assert len(formatted_code) > 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.asyncio
 | 
			
		||||
async def test_kcl_format_dir():
 | 
			
		||||
    await kcl.format_dir(car_wheel_dir)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_kcl_lint():
 | 
			
		||||
    # Read from a file.
 | 
			
		||||
    with open(os.path.join(files_dir, "box_with_linter_errors.kcl"), "r") as f:
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "kcl-test-server"
 | 
			
		||||
description = "A test server for KCL"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
license = "MIT"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "kcl-to-core"
 | 
			
		||||
description = "Utility methods to convert kcl to engine core executable tests"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
license = "MIT"
 | 
			
		||||
repository = "https://github.com/KittyCAD/modeling-app"
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "kcl-wasm-lib"
 | 
			
		||||
version = "0.1.70"
 | 
			
		||||
version = "0.1.71"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
repository = "https://github.com/KittyCAD/modeling-app"
 | 
			
		||||
rust-version = "1.83"
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user