Skip to content

Commit

Permalink
tests: client_py
Browse files Browse the repository at this point in the history
  • Loading branch information
Yohe-Am committed Aug 2, 2024
1 parent f0ecfb5 commit 676bdb8
Show file tree
Hide file tree
Showing 24 changed files with 2,535 additions and 817 deletions.
87 changes: 35 additions & 52 deletions libs/metagen/src/client_py/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
mod node_metas;
mod selections;
mod types;
mod utils;

use core::fmt::Write;

Expand All @@ -12,7 +13,6 @@ use common::typegraph::EffectType;
use crate::interlude::*;
use crate::*;

use crate::mdk_typescript::utils;
use crate::shared::types::NameMemo;
use crate::shared::types::TypeRenderer;
use crate::utils::GenDestBuf;
Expand Down Expand Up @@ -85,9 +85,9 @@ impl crate::Plugin for Generator {
};
let mut out = HashMap::new();
out.insert(
self.config.base.path.join("mdk.py"),
self.config.base.path.join("client.py"),
GeneratedFile {
contents: render_mdk_ts(&self.config, tg)?,
contents: render_client_py(&self.config, tg)?,
overwrite: true,
},
);
Expand All @@ -96,24 +96,24 @@ impl crate::Plugin for Generator {
}
}

fn render_mdk_ts(_config: &ClienPyGenConfig, tg: &Typegraph) -> anyhow::Result<String> {
let mut mdk_ts = GenDestBuf {
fn render_client_py(_config: &ClienPyGenConfig, tg: &Typegraph) -> anyhow::Result<String> {
let mut client_py = GenDestBuf {
buf: Default::default(),
};

writeln!(
&mut mdk_ts,
&mut client_py,
"# This file was @generated by metagen and is intended"
)?;
writeln!(
&mut mdk_ts,
&mut client_py,
"# to be generated again on subsequent metagen runs."
)?;
writeln!(&mut mdk_ts)?;
writeln!(&mut client_py)?;

render_static(&mut mdk_ts)?;
render_static(&mut client_py)?;

let dest: &mut GenDestBuf = &mut mdk_ts;
let dest: &mut GenDestBuf = &mut client_py;
let manifest = get_manifest(tg)?;

let name_mapper = NameMapper {
Expand Down Expand Up @@ -146,15 +146,15 @@ class QueryGraph(QueryGraphBase):
write!(
dest,
r#"
}};
}}
"#
)?;

for fun in manifest.root_fns {
use heck::ToLowerCamelCase;
use heck::ToSnekCase;

let node_name = fun.name;
let method_name = node_name.to_lower_camel_case();
let method_name = node_name.to_snek_case();
let out_ty_name = data_types.get(&fun.out_id).unwrap();

let args_row = match (
Expand Down Expand Up @@ -186,24 +186,19 @@ class QueryGraph(QueryGraphBase):
write!(
dest,
r#"
{method_name} ({args_row}) {{
const inner = selectionToNodeSet(
{{ "{node_name}": {args_selection} }},
[["{node_name}", nodeMetas.{meta_method}()]],
"$q",
)[0];
return new {node_type}(inner) as {node_type}<{out_ty_name}>;
}}"#
def {method_name}({args_row}) -> {node_type}[{out_ty_name}]:
node = selection_to_nodes(
{{"{node_name}": {args_selection}}},
{{"{node_name}": NodeDescs.{meta_method}()}},
"$q"
)[0]
return {node_type}(name=node.name, args=node.args, sub_nodes=node.sub_nodes)
"#
)?;
}
writeln!(
dest,
"
}}"
)?;

writeln!(&mut mdk_ts)?;
Ok(mdk_ts.buf)
writeln!(&mut client_py)?;
Ok(client_py.buf)
}

