ohmyapi 0.2.5__py3-none-any.whl → 0.2.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ohmyapi/__init__.py CHANGED
@@ -1 +1 @@
1
- from . import db
1
+ __VERSION__ = "0.2.8"
ohmyapi/cli.py CHANGED
@@ -27,6 +27,12 @@ def startapp(app_name: str, root: str = "."):
27
27
  scaffolding.startapp(app_name, root)
28
28
 
29
29
 
30
+ @app.command()
31
+ def dockerize(root: str = "."):
32
+ """Create template Dockerfile and docker-compose.yml."""
33
+ scaffolding.copy_static("docker", root)
34
+
35
+
30
36
  @app.command()
31
37
  def serve(root: str = ".", host="127.0.0.1", port=8000):
32
38
  """
@@ -35,11 +41,13 @@ def serve(root: str = ".", host="127.0.0.1", port=8000):
35
41
  project_path = Path(root)
36
42
  project = runtime.Project(project_path)
37
43
  app_instance = project.app()
44
+ app_instance = project.configure_app(app_instance)
38
45
  uvicorn.run(app_instance, host=host, port=int(port), reload=False)
39
46
 
40
47
 
41
48
  @app.command()
42
49
  def shell(root: str = "."):
50
+ """An interactive shell with your loaded project runtime."""
43
51
  project_path = Path(root).resolve()
44
52
  project = runtime.Project(project_path)
45
53
 
ohmyapi/core/runtime.py CHANGED
@@ -72,23 +72,35 @@ class Project:
72
72
  def is_app_installed(self, name: str) -> bool:
73
73
  return name in getattr(self.settings, "INSTALLED_APPS", [])
74
74
 
75
- def app(self, generate_schemas: bool = False) -> FastAPI:
75
+ def app(self,
76
+ docs_url: str = "/docs",
77
+ ) -> FastAPI:
76
78
  """
