framework-m-core 0.30.0__tar.gz → 0.30.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 (274) hide show
  1. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/CHANGELOG.md +12 -0
  2. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/PKG-INFO +2 -2
  3. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/pyproject.toml +2 -2
  4. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/print_format.py +50 -1
  5. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/mixins.py +4 -1
  6. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/schema_enrichment.py +21 -0
  7. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/domain/test_mixins.py +11 -0
  8. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/test_schema_enrichment.py +31 -0
  9. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/.gitignore +0 -0
  10. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/LICENSE +0 -0
  11. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/README.md +0 -0
  12. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/__init__.py +0 -0
  13. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/cli/__init__.py +0 -0
  14. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/cli/config.py +0 -0
  15. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/cli/main.py +0 -0
  16. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/cli/plugin_loader.py +0 -0
  17. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/cli/utility.py +0 -0
  18. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/config.py +0 -0
  19. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/container.py +0 -0
  20. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/decorators.py +0 -0
  21. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/di.py +0 -0
  22. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/__init__.py +0 -0
  23. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/activity_log.py +0 -0
  24. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/api_key.py +0 -0
  25. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/auto_report.py +0 -0
  26. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/custom_permission.py +0 -0
  27. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/document_share.py +0 -0
  28. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/email_queue.py +0 -0
  29. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/error_log.py +0 -0
  30. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/file.py +0 -0
  31. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/idempotency_key.py +0 -0
  32. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/job_log.py +0 -0
  33. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/landing_candidate.py +0 -0
  34. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/letterhead.py +0 -0
  35. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/notification.py +0 -0
  36. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/recent_document.py +0 -0
  37. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/report.py +0 -0
  38. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/saved_view.py +0 -0
  39. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/scheduled_job.py +0 -0
  40. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/session.py +0 -0
  41. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/social_account.py +0 -0
  42. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/system_settings.py +0 -0
  43. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/tenant_translation.py +0 -0
  44. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/todo.py +0 -0
  45. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/translation.py +0 -0
  46. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/user.py +0 -0
  47. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/webhook.py +0 -0
  48. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/webhook_log.py +0 -0
  49. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/workflow.py +0 -0
  50. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/workflow_state.py +0 -0
  51. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/workflow_state_definition.py +0 -0
  52. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/workflow_transition.py +0 -0
  53. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/doctypes/workflow_transition_definition.py +0 -0
  54. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/__init__.py +0 -0
  55. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/base_controller.py +0 -0
  56. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/base_doctype.py +0 -0
  57. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/diff.py +0 -0
  58. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/landing.py +0 -0
  59. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/meta.py +0 -0
  60. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/migration_engine.py +0 -0
  61. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/naming_counter.py +0 -0
  62. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/navigation.py +0 -0
  63. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/outbox.py +0 -0
  64. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/domain/redactor.py +0 -0
  65. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/events/__init__.py +0 -0
  66. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/events/handlers.py +0 -0
  67. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/exceptions.py +0 -0
  68. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/__init__.py +0 -0
  69. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/audit.py +0 -0
  70. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/auth_context.py +0 -0
  71. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/authentication.py +0 -0
  72. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/base_doctype.py +0 -0
  73. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/bootstrap.py +0 -0
  74. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/cache.py +0 -0
  75. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/composition.py +0 -0
  76. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/controller.py +0 -0
  77. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/db_resolver.py +0 -0
  78. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/defaults.py +0 -0
  79. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/discovery.py +0 -0
  80. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/email_queue.py +0 -0
  81. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/email_sender.py +0 -0
  82. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/event_bus.py +0 -0
  83. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/feature_entitlement.py +0 -0
  84. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/i18n.py +0 -0
  85. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/idempotency.py +0 -0
  86. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/identity.py +0 -0
  87. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/introspection.py +0 -0
  88. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/job_logger.py +0 -0
  89. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/job_queue.py +0 -0
  90. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/landing.py +0 -0
  91. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/logging.py +0 -0
  92. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/metering.py +0 -0
  93. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/navigation.py +0 -0
  94. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/notification.py +0 -0
  95. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/oauth.py +0 -0
  96. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/permission.py +0 -0
  97. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/print.py +0 -0
  98. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/read_model.py +0 -0
  99. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/redactor.py +0 -0
  100. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/registry.py +0 -0
  101. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/report_engine.py +0 -0
  102. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/repository.py +0 -0
  103. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/schema_mapper.py +0 -0
  104. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/search.py +0 -0
  105. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/secrets.py +0 -0
  106. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/session.py +0 -0
  107. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/sms_gateway.py +0 -0
  108. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/socket.py +0 -0
  109. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/storage.py +0 -0
  110. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/tenant.py +0 -0
  111. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/ticker.py +0 -0
  112. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/webhook.py +0 -0
  113. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/worker.py +0 -0
  114. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/interfaces/workflow.py +0 -0
  115. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/jobs_registry.py +0 -0
  116. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/locales/en/common.json +0 -0
  117. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/locales/es/common.json +0 -0
  118. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/locales/fr/common.json +0 -0
  119. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/locales/hi/common.json +0 -0
  120. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/locales/mr/common.json +0 -0
  121. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/locales/ta/common.json +0 -0
  122. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/locales/ur/common.json +0 -0
  123. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/metadata_decorator.py +0 -0
  124. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/permission_lookup.py +0 -0
  125. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/permissions.py +0 -0
  126. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/pii.py +0 -0
  127. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/py.typed +0 -0
  128. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/registry.py +0 -0
  129. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/rls.py +0 -0
  130. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/rpc_registry.py +0 -0
  131. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/security.py +0 -0
  132. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/services/__init__.py +0 -0
  133. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/services/defaults_service.py +0 -0
  134. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/services/document_id.py +0 -0
  135. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/services/health_server.py +0 -0
  136. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/services/landing.py +0 -0
  137. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/services/secrets_service.py +0 -0
  138. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/services/user_manager.py +0 -0
  139. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/services/webhook_dispatcher.py +0 -0
  140. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/system_context.py +0 -0
  141. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/types/job_context.py +0 -0
  142. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/src/framework_m_core/unit_of_work.py +0 -0
  143. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/cli/test_cli_commands.py +0 -0
  144. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/cli/test_cli_init.py +0 -0
  145. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/cli/test_cli_main.py +0 -0
  146. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/cli/test_config.py +0 -0
  147. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/cli/test_info_plugins.py +0 -0
  148. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/cli/test_plugin_loader.py +0 -0
  149. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/cli/test_utility.py +0 -0
  150. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/conftest.py +0 -0
  151. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/doctypes/test_api_key.py +0 -0
  152. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/doctypes/test_job_log.py +0 -0
  153. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/doctypes/test_report.py +0 -0
  154. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/doctypes/test_scheduled_job.py +0 -0
  155. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/doctypes/test_social_account.py +0 -0
  156. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/doctypes/test_user.py +0 -0
  157. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/doctypes/test_webhook.py +0 -0
  158. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/doctypes/test_webhook_log.py +0 -0
  159. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/doctypes/test_workflow_ui.py +0 -0
  160. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/domain/test_meta_discovery.py +0 -0
  161. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/domain/test_naming_counter.py +0 -0
  162. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/events/test_doc_events.py +0 -0
  163. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/interfaces/test_cache.py +0 -0
  164. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/interfaces/test_email_queue_protocol.py +0 -0
  165. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/interfaces/test_idempotency.py +0 -0
  166. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/interfaces/test_identity.py +0 -0
  167. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/interfaces/test_repository_temporal.py +0 -0
  168. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/interfaces/test_sms_gateway.py +0 -0
  169. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/interfaces/test_socket.py +0 -0
  170. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/interfaces/test_workflow.py +0 -0
  171. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/services/test_user_manager.py +0 -0
  172. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/services/test_webhook_dispatcher.py +0 -0
  173. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_activity_log.py +0 -0
  174. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_child_table_permissions.py +0 -0
  175. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_container.py +0 -0
  176. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_container_async.py +0 -0
  177. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_custom_permission.py +0 -0
  178. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_custom_protocols.py +0 -0
  179. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_di.py +0 -0
  180. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_document_share.py +0 -0
  181. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_email_queue.py +0 -0
  182. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_error_log.py +0 -0
  183. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_exceptions.py +0 -0
  184. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_exports.py +0 -0
  185. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_file.py +0 -0
  186. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_job_decorator.py +0 -0
  187. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_landing_candidate.py +0 -0
  188. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_link_field_leakage.py +0 -0
  189. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_meta_registry_baking.py +0 -0
  190. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_meta_registry_overrides.py +0 -0
  191. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_metadata_decorator.py +0 -0
  192. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_metadata_runtime_patch.py +0 -0
  193. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_notification.py +0 -0
  194. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_object_level_permissions.py +0 -0
  195. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_outbox.py +0 -0
  196. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_permission_config.py +0 -0
  197. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_permission_conveniences.py +0 -0
  198. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_permission_lookup.py +0 -0
  199. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_permissions.py +0 -0
  200. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_pii.py +0 -0
  201. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_print_format.py +0 -0
  202. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_rls.py +0 -0
  203. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_rpc_decorator.py +0 -0
  204. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_schema_extension.py +0 -0
  205. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_security.py +0 -0
  206. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_session.py +0 -0
  207. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_share_lookup.py +0 -0
  208. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_singles.py +0 -0
  209. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_system_context.py +0 -0
  210. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_system_settings.py +0 -0
  211. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_table_alteration.py +0 -0
  212. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_team_based_access.py +0 -0
  213. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_tenant.py +0 -0
  214. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_ui_context_registry.py +0 -0
  215. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_unit_of_work.py +0 -0
  216. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_user_preferences_locale.py +0 -0
  217. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/test_whitelist_decorator.py +0 -0
  218. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/core/types/test_job_context.py +0 -0
  219. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/domain/test_landing_models.py +0 -0
  220. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/domain/test_navigation_models.py +0 -0
  221. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/domain/test_registry_roles.py +0 -0
  222. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/events/test_auth_events.py +0 -0
  223. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/interfaces/test_activity_registry.py +0 -0
  224. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/interfaces/test_authentication.py +0 -0
  225. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/interfaces/test_discovery_port.py +0 -0
  226. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/interfaces/test_logging_protocol.py +0 -0
  227. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/interfaces/test_redactor_port.py +0 -0
  228. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/interfaces/test_worker_protocol.py +0 -0
  229. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/services/test_health_server.py +0 -0
  230. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/doctypes/test_auto_report.py +0 -0
  231. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/doctypes/test_saved_view.py +0 -0
  232. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/domain/test_base_controller.py +0 -0
  233. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/domain/test_base_controller_audit.py +0 -0
  234. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/domain/test_base_controller_submitted.py +0 -0
  235. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/domain/test_base_doctype_implements_protocol.py +0 -0
  236. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/domain/test_diff.py +0 -0
  237. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/domain/test_migration_engine.py +0 -0
  238. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/domain/test_redactor_logic.py +0 -0
  239. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/events/test_read_model_projector.py +0 -0
  240. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_audit.py +0 -0
  241. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_auth_context.py +0 -0
  242. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_base_doctype_protocol.py +0 -0
  243. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_bootstrap_protocol.py +0 -0
  244. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_controller_protocol.py +0 -0
  245. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_core_report_engine.py +0 -0
  246. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_db_resolver.py +0 -0
  247. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_defaults.py +0 -0
  248. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_event_bus.py +0 -0
  249. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_feature_entitlement.py +0 -0
  250. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_i18n.py +0 -0
  251. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_introspection.py +0 -0
  252. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_job_queue.py +0 -0
  253. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_landing.py +0 -0
  254. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_metering.py +0 -0
  255. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_navigation.py +0 -0
  256. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_permission.py +0 -0
  257. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_print.py +0 -0
  258. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_repository.py +0 -0
  259. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_schema_mapper_protocol.py +0 -0
  260. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_search.py +0 -0
  261. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_smoke_interfaces.py +0 -0
  262. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_storage.py +0 -0
  263. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/interfaces/test_ticker.py +0 -0
  264. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/services/test_defaults_service.py +0 -0
  265. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/services/test_document_id.py +0 -0
  266. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/services/test_landing_service.py +0 -0
  267. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/services/test_secrets_service.py +0 -0
  268. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/test_config_expansion.py +0 -0
  269. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/test_config_schema.py +0 -0
  270. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/test_registry.py +0 -0
  271. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/test_registry_discovery.py +0 -0
  272. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/test_selective_apps.py +0 -0
  273. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/core/test_webhooks.py +0 -0
  274. {framework_m_core-0.30.0 → framework_m_core-0.30.2}/tests/unit/test_base_doctype.py +0 -0
