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.
Files changed (41) hide show
  1. {framework_m-0.10.1 → framework_m-0.10.2}/CHANGELOG.md +7 -0
  2. {framework_m-0.10.1 → framework_m-0.10.2}/PKG-INFO +3 -3
  3. {framework_m-0.10.1 → framework_m-0.10.2}/pyproject.toml +3 -3
  4. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_api_endpoints.py +7 -7
  5. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_postgres_flow.py +11 -2
  6. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_real_http_client.py +2 -2
  7. {framework_m-0.10.1 → framework_m-0.10.2}/.gitignore +0 -0
  8. {framework_m-0.10.1 → framework_m-0.10.2}/LICENSE +0 -0
  9. {framework_m-0.10.1 → framework_m-0.10.2}/README.md +0 -0
  10. {framework_m-0.10.1 → framework_m-0.10.2}/alembic/README +0 -0
  11. {framework_m-0.10.1 → framework_m-0.10.2}/alembic/env.py +0 -0
  12. {framework_m-0.10.1 → framework_m-0.10.2}/alembic/script.py.mako +0 -0
  13. {framework_m-0.10.1 → framework_m-0.10.2}/alembic.ini +0 -0
  14. {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/__init__.py +0 -0
  15. {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/cli/__init__.py +0 -0
  16. {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/cli/main.py +0 -0
  17. {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/core/services/__init__.py +0 -0
  18. {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/core/services/correction.py +0 -0
  19. {framework_m-0.10.1 → framework_m-0.10.2}/src/framework_m/py.typed +0 -0
  20. {framework_m-0.10.1 → framework_m-0.10.2}/tests/adapters/auth/test_oauth_adapter.py +0 -0
  21. {framework_m-0.10.1 → framework_m-0.10.2}/tests/adapters/read_model/test_projector.py +0 -0
  22. {framework_m-0.10.1 → framework_m-0.10.2}/tests/architecture/fixtures/ci_dummy_index.html +0 -0
  23. {framework_m-0.10.1 → framework_m-0.10.2}/tests/architecture/test_frontend_bootstrap.py +0 -0
  24. {framework_m-0.10.1 → framework_m-0.10.2}/tests/architecture/test_package_separation.py +0 -0
  25. {framework_m-0.10.1 → framework_m-0.10.2}/tests/conftest.py +0 -0
  26. {framework_m-0.10.1 → framework_m-0.10.2}/tests/core/interfaces/test_read_model.py +0 -0
  27. {framework_m-0.10.1 → framework_m-0.10.2}/tests/core/interfaces/test_report_engine.py +0 -0
  28. {framework_m-0.10.1 → framework_m-0.10.2}/tests/core/test_correction_service.py +0 -0
  29. {framework_m-0.10.1 → framework_m-0.10.2}/tests/helpers/__init__.py +0 -0
  30. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/__init__.py +0 -0
  31. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_app_ports.py +0 -0
  32. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_child_table_integration.py +0 -0
  33. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_crud_flow.py +0 -0
  34. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_jobs_events_webhooks.py +0 -0
  35. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_migration_flow.py +0 -0
  36. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_override_migration.py +0 -0
  37. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_rfc_0008_audit.py +0 -0
  38. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_rfc_0008_correction.py +0 -0
  39. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_rfc_0008_versioning.py +0 -0
  40. {framework_m-0.10.1 → framework_m-0.10.2}/tests/integration/test_workflow_lifecycle.py +0 -0
  41. {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.1
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.18.0
22
- Requires-Dist: framework-m-standard>=0.16.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.1"
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.18.0",
25
- "framework-m-standard>=0.16.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
- "/api/v1/CrudTestDoc",
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
- "/api/v1/CrudTestDoc",
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
- "/api/v1/CrudTestDoc",
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("/api/v1/CrudTestDoc")
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("/api/v1/CrudTestDoc")
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
- "/api/v1/rpc/fn/integration.test_func",
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
- "/api/v1/rpc/fn/nonexistent.function",
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 is available for testcontainers."""
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}/api/v1/HttpTestTodo",
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}/api/v1/HttpTestTodo",
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