framework-m 0.14.0__tar.gz → 0.14.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 (50) hide show
  1. {framework_m-0.14.0 → framework_m-0.14.2}/CHANGELOG.md +12 -1
  2. {framework_m-0.14.0 → framework_m-0.14.2}/PKG-INFO +3 -3
  3. {framework_m-0.14.0 → framework_m-0.14.2}/pyproject.toml +8 -7
  4. {framework_m-0.14.0 → framework_m-0.14.2}/tests/core/interfaces/test_report_engine.py +12 -12
  5. framework_m-0.14.2/tests/integration/base.py +770 -0
  6. framework_m-0.14.2/tests/integration/test_crud_flow.py +25 -0
  7. framework_m-0.14.2/tests/integration/test_mariadb_flow.py +59 -0
  8. framework_m-0.14.2/tests/integration/test_mssql_flow.py +66 -0
  9. framework_m-0.14.2/tests/integration/test_mysql_flow.py +59 -0
  10. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_nats_deduplication.py +1 -1
  11. framework_m-0.14.2/tests/integration/test_oracle_flow.py +57 -0
  12. framework_m-0.14.2/tests/integration/test_postgres_flow.py +61 -0
  13. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_real_http_client.py +28 -4
  14. framework_m-0.14.2/tests/integration/utils.py +114 -0
  15. framework_m-0.14.0/tests/integration/test_crud_flow.py +0 -235
  16. framework_m-0.14.0/tests/integration/test_postgres_flow.py +0 -245
  17. {framework_m-0.14.0 → framework_m-0.14.2}/.gitignore +0 -0
  18. {framework_m-0.14.0 → framework_m-0.14.2}/LICENSE +0 -0
  19. {framework_m-0.14.0 → framework_m-0.14.2}/README.md +0 -0
  20. {framework_m-0.14.0 → framework_m-0.14.2}/alembic/README +0 -0
  21. {framework_m-0.14.0 → framework_m-0.14.2}/alembic/env.py +0 -0
  22. {framework_m-0.14.0 → framework_m-0.14.2}/alembic/script.py.mako +0 -0
  23. {framework_m-0.14.0 → framework_m-0.14.2}/alembic.ini +0 -0
  24. {framework_m-0.14.0 → framework_m-0.14.2}/src/framework_m/__init__.py +0 -0
  25. {framework_m-0.14.0 → framework_m-0.14.2}/src/framework_m/cli/__init__.py +0 -0
  26. {framework_m-0.14.0 → framework_m-0.14.2}/src/framework_m/cli/main.py +0 -0
  27. {framework_m-0.14.0 → framework_m-0.14.2}/src/framework_m/core/services/__init__.py +0 -0
  28. {framework_m-0.14.0 → framework_m-0.14.2}/src/framework_m/core/services/correction.py +0 -0
  29. {framework_m-0.14.0 → framework_m-0.14.2}/src/framework_m/py.typed +0 -0
  30. {framework_m-0.14.0 → framework_m-0.14.2}/tests/adapters/auth/test_oauth_adapter.py +0 -0
  31. {framework_m-0.14.0 → framework_m-0.14.2}/tests/adapters/read_model/test_projector.py +0 -0
  32. {framework_m-0.14.0 → framework_m-0.14.2}/tests/architecture/fixtures/ci_dummy_index.html +0 -0
  33. {framework_m-0.14.0 → framework_m-0.14.2}/tests/architecture/test_frontend_bootstrap.py +0 -0
  34. {framework_m-0.14.0 → framework_m-0.14.2}/tests/architecture/test_package_separation.py +0 -0
  35. {framework_m-0.14.0 → framework_m-0.14.2}/tests/conftest.py +0 -0
  36. {framework_m-0.14.0 → framework_m-0.14.2}/tests/core/interfaces/test_read_model.py +0 -0
  37. {framework_m-0.14.0 → framework_m-0.14.2}/tests/core/test_correction_service.py +0 -0
  38. {framework_m-0.14.0 → framework_m-0.14.2}/tests/helpers/__init__.py +0 -0
  39. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/__init__.py +0 -0
  40. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_api_endpoints.py +0 -0
  41. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_app_ports.py +0 -0
  42. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_child_table_integration.py +0 -0
  43. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_jobs_events_webhooks.py +0 -0
  44. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_migration_flow.py +0 -0
  45. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_override_migration.py +0 -0
  46. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_rfc_0008_audit.py +0 -0
  47. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_rfc_0008_correction.py +0 -0
  48. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_rfc_0008_versioning.py +0 -0
  49. {framework_m-0.14.0 → framework_m-0.14.2}/tests/integration/test_workflow_lifecycle.py +0 -0
  50. {framework_m-0.14.0 → framework_m-0.14.2}/tests/test_meta.py +0 -0
@@ -1,4 +1,15 @@
1
- ## framework-m v0.14.0
1
+ ## framework-m v0.14.2
2
+
3
+ ### Bug Fixes
4
+
5
+ - update integration test user context instantiations (6c60e14)
6
+ - pin Docker service version (674f106)
7
+ - stabilize CI service tests (156684f)
8
+ - satisfy pr lint checks (d3044f0)
9
+ - stabilize screenshot pipeline (78ed7cf)
10
+ - update report engine interface tests and mocks (9694ce5)
11
+
12
+ **framework-m** v0.14.1: internal dependency bump due to **framework-m-core** update## framework-m v0.14.0
2
13
 