struct RootFn {
Expand Down Expand Up @@ -311,8 +306,8 @@ fn get_manifest(tg: &Typegraph) -> Result<RenderManifest> {

/// Render the common sections like the transports
fn render_static(dest: &mut GenDestBuf) -> core::fmt::Result {
let mod_py = include_str!("static/mod.py");
writeln!(dest, "{}", mod_py)?;
let client_py = include_str!("static/client.py");
writeln!(dest, "{}", client_py)?;
Ok(())
}

Expand All @@ -323,10 +318,8 @@ fn render_data_types(
manifest: &RenderManifest,
name_mapper: Rc<NameMapper>,
) -> anyhow::Result<NameMemo> {
let mut renderer = TypeRenderer::new(
name_mapper.nodes.clone(),
Rc::new(mdk_typescript::types::TypescriptTypeRenderer {}),
);
let mut renderer =
TypeRenderer::new(name_mapper.nodes.clone(), Rc::new(types::PyTypeRenderer {}));
for &id in &manifest.data_types {
_ = renderer.render(id)?;
}
Expand All @@ -344,7 +337,7 @@ fn render_selection_types(
) -> Result<NameMemo> {
let mut renderer = TypeRenderer::new(
name_mapper.nodes.clone(),
Rc::new(selections::TsNodeSelectionsRenderer {
Rc::new(selections::PyNodeSelectionsRenderer {
arg_ty_names: arg_types_memo,
}),
);
Expand All @@ -365,7 +358,7 @@ fn render_node_metas(
) -> Result<NameMemo> {
let mut renderer = TypeRenderer::new(
name_mapper.nodes.clone(),
Rc::new(node_metas::TsNodeMetasRenderer { name_mapper }),
Rc::new(node_metas::PyNodeMetasRenderer { name_mapper }),
);
for &id in &manifest.selections {
_ = renderer.render(id)?;
Expand Down Expand Up @@ -394,8 +387,8 @@ fn e2e() -> anyhow::Result<()> {
"default".to_string(),
config::Target(
[GeneratorConfig {
generator_name: "client_ts".to_string(),
other: serde_json::to_value(client_ts::ClienTsGenConfig {
generator_name: "client_py".to_string(),
other: serde_json::to_value(client_py::ClienPyGenConfig {
base: config::MdkGeneratorConfigBase {
typegraph_name: Some(tg_name.into()),
typegraph_path: None,
Expand Down Expand Up @@ -423,30 +416,20 @@ fn e2e() -> anyhow::Result<()> {
config,
build_fn: |args| {
Box::pin(async move {
let status = tokio::process::Command::new("deno")
.args("check mdk.ts".split(' ').collect::<Vec<_>>())
.current_dir(&args.path)
.kill_on_drop(true)
.spawn()?
.wait()
.await?;
if !status.success() {
anyhow::bail!("error checking generated crate");
}
let status = tokio::process::Command::new("deno")
.args("lint mdk.ts".split(' ').collect::<Vec<_>>())
let status = tokio::process::Command::new("ruff")
.args("check client.py".split(' ').collect::<Vec<_>>())
.current_dir(&args.path)
.kill_on_drop(true)
.spawn()?
.wait()
.await?;
if !status.success() {
anyhow::bail!("error lint generated crate");
anyhow::bail!("error checking generated module");
}
Ok(())
})
},
target_dir: "./tests/mat_rust/".into(),
target_dir: None,
}])
.await
})?;
Expand Down
14 changes: 7 additions & 7 deletions libs/metagen/src/client_py/node_metas.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ use common::typegraph::*;
use super::utils::normalize_type_title;
use crate::{interlude::*, shared::types::*};

pub struct TsNodeMetasRenderer {
pub struct PyNodeMetasRenderer {
pub name_mapper: Rc<super::NameMapper>,
}

impl TsNodeMetasRenderer {
impl PyNodeMetasRenderer {
/// `props` is a map of prop_name -> (TypeName, subNodeName)
fn render_for_object(
&self,
Expand All @@ -24,7 +24,7 @@ impl TsNodeMetasRenderer {
dest,
r#"
@staticmethod
{ty_name}():
def {ty_name}():
return NodeMeta(
sub_nodes={{"#
)?;
Expand All @@ -39,7 +39,7 @@ impl TsNodeMetasRenderer {
dest,
r#"
}},
);
)
"#
)?;
Ok(())
Expand All @@ -56,7 +56,7 @@ impl TsNodeMetasRenderer {
dest,
r#"
@staticmethod
{ty_name}():
def {ty_name}():
return NodeMeta(
sub_nodes=NodeDescs.{return_node}().sub_nodes,"#
)?;
Expand Down Expand Up @@ -84,14 +84,14 @@ impl TsNodeMetasRenderer {
write!(
dest,
r#"
);
)
"#
)?;
Ok(())
}
}

impl RenderType for TsNodeMetasRenderer {
impl RenderType for PyNodeMetasRenderer {
fn render(
&self,
renderer: &mut TypeRenderer,
Expand Down
Loading

0 comments on commit 676bdb8

Please sign in to comment.