julee 0.1.4__tar.gz → 0.1.6__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 (314) hide show
  1. julee-0.1.6/PKG-INFO +104 -0
  2. julee-0.1.6/README.md +38 -0
  3. {julee-0.1.4 → julee-0.1.6}/pyproject.toml +14 -1
  4. {julee-0.1.4 → julee-0.1.6}/src/julee/__init__.py +1 -1
  5. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/routers/test_assembly_specifications.py +2 -0
  6. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/routers/test_documents.py +2 -0
  7. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/routers/test_knowledge_service_configs.py +2 -0
  8. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/routers/test_knowledge_service_queries.py +2 -0
  9. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/routers/test_system.py +2 -0
  10. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/routers/test_workflows.py +2 -0
  11. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/test_app.py +2 -0
  12. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/test_dependencies.py +2 -0
  13. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/test_requests.py +2 -0
  14. julee-0.1.6/src/julee/contrib/polling/__init__.py +50 -0
  15. julee-0.1.6/src/julee/contrib/polling/apps/__init__.py +17 -0
  16. julee-0.1.6/src/julee/contrib/polling/apps/worker/__init__.py +17 -0
  17. julee-0.1.6/src/julee/contrib/polling/apps/worker/pipelines.py +288 -0
  18. julee-0.1.6/src/julee/contrib/polling/domain/__init__.py +15 -0
  19. julee-0.1.6/src/julee/contrib/polling/domain/models/__init__.py +12 -0
  20. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/domain/models/polling_config.py +18 -1
  21. julee-0.1.6/src/julee/contrib/polling/domain/services/__init__.py +12 -0
  22. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/domain/services/poller.py +1 -1
  23. julee-0.1.6/src/julee/contrib/polling/infrastructure/__init__.py +16 -0
  24. julee-0.1.6/src/julee/contrib/polling/infrastructure/services/__init__.py +13 -0
  25. julee-0.1.6/src/julee/contrib/polling/infrastructure/services/polling/__init__.py +13 -0
  26. julee-0.1.6/src/julee/contrib/polling/infrastructure/services/polling/http/__init__.py +13 -0
  27. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/infrastructure/services/polling/http/http_poller_service.py +5 -2
  28. julee-0.1.6/src/julee/contrib/polling/infrastructure/temporal/__init__.py +20 -0
  29. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/infrastructure/temporal/activities.py +1 -1
  30. julee-0.1.6/src/julee/contrib/polling/infrastructure/temporal/manager.py +291 -0
  31. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/infrastructure/temporal/proxies.py +1 -1
  32. julee-0.1.6/src/julee/contrib/polling/tests/unit/apps/worker/test_pipelines.py +580 -0
  33. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/tests/unit/infrastructure/services/polling/http/test_http_poller_service.py +40 -2
  34. julee-0.1.6/src/julee/contrib/polling/tests/unit/infrastructure/temporal/__init__.py +7 -0
  35. julee-0.1.6/src/julee/contrib/polling/tests/unit/infrastructure/temporal/test_manager.py +475 -0
  36. julee-0.1.6/src/julee/docs/sphinx_hcd/__init__.py +209 -0
  37. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/__init__.py +5 -0
  38. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/models/__init__.py +32 -0
  39. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/models/accelerator.py +152 -0
  40. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/models/app.py +151 -0
  41. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/models/code_info.py +121 -0
  42. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/models/epic.py +79 -0
  43. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/models/integration.py +230 -0
  44. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/models/journey.py +222 -0
  45. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/models/persona.py +106 -0
  46. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/models/story.py +128 -0
  47. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/repositories/__init__.py +25 -0
  48. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/repositories/accelerator.py +98 -0
  49. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/repositories/app.py +57 -0
  50. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/repositories/base.py +89 -0
  51. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/repositories/code_info.py +69 -0
  52. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/repositories/epic.py +62 -0
  53. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/repositories/integration.py +79 -0
  54. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/repositories/journey.py +106 -0
  55. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/repositories/story.py +68 -0
  56. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/use_cases/__init__.py +64 -0
  57. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/use_cases/derive_personas.py +166 -0
  58. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/use_cases/resolve_accelerator_references.py +236 -0
  59. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/use_cases/resolve_app_references.py +144 -0
  60. julee-0.1.6/src/julee/docs/sphinx_hcd/domain/use_cases/resolve_story_references.py +121 -0
  61. julee-0.1.6/src/julee/docs/sphinx_hcd/parsers/__init__.py +48 -0
  62. julee-0.1.6/src/julee/docs/sphinx_hcd/parsers/ast.py +150 -0
  63. julee-0.1.6/src/julee/docs/sphinx_hcd/parsers/gherkin.py +155 -0
  64. julee-0.1.6/src/julee/docs/sphinx_hcd/parsers/yaml.py +184 -0
  65. julee-0.1.6/src/julee/docs/sphinx_hcd/repositories/__init__.py +4 -0
  66. julee-0.1.6/src/julee/docs/sphinx_hcd/repositories/memory/__init__.py +25 -0
  67. julee-0.1.6/src/julee/docs/sphinx_hcd/repositories/memory/accelerator.py +86 -0
  68. julee-0.1.6/src/julee/docs/sphinx_hcd/repositories/memory/app.py +45 -0
  69. julee-0.1.6/src/julee/docs/sphinx_hcd/repositories/memory/base.py +106 -0
  70. julee-0.1.6/src/julee/docs/sphinx_hcd/repositories/memory/code_info.py +59 -0
  71. julee-0.1.6/src/julee/docs/sphinx_hcd/repositories/memory/epic.py +54 -0
  72. julee-0.1.6/src/julee/docs/sphinx_hcd/repositories/memory/integration.py +70 -0
  73. julee-0.1.6/src/julee/docs/sphinx_hcd/repositories/memory/journey.py +96 -0
  74. julee-0.1.6/src/julee/docs/sphinx_hcd/repositories/memory/story.py +63 -0
  75. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/__init__.py +28 -0
  76. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/adapters.py +116 -0
  77. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/context.py +163 -0
  78. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/directives/__init__.py +160 -0
  79. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/directives/accelerator.py +576 -0
  80. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/directives/app.py +349 -0
  81. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/directives/base.py +211 -0
  82. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/directives/epic.py +434 -0
  83. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/directives/integration.py +220 -0
  84. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/directives/journey.py +642 -0
  85. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/directives/persona.py +345 -0
  86. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/directives/story.py +575 -0
  87. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/event_handlers/__init__.py +16 -0
  88. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/event_handlers/builder_inited.py +31 -0
  89. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/event_handlers/doctree_read.py +27 -0
  90. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/event_handlers/doctree_resolved.py +43 -0
  91. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/event_handlers/env_purge_doc.py +42 -0
  92. julee-0.1.6/src/julee/docs/sphinx_hcd/sphinx/initialization.py +139 -0
  93. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/__init__.py +9 -0
  94. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/conftest.py +6 -0
  95. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/__init__.py +1 -0
  96. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/models/__init__.py +1 -0
  97. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/models/test_accelerator.py +266 -0
  98. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/models/test_app.py +258 -0
  99. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/models/test_code_info.py +231 -0
  100. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/models/test_epic.py +163 -0
  101. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/models/test_integration.py +327 -0
  102. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/models/test_journey.py +249 -0
  103. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/models/test_persona.py +172 -0
  104. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/models/test_story.py +216 -0
  105. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/use_cases/__init__.py +1 -0
  106. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/use_cases/test_derive_personas.py +314 -0
  107. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/use_cases/test_resolve_accelerator_references.py +476 -0
  108. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/use_cases/test_resolve_app_references.py +265 -0
  109. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/domain/use_cases/test_resolve_story_references.py +229 -0
  110. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/integration/__init__.py +1 -0
  111. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/parsers/__init__.py +1 -0
  112. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/parsers/test_ast.py +298 -0
  113. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/parsers/test_gherkin.py +282 -0
  114. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/parsers/test_yaml.py +496 -0
  115. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/repositories/__init__.py +1 -0
  116. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/repositories/test_accelerator.py +298 -0
  117. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/repositories/test_app.py +218 -0
  118. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/repositories/test_base.py +151 -0
  119. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/repositories/test_code_info.py +253 -0
  120. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/repositories/test_epic.py +237 -0
  121. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/repositories/test_integration.py +268 -0
  122. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/repositories/test_journey.py +294 -0
  123. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/repositories/test_story.py +236 -0
  124. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/sphinx/__init__.py +1 -0
  125. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/sphinx/directives/__init__.py +1 -0
  126. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/sphinx/directives/test_base.py +160 -0
  127. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/sphinx/test_adapters.py +176 -0
  128. julee-0.1.6/src/julee/docs/sphinx_hcd/tests/sphinx/test_context.py +257 -0
  129. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly/tests/test_assembly.py +2 -0
  130. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly_specification/tests/test_assembly_specification.py +2 -0
  131. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly_specification/tests/test_knowledge_service_query.py +2 -0
  132. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/custom_fields/tests/test_custom_fields.py +2 -0
  133. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/document/tests/test_document.py +2 -0
  134. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/policy/tests/test_document_policy_validation.py +2 -0
  135. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/policy/tests/test_policy.py +2 -0
  136. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/use_cases/tests/test_extract_assemble_data.py +2 -0
  137. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/use_cases/tests/test_initialize_system_data.py +2 -0
  138. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/use_cases/tests/test_validate_document.py +2 -0
  139. {julee-0.1.4 → julee-0.1.6}/src/julee/maintenance/release.py +10 -5
  140. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/tests/test_document.py +2 -0
  141. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/tests/test_document_policy_validation.py +2 -0
  142. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/tests/test_policy.py +2 -0
  143. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/tests/test_assembly.py +2 -0
  144. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/tests/test_assembly_specification.py +2 -0
  145. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/tests/test_client_protocol.py +3 -0
  146. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/tests/test_document.py +2 -0
  147. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/tests/test_document_policy_validation.py +2 -0
  148. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/tests/test_knowledge_service_config.py +2 -0
  149. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/tests/test_knowledge_service_query.py +2 -0
  150. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/tests/test_policy.py +2 -0
  151. {julee-0.1.4 → julee-0.1.6}/src/julee/services/knowledge_service/anthropic/tests/test_knowledge_service.py +2 -0
  152. {julee-0.1.4 → julee-0.1.6}/src/julee/services/knowledge_service/memory/test_knowledge_service.py +2 -0
  153. {julee-0.1.4 → julee-0.1.6}/src/julee/services/knowledge_service/test_factory.py +2 -0
  154. {julee-0.1.4 → julee-0.1.6}/src/julee/util/tests/test_decorators.py +2 -0
  155. julee-0.1.6/src/julee.egg-info/PKG-INFO +104 -0
  156. {julee-0.1.4 → julee-0.1.6}/src/julee.egg-info/SOURCES.txt +99 -7
  157. {julee-0.1.4 → julee-0.1.6}/src/julee.egg-info/requires.txt +2 -0
  158. julee-0.1.4/PKG-INFO +0 -197
  159. julee-0.1.4/README.md +0 -133
  160. julee-0.1.4/src/julee/contrib/polling/__init__.py +0 -47
  161. julee-0.1.4/src/julee/contrib/polling/domain/__init__.py +0 -17
  162. julee-0.1.4/src/julee/contrib/polling/domain/models/__init__.py +0 -13
  163. julee-0.1.4/src/julee/contrib/polling/domain/services/__init__.py +0 -11
  164. julee-0.1.4/src/julee/contrib/polling/infrastructure/__init__.py +0 -15
  165. julee-0.1.4/src/julee/contrib/polling/infrastructure/services/__init__.py +0 -12
  166. julee-0.1.4/src/julee/contrib/polling/infrastructure/services/polling/__init__.py +0 -12
  167. julee-0.1.4/src/julee/contrib/polling/infrastructure/services/polling/http/__init__.py +0 -12
  168. julee-0.1.4/src/julee/contrib/polling/infrastructure/temporal/__init__.py +0 -20
  169. julee-0.1.4/src/julee/docs/sphinx_hcd/__init__.py +0 -76
  170. julee-0.1.4/src/julee/docs/sphinx_hcd/accelerators.py +0 -1175
  171. julee-0.1.4/src/julee/docs/sphinx_hcd/apps.py +0 -518
  172. julee-0.1.4/src/julee/docs/sphinx_hcd/epics.py +0 -453
  173. julee-0.1.4/src/julee/docs/sphinx_hcd/integrations.py +0 -310
  174. julee-0.1.4/src/julee/docs/sphinx_hcd/journeys.py +0 -797
  175. julee-0.1.4/src/julee/docs/sphinx_hcd/personas.py +0 -457
  176. julee-0.1.4/src/julee/docs/sphinx_hcd/stories.py +0 -960
  177. julee-0.1.4/src/julee.egg-info/PKG-INFO +0 -197
  178. {julee-0.1.4 → julee-0.1.6}/LICENSE +0 -0
  179. {julee-0.1.4 → julee-0.1.6}/MANIFEST.in +0 -0
  180. {julee-0.1.4 → julee-0.1.6}/setup.cfg +0 -0
  181. {julee-0.1.4 → julee-0.1.6}/src/julee/api/__init__.py +0 -0
  182. {julee-0.1.4 → julee-0.1.6}/src/julee/api/app.py +0 -0
  183. {julee-0.1.4 → julee-0.1.6}/src/julee/api/dependencies.py +0 -0
  184. {julee-0.1.4 → julee-0.1.6}/src/julee/api/requests.py +0 -0
  185. {julee-0.1.4 → julee-0.1.6}/src/julee/api/responses.py +0 -0
  186. {julee-0.1.4 → julee-0.1.6}/src/julee/api/routers/__init__.py +0 -0
  187. {julee-0.1.4 → julee-0.1.6}/src/julee/api/routers/assembly_specifications.py +0 -0
  188. {julee-0.1.4 → julee-0.1.6}/src/julee/api/routers/documents.py +0 -0
  189. {julee-0.1.4 → julee-0.1.6}/src/julee/api/routers/knowledge_service_configs.py +0 -0
  190. {julee-0.1.4 → julee-0.1.6}/src/julee/api/routers/knowledge_service_queries.py +0 -0
  191. {julee-0.1.4 → julee-0.1.6}/src/julee/api/routers/system.py +0 -0
  192. {julee-0.1.4 → julee-0.1.6}/src/julee/api/routers/workflows.py +0 -0
  193. {julee-0.1.4 → julee-0.1.6}/src/julee/api/services/__init__.py +0 -0
  194. {julee-0.1.4 → julee-0.1.6}/src/julee/api/services/system_initialization.py +0 -0
  195. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/__init__.py +0 -0
  196. {julee-0.1.4 → julee-0.1.6}/src/julee/api/tests/routers/__init__.py +0 -0
  197. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/__init__.py +0 -0
  198. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/infrastructure/temporal/activity_names.py +0 -0
  199. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/tests/__init__.py +0 -0
  200. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/tests/unit/__init__.py +0 -0
  201. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/tests/unit/infrastructure/__init__.py +0 -0
  202. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/tests/unit/infrastructure/services/__init__.py +0 -0
  203. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/tests/unit/infrastructure/services/polling/__init__.py +0 -0
  204. {julee-0.1.4 → julee-0.1.6}/src/julee/contrib/polling/tests/unit/infrastructure/services/polling/http/__init__.py +0 -0
  205. {julee-0.1.4 → julee-0.1.6}/src/julee/docs/__init__.py +0 -0
  206. {julee-0.1.4 → julee-0.1.6}/src/julee/docs/sphinx_hcd/config.py +0 -0
  207. {julee-0.1.4 → julee-0.1.6}/src/julee/docs/sphinx_hcd/utils.py +0 -0
  208. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/__init__.py +0 -0
  209. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/__init__.py +0 -0
  210. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly/__init__.py +0 -0
  211. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly/assembly.py +0 -0
  212. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly/tests/__init__.py +0 -0
  213. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly/tests/factories.py +0 -0
  214. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly_specification/__init__.py +0 -0
  215. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly_specification/assembly_specification.py +0 -0
  216. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly_specification/knowledge_service_query.py +0 -0
  217. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly_specification/tests/__init__.py +0 -0
  218. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/assembly_specification/tests/factories.py +0 -0
  219. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/custom_fields/__init__.py +0 -0
  220. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/custom_fields/content_stream.py +0 -0
  221. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/custom_fields/tests/__init__.py +0 -0
  222. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/document/__init__.py +0 -0
  223. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/document/document.py +0 -0
  224. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/document/tests/__init__.py +0 -0
  225. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/document/tests/factories.py +0 -0
  226. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/knowledge_service_config/__init__.py +0 -0
  227. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/knowledge_service_config/knowledge_service_config.py +0 -0
  228. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/policy/__init__.py +0 -0
  229. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/policy/document_policy_validation.py +0 -0
  230. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/policy/policy.py +0 -0
  231. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/policy/tests/__init__.py +0 -0
  232. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/models/policy/tests/factories.py +0 -0
  233. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/repositories/__init__.py +0 -0
  234. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/repositories/assembly.py +0 -0
  235. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/repositories/assembly_specification.py +0 -0
  236. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/repositories/base.py +0 -0
  237. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/repositories/document.py +0 -0
  238. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/repositories/document_policy_validation.py +0 -0
  239. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/repositories/knowledge_service_config.py +0 -0
  240. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/repositories/knowledge_service_query.py +0 -0
  241. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/repositories/policy.py +0 -0
  242. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/use_cases/__init__.py +0 -0
  243. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/use_cases/decorators.py +0 -0
  244. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/use_cases/extract_assemble_data.py +0 -0
  245. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/use_cases/initialize_system_data.py +0 -0
  246. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/use_cases/tests/__init__.py +0 -0
  247. {julee-0.1.4 → julee-0.1.6}/src/julee/domain/use_cases/validate_document.py +0 -0
  248. {julee-0.1.4 → julee-0.1.6}/src/julee/fixtures/documents.yaml +0 -0
  249. {julee-0.1.4 → julee-0.1.6}/src/julee/fixtures/knowledge_service_configs.yaml +0 -0
  250. {julee-0.1.4 → julee-0.1.6}/src/julee/fixtures/knowledge_service_queries.yaml +0 -0
  251. {julee-0.1.4 → julee-0.1.6}/src/julee/maintenance/__init__.py +0 -0
  252. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/__init__.py +0 -0
  253. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/__init__.py +0 -0
  254. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/assembly.py +0 -0
  255. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/assembly_specification.py +0 -0
  256. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/base.py +0 -0
  257. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/document.py +0 -0
  258. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/document_policy_validation.py +0 -0
  259. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/knowledge_service_config.py +0 -0
  260. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/knowledge_service_query.py +0 -0
  261. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/policy.py +0 -0
  262. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/memory/tests/__init__.py +0 -0
  263. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/__init__.py +0 -0
  264. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/assembly.py +0 -0
  265. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/assembly_specification.py +0 -0
  266. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/client.py +0 -0
  267. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/document.py +0 -0
  268. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/document_policy_validation.py +0 -0
  269. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/knowledge_service_config.py +0 -0
  270. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/knowledge_service_query.py +0 -0
  271. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/policy.py +0 -0
  272. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/tests/__init__.py +0 -0
  273. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/minio/tests/fake_client.py +0 -0
  274. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/temporal/__init__.py +0 -0
  275. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/temporal/activities.py +0 -0
  276. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/temporal/activity_names.py +0 -0
  277. {julee-0.1.4 → julee-0.1.6}/src/julee/repositories/temporal/proxies.py +0 -0
  278. {julee-0.1.4 → julee-0.1.6}/src/julee/services/__init__.py +0 -0
  279. {julee-0.1.4 → julee-0.1.6}/src/julee/services/knowledge_service/__init__.py +0 -0
  280. {julee-0.1.4 → julee-0.1.6}/src/julee/services/knowledge_service/anthropic/__init__.py +0 -0
  281. {julee-0.1.4 → julee-0.1.6}/src/julee/services/knowledge_service/anthropic/knowledge_service.py +0 -0
  282. {julee-0.1.4 → julee-0.1.6}/src/julee/services/knowledge_service/factory.py +0 -0
  283. {julee-0.1.4 → julee-0.1.6}/src/julee/services/knowledge_service/knowledge_service.py +0 -0
  284. {julee-0.1.4 → julee-0.1.6}/src/julee/services/knowledge_service/memory/__init__.py +0 -0
  285. {julee-0.1.4 → julee-0.1.6}/src/julee/services/knowledge_service/memory/knowledge_service.py +0 -0
  286. {julee-0.1.4 → julee-0.1.6}/src/julee/services/temporal/__init__.py +0 -0
  287. {julee-0.1.4 → julee-0.1.6}/src/julee/services/temporal/activities.py +0 -0
  288. {julee-0.1.4 → julee-0.1.6}/src/julee/services/temporal/activity_names.py +0 -0
  289. {julee-0.1.4 → julee-0.1.6}/src/julee/services/temporal/proxies.py +0 -0
  290. {julee-0.1.4 → julee-0.1.6}/src/julee/util/__init__.py +0 -0
  291. {julee-0.1.4 → julee-0.1.6}/src/julee/util/domain.py +0 -0
  292. {julee-0.1.4 → julee-0.1.6}/src/julee/util/repos/__init__.py +0 -0
  293. {julee-0.1.4 → julee-0.1.6}/src/julee/util/repos/minio/__init__.py +0 -0
  294. {julee-0.1.4 → julee-0.1.6}/src/julee/util/repos/minio/file_storage.py +0 -0
  295. {julee-0.1.4 → julee-0.1.6}/src/julee/util/repos/temporal/__init__.py +0 -0
  296. {julee-0.1.4 → julee-0.1.6}/src/julee/util/repos/temporal/client_proxies/file_storage.py +0 -0
  297. {julee-0.1.4 → julee-0.1.6}/src/julee/util/repos/temporal/data_converter.py +0 -0
  298. {julee-0.1.4 → julee-0.1.6}/src/julee/util/repos/temporal/minio_file_storage.py +0 -0
  299. {julee-0.1.4 → julee-0.1.6}/src/julee/util/repos/temporal/proxies/__init__.py +0 -0
  300. {julee-0.1.4 → julee-0.1.6}/src/julee/util/repos/temporal/proxies/file_storage.py +0 -0
  301. {julee-0.1.4 → julee-0.1.6}/src/julee/util/repositories.py +0 -0
  302. {julee-0.1.4 → julee-0.1.6}/src/julee/util/temporal/__init__.py +0 -0
  303. {julee-0.1.4 → julee-0.1.6}/src/julee/util/temporal/activities.py +0 -0
  304. {julee-0.1.4 → julee-0.1.6}/src/julee/util/temporal/decorators.py +0 -0
  305. {julee-0.1.4 → julee-0.1.6}/src/julee/util/tests/__init__.py +0 -0
  306. {julee-0.1.4 → julee-0.1.6}/src/julee/util/validation/__init__.py +0 -0
  307. {julee-0.1.4 → julee-0.1.6}/src/julee/util/validation/repository.py +0 -0
  308. {julee-0.1.4 → julee-0.1.6}/src/julee/util/validation/type_guards.py +0 -0
  309. {julee-0.1.4 → julee-0.1.6}/src/julee/worker.py +0 -0
  310. {julee-0.1.4 → julee-0.1.6}/src/julee/workflows/__init__.py +0 -0
  311. {julee-0.1.4 → julee-0.1.6}/src/julee/workflows/extract_assemble.py +0 -0
  312. {julee-0.1.4 → julee-0.1.6}/src/julee/workflows/validate_document.py +0 -0
  313. {julee-0.1.4 → julee-0.1.6}/src/julee.egg-info/dependency_links.txt +0 -0
  314. {julee-0.1.4 → julee-0.1.6}/src/julee.egg-info/top_level.txt +0 -0