@@ -1,3 +1,15 @@
1
+ ## framework-m-core v0.30.2
2
+
3
+ ### Bug Fixes
4
+
5
+ - dynamic resolution of app template directories via MetaRegistry (f4d3e66)
6
+
7
+ ## framework-m-core v0.30.1
8
+
9
+ ### Bug Fixes
10
+
11
+ - hide docstatus and support optional literal unions in schema enrichment (7b1e181)
12
+
1
13
  ## framework-m-core v0.30.0
2
14
 
3
15
  ### Features
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: framework-m-core
3
- Version: 0.30.0
3
+ Version: 0.30.2
4
4
  Summary: Core protocols and dependency injection for Framework M
5
5
  Author: Framework M Contributors
6
6
  License: Apache-2.0
7
7
  License-File: LICENSE
8
8
  Requires-Python: >=3.12
9
- Requires-Dist: cyclopts>=4.22.2
9
+ Requires-Dist: cyclopts>=4.22.4
10
10
  Requires-Dist: pydantic-settings>=2.14.2
11
11
  Requires-Dist: pydantic>=2.13.4
12
12
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "framework-m-core"
3
- version = "0.30.0"
3
+ version = "0.30.2"
4
4
  description = "Core protocols and dependency injection for Framework M"
5
5
  readme = "README.md"
