julee 0.1.4__py3-none-any.whl → 0.1.6__py3-none-any.whl

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 (165) hide show
  1. julee/__init__.py +1 -1
  2. julee/api/tests/routers/test_assembly_specifications.py +2 -0
  3. julee/api/tests/routers/test_documents.py +2 -0
  4. julee/api/tests/routers/test_knowledge_service_configs.py +2 -0
  5. julee/api/tests/routers/test_knowledge_service_queries.py +2 -0
  6. julee/api/tests/routers/test_system.py +2 -0
  7. julee/api/tests/routers/test_workflows.py +2 -0
  8. julee/api/tests/test_app.py +2 -0
  9. julee/api/tests/test_dependencies.py +2 -0
  10. julee/api/tests/test_requests.py +2 -0
  11. julee/contrib/polling/__init__.py +22 -19
  12. julee/contrib/polling/apps/__init__.py +17 -0
  13. julee/contrib/polling/apps/worker/__init__.py +17 -0
  14. julee/contrib/polling/apps/worker/pipelines.py +288 -0
  15. julee/contrib/polling/domain/__init__.py +7 -9
  16. julee/contrib/polling/domain/models/__init__.py +6 -7
  17. julee/contrib/polling/domain/models/polling_config.py +18 -1
  18. julee/contrib/polling/domain/services/__init__.py +6 -5
  19. julee/contrib/polling/domain/services/poller.py +1 -1
  20. julee/contrib/polling/infrastructure/__init__.py +9 -8
  21. julee/contrib/polling/infrastructure/services/__init__.py +6 -5
  22. julee/contrib/polling/infrastructure/services/polling/__init__.py +6 -5
  23. julee/contrib/polling/infrastructure/services/polling/http/__init__.py +6 -5
  24. julee/contrib/polling/infrastructure/services/polling/http/http_poller_service.py +5 -2
  25. julee/contrib/polling/infrastructure/temporal/__init__.py +12 -12
  26. julee/contrib/polling/infrastructure/temporal/activities.py +1 -1
  27. julee/contrib/polling/infrastructure/temporal/manager.py +291 -0
  28. julee/contrib/polling/infrastructure/temporal/proxies.py +1 -1
  29. julee/contrib/polling/tests/unit/apps/worker/test_pipelines.py +580 -0
  30. julee/contrib/polling/tests/unit/infrastructure/services/polling/http/test_http_poller_service.py +40 -2
  31. julee/contrib/polling/tests/unit/infrastructure/temporal/__init__.py +7 -0
  32. julee/contrib/polling/tests/unit/infrastructure/temporal/test_manager.py +475 -0
  33. julee/docs/sphinx_hcd/__init__.py +146 -13
  34. julee/docs/sphinx_hcd/domain/__init__.py +5 -0
  35. julee/docs/sphinx_hcd/domain/models/__init__.py +32 -0
  36. julee/docs/sphinx_hcd/domain/models/accelerator.py +152 -0
  37. julee/docs/sphinx_hcd/domain/models/app.py +151 -0
  38. julee/docs/sphinx_hcd/domain/models/code_info.py +121 -0
  39. julee/docs/sphinx_hcd/domain/models/epic.py +79 -0
  40. julee/docs/sphinx_hcd/domain/models/integration.py +230 -0
  41. julee/docs/sphinx_hcd/domain/models/journey.py +222 -0
  42. julee/docs/sphinx_hcd/domain/models/persona.py +106 -0
  43. julee/docs/sphinx_hcd/domain/models/story.py +128 -0
  44. julee/docs/sphinx_hcd/domain/repositories/__init__.py +25 -0
  45. julee/docs/sphinx_hcd/domain/repositories/accelerator.py +98 -0
  46. julee/docs/sphinx_hcd/domain/repositories/app.py +57 -0
  47. julee/docs/sphinx_hcd/domain/repositories/base.py +89 -0
  48. julee/docs/sphinx_hcd/domain/repositories/code_info.py +69 -0
  49. julee/docs/sphinx_hcd/domain/repositories/epic.py +62 -0
  50. julee/docs/sphinx_hcd/domain/repositories/integration.py +79 -0
  51. julee/docs/sphinx_hcd/domain/repositories/journey.py +106 -0
  52. julee/docs/sphinx_hcd/domain/repositories/story.py +68 -0
  53. julee/docs/sphinx_hcd/domain/use_cases/__init__.py +64 -0
  54. julee/docs/sphinx_hcd/domain/use_cases/derive_personas.py +166 -0
  55. julee/docs/sphinx_hcd/domain/use_cases/resolve_accelerator_references.py +236 -0
  56. julee/docs/sphinx_hcd/domain/use_cases/resolve_app_references.py +144 -0
  57. julee/docs/sphinx_hcd/domain/use_cases/resolve_story_references.py +121 -0
  58. julee/docs/sphinx_hcd/parsers/__init__.py +48 -0
  59. julee/docs/sphinx_hcd/parsers/ast.py +150 -0
  60. julee/docs/sphinx_hcd/parsers/gherkin.py +155 -0
  61. julee/docs/sphinx_hcd/parsers/yaml.py +184 -0
  62. julee/docs/sphinx_hcd/repositories/__init__.py +4 -0
  63. julee/docs/sphinx_hcd/repositories/memory/__init__.py +25 -0
  64. julee/docs/sphinx_hcd/repositories/memory/accelerator.py +86 -0
  65. julee/docs/sphinx_hcd/repositories/memory/app.py +45 -0
  66. julee/docs/sphinx_hcd/repositories/memory/base.py +106 -0
  67. julee/docs/sphinx_hcd/repositories/memory/code_info.py +59 -0
  68. julee/docs/sphinx_hcd/repositories/memory/epic.py +54 -0
  69. julee/docs/sphinx_hcd/repositories/memory/integration.py +70 -0
  70. julee/docs/sphinx_hcd/repositories/memory/journey.py +96 -0
  71. julee/docs/sphinx_hcd/repositories/memory/story.py +63 -0
  72. julee/docs/sphinx_hcd/sphinx/__init__.py +28 -0
  73. julee/docs/sphinx_hcd/sphinx/adapters.py +116 -0
  74. julee/docs/sphinx_hcd/sphinx/context.py +163 -0
  75. julee/docs/sphinx_hcd/sphinx/directives/__init__.py +160 -0
  76. julee/docs/sphinx_hcd/sphinx/directives/accelerator.py +576 -0
  77. julee/docs/sphinx_hcd/sphinx/directives/app.py +349 -0
  78. julee/docs/sphinx_hcd/sphinx/directives/base.py +211 -0
  79. julee/docs/sphinx_hcd/sphinx/directives/epic.py +434 -0
  80. julee/docs/sphinx_hcd/sphinx/directives/integration.py +220 -0
  81. julee/docs/sphinx_hcd/sphinx/directives/journey.py +642 -0
  82. julee/docs/sphinx_hcd/sphinx/directives/persona.py +345 -0
  83. julee/docs/sphinx_hcd/sphinx/directives/story.py +575 -0
  84. julee/docs/sphinx_hcd/sphinx/event_handlers/__init__.py +16 -0
  85. julee/docs/sphinx_hcd/sphinx/event_handlers/builder_inited.py +31 -0
  86. julee/docs/sphinx_hcd/sphinx/event_handlers/doctree_read.py +27 -0
  87. julee/docs/sphinx_hcd/sphinx/event_handlers/doctree_resolved.py +43 -0
  88. julee/docs/sphinx_hcd/sphinx/event_handlers/env_purge_doc.py +42 -0
  89. julee/docs/sphinx_hcd/sphinx/initialization.py +139 -0
  90. julee/docs/sphinx_hcd/tests/__init__.py +9 -0
  91. julee/docs/sphinx_hcd/tests/conftest.py +6 -0
  92. julee/docs/sphinx_hcd/tests/domain/__init__.py +1 -0
  93. julee/docs/sphinx_hcd/tests/domain/models/__init__.py +1 -0
  94. julee/docs/sphinx_hcd/tests/domain/models/test_accelerator.py +266 -0
  95. julee/docs/sphinx_hcd/tests/domain/models/test_app.py +258 -0
  96. julee/docs/sphinx_hcd/tests/domain/models/test_code_info.py +231 -0
  97. julee/docs/sphinx_hcd/tests/domain/models/test_epic.py +163 -0
  98. julee/docs/sphinx_hcd/tests/domain/models/test_integration.py +327 -0
  99. julee/docs/sphinx_hcd/tests/domain/models/test_journey.py +249 -0
  100. julee/docs/sphinx_hcd/tests/domain/models/test_persona.py +172 -0
  101. julee/docs/sphinx_hcd/tests/domain/models/test_story.py +216 -0
  102. julee/docs/sphinx_hcd/tests/domain/use_cases/__init__.py +1 -0
  103. julee/docs/sphinx_hcd/tests/domain/use_cases/test_derive_personas.py +314 -0
  104. julee/docs/sphinx_hcd/tests/domain/use_cases/test_resolve_accelerator_references.py +476 -0
  105. julee/docs/sphinx_hcd/tests/domain/use_cases/test_resolve_app_references.py +265 -0
  106. julee/docs/sphinx_hcd/tests/domain/use_cases/test_resolve_story_references.py +229 -0
  107. julee/docs/sphinx_hcd/tests/integration/__init__.py +1 -0
  108. julee/docs/sphinx_hcd/tests/parsers/__init__.py +1 -0
  109. julee/docs/sphinx_hcd/tests/parsers/test_ast.py +298 -0
  110. julee/docs/sphinx_hcd/tests/parsers/test_gherkin.py +282 -0
  111. julee/docs/sphinx_hcd/tests/parsers/test_yaml.py +496 -0
  112. julee/docs/sphinx_hcd/tests/repositories/__init__.py +1 -0
  113. julee/docs/sphinx_hcd/tests/repositories/test_accelerator.py +298 -0
  114. julee/docs/sphinx_hcd/tests/repositories/test_app.py +218 -0
  115. julee/docs/sphinx_hcd/tests/repositories/test_base.py +151 -0
  116. julee/docs/sphinx_hcd/tests/repositories/test_code_info.py +253 -0
  117. julee/docs/sphinx_hcd/tests/repositories/test_epic.py +237 -0
  118. julee/docs/sphinx_hcd/tests/repositories/test_integration.py +268 -0
  119. julee/docs/sphinx_hcd/tests/repositories/test_journey.py +294 -0
  120. julee/docs/sphinx_hcd/tests/repositories/test_story.py +236 -0
  121. julee/docs/sphinx_hcd/tests/sphinx/__init__.py +1 -0
  122. julee/docs/sphinx_hcd/tests/sphinx/directives/__init__.py +1 -0
  123. julee/docs/sphinx_hcd/tests/sphinx/directives/test_base.py +160 -0
  124. julee/docs/sphinx_hcd/tests/sphinx/test_adapters.py +176 -0
  125. julee/docs/sphinx_hcd/tests/sphinx/test_context.py +257 -0
  126. julee/domain/models/assembly/tests/test_assembly.py +2 -0
  127. julee/domain/models/assembly_specification/tests/test_assembly_specification.py +2 -0
  128. julee/domain/models/assembly_specification/tests/test_knowledge_service_query.py +2 -0
  129. julee/domain/models/custom_fields/tests/test_custom_fields.py +2 -0
  130. julee/domain/models/document/tests/test_document.py +2 -0
  131. julee/domain/models/policy/tests/test_document_policy_validation.py +2 -0
  132. julee/domain/models/policy/tests/test_policy.py +2 -0
  133. julee/domain/use_cases/tests/test_extract_assemble_data.py +2 -0
  134. julee/domain/use_cases/tests/test_initialize_system_data.py +2 -0
  135. julee/domain/use_cases/tests/test_validate_document.py +2 -0
  136. julee/maintenance/release.py +10 -5
  137. julee/repositories/memory/tests/test_document.py +2 -0
  138. julee/repositories/memory/tests/test_document_policy_validation.py +2 -0
  139. julee/repositories/memory/tests/test_policy.py +2 -0
  140. julee/repositories/minio/tests/test_assembly.py +2 -0
  141. julee/repositories/minio/tests/test_assembly_specification.py +2 -0
  142. julee/repositories/minio/tests/test_client_protocol.py +3 -0
  143. julee/repositories/minio/tests/test_document.py +2 -0
  144. julee/repositories/minio/tests/test_document_policy_validation.py +2 -0
  145. julee/repositories/minio/tests/test_knowledge_service_config.py +2 -0
  146. julee/repositories/minio/tests/test_knowledge_service_query.py +2 -0
  147. julee/repositories/minio/tests/test_policy.py +2 -0
  148. julee/services/knowledge_service/anthropic/tests/test_knowledge_service.py +2 -0
  149. julee/services/knowledge_service/memory/test_knowledge_service.py +2 -0
  150. julee/services/knowledge_service/test_factory.py +2 -0
  151. julee/util/tests/test_decorators.py +2 -0
  152. julee-0.1.6.dist-info/METADATA +104 -0
  153. julee-0.1.6.dist-info/RECORD +288 -0
  154. julee/docs/sphinx_hcd/accelerators.py +0 -1175
  155. julee/docs/sphinx_hcd/apps.py +0 -518
  156. julee/docs/sphinx_hcd/epics.py +0 -453
  157. julee/docs/sphinx_hcd/integrations.py +0 -310
  158. julee/docs/sphinx_hcd/journeys.py +0 -797
  159. julee/docs/sphinx_hcd/personas.py +0 -457
  160. julee/docs/sphinx_hcd/stories.py +0 -960
  161. julee-0.1.4.dist-info/METADATA +0 -197
  162. julee-0.1.4.dist-info/RECORD +0 -196
  163. {julee-0.1.4.dist-info → julee-0.1.6.dist-info}/WHEEL +0 -0
  164. {julee-0.1.4.dist-info → julee-0.1.6.dist-info}/licenses/LICENSE +0 -0
  165. {julee-0.1.4.dist-info → julee-0.1.6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,257 @@
1
+ """Tests for HCDContext."""
2
+
3
+ import pytest
4
+
5
+ from julee.docs.sphinx_hcd.domain.models import (
6
+ Accelerator,
7
+ App,
8
+ AppType,
9
+ Epic,
10
+ Journey,
11
+ Story,
12
+ )
13
+ from julee.docs.sphinx_hcd.sphinx.context import (
14
+ HCDContext,
15
+ ensure_hcd_context,
16
+ get_hcd_context,
17
+ set_hcd_context,
18
+ )
19
+
20
+
21
+ class MockSphinxApp:
22
+ """Mock Sphinx app for testing."""
23
+
24
+ pass
25
+
26
+
27
+ class TestHCDContextCreation:
28
+ """Test HCDContext creation."""
29
+
30
+ def test_create_context(self) -> None:
31
+ """Test creating a new context."""
32
+ context = HCDContext()
33
+
34
+ assert context.story_repo is not None
35
+ assert context.journey_repo is not None
36
+ assert context.epic_repo is not None
37
+ assert context.app_repo is not None
38
+ assert context.accelerator_repo is not None
39
+ assert context.integration_repo is not None
40
+ assert context.code_info_repo is not None
41
+
42
+ def test_repositories_are_independent(self) -> None:
43
+ """Test that each context has its own repositories."""
44
+ context1 = HCDContext()
45
+ context2 = HCDContext()
46
+
47
+ # Add to context1
48
+ story = Story(
49
+ slug="test-story",
50
+ feature_title="Test Story",
51
+ persona="Tester",
52
+ i_want="test",
53
+ so_that="verify",
54
+ app_slug="test-app",
55
+ file_path="test.feature",
56
+ )
57
+ context1.story_repo.save(story)
58
+
59
+ # context2 should be empty
60
+ assert context1.story_repo.get("test-story") is not None
61
+ assert context2.story_repo.get("test-story") is None
62
+
63
+
64
+ class TestHCDContextOperations:
65
+ """Test HCDContext operations."""
66
+
67
+ @pytest.fixture
68
+ def context(self) -> HCDContext:
69
+ """Create a context with sample data."""
70
+ ctx = HCDContext()
71
+
72
+ # Add some entities
73
+ ctx.story_repo.save(
74
+ Story(
75
+ slug="upload-document",
76
+ feature_title="Upload Document",
77
+ persona="Curator",
78
+ i_want="upload",
79
+ so_that="share",
80
+ app_slug="vocab-tool",
81
+ file_path="test.feature",
82
+ )
83
+ )
84
+
85
+ ctx.journey_repo.save(
86
+ Journey(
87
+ slug="build-vocabulary",
88
+ persona="Curator",
89
+ docname="journeys/build-vocabulary",
90
+ )
91
+ )
92
+
93
+ ctx.epic_repo.save(
94
+ Epic(
95
+ slug="vocabulary-management",
96
+ description="Manage vocabularies",
97
+ docname="epics/vocabulary-management",
98
+ )
99
+ )
100
+
101
+ ctx.app_repo.save(
102
+ App(
103
+ slug="vocab-tool",
104
+ name="Vocabulary Tool",
105
+ app_type=AppType.STAFF,
106
+ manifest_path="apps/vocab-tool/app.yaml",
107
+ )
108
+ )
109
+
110
+ ctx.accelerator_repo.save(
111
+ Accelerator(
112
+ slug="vocabulary",
113
+ status="alpha",
114
+ docname="accelerators/vocabulary",
115
+ )
116
+ )
117
+
118
+ return ctx
119
+
120
+ def test_clear_all(self, context: HCDContext) -> None:
121
+ """Test clearing all repositories."""
122
+ # Verify data exists
123
+ assert context.story_repo.get("upload-document") is not None
124
+ assert context.journey_repo.get("build-vocabulary") is not None
125
+ assert context.epic_repo.get("vocabulary-management") is not None
126
+ assert context.app_repo.get("vocab-tool") is not None
127
+ assert context.accelerator_repo.get("vocabulary") is not None
128
+
129
+ # Clear all
130
+ context.clear_all()
131
+
132
+ # Verify all cleared
133
+ assert context.story_repo.get("upload-document") is None
134
+ assert context.journey_repo.get("build-vocabulary") is None
135
+ assert context.epic_repo.get("vocabulary-management") is None
136
+ assert context.app_repo.get("vocab-tool") is None
137
+ assert context.accelerator_repo.get("vocabulary") is None
138
+
139
+ def test_clear_by_docname(self, context: HCDContext) -> None:
140
+ """Test clearing entities by docname."""
141
+ # Add another journey with different docname
142
+ context.journey_repo.save(
143
+ Journey(
144
+ slug="other-journey",
145
+ persona="User",
146
+ docname="journeys/other",
147
+ )
148
+ )
149
+
150
+ # Clear by docname
151
+ results = context.clear_by_docname("journeys/build-vocabulary")
152
+
153
+ # Verify results
154
+ assert results["journeys"] == 1
155
+ assert results["epics"] == 0
156
+ assert results["accelerators"] == 0
157
+
158
+ # Verify correct entity cleared
159
+ assert context.journey_repo.get("build-vocabulary") is None
160
+ assert context.journey_repo.get("other-journey") is not None
161
+
162
+ def test_clear_by_docname_multiple_types(self) -> None:
163
+ """Test clearing entities across multiple types with same docname."""
164
+ context = HCDContext()
165
+
166
+ # Add entities with same docname
167
+ context.journey_repo.save(
168
+ Journey(
169
+ slug="shared-journey",
170
+ persona="User",
171
+ docname="shared/doc",
172
+ )
173
+ )
174
+ context.epic_repo.save(
175
+ Epic(
176
+ slug="shared-epic",
177
+ docname="shared/doc",
178
+ )
179
+ )
180
+ context.accelerator_repo.save(
181
+ Accelerator(
182
+ slug="shared-accel",
183
+ docname="shared/doc",
184
+ )
185
+ )
186
+
187
+ # Clear by docname
188
+ results = context.clear_by_docname("shared/doc")
189
+
190
+ # All should be cleared
191
+ assert results["journeys"] == 1
192
+ assert results["epics"] == 1
193
+ assert results["accelerators"] == 1
194
+
195
+
196
+ class TestContextAccessFunctions:
197
+ """Test context access helper functions."""
198
+
199
+ def test_set_and_get_context(self) -> None:
200
+ """Test setting and getting context from app."""
201
+ app = MockSphinxApp()
202
+ context = HCDContext()
203
+
204
+ set_hcd_context(app, context)
205
+ retrieved = get_hcd_context(app)
206
+
207
+ assert retrieved is context
208
+
209
+ def test_get_context_not_set(self) -> None:
210
+ """Test getting context when not set raises error."""
211
+ app = MockSphinxApp()
212
+
213
+ with pytest.raises(AttributeError):
214
+ get_hcd_context(app)
215
+
216
+ def test_ensure_context_creates_new(self) -> None:
217
+ """Test ensure_hcd_context creates new context if none exists."""
218
+ app = MockSphinxApp()
219
+
220
+ context = ensure_hcd_context(app)
221
+
222
+ assert context is not None
223
+ assert isinstance(context, HCDContext)
224
+
225
+ def test_ensure_context_returns_existing(self) -> None:
226
+ """Test ensure_hcd_context returns existing context."""
227
+ app = MockSphinxApp()
228
+ original = HCDContext()
229
+ set_hcd_context(app, original)
230
+
231
+ retrieved = ensure_hcd_context(app)
232
+
233
+ assert retrieved is original
234
+
235
+ def test_context_persists_on_app(self) -> None:
236
+ """Test context persists on app object."""
237
+ app = MockSphinxApp()
238
+ context = HCDContext()
239
+
240
+ # Add data through context
241
+ context.story_repo.save(
242
+ Story(
243
+ slug="test",
244
+ feature_title="Test",
245
+ persona="User",
246
+ i_want="test",
247
+ so_that="verify",
248
+ app_slug="app",
249
+ file_path="test.feature",
250
+ )
251
+ )
252
+
253
+ set_hcd_context(app, context)
254
+
255
+ # Retrieve and verify data
256
+ retrieved = get_hcd_context(app)
257
+ assert retrieved.story_repo.get("test") is not None
@@ -29,6 +29,8 @@ from julee.domain.models.assembly import Assembly, AssemblyStatus
29
29
 
30
30
  from .factories import AssemblyFactory
31
31
 
32
+ pytestmark = pytest.mark.unit
33
+
32
34
 
33
35
  class TestAssemblyInstantiation:
34
36
  """Test Assembly creation with various field combinations."""
@@ -31,6 +31,8 @@ from julee.domain.models.assembly_specification import (
31
31
 
32
32
  from .factories import AssemblyFactory
33
33
 
34
+ pytestmark = pytest.mark.unit
35
+
34
36
 
35
37
  class TestAssemblyInstantiation:
36
38
  """Test AssemblySpecification creation with various field combinations."""
@@ -27,6 +27,8 @@ from julee.domain.models.assembly_specification import (
27
27
 
28
28
  from .factories import KnowledgeServiceQueryFactory
29
29
 
30
+ pytestmark = pytest.mark.unit
31
+
30
32
 
31
33
  class TestKnowledgeServiceQueryInstantiation:
32
34
  """Test KnowledgeServiceQuery creation with various field combinations."""
@@ -21,6 +21,8 @@ from julee.domain.models.custom_fields.content_stream import (
21
21
  ContentStream,
22
22
  )
23
23
 
24
+ pytestmark = pytest.mark.unit
25
+
24
26
 
25
27
  @pytest.mark.parametrize(
26
28
  "stream_input,error_message",
@@ -28,6 +28,8 @@ from julee.domain.models.document import Document
28
28
 
29
29
  from .factories import ContentStreamFactory, DocumentFactory
30
30
 
31
+ pytestmark = pytest.mark.unit
32
+
31
33
 
32
34
  class TestDocumentInstantiation:
33
35
  """Test Document creation with various field combinations."""
@@ -25,6 +25,8 @@ from julee.domain.models.policy import (
25
25
 
26
26
  from .factories import DocumentPolicyValidationFactory
27
27
 
28
+ pytestmark = pytest.mark.unit
29
+
28
30
 
29
31
  class TestDocumentPolicyValidationValidation:
30
32
  """Test validation rules for DocumentPolicyValidation model."""
@@ -15,6 +15,8 @@ from julee.domain.models.policy import (
15
15
  PolicyStatus,
16
16
  )
17
17
 
18
+ pytestmark = pytest.mark.unit
19
+
18
20
 
19
21
  class TestPolicy:
20
22
  """Tests for Policy domain model."""
@@ -38,6 +38,8 @@ from julee.services.knowledge_service.memory import (
38
38
  MemoryKnowledgeService,
39
39
  )
40
40
 
41
+ pytestmark = pytest.mark.unit
42
+
41
43
 
42
44
  class TestExtractAssembleDataUseCase:
43
45
  """Test cases for ExtractAssembleDataUseCase business logic."""
@@ -35,6 +35,8 @@ from julee.repositories.memory.knowledge_service_query import (
35
35
  MemoryKnowledgeServiceQueryRepository,
36
36
  )
37
37
 
38
+ pytestmark = pytest.mark.unit
39
+
38
40
 
39
41
  @pytest.fixture
40
42
  def memory_config_repository() -> MemoryKnowledgeServiceConfigRepository:
@@ -40,6 +40,8 @@ from julee.services.knowledge_service.memory import (
40
40
  MemoryKnowledgeService,
41
41
  )
42
42
 
43
+ pytestmark = pytest.mark.unit
44
+
43
45
 
44
46
  class TestValidateDocumentUseCase:
45
47
  """Test cases for ValidateDocumentUseCase business logic."""
@@ -151,7 +151,7 @@ def prepare(version: str, message_file: Path | None = None) -> None:
151
151
  commit_msg = f"release: bump version to {version}"
152
152
 
153
153
  # Use a temp file for the commit message to handle multiline properly
154
- with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
154
+ with tempfile.NamedTemporaryFile(mode="w", suffix=".txt", delete=False) as f:
155
155
  f.write(commit_msg)
156
156
  commit_msg_file = f.name
157
157
  try:
@@ -167,7 +167,7 @@ def prepare(version: str, message_file: Path | None = None) -> None:
167
167
  print("Creating pull request...")
168
168
  pr_body = release_notes if release_notes else f"Bump version to {version}"
169
169
 
170
- with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
170
+ with tempfile.NamedTemporaryFile(mode="w", suffix=".txt", delete=False) as f:
171
171
  f.write(pr_body)
172
172
  pr_body_file = f.name
173
173
  try:
@@ -215,14 +215,19 @@ def tag(version: str) -> None:
215
215
 
216
216
 
217
217
  def main() -> None:
218
- parser = argparse.ArgumentParser(description="Release preparation and tagging script")
218
+ parser = argparse.ArgumentParser(
219
+ description="Release preparation and tagging script"
220
+ )
219
221
  subparsers = parser.add_subparsers(dest="command", required=True)
220
222
 
221
223
  # prepare subcommand
222
- prepare_parser = subparsers.add_parser("prepare", help="Create release branch and PR")
224
+ prepare_parser = subparsers.add_parser(
225
+ "prepare", help="Create release branch and PR"
226
+ )
223
227
  prepare_parser.add_argument("version", help="Version number (X.Y.Z)")
224
228
  prepare_parser.add_argument(
225
- "--message-file", "-m",
229
+ "--message-file",
230
+ "-m",
226
231
  type=Path,
227
232
  help="File containing release notes for commit message and PR body",
228
233
  )
@@ -18,6 +18,8 @@ from julee.repositories.memory.document import (
18
18
  MemoryDocumentRepository,
19
19
  )
20
20
 
21
+ pytestmark = pytest.mark.unit
22
+
21
23
 
22
24
  @pytest.fixture
23
25
  def repository() -> MemoryDocumentRepository:
@@ -19,6 +19,8 @@ from julee.repositories.memory.document_policy_validation import (
19
19
  MemoryDocumentPolicyValidationRepository,
20
20
  )
21
21
 
22
+ pytestmark = pytest.mark.unit
23
+
22
24
 
23
25
  @pytest.fixture
24
26
  def validation_repo() -> MemoryDocumentPolicyValidationRepository:
@@ -13,6 +13,8 @@ import pytest
13
13
  from julee.domain.models.policy import Policy, PolicyStatus
14
14
  from julee.repositories.memory.policy import MemoryPolicyRepository
15
15
 
16
+ pytestmark = pytest.mark.unit
17
+
16
18
 
17
19
  @pytest.fixture
18
20
  def policy_repo() -> MemoryPolicyRepository:
@@ -15,6 +15,8 @@ from julee.repositories.minio.assembly import MinioAssemblyRepository
15
15
 
16
16
  from .fake_client import FakeMinioClient
17
17
 
18
+ pytestmark = pytest.mark.unit
19
+
18
20
 
19
21
  @pytest.fixture
20
22
  def fake_client() -> FakeMinioClient:
@@ -20,6 +20,8 @@ from julee.repositories.minio.assembly_specification import (
20
20
 
21
21
  from .fake_client import FakeMinioClient
22
22
 
23
+ pytestmark = pytest.mark.unit
24
+
23
25
 
24
26
  @pytest.fixture
25
27
  def fake_client() -> FakeMinioClient:
@@ -6,10 +6,13 @@ MinioClient protocol, ensuring that our protocol definition matches the
6
6
  actual interface.
7
7
  """
8
8
 
9
+ import pytest
9
10
  from minio import Minio
10
11
 
11
12
  from ..client import MinioClient
12
13
 
14
+ pytestmark = pytest.mark.unit
15
+
13
16
 
14
17
  class TestMinioClientProtocol:
15
18
  """Test that the real Minio client implements our protocol."""
@@ -23,6 +23,8 @@ from julee.repositories.minio.document import MinioDocumentRepository
23
23
 
24
24
  from .fake_client import FakeMinioClient
25
25
 
26
+ pytestmark = pytest.mark.unit
27
+
26
28
 
27
29
  @pytest.fixture
28
30
  def fake_minio_client() -> FakeMinioClient:
@@ -21,6 +21,8 @@ from julee.repositories.minio.document_policy_validation import (
21
21
 
22
22
  from .fake_client import FakeMinioClient
23
23
 
24
+ pytestmark = pytest.mark.unit
25
+
24
26
 
25
27
  @pytest.fixture
26
28
  def fake_client() -> FakeMinioClient:
@@ -20,6 +20,8 @@ from julee.repositories.minio.knowledge_service_config import (
20
20
 
21
21
  from .fake_client import FakeMinioClient
22
22
 
23
+ pytestmark = pytest.mark.unit
24
+
23
25
 
24
26
  @pytest.fixture
25
27
  def fake_client() -> FakeMinioClient:
@@ -19,6 +19,8 @@ from julee.repositories.minio.knowledge_service_query import (
19
19
 
20
20
  from .fake_client import FakeMinioClient
21
21
 
22
+ pytestmark = pytest.mark.unit
23
+
22
24
 
23
25
  @pytest.fixture
24
26
  def fake_client() -> FakeMinioClient:
@@ -15,6 +15,8 @@ from julee.repositories.minio.policy import MinioPolicyRepository
15
15
 
16
16
  from .fake_client import FakeMinioClient
17
17
 
18
+ pytestmark = pytest.mark.unit
19
+
18
20
 
19
21
  @pytest.fixture
20
22
  def fake_client() -> FakeMinioClient:
@@ -27,6 +27,8 @@ from julee.services.knowledge_service.anthropic import (
27
27
  knowledge_service as anthropic_ks_module,
28
28
  )
29
29
 
30
+ pytestmark = pytest.mark.unit
31
+
30
32
 
31
33
  @pytest.fixture
32
34
  def test_document() -> Document:
@@ -23,6 +23,8 @@ from julee.domain.models.knowledge_service_config import (
23
23
  from ..knowledge_service import QueryResult
24
24
  from .knowledge_service import MemoryKnowledgeService
25
25
 
26
+ pytestmark = pytest.mark.unit
27
+
26
28
 
27
29
  @pytest.fixture
28
30
  def test_document() -> Document:
@@ -26,6 +26,8 @@ from julee.services.knowledge_service.factory import (
26
26
  knowledge_service_factory,
27
27
  )
28
28
 
29
+ pytestmark = pytest.mark.unit
30
+
29
31
 
30
32
  @pytest.fixture
31
33
  def test_document() -> Document:
@@ -34,6 +34,8 @@ from julee.util.temporal.decorators import (
34
34
  temporal_workflow_proxy,
35
35
  )
36
36
 
37
+ pytestmark = pytest.mark.unit
38
+
37
39
 
38
40
  @runtime_checkable
39
41
  class MockBaseRepositoryProtocol(Protocol):
@@ -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.