Add experimental Python codegen CLI scaffold#744
Conversation
Mark generation command examples as schematic and clarify option validation behavior. Exercise python -m smithy_python in a subprocess.
| @@ -0,0 +1 @@ | |||
| # Changelog | |||
There was a problem hiding this comment.
Note for reviewers: Our release infra will automatically handle version bumping and changelog management.
There was a problem hiding this comment.
I haven't talked much about this publicly since I'm still working on implementations and a blog post, but check a look at shape closures. This is a way to drive generation that doesn't root everything in a service.
What it means for you is relatively little, other than that you should tolerate generating without a set service. Current type codegen generates a synthetic one, but you shouldn't operate that way.
Computing a closure is beyond your scope as a non-java plugin. I would suggest rather that you generate what's given to you and put the onus on customers to use smithy-build transforms to narrow it down to what they want. Maybe later you could implement everything needed to compute it and relax that restriction.
|
|
||
| ## Commands | ||
|
|
||
| Generation is organized by artifact type: |
There was a problem hiding this comment.
But what if you could mix artifacts. You don't now - but you could. Types+client or types+server is an obvious combo that's easy to do without much difficulty.
smithy-python generate --modes client,typesYou could default that to just be client since most will want that.
| artifact.add_argument( | ||
| "--model", | ||
| type=Path, | ||
| help="Read the JSON AST from a file instead of standard input", |
There was a problem hiding this comment.
Something like "The Smithy JSON AST model file to use for code generation. If not set, the model is read from standard input."
| for name, help_text in ( | ||
| ("client", "Generate a client package"), | ||
| ("types", "Generate a standalone types package"), | ||
| ): | ||
| artifact = artifacts.add_parser(name, help=help_text) | ||
| artifact.add_argument( |
| artifact.add_argument( | ||
| "--output", | ||
| type=Path, | ||
| help="Output directory for direct invocation", |
There was a problem hiding this comment.
Best to mention here where the default value comes from.
| @dataclass(frozen=True, slots=True) | ||
| class _Invocation: | ||
| artifact: str | ||
| model_source: bytes |
There was a problem hiding this comment.
A readable would be better here I think. You don't want to have to buffer all of that only to pass it into json.reads or whatever else.
Overview
This PR lays the foundation for a Python-native Smithy code generator. It adds an experimental
smithy-pythonpackage with the command-line interface that will eventually generate Python clients and standalone types packages.The CLI currently validates its inputs and then exits with an explicit “generation is not implemented yet” error. The existing Java generator remains the primary one while the Python implementation is developed incrementally.
Background
The Python generator will consume Smithy JSON AST models and produce packages compatible with the existing Smithy Python runtime. It is distributed separately from those runtime packages and is only needed during code generation.
Smithy’s
runplugin invokes the generator as an external process, allowing it to integrate with standard Smithy builds without being loaded into the Smithy CLI or implemented in Java. Read Smithy run plugin docs for more info.Changes Summary
smithy-pythonpackage.generate clientandgenerate typescommands.--modeland--output.runplugin invocation through standard input and the provided plugin environment.CLI smoke tests
Both generation commands accept a model and reach the expected placeholder behavior:
Both generation commands exit with status 1, as expected for the current implementation.
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.