6
6
  license = { text = "Apache-2.0" }
@@ -11,7 +11,7 @@ authors = [
11
11
  dependencies = [
12
12
  "pydantic>=2.13.4",
13
13
  "pydantic-settings>=2.14.2",
14
- "cyclopts>=4.22.2",
14
+ "cyclopts>=4.22.4",
15
15
  ]
16
16
 
17
17
  [build-system]
@@ -157,6 +157,55 @@ class PrintFormat(BaseDocType):
157
157
  # List view defaults to the first 4 schema fields, which would put the
158
158
  # raw Jinja template path/HTML in a table cell. Pick scannable columns.
159
159
  ui_meta = { # noqa: RUF012
160
+ "form": {
161
+ "tabs": [
162
+ {
163
+ "label": "Basic Info",
164
+ "sections": [
165
+ {
166
+ "label": "Format Details",
167
+ "fields": ["name", "doctype", "is_default"],
168
+ "columns": 2,
169
+ },
170
+ {
171
+ "label": "Template",
172
+ "fields": ["template", "custom_html"],
173
+ "columns": 2,
174
+ },
175
+ {
176
+ "label": "Styling",
177
+ "fields": ["css", "header_html", "footer_html"],
178
+ "columns": 2,
179
+ },
180
+ ],
181
+ },
182
+ {
183
+ "label": "Page Settings",
184
+ "sections": [
185
+ {
186
+ "label": "Page Layout",
187
+ "fields": ["page_size", "orientation", "repeat_header"],
188
+ "columns": 2,
189
+ },
190
+ {
191
+ "label": "Page Numbers",
192
+ "fields": ["show_page_numbers", "page_number_style"],
193
+ "columns": 2,
194
+ },
195
+ {
196
+ "label": "Margins (inches)",
197
+ "fields": [
198
+ "margin_top",
199
+ "margin_bottom",
200
+ "margin_left",
201
+ "margin_right",
202
+ ],
203
+ "columns": 2,
204
+ },
205
+ ],
206
+ },
207
+ ],
208
+ },
160
209
  "list": {
161
210
  "columns": [
162
211
  {"field": "name", "label": "Name"},
@@ -164,7 +213,7 @@ class PrintFormat(BaseDocType):
164
213
  {"field": "is_default", "label": "Default", "width": 90},
165
214
  {"field": "page_size", "label": "Page Size", "width": 100},
166
215
  ],
167
- }
216
+ },
168
217
  }
