-
-
Notifications
You must be signed in to change notification settings - Fork 306
feat: support for structured scaffold in create command #970
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: support for structured scaffold in create command #970
Conversation
for more information, see https://pre-commit.ci
@pre-commit-ci[bot] is attempting to deploy a commit to the sparckles Team on Vercel. A member of the Team first needs to authorize it. |
CodSpeed Performance ReportMerging #970 will not alter performanceComparing Summary
|
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
Hi, Multiple SubRoutes.For example, if we take the crimes example as one subrouter within a Gotham application. If we look at the web based Gotham application we might have multiple subrouters eg crime, finance, planning, licenses, housing where do these go in the scaffold directory structure? Are they: \no-db\api\handlers\crime.py Template and Static filesWhere do the Jinja templates go? For both templates and static files I'm assuming that there will be some that are shared right across Gotham and some that are specific to crime or finance ... Thanks |
Yes, each handler.py would be a collection of routes in a sub route, akin to viewsets in DRF |
@sansyrox any updates/suggestions ? |
Thanks for the nudge @ashupednekar 😄 I will complete the review by tomorrow eve! @dave42w , do you have any more suggestions/feedback? |
I don't have anything yet as I haven't built a large app yet in Robyn. I've found this article interesting and it covers a few things the scaffold doesn't. https://dev.nando.audio/2014/04/01/large_apps_with_sqlalchemy__architecture.html I also suspect that using an event queue will be a key part of larger apps rather than a big transition (eg in an ordering process) As the scaffolding is described as opinionated whether it might be possible to support plugging in different opinions eg if a corporate has a standard they already use and want robyn to support. |
Although I think we do need to get the CI builds sorted before we merge anything |
07f28de
to
0b766c9
Compare
|
1 similar comment
|
os.makedirs(final_project_dir_path, exist_ok=True) | ||
|
||
selected_project_template = (SCAFFOLD_DIR / Path(project_type)).resolve() | ||
selected_project_template = (SCAFFOLD_DIR / Path(scaffold_type) / Path(project_type)).resolve() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing directory structure validation. The code attempts to access a new directory structure that includes scaffold types (simple/structured), but based on the project tree, the 'structured' directory doesn't exist in the scaffold folder. This will raise a FileNotFoundError when users select the 'structured' scaffold type.
React with 👍 to tell me that this comment was useful, or 👎 if not (and I'll stop posting more comments like this in the future)
|
||
def discover_routes(handler_path: str = "api.handlers") -> Robyn: | ||
mux: Robyn = Robyn(__file__) | ||
package = importlib.import_module(handler_path) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The dynamic module import lacks error handling. importlib.import_module() can raise ModuleNotFoundError or other import-related exceptions if the module cannot be found or loaded. This could crash the application. Should be wrapped in a try-except block to handle potential import failures gracefully.
React with 👍 to tell me that this comment was useful, or 👎 if not (and I'll stop posting more comments like this in the future)
def discover_routes(handler_path: str = "api.handlers") -> Robyn: | ||
mux: Robyn = Robyn(__file__) | ||
package = importlib.import_module(handler_path) | ||
for _, module_name, _ in pkgutil.iter_modules(package.__path__, package.__name__ + "."): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unsafe access to package.path without checking if it exists. If package is not a package but a module, path attribute will not exist, leading to an AttributeError. Should check if hasattr(package, 'path') before accessing.
React with 👍 to tell me that this comment was useful, or 👎 if not (and I'll stop posting more comments like this in the future)
|
||
|
||
@router.post("/one") | ||
def one(): ... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The route handler 'one()' has an empty implementation using ellipsis (...). Without a proper implementation or return value, this endpoint will cause runtime errors when called. In Robyn, route handlers should return a response value. Consider returning a proper response object or JSON value like the 'three()' handler does.
React with 👍 to tell me that this comment was useful, or 👎 if not (and I'll stop posting more comments like this in the future)
|
||
|
||
@router.get("/two") | ||
def two(): ... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The route handler 'two()' has an empty implementation using ellipsis (...). Without a proper implementation or return value, this endpoint will cause runtime errors when called. In Robyn, route handlers should return a response value. Consider returning a proper response object or JSON value like the 'three()' handler does.
React with 👍 to tell me that this comment was useful, or 👎 if not (and I'll stop posting more comments like this in the future)
😱 Found 5 issues. Time to roll up your sleeves! 😱 |
Description
This PR fixes #969
Summary
PR: Add Structured Scaffold Option to Robyn's Create Command
Description:
This PR introduces a new feature to Robyn's
create
command, allowing users to choose between two scaffold options:Changes:
create
command to prompt users with a new option:Would you like the scaffold to be a simple starter kit or an opinionated structure?
api/handlers
(for route handlers)middlewares
(for middleware definitions)adaptors
(withmodels
,selectors
,mutators
)utils
(helper functions likedb.py
)devops
(including Dockerfile, docker-compose)conf.py
,config.env
).Example Structured Scaffold:
PR Checklist
Please ensure that:
Pre-Commit Instructions: