Skip to content
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

Open
wants to merge 66 commits into
base: main
Choose a base branch
from

Conversation

ashupednekar
Copy link

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:

  1. Simple Starter Kit – Ideal for minimal, quick-start projects.
  2. Structured Scaffold – A more opinionated setup, providing separation of concerns and enhanced organization for scaling projects.

Changes:

  • Updated the create command to prompt users with a new option:
    • Would you like the scaffold to be a simple starter kit or an opinionated structure?
  • The simple scaffold remains the same as before with options like Mongo, Postgres, SQLite, etc.
  • Added a structured scaffold with the following structure:
    • api/handlers (for route handlers)
    • middlewares (for middleware definitions)
    • adaptors (with models, selectors, mutators)
    • utils (helper functions like db.py)
    • devops (including Dockerfile, docker-compose)
    • Improved configuration management (e.g., conf.py, config.env).

Example Structured Scaffold:

├── no-db
│   ├── api
│   │   ├── handlers
│   │   │   ├── __init__.py
│   │   │   ├── probes.py
│   │   │   └── sample.py
│   │   └── middlewares
│   │       └── __init__.py
│   ├── conf.py
│   ├── config.env
│   ├── devops
│   │   ├── Dockerfile
│   │   ├── Dockerfile.src
│   │   └── docker-compose.yaml
│   ├── requirements.txt
│   ├── server.py
│   └── utils
│       └── __init__.py
└── sqlalchemy
    ├── adaptors
    │   ├── __init__.py
    │   ├── models.py
    │   ├── mutators
    │   │   └── __init__.py
    │   ├── schema.py
    │   └── selectors
    │       └── __init__.py
    ├── api
    │   ├── handlers
    │   │   ├── __init__.py
    │   │   ├── probes.py
    │   │   └── sample.py
    │   └── middlewares
    │       └── __init__.py
    ├── conf.py
    ├── config.env
    ├── devops
    │   ├── Dockerfile
    │   ├── Dockerfile.src
    │   └── docker-compose.yaml
    ├── requirements.txt
    ├── server.py
    └── utils
        ├── __init__.py
        └── db.py

PR Checklist

Please ensure that:

  • [*] The PR contains a descriptive title
  • [*] The PR contains a descriptive summary of the changes
  • [*] You build and test your changes before submitting a PR.
  • You have added relevant documentation
  • You have added relevant tests. We prefer integration tests wherever possible

Pre-Commit Instructions:

Copy link

vercel bot commented Sep 25, 2024

@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.

@ashupednekar ashupednekar marked this pull request as draft September 25, 2024 17:29
Copy link

codspeed-hq bot commented Sep 25, 2024

CodSpeed Performance Report

Merging #970 will not alter performance

Comparing ashupednekar:feat_structured_scaffold (662c009) with main (06c487d)

Summary

✅ 116 untouched benchmarks

@ashupednekar ashupednekar changed the title Feat structured scaffold feat: support for structured scaffold in create command Sep 26, 2024
@ashupednekar ashupednekar marked this pull request as ready for review September 26, 2024 05:00
Comment on lines +109 to +121
level = WARN
handlers = console
qualname =

[logger_sqlalchemy]
level = WARN
handlers =
qualname = sqlalchemy.engine

[logger_alembic]
level = INFO
handlers =
qualname = alembic
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what do the empty assignments mean here?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are alembic defaults, generated with alemic init migrations

The reason I chose to pre-run this and not leave it to users is so that we can make `migrations/env.py' changes to make is usable right away

Also, to standardize migrations directory structure

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ashupednekar , since alembic is not a tool where I have direct experience. Could you add a readme?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should I add it in the scaffold, or should I add more docs ?

I've added what's needed to get started under example_app/index.mdx

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, added readme

# are written from script.py.mako
# output_encoding = utf-8

sqlalchemy.url = driver://user:pass@localhost/dbname
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let us leave a comment, which says that you need to update it accordingly.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Also, there was a bug in the online migrations function in alembic/env.py in structured sqlalchemy scaffold. Fixed, and added docs in example_app/index.mdx for database migration steps as well

COPY . .
RUN pip install --no-cache-dir --upgrade -r requirements.txt --target=/workspace/deps

FROM gcr.io/distroless/python3-debian11
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could you explain this?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the --target flag tells pip to place the site packages at the specified path, we then copy this in the second stage and set PYTHONPATH accordingly

@sansyrox sansyrox mentioned this pull request Oct 28, 2024
1 task
@dave42w
Copy link
Contributor

dave42w commented Oct 28, 2024

Hi,
Can you help me understand a couple of things in this scaffold structure?

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
\no-db\api\handlers\finance.py

Template and Static files

Where do the Jinja templates go?
Where do the static files 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

@ashupednekar
Copy link
Author

Yes, each handler.py would be a collection of routes in a sub route, akin to viewsets in DRF

@ashupednekar
Copy link
Author

@sansyrox any updates/suggestions ?

@sansyrox
Copy link
Member

Thanks for the nudge @ashupednekar 😄

I will complete the review by tomorrow eve! @dave42w , do you have any more suggestions/feedback?

@dave42w
Copy link
Contributor

dave42w commented Dec 13, 2024

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.

@dave42w
Copy link
Contributor

dave42w commented Dec 13, 2024

Although I think we do need to get the CI builds sorted before we merge anything

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support for structured scaffolding in create command, retaining current templates
5 participants