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:
@ -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:
|
||||
|
Reference in New Issue
Block a user