169
218
 
170
219
  # Permissions - admins manage, all read
@@ -59,7 +59,10 @@ class SubmittableMixin(BaseModel):
59
59
  invoice.can_edit() # False (submitted)
60
60
  """
61
61
 
62
- docstatus: DocStatus = Field(default=DocStatus.DRAFT)
62
+ docstatus: DocStatus = Field(
63
+ default=DocStatus.DRAFT,
64
+ json_schema_extra={"ui_meta": {"hidden": True}},
65
+ )
63
66
 
64
67
  def is_submitted(self) -> bool:
65
68
  """Check if document is in submitted state."""
@@ -104,11 +104,29 @@ def _enrich_property(
104
104
  if "items" in prop and isinstance(prop["items"], dict):
105
105
  prop["items"] = _enrich_property(prop["items"], defs)
106
106
 
107
+ # Recursively enrich schema combinations (anyOf, allOf, oneOf)
108
+ for comb_key in ("anyOf", "allOf", "oneOf"):
109
+ if comb_key in prop and isinstance(prop[comb_key], list):
110
+ prop[comb_key] = [
111
+ _enrich_property(item, defs) if isinstance(item, dict) else item
112
+ for item in prop[comb_key]
113
+ ]
114
+
107
115
  # Ensure ui_meta exists
108
116
  ui_meta: dict[str, Any] = copy.deepcopy(prop.get("ui_meta", {}))
109
117
 
110
118
  # Surface enum values under ui_meta.options if not already there
111
119
  enum_values: list[Any] | None = prop.get("enum")
120
+ if not enum_values:
121
+ for comb_key in ("anyOf", "allOf", "oneOf"):
122
+ if comb_key in prop and isinstance(prop[comb_key], list):
123
+ for sub_schema in prop[comb_key]:
124
+ if isinstance(sub_schema, dict) and "enum" in sub_schema:
125
+ enum_values = sub_schema["enum"]
126
+ break
127
+ if enum_values:
128
+ break
129
+
112
130
  if enum_values and "options" not in ui_meta:
113
131
  ui_meta["options"] = [
114
132
  {"value": v, "label": str(v).replace("_", " ").title()} for v in enum_values
@@ -152,6 +170,9 @@ def enrich_schema(schema: dict[str, Any]) -> dict[str, Any]:
152
170
 
153
171
  enriched_properties: dict[str, Any] = {}
154
172
  for field_name, prop in properties.items():
173
+ if field_name == "docstatus":
174
+ ui_meta = prop.setdefault("ui_meta", {})
175
+ ui_meta["hidden"] = True
155
176
  enriched_properties[field_name] = _enrich_property(prop, defs)
156
177
 
157
178
  schema["properties"] = enriched_properties
@@ -105,6 +105,17 @@ class TestSubmittableMixin:
105
105
 
106
106
  assert invoice.docstatus == DocStatus.SUBMITTED
107
107
 
108
+ def test_docstatus_hidden_in_ui_meta(self) -> None:
109
+ """docstatus should have ui_meta hidden=True by default in SubmittableMixin."""
110
+
111
+ class BareSubmittable(DocType, SubmittableMixin):
112
+ pass
113
+
114
+ field_extra = BareSubmittable.model_fields["docstatus"].json_schema_extra
115
+ assert isinstance(field_extra, dict) and field_extra.get("ui_meta") == {
116
+ "hidden": True
117
+ }
118
+
108
119
 
109
120
  class TestMixinImports:
110
121
  """Tests for mixin imports."""
@@ -88,6 +88,32 @@ class TestLiteralFields:
88
88
  result = enrich_schema(schema)
89
89
  assert result["properties"]["status"]["ui_meta"]["options"] == custom_options
90
90
 
91
+ def test_optional_literal_union_options_populated(self) -> None:
92
+ """Optional Literal fields (rendered as anyOf with null in Pydantic v2) must surface options."""
93
+ schema = _schema(
94
+ {
95
+ "valuation_method": {
96
+ "anyOf": [
97
+ {
98
+ "type": "string",
99
+ "enum": ["FIFO", "Moving Average", "Standard Costing"],
100
+ },
101
+ {"type": "null"},
102
+ ],
103
+ "default": None,
104
+ "title": "Valuation Method",
105
+ }
106
+ }
107
+ )
108
+ result = enrich_schema(schema)
109
+ prop = result["properties"]["valuation_method"]
110
+
111
+ assert prop["ui_meta"]["options"] == [
112
+ {"value": "FIFO", "label": "Fifo"},
113
+ {"value": "Moving Average", "label": "Moving Average"},
114
+ {"value": "Standard Costing", "label": "Standard Costing"},
115
+ ]
116
+
91
117
 
92
118
  # ---------------------------------------------------------------------------
93
119
  # Python Enum via $ref
@@ -282,3 +308,8 @@ class TestSchemaIntegrity:
282
308
  schema = _schema({"description": {"type": "string", "title": "Description"}})
283
309
  result = enrich_schema(schema)
284
310
  assert "options" not in result["properties"]["description"]["ui_meta"]
311
+
312
+ def test_docstatus_automatically_hidden(self) -> None:
313
+ schema = _schema({"docstatus": {"type": "integer", "default": 0}})
314
+ result = enrich_schema(schema)
315
+ assert result["properties"]["docstatus"]["ui_meta"]["hidden"] is True