framework-m 0.10.1__tar.gz → 0.10.2__tar.gz
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.
- {framework_m-0.10.1 → framework_m-0.10.2}/CHANGELOG.md +7 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/PKG-INFO +3 -3
- {framework_m-0.10.1 → framework_m-0.10.2}/pyproject.toml +3 -3
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_api_endpoints.py +7 -7
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_postgres_flow.py +11 -2
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_real_http_client.py +2 -2
- {framework_m-0.10.1 → framework_m-0.10.2}/.gitignore +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/LICENSE +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/README.md +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/alembic/README +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/alembic/env.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/alembic/script.py.mako +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/alembic.ini +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/__init__.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/cli/__init__.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/cli/main.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/core/services/__init__.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/core/services/correction.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/py.typed +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/adapters/auth/test_oauth_adapter.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/adapters/read_model/test_projector.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/architecture/fixtures/ci_dummy_index.html +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/architecture/test_frontend_bootstrap.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/architecture/test_package_separation.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/conftest.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/core/interfaces/test_read_model.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/core/interfaces/test_report_engine.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/core/test_correction_service.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/helpers/__init__.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/__init__.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_app_ports.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_child_table_integration.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_crud_flow.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_jobs_events_webhooks.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_migration_flow.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_override_migration.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_rfc_0008_audit.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_rfc_0008_correction.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_rfc_0008_versioning.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_workflow_lifecycle.py +0 -0
- {framework_m-0.10.1 → framework_m-0.10.2}/tests/test_meta.py +0 -0
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## framework-m v0.10.2
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
- update integration tests for versioned endpoints and namespaced resolution (29f2af3)
|
|
6
|
+
- update pnpm lockfile and version (d0bf944)
|
|
7
|
+
|
|
1
8
|
**framework-m** v0.10.1: internal dependency bump due to **framework-m-studio** update## framework-m v0.10.0
|
|
2
9
|
|
|
3
10
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: framework-m
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.2
|
|
4
4
|
Summary: A modular, metadata-driven business application framework
|
|
5
5
|
Project-URL: Homepage, https://gitlab.com/castlecraft/framework-m
|
|
6
6
|
Project-URL: Documentation, https://gitlab.com/castlecraft/framework-m#readme
|
|
@@ -18,8 +18,8 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
19
19
|
Classifier: Typing :: Typed
|
|
20
20
|
Requires-Python: >=3.12
|
|
21
|
-
Requires-Dist: framework-m-core>=0.
|
|
22
|
-
Requires-Dist: framework-m-standard>=0.
|
|
21
|
+
Requires-Dist: framework-m-core>=0.19.0
|
|
22
|
+
Requires-Dist: framework-m-standard>=0.17.0
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
24
|
|
|
25
25
|
# Framework M
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "framework-m"
|
|
3
|
-
version = "0.10.
|
|
3
|
+
version = "0.10.2"
|
|
4
4
|
description = "A modular, metadata-driven business application framework"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "Apache-2.0" }
|
|
@@ -21,8 +21,8 @@ classifiers = [
|
|
|
21
21
|
]
|
|
22
22
|
|
|
23
23
|
dependencies = [
|
|
24
|
-
"framework-m-core>=0.
|
|
25
|
-
"framework-m-standard>=0.
|
|
24
|
+
"framework-m-core>=0.19.0",
|
|
25
|
+
"framework-m-standard>=0.17.0",
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
[tool.uv.sources]
|
|
@@ -120,7 +120,7 @@ class TestCrudEndpointValidation:
|
|
|
120
120
|
def test_create_with_valid_data(self, client: TestClient[Litestar]) -> None:
|
|
121
121
|
"""POST with valid data should return 201."""
|
|
122
122
|
response = client.post(
|
|
123
|
-
"/
|
|
123
|
+
"/CrudTestDoc",
|
|
124
124
|
json={"title": "Valid Title", "amount": 100.0},
|
|
125
125
|
)
|
|
126
126
|
# Should not be 404 (route exists)
|
|
@@ -131,7 +131,7 @@ class TestCrudEndpointValidation:
|
|
|
131
131
|
"""POST with invalid data should be rejected."""
|
|
132
132
|
# Missing required field 'title' should be rejected by Pydantic
|
|
133
133
|
response = client.post(
|
|
134
|
-
"/
|
|
134
|
+
"/CrudTestDoc",
|
|
135
135
|
json={"amount": "not-a-number"}, # Invalid type for amount
|
|
136
136
|
)
|
|
137
137
|
# Should be a client error (400 validation) or 403 (permission check before validation)
|
|
@@ -182,7 +182,7 @@ class TestCrudEndpointPermissions:
|
|
|
182
182
|
"""Employee should be able to create documents."""
|
|
183
183
|
client = TestClient(app_employee)
|
|
184
184
|
response = client.post(
|
|
185
|
-
"/
|
|
185
|
+
"/CrudTestDoc",
|
|
186
186
|
json={"title": "Employee Doc"},
|
|
187
187
|
)
|
|
188
188
|
# Endpoints should exist
|
|
@@ -191,7 +191,7 @@ class TestCrudEndpointPermissions:
|
|
|
191
191
|
def test_list_endpoint_works(self, app_employee: Litestar) -> None:
|
|
192
192
|
"""GET list should return paginated response."""
|
|
193
193
|
client = TestClient(app_employee)
|
|
194
|
-
response = client.get("/
|
|
194
|
+
response = client.get("/CrudTestDoc")
|
|
195
195
|
assert response.status_code == 200
|
|
196
196
|
data = response.json()
|
|
197
197
|
# Should have pagination fields
|
|
@@ -229,7 +229,7 @@ class TestCrudRlsFiltering:
|
|
|
229
229
|
def test_list_returns_paginated_format(self, app_user1: Litestar) -> None:
|
|
230
230
|
"""List should return paginated response with RLS applied."""
|
|
231
231
|
client = TestClient(app_user1)
|
|
232
|
-
response = client.get("/
|
|
232
|
+
response = client.get("/CrudTestDoc")
|
|
233
233
|
assert response.status_code == 200
|
|
234
234
|
data = response.json()
|
|
235
235
|
# Empty list since no DB, but format should be correct
|
|
@@ -279,7 +279,7 @@ class TestRpcEndpointIntegration:
|
|
|
279
279
|
|
|
280
280
|
# Call via RPC endpoint
|
|
281
281
|
response = client.post(
|
|
282
|
-
"/
|
|
282
|
+
"/rpc/fn/integration.test_func",
|
|
283
283
|
json={},
|
|
284
284
|
)
|
|
285
285
|
assert response.status_code in (200, 201)
|
|
@@ -290,7 +290,7 @@ class TestRpcEndpointIntegration:
|
|
|
290
290
|
def test_rpc_rejects_unregistered(self, client: TestClient[Litestar]) -> None:
|
|
291
291
|
"""Should reject calls to unregistered functions."""
|
|
292
292
|
response = client.post(
|
|
293
|
-
"/
|
|
293
|
+
"/rpc/fn/nonexistent.function",
|
|
294
294
|
json={},
|
|
295
295
|
)
|
|
296
296
|
assert response.status_code == 404
|
|
@@ -34,14 +34,23 @@ if TYPE_CHECKING:
|
|
|
34
34
|
|
|
35
35
|
# Check if Docker is available
|
|
36
36
|
def docker_available() -> bool:
|
|
37
|
-
"""Check if Docker
|
|
37
|
+
"""Check if Docker and required PostgreSQL image are available."""
|
|
38
38
|
try:
|
|
39
39
|
import docker
|
|
40
|
+
from docker.errors import DockerException, ImageNotFound
|
|
40
41
|
|
|
41
42
|
client = docker.from_env()
|
|
42
43
|
client.ping()
|
|
44
|
+
|
|
45
|
+
try:
|
|
46
|
+
client.images.get("postgres:15")
|
|
47
|
+
except ImageNotFound:
|
|
48
|
+
# Some CI runners expose Docker but block pulling library images.
|
|
49
|
+
# In that case, mark this integration module as unavailable.
|
|
50
|
+
client.images.pull("postgres:15")
|
|
51
|
+
|
|
43
52
|
return True
|
|
44
|
-
except Exception:
|
|
53
|
+
except (DockerException, Exception):
|
|
45
54
|
return False
|
|
46
55
|
|
|
47
56
|
|
|
@@ -136,7 +136,7 @@ class TestRealHttpClient:
|
|
|
136
136
|
"""GET list endpoint should work with real HTTP client."""
|
|
137
137
|
async with httpx.AsyncClient() as client:
|
|
138
138
|
response = await client.get(
|
|
139
|
-
f"{server}/
|
|
139
|
+
f"{server}/HttpTestTodo",
|
|
140
140
|
headers={"x-user-id": "user123", "x-roles": "Employee"},
|
|
141
141
|
)
|
|
142
142
|
assert response.status_code == 200
|
|
@@ -156,7 +156,7 @@ class TestRealHttpClient:
|
|
|
156
156
|
"""POST create should work with real HTTP client."""
|
|
157
157
|
async with httpx.AsyncClient() as client:
|
|
158
158
|
response = await client.post(
|
|
159
|
-
f"{server}/
|
|
159
|
+
f"{server}/HttpTestTodo",
|
|
160
160
|
json={"title": "Test Todo"},
|
|
161
161
|
headers={"x-user-id": "user123", "x-roles": "Employee"},
|
|
162
162
|
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|