3
14
  ### Features
4
15
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: framework-m
3
- Version: 0.14.0
3
+ Version: 0.14.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.26.0
22
- Requires-Dist: framework-m-standard>=0.24.0
21
+ Requires-Dist: framework-m-core>=0.28.0
22
+ Requires-Dist: framework-m-standard>=0.26.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.14.0"
3
+ version = "0.14.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.26.0",
25
- "framework-m-standard>=0.24.0",
24
+ "framework-m-core>=0.28.0",
25
+ "framework-m-standard>=0.26.0",
26
26
  ]
27
27
 
28
28
  [tool.uv.sources]
@@ -32,17 +32,18 @@ framework-m-studio = { workspace = true }
32
32
 
33
33
  [dependency-groups]
34
34
  dev = [
35
- "pytest>=9.1.0",
35
+ "pytest>=9.1.1",
36
36
  "pytest-asyncio>=1.4.0",
37
37
  "pytest-cov>=7.1.0",
38
38
  "mypy>=2.1.0",
39
- "ruff>=0.15.17",
39
+ "ruff>=0.15.20",
40
40
  "testcontainers>=4.14.2",
41
41
  "httpx>=0.28.1",
42
42
  "aiosqlite>=0.22.1",
43
- "framework-m-studio>=0.18.0",
43
+ "aiomysql>=0.3.2",
44
+ "framework-m-studio>=0.18.2",
44
45
  # Release tools
45
- "python-semantic-release>=10.5.3",
46
+ "python-semantic-release>=10.6.0",
46
47
  "build>=1.5.0",
47
48
  "twine>=6.2.0",
48
49
  "pre-commit>=4.6.0",
@@ -37,20 +37,20 @@ class TestReportResult:
37
37
 
38
38
  result = ReportResult(
39
39
  rows=[
40
- {"name": "Product A", "total": 1000},
41
- {"name": "Product B", "total": 2000},
40
+ {"data": {"name": "Product A", "total": 1000}},
41
+ {"data": {"name": "Product B", "total": 2000}},
42
42
  ],
43
43
  )
44
44
 
45
45
  assert len(result.rows) == 2
46
- assert result.rows[0]["name"] == "Product A"
46
+ assert result.rows[0].data["name"] == "Product A"
47
47
 
48
48
  def test_report_result_with_columns(self) -> None:
49
49
  """ReportResult should include column metadata."""
50
50
  from framework_m_core.interfaces.report_engine import ReportResult
51
51
 
52
52
  result = ReportResult(
53
- rows=[{"name": "Product A", "total": 1000}],
53
+ rows=[{"data": {"name": "Product A", "total": 1000}}],
54
54
  columns=["name", "total"],
55
55
  )
56
56
 
@@ -115,7 +115,7 @@ class TestMockReportEngine:
115
115
  ) -> ReportResult:
116
116
  """Execute SQL query."""
117
117
  return ReportResult(
118
- rows=[{"count": 42}],
118
+ rows=[{"data": {"count": 42}}],
119
119
  columns=["count"],
120
120
  )
121
121
 
@@ -127,7 +127,7 @@ class TestMockReportEngine:
127
127
  result = await engine.execute("SELECT COUNT(*) FROM users")
128
128
 
129
129
  assert len(result.rows) == 1
130
- assert result.rows[0]["count"] == 42
130
+ assert result.rows[0].data["count"] == 42
131
131
 
132
132
  async def test_mock_elastic_engine(self) -> None:
133
133
  """Mock Elastic engine should satisfy protocol."""
@@ -146,7 +146,7 @@ class TestMockReportEngine:
146
146
  ) -> ReportResult:
147
147
  """Execute Elastic DSL query."""
148
148
  return ReportResult(
149
- rows=[{"_source": {"name": "log1"}}],
149
+ rows=[{"data": {"_source": {"name": "log1"}}}],
150
150
  columns=["_source"],
151
151
  )
152
152
 
@@ -164,7 +164,7 @@ class TestMockReportEngine:
164
164
  result = await engine.execute('{"query": {"match_all": {}}}')
165
165
 
166
166
  assert len(result.rows) == 1
167
- assert "_source" in result.rows[0]
167
+ assert "_source" in result.rows[0].data
168
168
 
169
169
  async def test_mock_clickhouse_engine(self) -> None:
170
170
  """Mock ClickHouse engine should satisfy protocol."""
@@ -184,8 +184,8 @@ class TestMockReportEngine:
184
184
  """Execute ClickHouse query."""
185
185
  return ReportResult(
186
186
  rows=[
187
- {"date": "2026-01-01", "events": 1000},
188
- {"date": "2026-01-02", "events": 1500},
187
+ {"data": {"date": "2026-01-01", "events": 1000}},
188
+ {"data": {"date": "2026-01-02", "events": 1500}},
189
189
  ],
190
190
  columns=["date", "events"],
191
191
  )
@@ -200,5 +200,5 @@ class TestMockReportEngine:
200
200
  )
201
201
 
202
202
  assert len(result.rows) == 2
203
- assert result.rows[0]["date"] == "2026-01-01"
204
- assert result.rows[1]["events"] == 1500
203
+ assert result.rows[0].data["date"] == "2026-01-01"
204
+ assert result.rows[1].data["events"] == 1500