77
- Create a FastAPI app, attach all APIRouters from registered apps,
78
- and register ORM lifecycle event handlers.
79
+ Create and return a FastAPI app.
79
80
  """
80
- app = FastAPI(title=getattr(self.settings, "PROJECT_NAME", "OhMyAPI Project"))
81
+ import ohmyapi
82
+ return FastAPI(
83
+ title=getattr(self.settings, "PROJECT_NAME", "OhMyAPI Project"),
84
+ description=getattr(self.settings, "PROJECT_DESCRIPTION", ""),
85
+ docs_url=getattr(self.settings, "DOCS_URL", "/docs"),
86
+ version=ohmyapi.__VERSION__,
87
+ )
81
88
 
82
- # Attach routers from apps
89
+ def configure_app(self, app: FastAPI) -> FastAPI:
90
+ """
91
+ Attach project routes and event handlers to given FastAPI instance.
92
+ """
93
+ # Attach project routes.
83
94
  for app_name, app_def in self._apps.items():
84
95
  for router in app_def.routers:
85
96
  app.include_router(router)
86
97
 
87
- # Startup / shutdown events
98
+ # Initialize ORM on startup
88
99
  @app.on_event("startup")
89
100
  async def _startup():
90
- await self.init_orm(generate_schemas=generate_schemas)
101
+ await self.init_orm(generate_schemas=False)
91
102
 
103
+ # Close ORM on shutdown
92
104
  @app.on_event("shutdown")
93
105
  async def _shutdown():
94
106
  await self.close_orm()
@@ -2,6 +2,8 @@ from pathlib import Path
2
2
 
3
3
  from jinja2 import Environment, FileSystemLoader
4
4
 
5
+ import shutil
6
+
5
7
  # Base templates directory
6
8
  TEMPLATE_DIR = Path(__file__).parent / "templates"
7
9
  env = Environment(loader=FileSystemLoader(str(TEMPLATE_DIR)))
@@ -53,6 +55,26 @@ def render_template_dir(
53
55
  render_template_file(template_dir / template_rel_path, context, output_path)
54
56
 
55
57
 
58
+ def copy_static(dir_name: str, target_dir: Path):
59
+ """Statically copy all files from {TEMPLATE_DIR}/{dir_name} to target_dir."""
60
+ template_dir = TEMPLATE_DIR / dir_name
61
+ target_dir = Path(target_dir)
62
+ if not template_dir.exists():
63
+ print(f"no templates found under: {dir_name}")
64
+ return
65
+
66
+ for root, _, files in template_dir.walk():
67
+ root_path = Path(root)
68
+ for file in files:
69
+ src = root_path / file
70
+ dst = target_dir / file
71
+ if dst.exists():
72
+ print(f"⛔ File exists, skipping: {dst}")
73
+ continue
74
+ shutil.copy(src, ".")
75
+ print(f"✅ Templates created successfully.")
76
+ print(f"🔧 Next, run `docker compose up -d --build`")
77
+
56
78
  def startproject(name: str):
57
79
  """Create a new project: flat structure, all project templates go into <name>/"""
58
80
  target_dir = Path(name).resolve()
@@ -0,0 +1,30 @@
1
+ FROM python:3.13-alpine
2
+
3
+ ENV PYTHONDONTWRITEBYTECODE=1 \
4
+ PYTHONUNBUFFERED=1 \
5
+ POETRY_HOME="/opt/poetry" \
6
+ POETRY_VIRTUALENVS_IN_PROJECT=true \
7
+ POETRY_NO_INTERACTION=1
8
+
9
+ RUN apk add --no-cache \
10
+ build-base \
11
+ curl \
12
+ git \
13
+ bash \
14
+ libffi-dev \
15
+ openssl-dev \
16
+ python3-dev \
17
+ musl-dev
18
+
19
+ RUN curl -sSL https://install.python-poetry.org | python3 -
20
+ ENV PATH="$POETRY_HOME/bin:$PATH"
21
+
22
+ WORKDIR /app
23
+ COPY pyproject.toml poetry.lock* /app/
24
+ RUN poetry lock
25
+ RUN poetry install
26
+ COPY . /app
27
+
28
+ EXPOSE 8000
29
+
30
+ CMD ["poetry", "run", "ohmyapi", "serve", "--host", "0.0.0.0"]
@@ -0,0 +1,7 @@
1
+ services:
2
+ app:
3
+ build:
4
+ context: .
5
+ restart: unless-stopped
6
+ ports:
7
+ - 8000:8000
@@ -10,7 +10,7 @@ readme = "README.md"
10
10
  license = { text = "MIT" }
11
11
 
12
12
  dependencies = [
13
- "ohmyapi (>=0.1.0,<0.2.0)"
13
+ "ohmyapi"
14
14
  ]
15
15
 
16
16
  [tool.poetry.group.dev.dependencies]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ohmyapi
3
- Version: 0.2.5
3
+ Version: 0.2.8
4
4
  Summary: Django-flavored scaffolding and management layer around FastAPI, Pydantic, TortoiseORM and Aerich migrations
5
5
  License-Expression: MIT
6
6
  Keywords: fastapi,tortoise,orm,pydantic,async,web-framework
@@ -1,4 +1,4 @@
1
- ohmyapi/__init__.py,sha256=3y8knoHhOjkUMMi7ADheYxBJywXPvpn5JldxMUeWejw,17
1
+ ohmyapi/__init__.py,sha256=bIBn6BOvT5PCbHYDKzeSJwZgEWeSlQA2KfNoH5rKYbE,22
2
2
  ohmyapi/__main__.py,sha256=wcCrL4PjG51r5wVKqJhcoJPTLfHW0wNbD31DrUN0MWI,28
3
3
  ohmyapi/builtin/auth/__init__.py,sha256=vOVCSJX8BALzs8h5ZW9507bjoscP37bncMjdMmBXcMM,42
4
4
  ohmyapi/builtin/auth/models.py,sha256=8az4TKdC6PUha3_HyslKinDT2-yAN-aBoYUQcjxm7Js,1728
@@ -7,22 +7,24 @@ ohmyapi/builtin/auth/routes.py,sha256=r887BWea20vinX88QBuxGzQc9BrIi-LqyStM0V1cl1
7
7
  ohmyapi/builtin/demo/__init__.py,sha256=44Yo3mYmlKSKEwVp6O9urr-C_3qDQzCYLMn6B9i6wew,29
8
8
  ohmyapi/builtin/demo/models.py,sha256=r06rfuhPJaI2fYsQ24L1JCOd67f2GQNfGnkgKAptOX8,1404
9
9
  ohmyapi/builtin/demo/routes.py,sha256=1VTlEttrez6Qnhrz_9sTA-emtfXem0s0BkPVcLvg3k0,1801
10
- ohmyapi/cli.py,sha256=dJVNgpW5S4rCc619AEEKBKuEIAmQs153Ls0ZVaea48w,4173
10
+ ohmyapi/cli.py,sha256=gHiPWN3pkrrIJ69WFBHt0BTRNVI-YSJD7VhtqQRwKuc,4447
11
11
  ohmyapi/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- ohmyapi/core/runtime.py,sha256=Zs2080IXOamzs1TIRVCX-oWh93uJHumtYUwMZKtRwFY,11958
13
- ohmyapi/core/scaffolding.py,sha256=SA0SYFd7VcqkOn9xuXgj-yOoVqCZMJo68GGFbm34GE4,2663
12
+ ohmyapi/core/runtime.py,sha256=pNfFRk7sFX8FePX6cnb4H7kLh5CauNnA_gmc0rsWIh8,12287
13
+ ohmyapi/core/scaffolding.py,sha256=1KF67aBvd08xjDhIXhI-nDhClJAw2TB3tYVLiMmeYOk,3426
14
14
  ohmyapi/core/templates/app/__init__.py.j2,sha256=QwVIQVUGZVhdH1d4NrvL7NTsK4-T4cihzYs8UVX2dt4,43
15
15
  ohmyapi/core/templates/app/models.py.j2,sha256=_3w-vFJ5fgsmncsCv34k_wyCMF78jufbSSglns4gbb0,119
16
16
  ohmyapi/core/templates/app/routes.py.j2,sha256=SxLz_wvakusj5txbXToZyNq6ZmcamSwNjVrI0MNPRl0,1037
17
+ ohmyapi/core/templates/docker/Dockerfile,sha256=4-QgqK6h9sR7hYKGUvRife6GpLTm7EOzYupr54B3qUY,596
18
+ ohmyapi/core/templates/docker/docker-compose.yml,sha256=Jr344DALp28_w9d9O-HIuQgwaacIHabyFyvBuOQ-PeQ,102
17
19
  ohmyapi/core/templates/project/README.md.j2,sha256=SjR4JIrg-8XRE-UntUDwiw8jDpYitD_UjwoKkYJ7GLw,22
18
- ohmyapi/core/templates/project/pyproject.toml.j2,sha256=3ZqO6FX9Bhq8OAZl8nHPXCiWxl3gAffIF-LsC_-K9Us,538
20
+ ohmyapi/core/templates/project/pyproject.toml.j2,sha256=D3d5yv2317owH3tFYN6klMavt74gTqqhDsHe0jhqUeA,521
19
21
  ohmyapi/core/templates/project/settings.py.j2,sha256=So6w1OiL_jU-FyeT8IHueDjGNuEoSkYhabhHpne2fUU,140
20
22
  ohmyapi/db/__init__.py,sha256=5QKUycxnN83DOUD_Etoee9tEOYjnZ74deqrSOOx_MiQ,204
21
23
  ohmyapi/db/exceptions.py,sha256=vb4IIUoeYAY6sK42zRtjMy-39IFVi_Qb6mWySTY0jYw,34
22
24
  ohmyapi/db/model/__init__.py,sha256=k3StTNuKatpwZo_Z5JBFa-927eJrzibFE8U4SA82asc,32
23
25
  ohmyapi/db/model/model.py,sha256=ui4g78c5xoS06Dj8Cdk7QgTjRnE68zKeL-AdmeYYPuQ,2776
24
26
  ohmyapi/router.py,sha256=5g0U59glu4hxxnIoTSFzb2S2offkOT3eE39aprzVxwo,83
25
- ohmyapi-0.2.5.dist-info/METADATA,sha256=lZw4-WY9rahDJboBp1q0RNAxrzErYkA7p3lnz4RyVYo,2575
26
- ohmyapi-0.2.5.dist-info/WHEEL,sha256=M5asmiAlL6HEcOq52Yi5mmk9KmTVjY2RDPtO4p9DMrc,88
27
- ohmyapi-0.2.5.dist-info/entry_points.txt,sha256=wb3lw8-meAlpiv1mqcQ3m25ukL7djagU_w89GkrC37k,43
28
- ohmyapi-0.2.5.dist-info/RECORD,,
27
+ ohmyapi-0.2.8.dist-info/METADATA,sha256=ww_6H1sYKecjuCvYSStN8Ql01xqDY0MINAetvtrHQJo,2575
28
+ ohmyapi-0.2.8.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
29
+ ohmyapi-0.2.8.dist-info/entry_points.txt,sha256=wb3lw8-meAlpiv1mqcQ3m25ukL7djagU_w89GkrC37k,43
30
+ ohmyapi-0.2.8.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.2.0
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any