julee-0.1.6/PKG-INFO ADDED
@@ -0,0 +1,104 @@
1
+ Metadata-Version: 2.4
2
+ Name: julee
3
+ Version: 0.1.6
4
+ Summary: Julee - Clean architecture for accountable and transparent digital supply chains
5
+ Author-email: Pyx Industries <chris@pyx.io>
6
+ License: GPL-3.0
7
+ Project-URL: Homepage, https://github.com/pyx-industries/julee
8
+ Project-URL: Repository, https://github.com/pyx-industries/julee
9
+ Project-URL: Documentation, https://github.com/pyx-industries/julee#readme
10
+ Project-URL: Issues, https://github.com/pyx-industries/julee/issues
11
+ Keywords: temporal,workflow,document-processing,ai,supply-chain
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
+ Requires-Python: >=3.11
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: fastapi>=0.100.0
23
+ Requires-Dist: uvicorn>=0.20.0
24
+ Requires-Dist: python-multipart
25
+ Requires-Dist: fastapi-pagination>=0.12.0
26
+ Requires-Dist: pydantic>=2.0.0
27
+ Requires-Dist: temporalio[pydantic]>=1.3.0
28
+ Requires-Dist: minio>=7.0.0
29
+ Requires-Dist: anthropic>=0.66.0
30
+ Requires-Dist: click>=0.8.0
31
+ Requires-Dist: Jinja2>=3.0.0
32
+ Requires-Dist: PyYAML>=6.0.0
33
+ Requires-Dist: python-magic>=0.4.27
34
+ Requires-Dist: multihash>=0.1.1
35
+ Requires-Dist: six>=1.16.0
36
+ Requires-Dist: jsonschema>=4.0.0
37
+ Requires-Dist: jsonpointer>=3.0.0
38
+ Provides-Extra: dev
39
+ Requires-Dist: pytest>=8.0.0; extra == "dev"
40
+ Requires-Dist: pytest-asyncio>=1.0.0; extra == "dev"
41
+ Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
42
+ Requires-Dist: pytest-xdist>=3.5.0; extra == "dev"
43
+ Requires-Dist: hypothesis>=6.0.0; extra == "dev"
44
+ Requires-Dist: factory-boy>=3.2.0; extra == "dev"
45
+ Requires-Dist: mypy>=1.7.0; extra == "dev"
46
+ Requires-Dist: types-PyYAML; extra == "dev"
47
+ Requires-Dist: types-jsonschema; extra == "dev"
48
+ Requires-Dist: types-python-dateutil; extra == "dev"
49
+ Requires-Dist: black>=24.0.0; extra == "dev"
50
+ Requires-Dist: ruff>=0.5.0; extra == "dev"
51
+ Requires-Dist: pre-commit>=3.0.0; extra == "dev"
52
+ Requires-Dist: bandit; extra == "dev"
53
+ Requires-Dist: pip-tools>=7.0.0; extra == "dev"
54
+ Requires-Dist: asyncpg; extra == "dev"
55
+ Requires-Dist: sphinx>=7.0.0; extra == "dev"
56
+ Provides-Extra: docs
57
+ Requires-Dist: sphinx>=7.0.0; extra == "docs"
58
+ Requires-Dist: sphinx-autobuild>=2021.3.14; extra == "docs"
59
+ Requires-Dist: sphinx-rtd-theme>=2.0.0; extra == "docs"
60
+ Requires-Dist: furo>=2023.9.10; extra == "docs"
61
+ Requires-Dist: sphinx-autodoc-typehints>=1.25.0; extra == "docs"
62
+ Requires-Dist: sphinxcontrib-mermaid>=0.9.2; extra == "docs"
63
+ Requires-Dist: sphinxcontrib-plantuml>=0.25; extra == "docs"
64
+ Requires-Dist: sphinx-autoapi>=3.0.0; extra == "docs"
65
+ Dynamic: license-file
66
+
67
+ # Julee
68
+
69
+ Clean architecture for accountable and transparent digital supply chains.
70
+
71
+ Julee is a Python framework for building resilient, auditable business processes using Temporal workflows. Solutions are organized around your business domain—your bounded contexts become "accelerators" that speak your business language, not framework jargon.
72
+
73
+ **Use Julee when:** processes must be done correctly, may be complex or long-running, need compliance audit trails (responsible AI, algorithmic due-diligence), or depend on unreliable services that may fail, timeout, or be rate-limited.
74
+
75
+ **Core concepts:** Accelerators are collections of pipelines that automate a business area. Pipelines are use cases wrapped with Temporal, providing durability (survives crashes), reliability (automatic retries), observability (complete execution history), and supply chain provenance (audit trails that become "digital product passports").
76
+
77
+ ## Installation
78
+
79
+ ```bash
80
+ pip install julee
81
+ ```
82
+
83
+ ## Runtime Dependencies
84
+
85
+ Julee applications require: [Temporal](https://temporal.io/) (workflow orchestration), S3-compatible object storage (e.g. MinIO), PostgreSQL (for Temporal).
86
+
87
+ ## Documentation
88
+
89
+ Full documentation at [julee.readthedocs.io](https://julee.readthedocs.io), package on [PyPI](https://pypi.org/project/julee/).
90
+
91
+ ## Example
92
+
93
+ This repository includes a Docker Compose example demonstrating a meeting minutes extraction system:
94
+
95
+ ```bash
96
+ cp .env.example .env # Add your ANTHROPIC_API_KEY
97
+ docker compose up --build
98
+ ```
99
+
100
+ See the `demo-ui/` directory for the UI source.
101
+
102
+ ## License
103
+
104
+ GPL-3.0 — see [LICENSE](LICENSE) for details.
julee-0.1.6/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # Julee
2
+
3
+ Clean architecture for accountable and transparent digital supply chains.
4
+
5
+ Julee is a Python framework for building resilient, auditable business processes using Temporal workflows. Solutions are organized around your business domain—your bounded contexts become "accelerators" that speak your business language, not framework jargon.
6
+
7
+ **Use Julee when:** processes must be done correctly, may be complex or long-running, need compliance audit trails (responsible AI, algorithmic due-diligence), or depend on unreliable services that may fail, timeout, or be rate-limited.
8
+
9
+ **Core concepts:** Accelerators are collections of pipelines that automate a business area. Pipelines are use cases wrapped with Temporal, providing durability (survives crashes), reliability (automatic retries), observability (complete execution history), and supply chain provenance (audit trails that become "digital product passports").
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ pip install julee
15
+ ```
16
+
17
+ ## Runtime Dependencies
18
+
19
+ Julee applications require: [Temporal](https://temporal.io/) (workflow orchestration), S3-compatible object storage (e.g. MinIO), PostgreSQL (for Temporal).
20
+
21
+ ## Documentation
22
+
23
+ Full documentation at [julee.readthedocs.io](https://julee.readthedocs.io), package on [PyPI](https://pypi.org/project/julee/).
24
+
25
+ ## Example
26
+
27
+ This repository includes a Docker Compose example demonstrating a meeting minutes extraction system:
28
+
29
+ ```bash
30
+ cp .env.example .env # Add your ANTHROPIC_API_KEY
31
+ docker compose up --build
32
+ ```
33
+
34
+ See the `demo-ui/` directory for the UI source.
35
+
36
+ ## License
37
+
38
+ GPL-3.0 — see [LICENSE](LICENSE) for details.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "julee"
7
- version = "0.1.4"
7
+ version = "0.1.6"
8
8
  description = "Julee - Clean architecture for accountable and transparent digital supply chains"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -54,6 +54,7 @@ dev = [
54
54
  "pytest>=8.0.0",
55
55
  "pytest-asyncio>=1.0.0",
56
56
  "pytest-cov>=4.1.0",
57
+ "pytest-xdist>=3.5.0",
57
58
  "hypothesis>=6.0.0",
58
59
  "factory-boy>=3.2.0",
59
60
  # Type checking
@@ -71,6 +72,8 @@ dev = [
71
72
  "pip-tools>=7.0.0",
72
73
  # Database (for testing)
73
74
  "asyncpg",
75
+ # Sphinx (for sphinx_hcd tests)
76
+ "sphinx>=7.0.0",
74
77
  ]
75
78
 
76
79
  docs = [
@@ -106,10 +109,20 @@ asyncio_mode = "auto"
106
109
  addopts = [
107
110
  "--strict-markers",
108
111
  "--tb=short",
112
+ "-n", "auto",
113
+ "--dist", "loadgroup",
109
114
  "--cov=src/julee",
110
115
  "--cov-report=term-missing",
111
116
  "--cov-report=html",
112
117
  ]
118
+ markers = [
119
+ "unit: Unit tests (fast, isolated)",
120
+ "integration: Integration tests (slower, with dependencies)",
121
+ "e2e: End-to-end tests (slowest, full stack)",
122
+ "llm: Tests that use real LLM API calls (slow, costs money)",
123
+ "contract: Contract tests (verify external API shapes and mock fidelity)",
124
+ "slow: Slow tests (stress tests, load tests)",
125
+ ]
113
126
 
114
127
  [tool.coverage.run]
115
128
  source = ["src/julee"]
@@ -1,3 +1,3 @@
1
1
  """Julee - Clean architecture for accountable and transparent digital supply chains."""
2
2
 
3
- __version__ = "0.1.1"
3
+ __version__ = "0.1.5"
@@ -25,6 +25,8 @@ from julee.repositories.memory import (
25
25
  MemoryAssemblySpecificationRepository,
26
26
  )
27
27
 
28
+ pytestmark = pytest.mark.unit
29
+
28
30
 
29
31
  @pytest.fixture
30
32
  def memory_repo() -> MemoryAssemblySpecificationRepository:
@@ -18,6 +18,8 @@ from julee.api.routers.documents import router
18
18
  from julee.domain.models.document import Document, DocumentStatus
19
19
  from julee.repositories.memory import MemoryDocumentRepository
20
20
 
21
+ pytestmark = pytest.mark.unit
22
+
21
23
 
22
24
  @pytest.fixture
23
25
  def memory_repo() -> MemoryDocumentRepository:
@@ -22,6 +22,8 @@ from julee.domain.models.knowledge_service_config import (
22
22
  ServiceApi,
23
23
  )
24
24
 
25
+ pytestmark = pytest.mark.unit
26
+
25
27
 
26
28
  @pytest.fixture
27
29
  def mock_repository() -> AsyncMock:
@@ -22,6 +22,8 @@ from julee.repositories.memory import (
22
22
  MemoryKnowledgeServiceQueryRepository,
23
23
  )
24
24
 
25
+ pytestmark = pytest.mark.unit
26
+
25
27
 
26
28
  @pytest.fixture
27
29
  def memory_repo() -> MemoryKnowledgeServiceQueryRepository:
@@ -17,6 +17,8 @@ from fastapi.testclient import TestClient
17
17
  from julee.api.responses import ServiceStatus
18
18
  from julee.api.routers.system import router
19
19
 
20
+ pytestmark = pytest.mark.unit
21
+
20
22
 
21
23
  @pytest.fixture
22
24
  def app_with_router() -> FastAPI:
@@ -16,6 +16,8 @@ from fastapi_pagination import add_pagination
16
16
  from julee.api.dependencies import get_temporal_client
17
17
  from julee.api.routers.workflows import router
18
18
 
19
+ pytestmark = pytest.mark.unit
20
+
19
21
 
20
22
  @pytest.fixture
21
23
  def mock_temporal_client() -> MagicMock:
@@ -25,6 +25,8 @@ from julee.repositories.memory.knowledge_service_config import (
25
25
  MemoryKnowledgeServiceConfigRepository,
26
26
  )
27
27
 
28
+ pytestmark = pytest.mark.unit
29
+
28
30
 
29
31
  @pytest.fixture
30
32
  def memory_repo() -> MemoryKnowledgeServiceQueryRepository:
@@ -16,6 +16,8 @@ from julee.api.dependencies import (
16
16
  get_startup_dependencies,
17
17
  )
18
18
 
19
+ pytestmark = pytest.mark.unit
20
+
19
21
 
20
22
  @pytest.fixture
21
23
  def mock_container() -> AsyncMock:
@@ -21,6 +21,8 @@ from julee.domain.models import (
21
21
  KnowledgeServiceQuery,
22
22
  )
23
23
 
24
+ pytestmark = pytest.mark.unit
25
+
24
26
 
25
27
  class TestCreateAssemblySpecificationRequest:
26
28
  """Test CreateAssemblySpecificationRequest model."""
@@ -0,0 +1,50 @@
1
+ """
2
+ Polling Contrib Module.
3
+
4
+ This module provides ready-made polling functionality for external endpoints.
5
+ It follows the Julee contrib module pattern, providing a complete polling
6
+ solution that can be imported and used by Julee solutions.
7
+
8
+ The polling module includes:
9
+ - Domain models for polling configuration and results
10
+ - Service protocols for polling operations
11
+ - HTTP implementation for REST API polling
12
+ - Co-located tests and examples
13
+
14
+ Example usage:
15
+ from julee.contrib.polling.domain.models.polling_config import PollingConfig, PollingProtocol
16
+ from julee.contrib.polling.infrastructure.services.polling.http import HttpPollerService
17
+ from julee.contrib.polling.domain.services.poller import PollerService
18
+ from julee.contrib.polling.domain.models.polling_config import PollingResult
19
+
20
+ # Configure polling
21
+ config = PollingConfig(
22
+ endpoint_identifier="api-v1",
23
+ polling_protocol=PollingProtocol.HTTP,
24
+ connection_params={"url": "https://api.example.com/data"},
25
+ timeout_seconds=30
26
+ )
27
+
28
+ # Poll the endpoint
29
+ service = HttpPollerService()
30
+ result = await service.poll_endpoint(config)
31
+
32
+ Note: All imports must be explicit to avoid import chains that can pull
33
+ non-deterministic code into Temporal workflows. Import directly from
34
+ the specific modules you need rather than using this convenience module.
35
+ """
36
+
37
+ # No re-exports to avoid import chains that pull non-deterministic code
38
+ # into Temporal workflows. Import from specific submodules instead:
39
+ #
40
+ # Domain:
41
+ # - from julee.contrib.polling.domain.models.polling_config import PollingConfig, PollingProtocol, PollingResult
42
+ # - from julee.contrib.polling.domain.services.poller import PollerService
43
+ #
44
+ # Infrastructure:
45
+ # - from julee.contrib.polling.infrastructure.services.polling.http import HttpPollerService
46
+ # - from julee.contrib.polling.infrastructure.temporal.manager import PollingManager
47
+ # - from julee.contrib.polling.infrastructure.temporal.proxies import WorkflowPollerServiceProxy
48
+ # - from julee.contrib.polling.infrastructure.temporal.activities import TemporalPollerService
49
+
50
+ __all__ = []
@@ -0,0 +1,17 @@
1
+ """
2
+ Application entry points for the polling contrib module.
3
+
4
+ This module contains the application-layer components that provide entry points
5
+ for the polling contrib module, including worker pipelines, API routes, and
6
+ CLI commands.
7
+
8
+ Following the ADR contrib module structure, this layer wires together domain
9
+ services and infrastructure implementations into runnable applications.
10
+
11
+ No re-exports to avoid import chains that pull non-deterministic code
12
+ into Temporal workflows. Import directly from specific modules:
13
+
14
+ - from julee.contrib.polling.apps.worker.pipelines import NewDataDetectionPipeline
15
+ """
16
+
17
+ __all__ = []
@@ -0,0 +1,17 @@
1
+ """
2
+ Worker applications for the polling contrib module.
3
+
4
+ This module contains worker-specific entry points for the polling contrib module,
5
+ including Temporal workflows (pipelines) that orchestrate polling operations
6
+ with durability guarantees.
7
+
8
+ The worker applications in this module can be registered with Temporal workers
9
+ to provide polling capabilities within workflow contexts.
10
+
11
+ No re-exports to avoid import chains that pull non-deterministic code
12
+ into Temporal workflows. Import directly from specific modules:
13
+
14
+ - from julee.contrib.polling.apps.worker.pipelines import NewDataDetectionPipeline
15
+ """
16
+
17
+ __all__ = []
@@ -0,0 +1,288 @@
1
+ """
2
+ Temporal workflows for polling operations in the Julee polling contrib module.
3
+
4
+ This module contains workflows that orchestrate polling operations with
5
+ Temporal's durability guarantees, providing retry logic, state management,
6
+ and reliable execution for endpoint polling and change detection.
7
+ """
8
+
9
+ import hashlib
10
+ import logging
11
+ from typing import Any
12
+
13
+ from temporalio import workflow
14
+
15
+ from julee.contrib.polling.domain.models.polling_config import PollingConfig
16
+ from julee.contrib.polling.infrastructure.temporal.proxies import (
17
+ WorkflowPollerServiceProxy,
18
+ )
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ @workflow.defn
24
+ class NewDataDetectionPipeline:
25
+ """
26
+ Temporal workflow for endpoint polling with new data detection.
27
+
28
+ This workflow:
29
+ 1. Polls an endpoint using the configured polling service
30
+ 2. Compares result with previous completion to detect changes
31
+ 3. Triggers downstream processing when new data is detected
32
+ 4. Returns completion result for next scheduled execution
33
+
34
+ The workflow uses Temporal's schedule last completion result feature
35
+ to automatically receive the previous execution's result for comparison.
36
+ """
37
+
38
+ def __init__(self) -> None:
39
+ self.current_step = "initialized"
40
+ self.endpoint_id: str | None = None
41
+ self.has_new_data: bool = False
42
+
43
+ @workflow.query
44
+ def get_current_step(self) -> str:
45
+ """Query method to get the current workflow step."""
46
+ return self.current_step
47
+
48
+ @workflow.query
49
+ def get_endpoint_id(self) -> str | None:
50
+ """Query method to get the endpoint ID being polled."""
51
+ return self.endpoint_id
52
+
53
+ @workflow.query
54
+ def get_has_new_data(self) -> bool:
55
+ """Query method to check if new data was detected."""
56
+ return self.has_new_data
57
+
58
+ async def trigger_downstream_pipeline(
59
+ self,
60
+ downstream_pipeline: str,
61
+ previous_data: bytes | None,
62
+ new_data: bytes,
63
+ ) -> bool:
64
+ """
65
+ Trigger downstream pipeline workflow.
66
+
67
+ Args:
68
+ downstream_pipeline: Name of the downstream workflow to trigger
69
+ previous_data: Previous content (None if first run)
70
+ new_data: New content that was detected
71
+
72
+ Returns:
73
+ True if successfully triggered, False otherwise
74
+ """
75
+ try:
76
+ # Start external workflow for downstream processing (fire-and-forget)
77
+ await workflow.start_child_workflow(
78
+ downstream_pipeline, # This would be the workflow class name
79
+ args=[previous_data, new_data],
80
+ id=f"downstream-{self.endpoint_id}-{workflow.info().workflow_id}",
81
+ task_queue="downstream-processing-queue",
82
+ )
83
+
84
+ workflow.logger.info(
85
+ "Downstream pipeline triggered successfully",
86
+ extra={
87
+ "endpoint_id": self.endpoint_id,
88
+ "downstream_pipeline": downstream_pipeline,
89
+ },
90
+ )
91
+ return True
92
+
93
+ except Exception as e:
94
+ workflow.logger.error(
95
+ "Failed to trigger downstream pipeline",
96
+ extra={
97
+ "endpoint_id": self.endpoint_id,
98
+ "downstream_pipeline": downstream_pipeline,
99
+ "error": str(e),
100
+ "error_type": type(e).__name__,
101
+ },
102
+ )
103
+ # Don't fail the polling workflow if downstream trigger fails
104
+ return False
105
+
106
+ @workflow.run
107
+ async def run(
108
+ self,
109
+ config: PollingConfig | dict[str, Any],
110
+ downstream_pipeline: str | None = None,
111
+ ) -> dict[str, Any]:
112
+ """
113
+ Execute the new data detection workflow.
114
+
115
+ Args:
116
+ config: Configuration for the polling operation (PollingConfig or dict from schedule)
117
+ downstream_pipeline: Optional pipeline to trigger when new data detected
118
+
119
+ Returns:
120
+ Completion result containing polling result and detection metadata
121
+
122
+ Raises:
123
+ RuntimeError: If polling or downstream processing fails after retries
124
+ """
125
+ # Convert dict to PollingConfig if needed (for schedule compatibility)
126
+ # Temporal schedules serialize arguments as dicts, not Pydantic models
127
+ if isinstance(config, dict):
128
+ config = PollingConfig.model_validate(config)
129
+
130
+ self.endpoint_id = config.endpoint_identifier
131
+
132
+ # Fetch previous completion result from Temporal
133
+ previous_completion = workflow.get_last_completion_result()
134
+
135
+ workflow.logger.info(
136
+ "Starting new data detection pipeline",
137
+ extra={
138
+ "endpoint_id": self.endpoint_id,
139
+ "polling_protocol": config.polling_protocol.value,
140
+ "has_previous_completion": previous_completion is not None,
141
+ "workflow_id": workflow.info().workflow_id,
142
+ "run_id": workflow.info().run_id,
143
+ },
144
+ )
145
+
146
+ self.current_step = "polling_endpoint"
147
+
148
+ try:
149
+ # Step 1: Poll the endpoint
150
+ polling_service = WorkflowPollerServiceProxy()
151
+ polling_result = await polling_service.poll_endpoint(config)
152
+
153
+ # Extract the timestamp from when polling actually happened
154
+ polled_at = polling_result.polled_at.isoformat()
155
+
156
+ workflow.logger.debug(
157
+ "Polling completed",
158
+ extra={
159
+ "endpoint_id": self.endpoint_id,
160
+ "polling_success": polling_result.success,
161
+ "content_length": len(polling_result.content),
162
+ },
163
+ )
164
+
165
+ self.current_step = "detecting_changes"
166
+
167
+ # Step 2: Detect new data using hash comparison
168
+ current_content = polling_result.content
169
+ current_hash = hashlib.sha256(current_content).hexdigest()
170
+
171
+ previous_hash = None
172
+ if previous_completion and "polling_result" in previous_completion:
173
+ previous_hash = previous_completion["polling_result"].get(
174
+ "content_hash"
175
+ )
176
+
177
+ has_new_data = previous_hash != current_hash
178
+ self.has_new_data = has_new_data
179
+
180
+ workflow.logger.info(
181
+ f"DEBUG: Change detection - has_new_data: {has_new_data}, "
182
+ f"is_first_run: {previous_hash is None}, "
183
+ f"current_hash: {current_hash[:8]}..., "
184
+ f"previous_hash: {previous_hash[:8] if previous_hash else 'None'}..."
185
+ )
186
+
187
+ # Step 3: Trigger downstream processing if new data detected
188
+ downstream_triggered = False
189
+ if has_new_data and downstream_pipeline:
190
+ self.current_step = "triggering_downstream"
191
+
192
+ workflow.logger.info(
193
+ "Triggering downstream pipeline",
194
+ extra={
195
+ "endpoint_id": self.endpoint_id,
196
+ "downstream_pipeline": downstream_pipeline,
197
+ "content_length": len(current_content),
198
+ },
199
+ )
200
+
201
+ # Get previous data for comparison
202
+ previous_data = None
203
+ if previous_completion and "polling_result" in previous_completion:
204
+ prev_content_str = previous_completion["polling_result"].get(
205
+ "content"
206
+ )
207
+ if prev_content_str:
208
+ try:
209
+ previous_data = prev_content_str.encode("utf-8")
210
+ except (UnicodeDecodeError, AttributeError) as e:
211
+ workflow.logger.error(
212
+ "Failed to decode previous content for downstream pipeline",
213
+ extra={
214
+ "endpoint_id": self.endpoint_id,
215
+ "error": str(e),
216
+ "error_type": type(e).__name__,
217
+ },
218
+ )
219
+ raise RuntimeError(
220
+ f"Previous content is corrupted or invalid: {e}"
221
+ )
222
+ elif previous_hash:
223
+ # We have previous run but no content - this is an error
224
+ workflow.logger.error(
225
+ "Previous content not available for downstream pipeline but previous hash exists",
226
+ extra={
227
+ "endpoint_id": self.endpoint_id,
228
+ "previous_hash": previous_hash,
229
+ },
230
+ )
231
+ raise RuntimeError(
232
+ "Previous content is missing from completion result but is required for downstream pipeline"
233
+ )
234
+
235
+ downstream_triggered = await self.trigger_downstream_pipeline(
236
+ downstream_pipeline,
237
+ previous_data,
238
+ current_content,
239
+ )
240
+
241
+ self.current_step = "completed"
242
+
243
+ # Step 4: Return completion result for next scheduled execution
244
+ completion_result = {
245
+ "polling_result": {
246
+ "success": polling_result.success,
247
+ "content_hash": current_hash,
248
+ "content": current_content.decode("utf-8", errors="ignore"),
249
+ "polled_at": polled_at,
250
+ "content_length": len(current_content),
251
+ },
252
+ "detection_result": {
253
+ "has_new_data": has_new_data,
254
+ "previous_hash": previous_hash,
255
+ "current_hash": current_hash,
256
+ },
257
+ "downstream_triggered": downstream_triggered,
258
+ "endpoint_id": self.endpoint_id,
259
+ "completed_at": workflow.now().isoformat(),
260
+ }
261
+
262
+ workflow.logger.info(
263
+ "New data detection pipeline completed successfully",
264
+ extra={
265
+ "endpoint_id": self.endpoint_id,
266
+ "has_new_data": has_new_data,
267
+ "downstream_triggered": downstream_triggered,
268
+ },
269
+ )
270
+
271
+ return completion_result
272
+
273
+ except Exception as e:
274
+ self.current_step = "failed"
275
+
276
+ workflow.logger.error(
277
+ "New data detection pipeline failed",
278
+ extra={
279
+ "endpoint_id": self.endpoint_id,
280
+ "error": str(e),
281
+ "error_type": type(e).__name__,
282
+ "current_step": self.current_step,
283
+ },
284
+ exc_info=True,
285
+ )
286
+
287
+ # Re-raise to let Temporal handle retry logic
288
+ raise
@@ -0,0 +1,15 @@
1
+ """
2
+ Domain layer for the polling contrib module.
3
+
4
+ This module contains the core domain models, services, and business rules
5
+ for the polling contrib module. It defines the fundamental concepts and
6
+ protocols that govern polling operations.
7
+
8
+ No re-exports to avoid import chains that pull non-deterministic code
9
+ into Temporal workflows. Import directly from specific modules:
10
+
11
+ - from julee.contrib.polling.domain.models.polling_config import PollingConfig, PollingProtocol, PollingResult
12
+ - from julee.contrib.polling.domain.services.poller import PollerService
13
+ """
14
+
15
+ __all__ = []