framework-m-core 0.4.1__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 (161) hide show
  1. framework_m_core-0.4.1/.gitignore +119 -0
  2. framework_m_core-0.4.1/CHANGELOG.md +105 -0
  3. framework_m_core-0.4.1/PKG-INFO +92 -0
  4. framework_m_core-0.4.1/README.md +78 -0
  5. framework_m_core-0.4.1/pyproject.toml +31 -0
  6. framework_m_core-0.4.1/src/framework_m_core/__init__.py +29 -0
  7. framework_m_core-0.4.1/src/framework_m_core/cli/__init__.py +0 -0
  8. framework_m_core-0.4.1/src/framework_m_core/cli/config.py +128 -0
  9. framework_m_core-0.4.1/src/framework_m_core/cli/main.py +30 -0
  10. framework_m_core-0.4.1/src/framework_m_core/cli/plugin_loader.py +132 -0
  11. framework_m_core-0.4.1/src/framework_m_core/cli/utility.py +58 -0
  12. framework_m_core-0.4.1/src/framework_m_core/config.py +171 -0
  13. framework_m_core-0.4.1/src/framework_m_core/container.py +329 -0
  14. framework_m_core-0.4.1/src/framework_m_core/decorators.py +308 -0
  15. framework_m_core-0.4.1/src/framework_m_core/doctypes/__init__.py +51 -0
  16. framework_m_core-0.4.1/src/framework_m_core/doctypes/activity_log.py +123 -0
  17. framework_m_core-0.4.1/src/framework_m_core/doctypes/api_key.py +89 -0
  18. framework_m_core-0.4.1/src/framework_m_core/doctypes/custom_permission.py +118 -0
  19. framework_m_core-0.4.1/src/framework_m_core/doctypes/document_share.py +142 -0
  20. framework_m_core-0.4.1/src/framework_m_core/doctypes/email_queue.py +209 -0
  21. framework_m_core-0.4.1/src/framework_m_core/doctypes/error_log.py +127 -0
  22. framework_m_core-0.4.1/src/framework_m_core/doctypes/file.py +97 -0
  23. framework_m_core-0.4.1/src/framework_m_core/doctypes/job_log.py +144 -0
  24. framework_m_core-0.4.1/src/framework_m_core/doctypes/notification.py +146 -0
  25. framework_m_core-0.4.1/src/framework_m_core/doctypes/print_format.py +124 -0
  26. framework_m_core-0.4.1/src/framework_m_core/doctypes/recent_document.py +75 -0
  27. framework_m_core-0.4.1/src/framework_m_core/doctypes/report.py +94 -0
  28. framework_m_core-0.4.1/src/framework_m_core/doctypes/scheduled_job.py +97 -0
  29. framework_m_core-0.4.1/src/framework_m_core/doctypes/session.py +71 -0
  30. framework_m_core-0.4.1/src/framework_m_core/doctypes/social_account.py +88 -0
  31. framework_m_core-0.4.1/src/framework_m_core/doctypes/system_settings.py +119 -0
  32. framework_m_core-0.4.1/src/framework_m_core/doctypes/tenant_translation.py +133 -0
  33. framework_m_core-0.4.1/src/framework_m_core/doctypes/todo.py +59 -0
  34. framework_m_core-0.4.1/src/framework_m_core/doctypes/translation.py +107 -0
  35. framework_m_core-0.4.1/src/framework_m_core/doctypes/user.py +115 -0
  36. framework_m_core-0.4.1/src/framework_m_core/doctypes/webhook.py +127 -0
  37. framework_m_core-0.4.1/src/framework_m_core/doctypes/webhook_log.py +114 -0
  38. framework_m_core-0.4.1/src/framework_m_core/doctypes/workflow.py +51 -0
  39. framework_m_core-0.4.1/src/framework_m_core/doctypes/workflow_state.py +56 -0
  40. framework_m_core-0.4.1/src/framework_m_core/doctypes/workflow_transition.py +57 -0
  41. framework_m_core-0.4.1/src/framework_m_core/domain/__init__.py +1 -0
  42. framework_m_core-0.4.1/src/framework_m_core/domain/base_controller.py +224 -0
  43. framework_m_core-0.4.1/src/framework_m_core/domain/base_doctype.py +287 -0
  44. framework_m_core-0.4.1/src/framework_m_core/domain/mixins.py +131 -0
  45. framework_m_core-0.4.1/src/framework_m_core/domain/naming_counter.py +50 -0
  46. framework_m_core-0.4.1/src/framework_m_core/domain/outbox.py +85 -0
  47. framework_m_core-0.4.1/src/framework_m_core/events/__init__.py +112 -0
  48. framework_m_core-0.4.1/src/framework_m_core/exceptions.py +144 -0
  49. framework_m_core-0.4.1/src/framework_m_core/interfaces/__init__.py +23 -0
  50. framework_m_core-0.4.1/src/framework_m_core/interfaces/audit.py +216 -0
  51. framework_m_core-0.4.1/src/framework_m_core/interfaces/auth_context.py +165 -0
  52. framework_m_core-0.4.1/src/framework_m_core/interfaces/authentication.py +86 -0
  53. framework_m_core-0.4.1/src/framework_m_core/interfaces/base_doctype.py +54 -0
  54. framework_m_core-0.4.1/src/framework_m_core/interfaces/bootstrap.py +110 -0
  55. framework_m_core-0.4.1/src/framework_m_core/interfaces/cache.py +140 -0
  56. framework_m_core-0.4.1/src/framework_m_core/interfaces/controller.py +157 -0
  57. framework_m_core-0.4.1/src/framework_m_core/interfaces/email_queue.py +187 -0
  58. framework_m_core-0.4.1/src/framework_m_core/interfaces/email_sender.py +143 -0
  59. framework_m_core-0.4.1/src/framework_m_core/interfaces/event_bus.py +167 -0
  60. framework_m_core-0.4.1/src/framework_m_core/interfaces/i18n.py +89 -0
  61. framework_m_core-0.4.1/src/framework_m_core/interfaces/identity.py +198 -0
  62. framework_m_core-0.4.1/src/framework_m_core/interfaces/job_queue.py +154 -0
  63. framework_m_core-0.4.1/src/framework_m_core/interfaces/notification.py +145 -0
  64. framework_m_core-0.4.1/src/framework_m_core/interfaces/oauth.py +130 -0
  65. framework_m_core-0.4.1/src/framework_m_core/interfaces/permission.py +141 -0
  66. framework_m_core-0.4.1/src/framework_m_core/interfaces/print.py +85 -0
  67. framework_m_core-0.4.1/src/framework_m_core/interfaces/read_model.py +142 -0
  68. framework_m_core-0.4.1/src/framework_m_core/interfaces/report_engine.py +90 -0
  69. framework_m_core-0.4.1/src/framework_m_core/interfaces/repository.py +228 -0
  70. framework_m_core-0.4.1/src/framework_m_core/interfaces/schema_mapper.py +164 -0
  71. framework_m_core-0.4.1/src/framework_m_core/interfaces/search.py +133 -0
  72. framework_m_core-0.4.1/src/framework_m_core/interfaces/session.py +167 -0
  73. framework_m_core-0.4.1/src/framework_m_core/interfaces/socket.py +99 -0
  74. framework_m_core-0.4.1/src/framework_m_core/interfaces/storage.py +181 -0
  75. framework_m_core-0.4.1/src/framework_m_core/interfaces/tenant.py +165 -0
  76. framework_m_core-0.4.1/src/framework_m_core/interfaces/workflow.py +214 -0
  77. framework_m_core-0.4.1/src/framework_m_core/permission_lookup.py +203 -0
  78. framework_m_core-0.4.1/src/framework_m_core/permissions.py +228 -0
  79. framework_m_core-0.4.1/src/framework_m_core/pii.py +215 -0
  80. framework_m_core-0.4.1/src/framework_m_core/py.typed +0 -0
  81. framework_m_core-0.4.1/src/framework_m_core/registry.py +312 -0
  82. framework_m_core-0.4.1/src/framework_m_core/rls.py +201 -0
  83. framework_m_core-0.4.1/src/framework_m_core/rpc_registry.py +90 -0
  84. framework_m_core-0.4.1/src/framework_m_core/security.py +44 -0
  85. framework_m_core-0.4.1/src/framework_m_core/services/__init__.py +12 -0
  86. framework_m_core-0.4.1/src/framework_m_core/services/user_manager.py +187 -0
  87. framework_m_core-0.4.1/src/framework_m_core/system_context.py +151 -0
  88. framework_m_core-0.4.1/src/framework_m_core/types/job_context.py +94 -0
  89. framework_m_core-0.4.1/src/framework_m_core/unit_of_work.py +138 -0
  90. framework_m_core-0.4.1/tests/cli/test_cli_main.py +54 -0
  91. framework_m_core-0.4.1/tests/cli/test_config.py +350 -0
  92. framework_m_core-0.4.1/tests/cli/test_plugin_loader.py +135 -0
  93. framework_m_core-0.4.1/tests/cli/test_utility.py +101 -0
  94. framework_m_core-0.4.1/tests/conftest.py +56 -0
  95. framework_m_core-0.4.1/tests/core/doctypes/test_api_key.py +124 -0
  96. framework_m_core-0.4.1/tests/core/doctypes/test_job_log.py +193 -0
  97. framework_m_core-0.4.1/tests/core/doctypes/test_report.py +202 -0
  98. framework_m_core-0.4.1/tests/core/doctypes/test_scheduled_job.py +72 -0
  99. framework_m_core-0.4.1/tests/core/doctypes/test_social_account.py +134 -0
  100. framework_m_core-0.4.1/tests/core/doctypes/test_user.py +239 -0
  101. framework_m_core-0.4.1/tests/core/doctypes/test_webhook.py +255 -0
  102. framework_m_core-0.4.1/tests/core/doctypes/test_webhook_log.py +183 -0
  103. framework_m_core-0.4.1/tests/core/events/test_doc_events.py +181 -0
  104. framework_m_core-0.4.1/tests/core/interfaces/test_cache.py +123 -0
  105. framework_m_core-0.4.1/tests/core/interfaces/test_email_queue_protocol.py +230 -0
  106. framework_m_core-0.4.1/tests/core/interfaces/test_identity.py +218 -0
  107. framework_m_core-0.4.1/tests/core/interfaces/test_socket.py +135 -0
  108. framework_m_core-0.4.1/tests/core/interfaces/test_workflow.py +664 -0
  109. framework_m_core-0.4.1/tests/core/services/test_user_manager.py +279 -0
  110. framework_m_core-0.4.1/tests/core/test_activity_log.py +161 -0
  111. framework_m_core-0.4.1/tests/core/test_child_table_permissions.py +165 -0
  112. framework_m_core-0.4.1/tests/core/test_container.py +218 -0
  113. framework_m_core-0.4.1/tests/core/test_custom_permission.py +174 -0
  114. framework_m_core-0.4.1/tests/core/test_custom_protocols.py +511 -0
  115. framework_m_core-0.4.1/tests/core/test_document_share.py +171 -0
  116. framework_m_core-0.4.1/tests/core/test_email_queue.py +292 -0
  117. framework_m_core-0.4.1/tests/core/test_error_log.py +148 -0
  118. framework_m_core-0.4.1/tests/core/test_exceptions.py +214 -0
  119. framework_m_core-0.4.1/tests/core/test_file.py +151 -0
  120. framework_m_core-0.4.1/tests/core/test_link_field_leakage.py +237 -0
  121. framework_m_core-0.4.1/tests/core/test_meta_registry_overrides.py +273 -0
  122. framework_m_core-0.4.1/tests/core/test_notification.py +151 -0
  123. framework_m_core-0.4.1/tests/core/test_object_level_permissions.py +288 -0
  124. framework_m_core-0.4.1/tests/core/test_outbox.py +114 -0
  125. framework_m_core-0.4.1/tests/core/test_permission_config.py +228 -0
  126. framework_m_core-0.4.1/tests/core/test_permission_conveniences.py +292 -0
  127. framework_m_core-0.4.1/tests/core/test_permission_lookup.py +251 -0
  128. framework_m_core-0.4.1/tests/core/test_pii.py +197 -0
  129. framework_m_core-0.4.1/tests/core/test_print_format.py +182 -0
  130. framework_m_core-0.4.1/tests/core/test_rls.py +249 -0
  131. framework_m_core-0.4.1/tests/core/test_rpc_decorator.py +205 -0
  132. framework_m_core-0.4.1/tests/core/test_schema_extension.py +578 -0
  133. framework_m_core-0.4.1/tests/core/test_session.py +265 -0
  134. framework_m_core-0.4.1/tests/core/test_share_lookup.py +182 -0
  135. framework_m_core-0.4.1/tests/core/test_system_context.py +124 -0
  136. framework_m_core-0.4.1/tests/core/test_system_settings.py +140 -0
  137. framework_m_core-0.4.1/tests/core/test_table_alteration.py +502 -0
  138. framework_m_core-0.4.1/tests/core/test_team_based_access.py +243 -0
  139. framework_m_core-0.4.1/tests/core/test_tenant.py +164 -0
  140. framework_m_core-0.4.1/tests/core/test_unit_of_work.py +156 -0
  141. framework_m_core-0.4.1/tests/core/test_whitelist_decorator.py +162 -0
  142. framework_m_core-0.4.1/tests/core/types/test_job_context.py +122 -0
  143. framework_m_core-0.4.1/tests/unit/core/domain/test_base_controller.py +480 -0
  144. framework_m_core-0.4.1/tests/unit/core/domain/test_base_doctype_implements_protocol.py +163 -0
  145. framework_m_core-0.4.1/tests/unit/core/domain/test_mixins.py +121 -0
  146. framework_m_core-0.4.1/tests/unit/core/interfaces/test_audit.py +261 -0
  147. framework_m_core-0.4.1/tests/unit/core/interfaces/test_auth_context.py +176 -0
  148. framework_m_core-0.4.1/tests/unit/core/interfaces/test_base_doctype_protocol.py +183 -0
  149. framework_m_core-0.4.1/tests/unit/core/interfaces/test_bootstrap_protocol.py +189 -0
  150. framework_m_core-0.4.1/tests/unit/core/interfaces/test_controller_protocol.py +230 -0
  151. framework_m_core-0.4.1/tests/unit/core/interfaces/test_event_bus.py +97 -0
  152. framework_m_core-0.4.1/tests/unit/core/interfaces/test_i18n.py +684 -0
  153. framework_m_core-0.4.1/tests/unit/core/interfaces/test_job_queue.py +131 -0
  154. framework_m_core-0.4.1/tests/unit/core/interfaces/test_permission.py +75 -0
  155. framework_m_core-0.4.1/tests/unit/core/interfaces/test_print.py +28 -0
  156. framework_m_core-0.4.1/tests/unit/core/interfaces/test_repository.py +188 -0
  157. framework_m_core-0.4.1/tests/unit/core/interfaces/test_schema_mapper_protocol.py +163 -0
  158. framework_m_core-0.4.1/tests/unit/core/interfaces/test_search.py +73 -0
  159. framework_m_core-0.4.1/tests/unit/core/interfaces/test_storage.py +199 -0
  160. framework_m_core-0.4.1/tests/unit/core/test_registry.py +339 -0
  161. framework_m_core-0.4.1/tests/unit/test_base_doctype.py +293 -0
