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.
- framework_m_core-0.4.1/.gitignore +119 -0
- framework_m_core-0.4.1/CHANGELOG.md +105 -0
- framework_m_core-0.4.1/PKG-INFO +92 -0
- framework_m_core-0.4.1/README.md +78 -0
- framework_m_core-0.4.1/pyproject.toml +31 -0
- framework_m_core-0.4.1/src/framework_m_core/__init__.py +29 -0
- framework_m_core-0.4.1/src/framework_m_core/cli/__init__.py +0 -0
- framework_m_core-0.4.1/src/framework_m_core/cli/config.py +128 -0
- framework_m_core-0.4.1/src/framework_m_core/cli/main.py +30 -0
- framework_m_core-0.4.1/src/framework_m_core/cli/plugin_loader.py +132 -0
- framework_m_core-0.4.1/src/framework_m_core/cli/utility.py +58 -0
- framework_m_core-0.4.1/src/framework_m_core/config.py +171 -0
- framework_m_core-0.4.1/src/framework_m_core/container.py +329 -0
- framework_m_core-0.4.1/src/framework_m_core/decorators.py +308 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/__init__.py +51 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/activity_log.py +123 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/api_key.py +89 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/custom_permission.py +118 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/document_share.py +142 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/email_queue.py +209 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/error_log.py +127 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/file.py +97 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/job_log.py +144 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/notification.py +146 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/print_format.py +124 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/recent_document.py +75 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/report.py +94 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/scheduled_job.py +97 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/session.py +71 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/social_account.py +88 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/system_settings.py +119 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/tenant_translation.py +133 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/todo.py +59 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/translation.py +107 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/user.py +115 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/webhook.py +127 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/webhook_log.py +114 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/workflow.py +51 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/workflow_state.py +56 -0
- framework_m_core-0.4.1/src/framework_m_core/doctypes/workflow_transition.py +57 -0
- framework_m_core-0.4.1/src/framework_m_core/domain/__init__.py +1 -0
- framework_m_core-0.4.1/src/framework_m_core/domain/base_controller.py +224 -0
- framework_m_core-0.4.1/src/framework_m_core/domain/base_doctype.py +287 -0
- framework_m_core-0.4.1/src/framework_m_core/domain/mixins.py +131 -0
- framework_m_core-0.4.1/src/framework_m_core/domain/naming_counter.py +50 -0
- framework_m_core-0.4.1/src/framework_m_core/domain/outbox.py +85 -0
- framework_m_core-0.4.1/src/framework_m_core/events/__init__.py +112 -0
- framework_m_core-0.4.1/src/framework_m_core/exceptions.py +144 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/__init__.py +23 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/audit.py +216 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/auth_context.py +165 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/authentication.py +86 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/base_doctype.py +54 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/bootstrap.py +110 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/cache.py +140 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/controller.py +157 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/email_queue.py +187 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/email_sender.py +143 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/event_bus.py +167 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/i18n.py +89 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/identity.py +198 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/job_queue.py +154 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/notification.py +145 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/oauth.py +130 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/permission.py +141 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/print.py +85 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/read_model.py +142 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/report_engine.py +90 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/repository.py +228 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/schema_mapper.py +164 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/search.py +133 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/session.py +167 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/socket.py +99 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/storage.py +181 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/tenant.py +165 -0
- framework_m_core-0.4.1/src/framework_m_core/interfaces/workflow.py +214 -0
- framework_m_core-0.4.1/src/framework_m_core/permission_lookup.py +203 -0
- framework_m_core-0.4.1/src/framework_m_core/permissions.py +228 -0
- framework_m_core-0.4.1/src/framework_m_core/pii.py +215 -0
- framework_m_core-0.4.1/src/framework_m_core/py.typed +0 -0
- framework_m_core-0.4.1/src/framework_m_core/registry.py +312 -0
- framework_m_core-0.4.1/src/framework_m_core/rls.py +201 -0
- framework_m_core-0.4.1/src/framework_m_core/rpc_registry.py +90 -0
- framework_m_core-0.4.1/src/framework_m_core/security.py +44 -0
- framework_m_core-0.4.1/src/framework_m_core/services/__init__.py +12 -0
- framework_m_core-0.4.1/src/framework_m_core/services/user_manager.py +187 -0
- framework_m_core-0.4.1/src/framework_m_core/system_context.py +151 -0
- framework_m_core-0.4.1/src/framework_m_core/types/job_context.py +94 -0
- framework_m_core-0.4.1/src/framework_m_core/unit_of_work.py +138 -0
- framework_m_core-0.4.1/tests/cli/test_cli_main.py +54 -0
- framework_m_core-0.4.1/tests/cli/test_config.py +350 -0
- framework_m_core-0.4.1/tests/cli/test_plugin_loader.py +135 -0
- framework_m_core-0.4.1/tests/cli/test_utility.py +101 -0
- framework_m_core-0.4.1/tests/conftest.py +56 -0
- framework_m_core-0.4.1/tests/core/doctypes/test_api_key.py +124 -0
- framework_m_core-0.4.1/tests/core/doctypes/test_job_log.py +193 -0
- framework_m_core-0.4.1/tests/core/doctypes/test_report.py +202 -0
- framework_m_core-0.4.1/tests/core/doctypes/test_scheduled_job.py +72 -0
- framework_m_core-0.4.1/tests/core/doctypes/test_social_account.py +134 -0
- framework_m_core-0.4.1/tests/core/doctypes/test_user.py +239 -0
- framework_m_core-0.4.1/tests/core/doctypes/test_webhook.py +255 -0
- framework_m_core-0.4.1/tests/core/doctypes/test_webhook_log.py +183 -0
- framework_m_core-0.4.1/tests/core/events/test_doc_events.py +181 -0
- framework_m_core-0.4.1/tests/core/interfaces/test_cache.py +123 -0
- framework_m_core-0.4.1/tests/core/interfaces/test_email_queue_protocol.py +230 -0
- framework_m_core-0.4.1/tests/core/interfaces/test_identity.py +218 -0
- framework_m_core-0.4.1/tests/core/interfaces/test_socket.py +135 -0
- framework_m_core-0.4.1/tests/core/interfaces/test_workflow.py +664 -0
- framework_m_core-0.4.1/tests/core/services/test_user_manager.py +279 -0
- framework_m_core-0.4.1/tests/core/test_activity_log.py +161 -0
- framework_m_core-0.4.1/tests/core/test_child_table_permissions.py +165 -0
- framework_m_core-0.4.1/tests/core/test_container.py +218 -0
- framework_m_core-0.4.1/tests/core/test_custom_permission.py +174 -0
- framework_m_core-0.4.1/tests/core/test_custom_protocols.py +511 -0
- framework_m_core-0.4.1/tests/core/test_document_share.py +171 -0
- framework_m_core-0.4.1/tests/core/test_email_queue.py +292 -0
- framework_m_core-0.4.1/tests/core/test_error_log.py +148 -0
- framework_m_core-0.4.1/tests/core/test_exceptions.py +214 -0
- framework_m_core-0.4.1/tests/core/test_file.py +151 -0
- framework_m_core-0.4.1/tests/core/test_link_field_leakage.py +237 -0
- framework_m_core-0.4.1/tests/core/test_meta_registry_overrides.py +273 -0
- framework_m_core-0.4.1/tests/core/test_notification.py +151 -0
- framework_m_core-0.4.1/tests/core/test_object_level_permissions.py +288 -0
- framework_m_core-0.4.1/tests/core/test_outbox.py +114 -0
- framework_m_core-0.4.1/tests/core/test_permission_config.py +228 -0
- framework_m_core-0.4.1/tests/core/test_permission_conveniences.py +292 -0
- framework_m_core-0.4.1/tests/core/test_permission_lookup.py +251 -0
- framework_m_core-0.4.1/tests/core/test_pii.py +197 -0
- framework_m_core-0.4.1/tests/core/test_print_format.py +182 -0
- framework_m_core-0.4.1/tests/core/test_rls.py +249 -0
- framework_m_core-0.4.1/tests/core/test_rpc_decorator.py +205 -0
- framework_m_core-0.4.1/tests/core/test_schema_extension.py +578 -0
- framework_m_core-0.4.1/tests/core/test_session.py +265 -0
- framework_m_core-0.4.1/tests/core/test_share_lookup.py +182 -0
- framework_m_core-0.4.1/tests/core/test_system_context.py +124 -0
- framework_m_core-0.4.1/tests/core/test_system_settings.py +140 -0
- framework_m_core-0.4.1/tests/core/test_table_alteration.py +502 -0
- framework_m_core-0.4.1/tests/core/test_team_based_access.py +243 -0
- framework_m_core-0.4.1/tests/core/test_tenant.py +164 -0
- framework_m_core-0.4.1/tests/core/test_unit_of_work.py +156 -0
- framework_m_core-0.4.1/tests/core/test_whitelist_decorator.py +162 -0
- framework_m_core-0.4.1/tests/core/types/test_job_context.py +122 -0
- framework_m_core-0.4.1/tests/unit/core/domain/test_base_controller.py +480 -0
- framework_m_core-0.4.1/tests/unit/core/domain/test_base_doctype_implements_protocol.py +163 -0
- framework_m_core-0.4.1/tests/unit/core/domain/test_mixins.py +121 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_audit.py +261 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_auth_context.py +176 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_base_doctype_protocol.py +183 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_bootstrap_protocol.py +189 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_controller_protocol.py +230 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_event_bus.py +97 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_i18n.py +684 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_job_queue.py +131 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_permission.py +75 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_print.py +28 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_repository.py +188 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_schema_mapper_protocol.py +163 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_search.py +73 -0
- framework_m_core-0.4.1/tests/unit/core/interfaces/test_storage.py +199 -0
- framework_m_core-0.4.1/tests/unit/core/test_registry.py +339 -0
- 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
|
+
[](https://badge.fury.io/py/framework-m-core)
|
|
18
|
+
[](https://www.python.org/downloads/)
|
|
19
|
+
[](https://opensource.org/licenses/MIT)
|
|
20
|
+
[](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
|
+
[](https://badge.fury.io/py/framework-m-core)
|
|
4
|
+
[](https://www.python.org/downloads/)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
[](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
|
+
]
|
|
File without changes
|
|
@@ -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()
|