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.
- julee/__init__.py +1 -1
- julee/api/tests/routers/test_assembly_specifications.py +2 -0
- julee/api/tests/routers/test_documents.py +2 -0
- julee/api/tests/routers/test_knowledge_service_configs.py +2 -0
- julee/api/tests/routers/test_knowledge_service_queries.py +2 -0
- julee/api/tests/routers/test_system.py +2 -0
- julee/api/tests/routers/test_workflows.py +2 -0
- julee/api/tests/test_app.py +2 -0
- julee/api/tests/test_dependencies.py +2 -0
- julee/api/tests/test_requests.py +2 -0
- julee/contrib/polling/__init__.py +22 -19
- julee/contrib/polling/apps/__init__.py +17 -0
- julee/contrib/polling/apps/worker/__init__.py +17 -0
- julee/contrib/polling/apps/worker/pipelines.py +288 -0
- julee/contrib/polling/domain/__init__.py +7 -9
- julee/contrib/polling/domain/models/__init__.py +6 -7
- julee/contrib/polling/domain/models/polling_config.py +18 -1
- julee/contrib/polling/domain/services/__init__.py +6 -5
- julee/contrib/polling/domain/services/poller.py +1 -1
- julee/contrib/polling/infrastructure/__init__.py +9 -8
- julee/contrib/polling/infrastructure/services/__init__.py +6 -5
- julee/contrib/polling/infrastructure/services/polling/__init__.py +6 -5
- julee/contrib/polling/infrastructure/services/polling/http/__init__.py +6 -5
- julee/contrib/polling/infrastructure/services/polling/http/http_poller_service.py +5 -2
- julee/contrib/polling/infrastructure/temporal/__init__.py +12 -12
- julee/contrib/polling/infrastructure/temporal/activities.py +1 -1
- julee/contrib/polling/infrastructure/temporal/manager.py +291 -0
- julee/contrib/polling/infrastructure/temporal/proxies.py +1 -1
- julee/contrib/polling/tests/unit/apps/worker/test_pipelines.py +580 -0
- julee/contrib/polling/tests/unit/infrastructure/services/polling/http/test_http_poller_service.py +40 -2
- julee/contrib/polling/tests/unit/infrastructure/temporal/__init__.py +7 -0
- julee/contrib/polling/tests/unit/infrastructure/temporal/test_manager.py +475 -0
- julee/docs/sphinx_hcd/__init__.py +146 -13
- julee/docs/sphinx_hcd/domain/__init__.py +5 -0
- julee/docs/sphinx_hcd/domain/models/__init__.py +32 -0
- julee/docs/sphinx_hcd/domain/models/accelerator.py +152 -0
- julee/docs/sphinx_hcd/domain/models/app.py +151 -0
- julee/docs/sphinx_hcd/domain/models/code_info.py +121 -0
- julee/docs/sphinx_hcd/domain/models/epic.py +79 -0
- julee/docs/sphinx_hcd/domain/models/integration.py +230 -0
- julee/docs/sphinx_hcd/domain/models/journey.py +222 -0
- julee/docs/sphinx_hcd/domain/models/persona.py +106 -0
- julee/docs/sphinx_hcd/domain/models/story.py +128 -0
- julee/docs/sphinx_hcd/domain/repositories/__init__.py +25 -0
- julee/docs/sphinx_hcd/domain/repositories/accelerator.py +98 -0
- julee/docs/sphinx_hcd/domain/repositories/app.py +57 -0
- julee/docs/sphinx_hcd/domain/repositories/base.py +89 -0
- julee/docs/sphinx_hcd/domain/repositories/code_info.py +69 -0
- julee/docs/sphinx_hcd/domain/repositories/epic.py +62 -0
- julee/docs/sphinx_hcd/domain/repositories/integration.py +79 -0
- julee/docs/sphinx_hcd/domain/repositories/journey.py +106 -0
- julee/docs/sphinx_hcd/domain/repositories/story.py +68 -0
- julee/docs/sphinx_hcd/domain/use_cases/__init__.py +64 -0
- julee/docs/sphinx_hcd/domain/use_cases/derive_personas.py +166 -0
- julee/docs/sphinx_hcd/domain/use_cases/resolve_accelerator_references.py +236 -0
- julee/docs/sphinx_hcd/domain/use_cases/resolve_app_references.py +144 -0
- julee/docs/sphinx_hcd/domain/use_cases/resolve_story_references.py +121 -0
- julee/docs/sphinx_hcd/parsers/__init__.py +48 -0
- julee/docs/sphinx_hcd/parsers/ast.py +150 -0
- julee/docs/sphinx_hcd/parsers/gherkin.py +155 -0
- julee/docs/sphinx_hcd/parsers/yaml.py +184 -0
- julee/docs/sphinx_hcd/repositories/__init__.py +4 -0
- julee/docs/sphinx_hcd/repositories/memory/__init__.py +25 -0
- julee/docs/sphinx_hcd/repositories/memory/accelerator.py +86 -0
- julee/docs/sphinx_hcd/repositories/memory/app.py +45 -0
- julee/docs/sphinx_hcd/repositories/memory/base.py +106 -0
- julee/docs/sphinx_hcd/repositories/memory/code_info.py +59 -0
- julee/docs/sphinx_hcd/repositories/memory/epic.py +54 -0
- julee/docs/sphinx_hcd/repositories/memory/integration.py +70 -0
- julee/docs/sphinx_hcd/repositories/memory/journey.py +96 -0
- julee/docs/sphinx_hcd/repositories/memory/story.py +63 -0
- julee/docs/sphinx_hcd/sphinx/__init__.py +28 -0
- julee/docs/sphinx_hcd/sphinx/adapters.py +116 -0
- julee/docs/sphinx_hcd/sphinx/context.py +163 -0
- julee/docs/sphinx_hcd/sphinx/directives/__init__.py +160 -0
- julee/docs/sphinx_hcd/sphinx/directives/accelerator.py +576 -0
- julee/docs/sphinx_hcd/sphinx/directives/app.py +349 -0
- julee/docs/sphinx_hcd/sphinx/directives/base.py +211 -0
- julee/docs/sphinx_hcd/sphinx/directives/epic.py +434 -0
- julee/docs/sphinx_hcd/sphinx/directives/integration.py +220 -0
- julee/docs/sphinx_hcd/sphinx/directives/journey.py +642 -0
- julee/docs/sphinx_hcd/sphinx/directives/persona.py +345 -0
- julee/docs/sphinx_hcd/sphinx/directives/story.py +575 -0
- julee/docs/sphinx_hcd/sphinx/event_handlers/__init__.py +16 -0
- julee/docs/sphinx_hcd/sphinx/event_handlers/builder_inited.py +31 -0
- julee/docs/sphinx_hcd/sphinx/event_handlers/doctree_read.py +27 -0
- julee/docs/sphinx_hcd/sphinx/event_handlers/doctree_resolved.py +43 -0
- julee/docs/sphinx_hcd/sphinx/event_handlers/env_purge_doc.py +42 -0
- julee/docs/sphinx_hcd/sphinx/initialization.py +139 -0
- julee/docs/sphinx_hcd/tests/__init__.py +9 -0
- julee/docs/sphinx_hcd/tests/conftest.py +6 -0
- julee/docs/sphinx_hcd/tests/domain/__init__.py +1 -0
- julee/docs/sphinx_hcd/tests/domain/models/__init__.py +1 -0
- julee/docs/sphinx_hcd/tests/domain/models/test_accelerator.py +266 -0
- julee/docs/sphinx_hcd/tests/domain/models/test_app.py +258 -0
- julee/docs/sphinx_hcd/tests/domain/models/test_code_info.py +231 -0
- julee/docs/sphinx_hcd/tests/domain/models/test_epic.py +163 -0
- julee/docs/sphinx_hcd/tests/domain/models/test_integration.py +327 -0
- julee/docs/sphinx_hcd/tests/domain/models/test_journey.py +249 -0
- julee/docs/sphinx_hcd/tests/domain/models/test_persona.py +172 -0
- julee/docs/sphinx_hcd/tests/domain/models/test_story.py +216 -0
- julee/docs/sphinx_hcd/tests/domain/use_cases/__init__.py +1 -0
- julee/docs/sphinx_hcd/tests/domain/use_cases/test_derive_personas.py +314 -0
- julee/docs/sphinx_hcd/tests/domain/use_cases/test_resolve_accelerator_references.py +476 -0
- julee/docs/sphinx_hcd/tests/domain/use_cases/test_resolve_app_references.py +265 -0
- julee/docs/sphinx_hcd/tests/domain/use_cases/test_resolve_story_references.py +229 -0
- julee/docs/sphinx_hcd/tests/integration/__init__.py +1 -0
- julee/docs/sphinx_hcd/tests/parsers/__init__.py +1 -0
- julee/docs/sphinx_hcd/tests/parsers/test_ast.py +298 -0
- julee/docs/sphinx_hcd/tests/parsers/test_gherkin.py +282 -0
- julee/docs/sphinx_hcd/tests/parsers/test_yaml.py +496 -0
- julee/docs/sphinx_hcd/tests/repositories/__init__.py +1 -0
- julee/docs/sphinx_hcd/tests/repositories/test_accelerator.py +298 -0
- julee/docs/sphinx_hcd/tests/repositories/test_app.py +218 -0
- julee/docs/sphinx_hcd/tests/repositories/test_base.py +151 -0
- julee/docs/sphinx_hcd/tests/repositories/test_code_info.py +253 -0
- julee/docs/sphinx_hcd/tests/repositories/test_epic.py +237 -0
- julee/docs/sphinx_hcd/tests/repositories/test_integration.py +268 -0
- julee/docs/sphinx_hcd/tests/repositories/test_journey.py +294 -0
- julee/docs/sphinx_hcd/tests/repositories/test_story.py +236 -0
- julee/docs/sphinx_hcd/tests/sphinx/__init__.py +1 -0
- julee/docs/sphinx_hcd/tests/sphinx/directives/__init__.py +1 -0
- julee/docs/sphinx_hcd/tests/sphinx/directives/test_base.py +160 -0
- julee/docs/sphinx_hcd/tests/sphinx/test_adapters.py +176 -0
- julee/docs/sphinx_hcd/tests/sphinx/test_context.py +257 -0
- julee/domain/models/assembly/tests/test_assembly.py +2 -0
- julee/domain/models/assembly_specification/tests/test_assembly_specification.py +2 -0
- julee/domain/models/assembly_specification/tests/test_knowledge_service_query.py +2 -0
- julee/domain/models/custom_fields/tests/test_custom_fields.py +2 -0
- julee/domain/models/document/tests/test_document.py +2 -0
- julee/domain/models/policy/tests/test_document_policy_validation.py +2 -0
- julee/domain/models/policy/tests/test_policy.py +2 -0
- julee/domain/use_cases/tests/test_extract_assemble_data.py +2 -0
- julee/domain/use_cases/tests/test_initialize_system_data.py +2 -0
- julee/domain/use_cases/tests/test_validate_document.py +2 -0
- julee/maintenance/release.py +10 -5
- julee/repositories/memory/tests/test_document.py +2 -0
- julee/repositories/memory/tests/test_document_policy_validation.py +2 -0
- julee/repositories/memory/tests/test_policy.py +2 -0
- julee/repositories/minio/tests/test_assembly.py +2 -0
- julee/repositories/minio/tests/test_assembly_specification.py +2 -0
- julee/repositories/minio/tests/test_client_protocol.py +3 -0
- julee/repositories/minio/tests/test_document.py +2 -0
- julee/repositories/minio/tests/test_document_policy_validation.py +2 -0
- julee/repositories/minio/tests/test_knowledge_service_config.py +2 -0
- julee/repositories/minio/tests/test_knowledge_service_query.py +2 -0
- julee/repositories/minio/tests/test_policy.py +2 -0
- julee/services/knowledge_service/anthropic/tests/test_knowledge_service.py +2 -0
- julee/services/knowledge_service/memory/test_knowledge_service.py +2 -0
- julee/services/knowledge_service/test_factory.py +2 -0
- julee/util/tests/test_decorators.py +2 -0
- julee-0.1.6.dist-info/METADATA +104 -0
- julee-0.1.6.dist-info/RECORD +288 -0
- julee/docs/sphinx_hcd/accelerators.py +0 -1175
- julee/docs/sphinx_hcd/apps.py +0 -518
- julee/docs/sphinx_hcd/epics.py +0 -453
- julee/docs/sphinx_hcd/integrations.py +0 -310
- julee/docs/sphinx_hcd/journeys.py +0 -797
- julee/docs/sphinx_hcd/personas.py +0 -457
- julee/docs/sphinx_hcd/stories.py +0 -960
- julee-0.1.4.dist-info/METADATA +0 -197
- julee-0.1.4.dist-info/RECORD +0 -196
- {julee-0.1.4.dist-info → julee-0.1.6.dist-info}/WHEEL +0 -0
- {julee-0.1.4.dist-info → julee-0.1.6.dist-info}/licenses/LICENSE +0 -0
- {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
|
|
@@ -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."""
|
julee/maintenance/release.py
CHANGED
|
@@ -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=
|
|
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=
|
|
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(
|
|
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(
|
|
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",
|
|
229
|
+
"--message-file",
|
|
230
|
+
"-m",
|
|
226
231
|
type=Path,
|
|
227
232
|
help="File containing release notes for commit message and PR body",
|
|
228
233
|
)
|
|
@@ -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."""
|
|
@@ -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.
|