@@ -0,0 +1,119 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+ .history/
23
+ # static/ - removed generic ignore, specific ignores added below
24
+
25
+ # Virtual environments
26
+ .venv/
27
+ venv/
28
+ ENV/
29
+ env/
30
+
31
+ # UV
32
+ .uv/
33
+ uv.lock
34
+
35
+ # IDE
36
+ .idea/
37
+ .vscode/
38
+ *.swp
39
+ *.swo
40
+ *~
41
+
42
+ # Testing
43
+ .pytest_cache/
44
+ .coverage
45
+ htmlcov/
46
+ .tox/
47
+ .nox/
48
+ coverage.xml
49
+
50
+ # Type checking
51
+ .mypy_cache/
52
+ .dmypy.json
53
+ dmypy.json
54
+
55
+ # Ruff
56
+ .ruff_cache/
57
+
58
+ # OS
59
+ .DS_Store
60
+ Thumbs.db
61
+
62
+ # Logs
63
+ *.log
64
+
65
+ # Local config
66
+ .env
67
+ .env.local
68
+
69
+ # Docker
70
+ docker-compose.override.yml
71
+
72
+ # SQLite databases
73
+ *.db
74
+ *.sqlite
75
+ *.sqlite3
76
+
77
+ # Studio UI built assets
78
+ apps/studio/src/framework_m_studio/static/
79
+
80
+ #doctypes
81
+ doctypes/*.py
82
+ apps/studio/src/doctypes/*.py
83
+
84
+ # Node.js / Frontend
85
+ node_modules/
86
+ .pnpm-store/
87
+ *.tsbuildinfo
88
+
89
+ # Frontend build outputs
90
+ frontend/dist/
91
+ frontend/.vite/
92
+ apps/*/studio_ui/dist/
93
+ apps/*/studio_ui/.vite/
94
+ frontend/playwright-report
95
+ frontend/test-results
96
+ apps/studio/studio_ui/node_modules/
97
+
98
+ # Logs
99
+ npm-debug.log*
100
+ pnpm-debug.log*
101
+ yarn-debug.log*
102
+ yarn-error.log*
103
+
104
+ # Editor directories
105
+ .idea/
106
+ *.sublime-project
107
+ *.sublime-workspace
108
+
109
+ # Generated Documentation
110
+ docs/developer/generated/
111
+ docs/machine/
112
+
113
+ # Website
114
+ website/.docusaurus/
115
+ website/build/
116
+ website/node_modules/
117
+
118
+ # GitLab Pages
119
+ public/
@@ -0,0 +1,105 @@
1
+ # Changelog
2
+
3
+ ## framework-m-core v0.4.1
4
+
5
+ ### Bug Fixes
6
+
7
+ - add both OIDC tokens to all publish jobs (206d05d)
8
+
9
+
10
+ ## framework-m-core v0.4.0
11
+
12
+ ### Features
13
+
14
+ - add comprehensive README with installation and usage docs (9ce1589)
15
+ - add comprehensive README with installation and usage docs (8a01633)
16
+
17
+ ### Bug Fixes
18
+
19
+ - add pipeline status badge to README (c413751)
20
+ - update package description in README (56a047c)
21
+ - use correct pyproject-build executable from build package (45d68b6)
22
+
23
+
24
+ ## framework-m-core v0.3.1
25
+
26
+ ### Bug Fixes
27
+
28
+ - add time import in release_utils (d4e3f8f)
29
+ - use uv tool run instead of uv run for both build and twine (801aa3f)
30
+
31
+
32
+ ## framework-m-core v0.3.0
33
+
34
+ ### Features
35
+
36
+ - Add new protocol-based interfaces, framework-mx-mongo and documentation generation (51f92ee)
37
+ - add gitlint for conventional commit enforcement (5ec959f)
38
+ - switch to scoped tags and fix release automation (e975051)
39
+ - add unique constraint support and refine docs (5f9af98)
40
+ - add Python-based release automation with update-existing-branch logic (6fcd9cb)
41
+ - add automated release workflow with duplicate prevention (ca5a508)
42
+ - add PyPI publishing for framework-m-studio and update docs (d6ed80a)
43
+ - comprehensive documentation covering fundamentals, migration guides, i18n, multi-tenancy usage, and API references (6a2c1df)
44
+ - implement Frontend Build & Serving (9f9aa79)
45
+ - implement desk ui (13ebcc8)
46
+ - implement workflows and advanced features (22a7745)
47
+ - implement system doctypes and features (05e7f3d)
48
+ - implement built-in doctypes and system adapters (23195d1)
49
+ - cli tools implementation (18a1d83)
50
+ - implement events, webhooks, monitoring and websockets (9381d3f)
51
+ - add NATS event bus, cron scheduler, and document lifecycle events (1b6525a)
52
+ - phase-03 complete (00123da)
53
+ - prepare for package split after completion (e8abae2)
54
+ - permission system implemented (632afb7)
55
+ - litestar application setup and authentication middleware (7854664)
56
+ - Complete DocType Engine & Database Layer (523f211)
57
+ - refactor phase-01 and implemented doctype-engine with CRUD, migrations and cli (3c36234)
58
+ - complete Phase 01 - Core Kernel & Interfaces (1dcbfab)
59
+ - automated pipeline for gitlab registry (c1a9e2b)
60
+
61
+ ### Bug Fixes
62
+
63
+ - release script and broken anchors in features.md (3830267)
64
+ - broken links (dc03f4b)
65
+ - footer links and broken markdown links (82d0595)
66
+ - node version mismatch (7fc3067)
67
+ - docs command to use colon instead of space (eddf12d)
68
+ - lint and mypy errors (0e65b7d)
69
+ - lint and mypy errors (0738180)
70
+ - Resolve import errors and test failures after package split (6153884)
71
+ - add pypi and pipeline badges to readme (62590fc)
72
+ - robust package detection and safe MR title truncation (36385b6)
73
+ - improve changelog extraction for GitLab release pages (bb636b0)
74
+ - use show-ref for robust tag check and clear local ghost tags (79563c5)
75
+ - finalize air-tight release automation with GitLab releases, professional logging, and zero-spam logic (0dc7b19)
76
+ - simplify release rules and regex to stop recursive loops (790b318)
77
+ - fix auto-tagging trigger and regex for merge commits (5e69fb9)
78
+ - improve commit filtering and fix linting (6e4082d)
79
+ - prevent duplicate changelog entries by ensuring tags are fetched and handled correctly (a498f85)
80
+ - make release tag parsing more robust for large monorepos (8e1b5d8)
81
+ - update project URLs to GitLab and refactor versioning source of truth (84e0bd3)
82
+ - prevent recursive release loops and cleanup dead code (6ff3776)
83
+ - remove create-studio-release-mr and detached HEAD (d814206)
84
+ - lint issues (0c1dc94)
85
+ - studio issues and ci pipeline (e17e9c2)
86
+ - ruff issue (24fb2ef)
87
+ - ruff issue (2b3dfb0)
88
+ - mypy issues (23c539b)
89
+ - Fix ruff linting errors (ad8997c)
90
+ - lint format (8fc33e8)
91
+ - add framework-m-studio in dev dependencies (3d3825a)
92
+ - correct mypy type ignore for aioboto3 imports (aa04e86)
93
+ - format with ruff (c9d5f39)
94
+ - mypy issues (5ab1715)
95
+ - format all files with ruff (90e3808)
96
+ - remove skip ci from release commit message (2db2b6f)
97
+ - correct directory navigation in release-package job (5b67a98)
98
+ - lint error in base_doctype (47e8c37)
99
+ - lint error in test_base_doctype (354f66f)
100
+ - use twine for GitLab registry publishing (6472dc7)
101
+ - specify dist path for uv publish (86df5c7)
102
+ - exclude cache directories from source (695d2fb)
103
+ - lint errors in tests (8b4120d)
104
+ - rename workspace to avoid package name conflict (20e46bb)
105
+
@@ -0,0 +1,92 @@
1
+ Metadata-Version: 2.4
2
+ Name: framework-m-core
3
+ Version: 0.4.1
4
+ Summary: Core protocols and dependency injection for Framework M
5
+ Author: Framework M Contributors
6
+ License: MIT
7
+ Requires-Python: >=3.12
8
+ Requires-Dist: argon2-cffi>=23.1.0
9
+ Requires-Dist: cyclopts>=3.0.0
10
+ Requires-Dist: dependency-injector>=4.41.0
11
+ Requires-Dist: pydantic-settings>=2.0.0
12
+ Requires-Dist: pydantic>=2.0.0
13
+ Description-Content-Type: text/markdown
14
+
15
+ # Framework M Core
16
+
17
+ [![PyPI version](https://badge.fury.io/py/framework-m-core.svg)](https://badge.fury.io/py/framework-m-core)
18
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
19
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
20
+ [![GitLab Pipeline Status](https://gitlab.com/castlecraft/framework-m/badges/main/pipeline.svg)](https://gitlab.com/castlecraft/framework-m/-/pipelines)
21
+
22
+ Core protocols and dependency injection container for Framework M.
23
+
24
+ ## Installation
25
+
26
+ ```bash
27
+ pip install framework-m-core
28
+ ```
29
+
30
+ Or with `uv`:
31
+
32
+ ```bash
33
+ uv add framework-m-core
34
+ ```
35
+
36
+ ## What's Included
37
+
38
+ ### Protocol Interfaces (Ports)
39
+
40
+ Framework M Core defines the protocol interfaces that adapters must implement:
41
+
42
+ | Protocol | Purpose |
43
+ |----------|---------|
44
+ | `RepositoryProtocol` | CRUD operations for documents |
45
+ | `EventBusProtocol` | Publish/subscribe events |
46
+ | `PermissionProtocol` | Authorization with RLS |
47
+ | `StorageProtocol` | File storage abstraction |
48
+ | `JobQueueProtocol` | Background job processing |
49
+ | `CacheProtocol` | Caching layer |
50
+ | `NotificationProtocol` | Email/SMS notifications |
51
+ | `SearchProtocol` | Full-text search |
52
+ | `PrintProtocol` | PDF generation |
53
+ | `I18nProtocol` | Internationalization |
54
+
55
+ ### Domain Base Classes
56
+
57
+ - `BaseDocType` - Base class for all document types
58
+ - `BaseController` - Lifecycle hooks (validate, before_save, after_save, etc.)
59
+ - `SubmittableMixin` - For documents with submit/cancel workflow
60
+
61
+ ### Dependency Injection
62
+
63
+ Built on `dependency-injector` for clean, testable code:
64
+
65
+ ```python
66
+ from framework_m_core.container import Container
67
+
68
+ container = Container()
69
+ container.wire(modules=["my_app.services"])
70
+ ```
71
+
72
+ ### CLI Framework
73
+
74
+ Built on `cyclopts` for powerful command-line interfaces:
75
+
76
+ ```python
77
+ from framework_m_core.cli import app
78
+
79
+ @app.command
80
+ def my_command():
81
+ """My custom command."""
82
+ pass
83
+ ```
84
+
85
+ ## Usage
86
+
87
+ This package is typically used as a dependency of `framework-m` or `framework-m-standard`.
88
+ For most applications, install the full `framework-m` package instead.
89
+
90
+ ## License
91
+
92
+ MIT License - see [LICENSE](https://gitlab.com/castlecraft/framework-m/blob/main/LICENSE) for details.
@@ -0,0 +1,78 @@
1
+ # Framework M Core
2
+
3
+ [![PyPI version](https://badge.fury.io/py/framework-m-core.svg)](https://badge.fury.io/py/framework-m-core)
4
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![GitLab Pipeline Status](https://gitlab.com/castlecraft/framework-m/badges/main/pipeline.svg)](https://gitlab.com/castlecraft/framework-m/-/pipelines)
7
+
8
+ Core protocols and dependency injection container for Framework M.
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ pip install framework-m-core
14
+ ```
15
+
16
+ Or with `uv`:
17
+
18
+ ```bash
19
+ uv add framework-m-core
20
+ ```
21
+
22
+ ## What's Included
23
+
24
+ ### Protocol Interfaces (Ports)
25
+
26
+ Framework M Core defines the protocol interfaces that adapters must implement:
27
+
28
+ | Protocol | Purpose |
29
+ |----------|---------|
30
+ | `RepositoryProtocol` | CRUD operations for documents |
31
+ | `EventBusProtocol` | Publish/subscribe events |
32
+ | `PermissionProtocol` | Authorization with RLS |
33
+ | `StorageProtocol` | File storage abstraction |
34
+ | `JobQueueProtocol` | Background job processing |
35
+ | `CacheProtocol` | Caching layer |
36
+ | `NotificationProtocol` | Email/SMS notifications |
37
+ | `SearchProtocol` | Full-text search |
38
+ | `PrintProtocol` | PDF generation |
39
+ | `I18nProtocol` | Internationalization |
40
+
41
+ ### Domain Base Classes
42
+
43
+ - `BaseDocType` - Base class for all document types
44
+ - `BaseController` - Lifecycle hooks (validate, before_save, after_save, etc.)
45
+ - `SubmittableMixin` - For documents with submit/cancel workflow
46
+
47
+ ### Dependency Injection
48
+
49
+ Built on `dependency-injector` for clean, testable code:
50
+
51
+ ```python
52
+ from framework_m_core.container import Container
53
+
54
+ container = Container()
55
+ container.wire(modules=["my_app.services"])
56
+ ```
57
+
58
+ ### CLI Framework
59
+
60
+ Built on `cyclopts` for powerful command-line interfaces:
61
+
62
+ ```python
63
+ from framework_m_core.cli import app
64
+
65
+ @app.command
66
+ def my_command():
67
+ """My custom command."""
68
+ pass
69
+ ```
70
+
71
+ ## Usage
72
+
73
+ This package is typically used as a dependency of `framework-m` or `framework-m-standard`.
74
+ For most applications, install the full `framework-m` package instead.
75
+
76
+ ## License
77
+
78
+ MIT License - see [LICENSE](https://gitlab.com/castlecraft/framework-m/blob/main/LICENSE) for details.
@@ -0,0 +1,31 @@
1
+ [project]
2
+ name = "framework-m-core"
3
+ version = "0.4.1"
4
+ description = "Core protocols and dependency injection for Framework M"
5
+ readme = "README.md"
6
+ license = { text = "MIT" }
7
+ requires-python = ">=3.12"
8
+ authors = [
9
+ { name = "Framework M Contributors" }
10
+ ]
11
+ dependencies = [
12
+ "pydantic>=2.0.0",
13
+ "pydantic-settings>=2.0.0",
14
+ "dependency-injector>=4.41.0",
15
+ "argon2-cffi>=23.1.0",
16
+ "cyclopts>=3.0.0",
17
+ ]
18
+
19
+ [build-system]
20
+ requires = ["hatchling"]
21
+ build-backend = "hatchling.build"
22
+
23
+ [tool.hatch.build.targets.wheel]
24
+ packages = ["src/framework_m_core"]
25
+
26
+ [tool.mypy]
27
+ python_version = "3.12"
28
+ strict = true
29
+ warn_return_any = true
30
+ warn_unused_ignores = true
31
+ disallow_untyped_defs = true
@@ -0,0 +1,29 @@
1
+ """Core module - Domain logic and interfaces."""
2
+
3
+ import importlib.metadata
4
+
5
+ from framework_m_core.container import Container
6
+ from framework_m_core.domain.base_doctype import BaseDocType as DocType
7
+ from framework_m_core.domain.base_doctype import Field
8
+ from framework_m_core.interfaces.base_doctype import BaseDocTypeProtocol
9
+ from framework_m_core.interfaces.bootstrap import BootstrapProtocol
10
+ from framework_m_core.interfaces.controller import BaseControllerProtocol
11
+ from framework_m_core.interfaces.schema_mapper import SchemaMapperProtocol
12
+ from framework_m_core.registry import MetaRegistry
13
+
14
+ try:
15
+ __version__ = importlib.metadata.version("framework-m-core")
16
+ except importlib.metadata.PackageNotFoundError:
17
+ __version__ = "0.0.0"
18
+
19
+ __all__ = [
20
+ "BaseControllerProtocol",
21
+ "BaseDocTypeProtocol",
22
+ "BootstrapProtocol",
23
+ "Container",
24
+ "DocType",
25
+ "Field",
26
+ "MetaRegistry",
27
+ "SchemaMapperProtocol",
28
+ "__version__",
29
+ ]
@@ -0,0 +1,128 @@
1
+ """Configuration Management CLI Commands.
2
+
3
+ This module provides CLI commands for managing Framework M configuration:
4
+ - m config:show: Display current configuration
5
+ - m config:set <key> <value>: Update configuration value
6
+
7
+ Usage:
8
+ m config:show # Show all config
9
+ m config:set framework.name myapp
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from pathlib import Path
15
+ from typing import Annotated, Any
16
+
17
+ import cyclopts
18
+
19
+ from framework_m_core.config import (
20
+ CONFIG_FILE_NAME,
21
+ DEFAULT_CONFIG,
22
+ find_config_file,
23
+ format_config,
24
+ get_nested_value,
25
+ load_config,
26
+ save_config,
27
+ set_nested_value,
28
+ )
29
+
30
+ # =============================================================================
31
+ # CLI Commands
32
+ # =============================================================================
33
+
34
+
35
+ def config_show_command(
36
+ key: Annotated[
37
+ str | None,
38
+ cyclopts.Parameter(help="Specific key to show (e.g., framework.name)"),
39
+ ] = None,
40
+ config_file: Annotated[
41
+ Path | None,
42
+ cyclopts.Parameter(name="--config", help="Path to config file"),
43
+ ] = None,
44
+ ) -> None:
45
+ """Display current configuration.
46
+
47
+ Shows the current Framework M configuration from framework_config.toml.
48
+
49
+ Examples:
50
+ m config:show # Show all config
51
+ m config:show framework.name # Show specific key
52
+ """
53
+ config_path = config_file or find_config_file()
54
+ config = load_config(config_path)
55
+
56
+ if not config:
57
+ print(f"No config found at: {config_path}")
58
+ print()
59
+ print("Create a config file with default values:")
60
+ print(" m config:set framework.name myapp")
61
+ return
62
+
63
+ print(f"Config file: {config_path}")
64
+ print()
65
+
66
+ if key:
67
+ value = get_nested_value(config, key)
68
+ if value is not None:
69
+ print(f"{key} = {value}")
70
+ else:
71
+ print(f"Key not found: {key}")
72
+ raise SystemExit(1)
73
+ else:
74
+ print(format_config(config))
75
+
76
+
77
+ def config_set_command(
78
+ key: Annotated[str, cyclopts.Parameter(help="Key to set (e.g., framework.name)")],
79
+ value: Annotated[str, cyclopts.Parameter(help="Value to set")],
80
+ config_file: Annotated[
81
+ Path | None,
82
+ cyclopts.Parameter(name="--config", help="Path to config file"),
83
+ ] = None,
84
+ ) -> None:
85
+ """Set a configuration value.
86
+
87
+ Updates a value in framework_config.toml, creating the file if needed.
88
+
89
+ Examples:
90
+ m config:set framework.name myapp
91
+ m config:set apps.installed "myapp,otherapp"
92
+ """
93
+ config_path = config_file or find_config_file()
94
+ config = load_config(config_path) or DEFAULT_CONFIG.copy()
95
+
96
+ # Parse value (handle lists)
97
+ if "," in value:
98
+ parsed_value: Any = [v.strip() for v in value.split(",")]
99
+ else:
100
+ parsed_value = value
101
+
102
+ old_value = get_nested_value(config, key)
103
+ set_nested_value(config, key, parsed_value)
104
+
105
+ save_config(config_path, config)
106
+
107
+ print(f"Config file: {config_path}")
108
+ print()
109
+ if old_value is not None:
110
+ print(f" {key}: {old_value} -> {parsed_value}")
111
+ else:
112
+ print(f" {key} = {parsed_value}")
113
+ print()
114
+ print("✓ Configuration updated")
115
+
116
+
117
+ __all__ = [
118
+ "CONFIG_FILE_NAME",
119
+ "DEFAULT_CONFIG",
120
+ "config_set_command",
121
+ "config_show_command",
122
+ "find_config_file",
123
+ "format_config",
124
+ "get_nested_value",
125
+ "load_config",
126
+ "save_config",
127
+ "set_nested_value",
128
+ ]
@@ -0,0 +1,30 @@
1
+ import cyclopts
2
+
3
+ from framework_m_core import __version__
4
+ from framework_m_core.cli.config import config_set_command, config_show_command
5
+ from framework_m_core.cli.plugin_loader import load_plugins
6
+ from framework_m_core.cli.utility import info_command
7
+
8
+ app = cyclopts.App(
9
+ name="m",
10
+ version=__version__,
11
+ help="Framework M CLI",
12
+ )
13
+
14
+ # Register core commands
15
+ app.command(info_command, name="info")
16
+
17
+ # Config commands
18
+ app.command(config_show_command, name="config:show")
19
+ app.command(config_set_command, name="config:set")
20
+
21
+ # Load plugins
22
+ load_plugins(app)
23
+
24
+
25
+ def main() -> None:
26
+ app()
27
+
28
+
29
+ if __name__ == "__main__":
30
+ main()