framework-m 0.14.1__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.
- {framework_m-0.14.1 → framework_m-0.14.2}/CHANGELOG.md +11 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/PKG-INFO +3 -3
- {framework_m-0.14.1 → framework_m-0.14.2}/pyproject.toml +8 -7
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/core/interfaces/test_report_engine.py +12 -12
- framework_m-0.14.2/tests/integration/base.py +770 -0
- framework_m-0.14.2/tests/integration/test_crud_flow.py +25 -0
- framework_m-0.14.2/tests/integration/test_mariadb_flow.py +59 -0
- framework_m-0.14.2/tests/integration/test_mssql_flow.py +66 -0
- framework_m-0.14.2/tests/integration/test_mysql_flow.py +59 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_nats_deduplication.py +1 -1
- framework_m-0.14.2/tests/integration/test_oracle_flow.py +57 -0
- framework_m-0.14.2/tests/integration/test_postgres_flow.py +61 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_real_http_client.py +28 -4
- framework_m-0.14.2/tests/integration/utils.py +114 -0
- framework_m-0.14.1/tests/integration/test_crud_flow.py +0 -235
- framework_m-0.14.1/tests/integration/test_postgres_flow.py +0 -245
- {framework_m-0.14.1 → framework_m-0.14.2}/.gitignore +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/LICENSE +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/README.md +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/alembic/README +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/alembic/env.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/alembic/script.py.mako +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/alembic.ini +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/src/framework_m/__init__.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/src/framework_m/cli/__init__.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/src/framework_m/cli/main.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/src/framework_m/core/services/__init__.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/src/framework_m/core/services/correction.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/src/framework_m/py.typed +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/adapters/auth/test_oauth_adapter.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/adapters/read_model/test_projector.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/architecture/fixtures/ci_dummy_index.html +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/architecture/test_frontend_bootstrap.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/architecture/test_package_separation.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/conftest.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/core/interfaces/test_read_model.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/core/test_correction_service.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/helpers/__init__.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/__init__.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_api_endpoints.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_app_ports.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_child_table_integration.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_jobs_events_webhooks.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_migration_flow.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_override_migration.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_rfc_0008_audit.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_rfc_0008_correction.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_rfc_0008_versioning.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/integration/test_workflow_lifecycle.py +0 -0
- {framework_m-0.14.1 → framework_m-0.14.2}/tests/test_meta.py +0 -0
|
@@ -1,3 +1,14 @@
|
|
|
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
|
+
|
|
1
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: framework-m
|
|
3
|
-
Version: 0.14.
|
|
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.
|
|
22
|
-
Requires-Dist: framework-m-standard>=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.
|
|
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.
|
|
25
|
-
"framework-m-standard>=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.
|
|
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.
|
|
39
|
+
"ruff>=0.15.20",
|
|
40
40
|
"testcontainers>=4.14.2",
|
|
41
41
|
"httpx>=0.28.1",
|
|
42
42
|
"aiosqlite>=0.22.1",
|
|
43
|
-
"
|
|
43
|
+
"aiomysql>=0.3.2",
|
|
44
|
+
"framework-m-studio>=0.18.2",
|
|
44
45
|
# Release tools
|
|
45
|
-
"python-semantic-release>=10.
|
|
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
|