julee 0.1.0__py3-none-any.whl → 0.1.2__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/domain/models/assembly_specification/knowledge_service_query.py +7 -3
- julee/domain/models/policy/policy.py +2 -0
- julee/domain/repositories/base.py +28 -12
- julee/domain/use_cases/extract_assemble_data.py +10 -1
- julee/domain/use_cases/validate_document.py +12 -1
- julee/repositories/__init__.py +4 -1
- julee/repositories/memory/assembly_specification.py +1 -0
- julee/repositories/memory/knowledge_service_config.py +1 -0
- julee/repositories/memory/knowledge_service_query.py +1 -0
- julee/repositories/minio/knowledge_service_config.py +2 -2
- julee/services/knowledge_service/knowledge_service.py +10 -4
- julee/util/repositories.py +2 -4
- julee/util/temporal/activities.py +1 -1
- julee/util/temporal/decorators.py +8 -15
- {julee-0.1.0.dist-info → julee-0.1.2.dist-info}/METADATA +3 -1
- {julee-0.1.0.dist-info → julee-0.1.2.dist-info}/RECORD +20 -20
- {julee-0.1.0.dist-info → julee-0.1.2.dist-info}/WHEEL +0 -0
- {julee-0.1.0.dist-info → julee-0.1.2.dist-info}/licenses/LICENSE +0 -0
- {julee-0.1.0.dist-info → julee-0.1.2.dist-info}/top_level.txt +0 -0
julee/__init__.py
CHANGED
|
@@ -37,26 +37,30 @@ class KnowledgeServiceQuery(BaseModel):
|
|
|
37
37
|
|
|
38
38
|
Examples of query_metadata usage:
|
|
39
39
|
|
|
40
|
-
For Anthropic services
|
|
40
|
+
For Anthropic services::
|
|
41
|
+
|
|
41
42
|
query_metadata = {
|
|
42
43
|
"model": "claude-sonnet-4-20250514",
|
|
43
44
|
"max_tokens": 4000,
|
|
44
45
|
"temperature": 0.1
|
|
45
46
|
}
|
|
46
47
|
|
|
47
|
-
For OpenAI services
|
|
48
|
+
For OpenAI services::
|
|
49
|
+
|
|
48
50
|
query_metadata = {
|
|
49
51
|
"model": "gpt-4",
|
|
50
52
|
"temperature": 0.2,
|
|
51
53
|
"top_p": 0.9
|
|
52
54
|
}
|
|
53
55
|
|
|
54
|
-
For custom services
|
|
56
|
+
For custom services::
|
|
57
|
+
|
|
55
58
|
query_metadata = {
|
|
56
59
|
"endpoint": "custom-model-v2",
|
|
57
60
|
"timeout": 30,
|
|
58
61
|
"retries": 3
|
|
59
62
|
}
|
|
63
|
+
|
|
60
64
|
"""
|
|
61
65
|
|
|
62
66
|
# Core query identification
|
|
@@ -38,9 +38,11 @@ class Policy(BaseModel):
|
|
|
38
38
|
be applied to improve document quality before re-validation.
|
|
39
39
|
|
|
40
40
|
The policy operates in two modes:
|
|
41
|
+
|
|
41
42
|
1. Validation-only: Calculates scores and passes/fails based on criteria
|
|
42
43
|
2. Validation with transformation: Calculates scores, applies
|
|
43
44
|
transformations, then re-calculates scores for final pass/fail
|
|
45
|
+
|
|
44
46
|
"""
|
|
45
47
|
|
|
46
48
|
# Core policy identification
|
|
@@ -51,10 +51,12 @@ class BaseRepository(Protocol[T]):
|
|
|
51
51
|
Returns:
|
|
52
52
|
Entity if found, None otherwise
|
|
53
53
|
|
|
54
|
-
Implementation Notes
|
|
54
|
+
.. rubric:: Implementation Notes
|
|
55
|
+
|
|
55
56
|
- Must be idempotent: multiple calls return same result
|
|
56
57
|
- Should handle missing entities gracefully (return None)
|
|
57
58
|
- Loads complete entity with all relationships
|
|
59
|
+
|
|
58
60
|
"""
|
|
59
61
|
...
|
|
60
62
|
|
|
@@ -67,7 +69,8 @@ class BaseRepository(Protocol[T]):
|
|
|
67
69
|
Returns:
|
|
68
70
|
Dict mapping entity_id to entity (or None if not found)
|
|
69
71
|
|
|
70
|
-
Implementation Notes
|
|
72
|
+
.. rubric:: Implementation Notes
|
|
73
|
+
|
|
71
74
|
- Must be idempotent: multiple calls return same result
|
|
72
75
|
- Should handle missing entities gracefully (return None for missing)
|
|
73
76
|
- Implementations may optimize with batch operations or fall back
|
|
@@ -75,10 +78,12 @@ class BaseRepository(Protocol[T]):
|
|
|
75
78
|
- Keys in returned dict correspond exactly to input entity_ids
|
|
76
79
|
- Missing entities have None values in the returned dict
|
|
77
80
|
|
|
78
|
-
Workflow Context
|
|
81
|
+
.. rubric:: Workflow Context
|
|
82
|
+
|
|
79
83
|
In Temporal workflows, this method is implemented as an activity
|
|
80
84
|
to ensure batch operations are durably stored and consistent
|
|
81
85
|
across workflow replays.
|
|
86
|
+
|
|
82
87
|
"""
|
|
83
88
|
...
|
|
84
89
|
|
|
@@ -88,11 +93,13 @@ class BaseRepository(Protocol[T]):
|
|
|
88
93
|
Args:
|
|
89
94
|
entity: Complete entity to save
|
|
90
95
|
|
|
91
|
-
Implementation Notes
|
|
96
|
+
.. rubric:: Implementation Notes
|
|
97
|
+
|
|
92
98
|
- Must be idempotent: saving same entity state is safe
|
|
93
99
|
- Should update the updated_at timestamp
|
|
94
100
|
- Must save complete entity with all relationships
|
|
95
101
|
- Handles both new entities and updates to existing ones
|
|
102
|
+
|
|
96
103
|
"""
|
|
97
104
|
...
|
|
98
105
|
|
|
@@ -102,24 +109,30 @@ class BaseRepository(Protocol[T]):
|
|
|
102
109
|
Returns:
|
|
103
110
|
List of all entities in the repository
|
|
104
111
|
|
|
105
|
-
Implementation Notes
|
|
112
|
+
.. rubric:: Implementation Notes
|
|
113
|
+
|
|
106
114
|
- Must be idempotent: multiple calls return same result
|
|
107
115
|
- Returns empty list if no entities exist
|
|
108
116
|
- Should return entities in a consistent order (e.g., by ID)
|
|
109
117
|
- For large datasets, consider pagination at the use case level
|
|
110
118
|
|
|
111
|
-
Workflow Context
|
|
119
|
+
.. rubric:: Workflow Context
|
|
120
|
+
|
|
112
121
|
In Temporal workflows, this method is implemented as an activity
|
|
113
122
|
to ensure the list operation is durably stored and consistent
|
|
114
123
|
across workflow replays.
|
|
115
124
|
|
|
116
|
-
Default Implementation
|
|
125
|
+
.. rubric:: Default Implementation
|
|
126
|
+
|
|
117
127
|
Base protocol provides a default that returns empty list.
|
|
118
128
|
Repository implementations should override this method as needed.
|
|
119
129
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
130
|
+
.. note::
|
|
131
|
+
|
|
132
|
+
This default implementation returns empty list to avoid
|
|
133
|
+
breaking existing repositories. Specific repositories should
|
|
134
|
+
implement proper list_all() functionality as needed.
|
|
135
|
+
|
|
123
136
|
"""
|
|
124
137
|
return []
|
|
125
138
|
|
|
@@ -132,15 +145,18 @@ class BaseRepository(Protocol[T]):
|
|
|
132
145
|
Returns:
|
|
133
146
|
Unique entity ID string
|
|
134
147
|
|
|
135
|
-
Implementation Notes
|
|
148
|
+
.. rubric:: Implementation Notes
|
|
149
|
+
|
|
136
150
|
- Must generate globally unique identifiers
|
|
137
151
|
- May use UUIDs, database sequences, or distributed ID generators
|
|
138
152
|
- Should be fast and reliable
|
|
139
153
|
- Failure here should be rare but handled gracefully
|
|
140
154
|
|
|
141
|
-
Workflow Context
|
|
155
|
+
.. rubric:: Workflow Context
|
|
156
|
+
|
|
142
157
|
In Temporal workflows, this method is implemented as an activity
|
|
143
158
|
to ensure the generated ID is durably stored and consistent
|
|
144
159
|
across workflow replays.
|
|
160
|
+
|
|
145
161
|
"""
|
|
146
162
|
...
|
|
@@ -57,6 +57,7 @@ class ExtractAssembleDataUseCase:
|
|
|
57
57
|
methods and expects them to work correctly.
|
|
58
58
|
|
|
59
59
|
Architectural Notes:
|
|
60
|
+
|
|
60
61
|
- This class contains pure business logic with no framework dependencies
|
|
61
62
|
- Repository dependencies are injected via constructor
|
|
62
63
|
(dependency inversion)
|
|
@@ -64,6 +65,7 @@ class ExtractAssembleDataUseCase:
|
|
|
64
65
|
- The use case works with domain objects exclusively
|
|
65
66
|
- Deterministic execution is guaranteed by avoiding
|
|
66
67
|
non-deterministic operations
|
|
68
|
+
|
|
67
69
|
"""
|
|
68
70
|
|
|
69
71
|
def __init__(
|
|
@@ -91,7 +93,8 @@ class ExtractAssembleDataUseCase:
|
|
|
91
93
|
operations
|
|
92
94
|
now_fn: Function to get current time (for workflow compatibility)
|
|
93
95
|
|
|
94
|
-
|
|
96
|
+
.. note::
|
|
97
|
+
|
|
95
98
|
The repositories passed here may be concrete implementations
|
|
96
99
|
(for testing or direct execution) or workflow stubs (for
|
|
97
100
|
Temporal workflow execution). The use case doesn't know or care
|
|
@@ -99,6 +102,7 @@ class ExtractAssembleDataUseCase:
|
|
|
99
102
|
|
|
100
103
|
Repositories are validated at construction time to catch
|
|
101
104
|
configuration errors early in the application lifecycle.
|
|
105
|
+
|
|
102
106
|
"""
|
|
103
107
|
# Validate at construction time for early error detection
|
|
104
108
|
self.document_repo = ensure_repository_protocol(
|
|
@@ -135,6 +139,7 @@ class ExtractAssembleDataUseCase:
|
|
|
135
139
|
assembly.
|
|
136
140
|
|
|
137
141
|
This method orchestrates the core assembly workflow:
|
|
142
|
+
|
|
138
143
|
1. Generates a unique assembly ID
|
|
139
144
|
2. Retrieves the assembly specification
|
|
140
145
|
3. Stores the initial assembly in the repository
|
|
@@ -156,6 +161,7 @@ class ExtractAssembleDataUseCase:
|
|
|
156
161
|
Raises:
|
|
157
162
|
ValueError: If required entities are not found or invalid
|
|
158
163
|
RuntimeError: If assembly processing fails
|
|
164
|
+
|
|
159
165
|
"""
|
|
160
166
|
logger.debug(
|
|
161
167
|
"Starting data assembly use case",
|
|
@@ -267,6 +273,7 @@ class ExtractAssembleDataUseCase:
|
|
|
267
273
|
|
|
268
274
|
Raises:
|
|
269
275
|
RuntimeError: If registration fails
|
|
276
|
+
|
|
270
277
|
"""
|
|
271
278
|
registrations = {}
|
|
272
279
|
|
|
@@ -351,6 +358,7 @@ class ExtractAssembleDataUseCase:
|
|
|
351
358
|
Perform a single assembly iteration using knowledge services.
|
|
352
359
|
|
|
353
360
|
This method:
|
|
361
|
+
|
|
354
362
|
1. Executes all knowledge service queries defined in the specification
|
|
355
363
|
2. Stitches together the query results into a complete JSON document
|
|
356
364
|
3. Creates and stores the assembled document
|
|
@@ -368,6 +376,7 @@ class ExtractAssembleDataUseCase:
|
|
|
368
376
|
Raises:
|
|
369
377
|
ValueError: If required entities are not found
|
|
370
378
|
RuntimeError: If knowledge service operations fail
|
|
379
|
+
|
|
371
380
|
"""
|
|
372
381
|
# Initialize the result data structure
|
|
373
382
|
assembled_data: Dict[str, Any] = {}
|
|
@@ -58,6 +58,7 @@ class ValidateDocumentUseCase:
|
|
|
58
58
|
methods and expects them to work correctly.
|
|
59
59
|
|
|
60
60
|
Architectural Notes:
|
|
61
|
+
|
|
61
62
|
- This class contains pure business logic with no framework dependencies
|
|
62
63
|
- Repository dependencies are injected via constructor
|
|
63
64
|
(dependency inversion)
|
|
@@ -65,6 +66,7 @@ class ValidateDocumentUseCase:
|
|
|
65
66
|
- The use case works with domain objects exclusively
|
|
66
67
|
- Deterministic execution is guaranteed by avoiding
|
|
67
68
|
non-deterministic operations
|
|
69
|
+
|
|
68
70
|
"""
|
|
69
71
|
|
|
70
72
|
def __init__(
|
|
@@ -93,7 +95,8 @@ class ValidateDocumentUseCase:
|
|
|
93
95
|
now_fn: Function to get current time (e.g., workflow.now for
|
|
94
96
|
Temporal workflows)
|
|
95
97
|
|
|
96
|
-
|
|
98
|
+
.. note::
|
|
99
|
+
|
|
97
100
|
The repositories passed here may be concrete implementations
|
|
98
101
|
(for testing or direct execution) or workflow stubs (for
|
|
99
102
|
Temporal workflow execution). The use case doesn't know or care
|
|
@@ -101,6 +104,7 @@ class ValidateDocumentUseCase:
|
|
|
101
104
|
|
|
102
105
|
Repositories are validated at construction time to catch
|
|
103
106
|
configuration errors early in the application lifecycle.
|
|
107
|
+
|
|
104
108
|
"""
|
|
105
109
|
# Validate at construction time for early error detection
|
|
106
110
|
self.document_repo = ensure_repository_protocol(
|
|
@@ -133,6 +137,7 @@ class ValidateDocumentUseCase:
|
|
|
133
137
|
Validate a document against a policy and return the validation result.
|
|
134
138
|
|
|
135
139
|
This method orchestrates the core validation workflow:
|
|
140
|
+
|
|
136
141
|
1. Generates a unique validation ID
|
|
137
142
|
2. Retrieves the document and policy
|
|
138
143
|
3. Creates and stores the initial validation record
|
|
@@ -152,6 +157,7 @@ class ValidateDocumentUseCase:
|
|
|
152
157
|
Raises:
|
|
153
158
|
ValueError: If required entities are not found or invalid
|
|
154
159
|
RuntimeError: If validation processing fails
|
|
160
|
+
|
|
155
161
|
"""
|
|
156
162
|
logger.debug(
|
|
157
163
|
"Starting document validation use case",
|
|
@@ -429,6 +435,7 @@ class ValidateDocumentUseCase:
|
|
|
429
435
|
|
|
430
436
|
Returns:
|
|
431
437
|
Dict mapping knowledge_service_id to service_file_id
|
|
438
|
+
|
|
432
439
|
"""
|
|
433
440
|
registrations = {}
|
|
434
441
|
required_service_ids = {
|
|
@@ -471,6 +478,7 @@ class ValidateDocumentUseCase:
|
|
|
471
478
|
|
|
472
479
|
Returns:
|
|
473
480
|
List of (query_id, actual_score) tuples
|
|
481
|
+
|
|
474
482
|
"""
|
|
475
483
|
validation_scores = []
|
|
476
484
|
|
|
@@ -556,6 +564,7 @@ class ValidateDocumentUseCase:
|
|
|
556
564
|
|
|
557
565
|
Returns:
|
|
558
566
|
True if all required scores were met or exceeded, False otherwise
|
|
567
|
+
|
|
559
568
|
"""
|
|
560
569
|
# Convert to dictionaries for easier lookup
|
|
561
570
|
actual_scores_dict = dict(actual_scores)
|
|
@@ -601,6 +610,7 @@ class ValidateDocumentUseCase:
|
|
|
601
610
|
Raises:
|
|
602
611
|
ValueError: If transformation queries are not found or fail
|
|
603
612
|
RuntimeError: If document transformation fails
|
|
613
|
+
|
|
604
614
|
"""
|
|
605
615
|
if not policy.transformation_queries:
|
|
606
616
|
raise ValueError("No transformation queries provided")
|
|
@@ -717,6 +727,7 @@ class ValidateDocumentUseCase:
|
|
|
717
727
|
|
|
718
728
|
Raises:
|
|
719
729
|
ValueError: If no valid JSON content can be extracted from result
|
|
730
|
+
|
|
720
731
|
"""
|
|
721
732
|
response_text = result_data.get("response", "")
|
|
722
733
|
if not response_text:
|
julee/repositories/__init__.py
CHANGED
|
@@ -5,13 +5,16 @@ This package contains concrete implementations of the repository interfaces
|
|
|
5
5
|
defined in julee.domain.repositories.
|
|
6
6
|
|
|
7
7
|
Implementation packages:
|
|
8
|
+
|
|
8
9
|
- memory: In-memory implementations for testing
|
|
9
10
|
- minio: MinIO-based implementations for production
|
|
10
11
|
- temporal: Temporal workflow proxy implementations
|
|
11
12
|
|
|
12
|
-
Import implementations using their full module paths, e.g
|
|
13
|
+
Import implementations using their full module paths, e.g.::
|
|
14
|
+
|
|
13
15
|
from julee.repositories.memory import MemoryDocumentRepository
|
|
14
16
|
from julee.repositories.minio.document import (
|
|
15
17
|
MinioDocumentRepository,
|
|
16
18
|
)
|
|
19
|
+
|
|
17
20
|
"""
|
|
@@ -34,12 +34,12 @@ class MinioKnowledgeServiceConfigRepository(
|
|
|
34
34
|
|
|
35
35
|
This implementation stores knowledge service configurations as JSON
|
|
36
36
|
objects:
|
|
37
|
+
|
|
37
38
|
- Knowledge Service Configs: JSON objects in the
|
|
38
39
|
"knowledge-service-configs" bucket
|
|
39
40
|
|
|
40
41
|
Each configuration is stored with its knowledge_service_id as the object
|
|
41
|
-
name
|
|
42
|
-
for efficient retrieval and updates.
|
|
42
|
+
name for efficient retrieval and updates.
|
|
43
43
|
"""
|
|
44
44
|
|
|
45
45
|
def __init__(self, client: MinioClient) -> None:
|
|
@@ -92,17 +92,20 @@ class KnowledgeService(Protocol):
|
|
|
92
92
|
FileRegistrationResult containing registration details and the
|
|
93
93
|
service's internal file identifier
|
|
94
94
|
|
|
95
|
-
Implementation Notes
|
|
95
|
+
.. rubric:: Implementation Notes
|
|
96
|
+
|
|
96
97
|
- Must be idempotent: re-registering same document returns same result
|
|
97
98
|
- Should handle service unavailability gracefully
|
|
98
99
|
- Must return the service's internal file ID for future queries
|
|
99
100
|
- Document content is accessed directly from the Document object
|
|
100
101
|
- Should handle various document formats and sizes
|
|
101
102
|
|
|
102
|
-
Workflow Context
|
|
103
|
+
.. rubric:: Workflow Context
|
|
104
|
+
|
|
103
105
|
In Temporal workflows, this method is implemented as an activity
|
|
104
106
|
to ensure registration results are durably stored and consistent
|
|
105
107
|
across workflow replays.
|
|
108
|
+
|
|
106
109
|
"""
|
|
107
110
|
...
|
|
108
111
|
|
|
@@ -141,7 +144,8 @@ class KnowledgeService(Protocol):
|
|
|
141
144
|
Returns:
|
|
142
145
|
QueryResult containing query results and execution metadata
|
|
143
146
|
|
|
144
|
-
Implementation Notes
|
|
147
|
+
.. rubric:: Implementation Notes
|
|
148
|
+
|
|
145
149
|
- Must be idempotent: same query returns consistent results
|
|
146
150
|
- Service file IDs are provided as context to enhance query responses
|
|
147
151
|
- Should handle service unavailability gracefully
|
|
@@ -152,9 +156,11 @@ class KnowledgeService(Protocol):
|
|
|
152
156
|
- Should validate that service_file_ids exist in the service before
|
|
153
157
|
including them in the query context
|
|
154
158
|
|
|
155
|
-
Workflow Context
|
|
159
|
+
.. rubric:: Workflow Context
|
|
160
|
+
|
|
156
161
|
In Temporal workflows, this method is implemented as an activity
|
|
157
162
|
to ensure query results are durably stored and can be replayed
|
|
158
163
|
consistently.
|
|
164
|
+
|
|
159
165
|
"""
|
|
160
166
|
...
|
julee/util/repositories.py
CHANGED
|
@@ -23,11 +23,9 @@ class FileStorageRepository(Protocol):
|
|
|
23
23
|
FileMetadata object with details about the uploaded file.
|
|
24
24
|
|
|
25
25
|
Implementation Notes:
|
|
26
|
-
- Must be idempotent: uploading the same file_id multiple times is
|
|
27
|
-
safe.
|
|
26
|
+
- Must be idempotent: uploading the same file_id multiple times is safe.
|
|
28
27
|
- Should return metadata including the actual size and content type.
|
|
29
|
-
- Must perform security validation: file size limits, content type
|
|
30
|
-
verification, and filename sanitization.
|
|
28
|
+
- Must perform security validation: file size limits, content type verification, and filename sanitization.
|
|
31
29
|
- Should reject files that don't match declared content type.
|
|
32
30
|
"""
|
|
33
31
|
...
|
|
@@ -79,7 +79,7 @@ def collect_activities_from_instances(*instances: Any) -> list[Any]:
|
|
|
79
79
|
|
|
80
80
|
Args:
|
|
81
81
|
*instances: Repository and service instances decorated with
|
|
82
|
-
|
|
82
|
+
@temporal_activity_registration
|
|
83
83
|
|
|
84
84
|
Returns:
|
|
85
85
|
List of activity methods ready for Worker registration
|
|
@@ -123,13 +123,10 @@ def temporal_activity_registration(
|
|
|
123
123
|
name.
|
|
124
124
|
|
|
125
125
|
Args:
|
|
126
|
-
activity_prefix: Prefix for activity names (e.g.,
|
|
127
|
-
"sample.payment_repo.minio") Method names will be appended to create
|
|
128
|
-
full activity names like "sample.payment_repo.minio.process_payment"
|
|
126
|
+
activity_prefix: Prefix for activity names (e.g., "sample.payment_repo.minio"). Method names will be appended to create full activity names like "sample.payment_repo.minio.process_payment"
|
|
129
127
|
|
|
130
128
|
Returns:
|
|
131
|
-
The decorated class with all async methods wrapped as Temporal
|
|
132
|
-
activities
|
|
129
|
+
The decorated class with all async methods wrapped as Temporal activities
|
|
133
130
|
|
|
134
131
|
Example:
|
|
135
132
|
@temporal_activity_registration("sample.payment_repo.minio")
|
|
@@ -137,12 +134,9 @@ def temporal_activity_registration(
|
|
|
137
134
|
pass
|
|
138
135
|
|
|
139
136
|
# This automatically creates activities for all protocol methods:
|
|
140
|
-
# - process_payment ->
|
|
141
|
-
#
|
|
142
|
-
# -
|
|
143
|
-
# "sample.payment_repo.minio.get_payment"
|
|
144
|
-
# - refund_payment ->
|
|
145
|
-
# "sample.payment_repo.minio.refund_payment"
|
|
137
|
+
# - process_payment -> "sample.payment_repo.minio.process_payment"
|
|
138
|
+
# - get_payment -> "sample.payment_repo.minio.get_payment"
|
|
139
|
+
# - refund_payment -> "sample.payment_repo.minio.refund_payment"
|
|
146
140
|
"""
|
|
147
141
|
|
|
148
142
|
def decorator(cls: Type[T]) -> Type[T]:
|
|
@@ -226,8 +220,8 @@ def temporal_workflow_proxy(
|
|
|
226
220
|
retry_methods: List of method names that should use retry policies
|
|
227
221
|
|
|
228
222
|
Returns:
|
|
229
|
-
The decorated class with all protocol methods implemented as
|
|
230
|
-
|
|
223
|
+
The decorated class with all protocol methods implemented as workflow
|
|
224
|
+
activity calls
|
|
231
225
|
|
|
232
226
|
Example:
|
|
233
227
|
@temporal_workflow_proxy(
|
|
@@ -241,8 +235,7 @@ def temporal_workflow_proxy(
|
|
|
241
235
|
# This automatically creates workflow methods for all methods:
|
|
242
236
|
# - get() -> calls "julee.document_repo.minio.get" activity
|
|
243
237
|
# - save() -> calls "julee.document_repo.minio.save" with retry
|
|
244
|
-
# - generate_id() -> calls "julee.document_repo.minio.generate_id"
|
|
245
|
-
# with retry
|
|
238
|
+
# - generate_id() -> calls "julee.document_repo.minio.generate_id" with retry
|
|
246
239
|
"""
|
|
247
240
|
|
|
248
241
|
def decorator(cls: Type[T]) -> Type[T]:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: julee
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Julee - Clean architecture for accountable and transparent digital supply chains
|
|
5
5
|
Author-email: Pyx Industries <chris@pyx.io>
|
|
6
6
|
License: GPL-3.0
|
|
@@ -45,6 +45,7 @@ Requires-Dist: factory-boy>=3.2.0; extra == "dev"
|
|
|
45
45
|
Requires-Dist: mypy>=1.7.0; extra == "dev"
|
|
46
46
|
Requires-Dist: types-PyYAML; extra == "dev"
|
|
47
47
|
Requires-Dist: types-jsonschema; extra == "dev"
|
|
48
|
+
Requires-Dist: types-python-dateutil; extra == "dev"
|
|
48
49
|
Requires-Dist: black>=24.0.0; extra == "dev"
|
|
49
50
|
Requires-Dist: ruff>=0.5.0; extra == "dev"
|
|
50
51
|
Requires-Dist: pre-commit>=3.0.0; extra == "dev"
|
|
@@ -57,6 +58,7 @@ Requires-Dist: sphinx-rtd-theme>=2.0.0; extra == "docs"
|
|
|
57
58
|
Requires-Dist: furo>=2023.9.10; extra == "docs"
|
|
58
59
|
Requires-Dist: sphinx-autodoc-typehints>=1.25.0; extra == "docs"
|
|
59
60
|
Requires-Dist: sphinxcontrib-mermaid>=0.9.2; extra == "docs"
|
|
61
|
+
Requires-Dist: sphinxcontrib-plantuml>=0.25; extra == "docs"
|
|
60
62
|
Requires-Dist: sphinx-autoapi>=3.0.0; extra == "docs"
|
|
61
63
|
Dynamic: license-file
|
|
62
64
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
julee/__init__.py,sha256=
|
|
1
|
+
julee/__init__.py,sha256=8XYQJwEwJdGsPw23i7Zi_8hYCqNqRVrcPTlM0tkTO4g,111
|
|
2
2
|
julee/worker.py,sha256=bdGytX1m0LPULDUtTieANe8BjCC30J_-HPwUL2gkMB0,7230
|
|
3
3
|
julee/api/__init__.py,sha256=bJECAJifuV-pochMVeDqKhQ63jvXel3W4Y0_NK9gn8s,801
|
|
4
4
|
julee/api/app.py,sha256=XSOEwJY5Z6RUpE6bY_fSSyciFSJqjSHc-Kolf3DVN00,4928
|
|
@@ -34,7 +34,7 @@ julee/domain/models/assembly/tests/factories.py,sha256=YlgXLvK_QX3_fRHyc1WkhIhGW
|
|
|
34
34
|
julee/domain/models/assembly/tests/test_assembly.py,sha256=aMtFl7RqEdT2FQP-BGpaTL5AL6UrEsc99GdxmaeblOo,16192
|
|
35
35
|
julee/domain/models/assembly_specification/__init__.py,sha256=8oHXxCUAwplrL1lTKNyLQg7QxFapmPgroU0W6TMWTNA,804
|
|
36
36
|
julee/domain/models/assembly_specification/assembly_specification.py,sha256=M3s2I025vMSqy3G95ta4ncKtw8zW_zEhwHhJihAe2ZU,6804
|
|
37
|
-
julee/domain/models/assembly_specification/knowledge_service_query.py,sha256=
|
|
37
|
+
julee/domain/models/assembly_specification/knowledge_service_query.py,sha256=GR1JUO1MGrzbWhCKwBKihbkANyKDgx8drIU9MePQssg,4309
|
|
38
38
|
julee/domain/models/assembly_specification/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
39
39
|
julee/domain/models/assembly_specification/tests/factories.py,sha256=4Vd13t-NB9oRXLgliKvKP3S8hbJIaNe-QBH-QSFvSTc,2369
|
|
40
40
|
julee/domain/models/assembly_specification/tests/test_assembly_specification.py,sha256=_hC1ttFR4C64xKxl0NNi1FDhyna5503i-d87scQHsEA,18138
|
|
@@ -52,7 +52,7 @@ julee/domain/models/knowledge_service_config/__init__.py,sha256=5qYB-nGcVp6CIP7V
|
|
|
52
52
|
julee/domain/models/knowledge_service_config/knowledge_service_config.py,sha256=abRdg9Wlp-4yWTGUkQyEdwFqJnhGnDUHBryx8QFouRg,2978
|
|
53
53
|
julee/domain/models/policy/__init__.py,sha256=rv53kHRWfVkw0W96e90P3MDR_N2E7_H48hoJchINark,283
|
|
54
54
|
julee/domain/models/policy/document_policy_validation.py,sha256=KIB-XFru0CGU4Po6i0_whT9VcYJbD07ca44SvjsSVsE,8054
|
|
55
|
-
julee/domain/models/policy/policy.py,sha256=
|
|
55
|
+
julee/domain/models/policy/policy.py,sha256=_wFKYCZr5Gzr6LHMY2swQF0wEN3QVS4fA6SyMNy4Nko,7091
|
|
56
56
|
julee/domain/models/policy/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
57
|
julee/domain/models/policy/tests/factories.py,sha256=rr1vr1x8SGTbPjvK1lKh3cm86P3YWIP4cjt8hrdjm9g,1299
|
|
58
58
|
julee/domain/models/policy/tests/test_document_policy_validation.py,sha256=UcZxbVx3zHUvnSr7IW1CYzLfccu8SiJspmr27z2MOd0,15886
|
|
@@ -60,7 +60,7 @@ julee/domain/models/policy/tests/test_policy.py,sha256=1qB32pi3Fj3xbwaUS19Z3xUuh
|
|
|
60
60
|
julee/domain/repositories/__init__.py,sha256=1x0zZkxwL7fmrgGsP5HsQlunA7rJavCFhh-eIC1T-ak,949
|
|
61
61
|
julee/domain/repositories/assembly.py,sha256=T_yrfYaTY212PMApbeJEAlv2OBc9yKdRkK9lQbwSZ3E,1684
|
|
62
62
|
julee/domain/repositories/assembly_specification.py,sha256=bPVeJW_Pxf64qL7Ls2aln6vYZB8MdGg2KGMD4RQMGWA,2068
|
|
63
|
-
julee/domain/repositories/base.py,sha256=
|
|
63
|
+
julee/domain/repositories/base.py,sha256=kc_Hj5Lywdx40vKOO0OAttI82w0l9TqwIRCXfz9MZrM,5375
|
|
64
64
|
julee/domain/repositories/document.py,sha256=nPSQNwYEbD53fJ6qa8BpOUpNoxiaI4YESb01ccHx9n8,1875
|
|
65
65
|
julee/domain/repositories/document_policy_validation.py,sha256=K0Pn1W0tRWE0i1yPXPOgDDs2DpFB0jayKHw1HOoKKQE,2108
|
|
66
66
|
julee/domain/repositories/knowledge_service_config.py,sha256=mLum3ktpl3KQMj5qmu29EIuNESlQVlADKwns5XR_ISI,1992
|
|
@@ -68,9 +68,9 @@ julee/domain/repositories/knowledge_service_query.py,sha256=HIEHkQPzmKGgxbDGgmV3
|
|
|
68
68
|
julee/domain/repositories/policy.py,sha256=pXPUpL86fggHAi0Zvdc75Ht7FwG5Wkp8t5Xe-L9JXmg,1872
|
|
69
69
|
julee/domain/use_cases/__init__.py,sha256=rKJyunXCHorEyxPfKDEYD27kese53e5spCfFTbDxpOc,534
|
|
70
70
|
julee/domain/use_cases/decorators.py,sha256=5HbuPcBuWEJMHikDDJFvFhPUw6mwHkWDshrEFZjp15M,3489
|
|
71
|
-
julee/domain/use_cases/extract_assemble_data.py,sha256=
|
|
71
|
+
julee/domain/use_cases/extract_assemble_data.py,sha256=brOLF_9VsuDLA777o2H_fON8wBZ-Qcdg5lcfdDKSqGw,24958
|
|
72
72
|
julee/domain/use_cases/initialize_system_data.py,sha256=8Oe7kO1ErMtJPn4cXAEOaLaW3mDJXOmvTSCVO5gZU0A,29284
|
|
73
|
-
julee/domain/use_cases/validate_document.py,sha256=
|
|
73
|
+
julee/domain/use_cases/validate_document.py,sha256=ZQNYrlg0U3JLrOjqAB1dEy4UCdt2_PTXR734pXPqhvc,28228
|
|
74
74
|
julee/domain/use_cases/tests/__init__.py,sha256=xKgoU78i5zK5mlZ2NNfp8nhbnb9fIcNwCTcQD0j9gEw,199
|
|
75
75
|
julee/domain/use_cases/tests/test_extract_assemble_data.py,sha256=lSkzKHJ4UrhKjd0Kn_Ky3me6eWPO72EYq6RlKH69Vs8,21596
|
|
76
76
|
julee/domain/use_cases/tests/test_initialize_system_data.py,sha256=QGq-IifMoJBqhstcm4Y-UMh8iTwJGOF3oQ2rR06Lr2w,17928
|
|
@@ -79,15 +79,15 @@ julee/fixtures/assembly_specifications.yaml,sha256=ke3KFR3vRoGPMYZ8AmOvgVRY1-pmi
|
|
|
79
79
|
julee/fixtures/documents.yaml,sha256=nAI2ReHxoaPdPW2b4IFAWNw5N_1aHgexa_fMMWMr3lw,6389
|
|
80
80
|
julee/fixtures/knowledge_service_configs.yaml,sha256=SfJO1SJFzYtF2Y7XTZmhl3d9Eiv2-xMrHKW1kI7NhI0,1378
|
|
81
81
|
julee/fixtures/knowledge_service_queries.yaml,sha256=63Mrz083lFBXV94tB40eob5VxuTyKp8ZgN8vk8KcjoY,1706
|
|
82
|
-
julee/repositories/__init__.py,sha256=
|
|
82
|
+
julee/repositories/__init__.py,sha256=mJpDFYP5f4LBhavYSnC3SnTcWnozMCz7aXje4iB5pyU,571
|
|
83
83
|
julee/repositories/memory/__init__.py,sha256=w0ibQfMm3HYdFhLXXMPa_aRtbRiG60j2bqmEGdjmOtg,1225
|
|
84
84
|
julee/repositories/memory/assembly.py,sha256=i8GeQT8bRj1_GXIQTyLUXS4gV8Z8BSokFT22QxA5myk,2834
|
|
85
|
-
julee/repositories/memory/assembly_specification.py,sha256=
|
|
85
|
+
julee/repositories/memory/assembly_specification.py,sha256=BGH1tI6hq8z_1L1xPouPEuynvnbg3g-gBAv64u4goRg,4275
|
|
86
86
|
julee/repositories/memory/base.py,sha256=6gVqKIjUJblrHC79xVP210Bk0GfLFQSyY-gGpJ1ki8E,7801
|
|
87
87
|
julee/repositories/memory/document.py,sha256=LPnj687fhG_HWj2MsL6mmK-JXQKvvkpRQ--okHWMfWU,5269
|
|
88
88
|
julee/repositories/memory/document_policy_validation.py,sha256=ELldaWKNdsvvdaWMl1p8G-dAhBzJu7MpTkd0LL06kRM,3742
|
|
89
|
-
julee/repositories/memory/knowledge_service_config.py,sha256=
|
|
90
|
-
julee/repositories/memory/knowledge_service_query.py,sha256=
|
|
89
|
+
julee/repositories/memory/knowledge_service_config.py,sha256=o_aLtpPo88wfQ1wd2g-1-c2MWVhFsi2Rju8HOk7C4sk,4242
|
|
90
|
+
julee/repositories/memory/knowledge_service_query.py,sha256=NNMScg_X3YarPr_SpbsQcrU39pky6KbQp8UFJt9D1nQ,3966
|
|
91
91
|
julee/repositories/memory/policy.py,sha256=c5xzMLzop7XlehewwjHU9fDxYfUYUmymzy4J0CazHpc,2901
|
|
92
92
|
julee/repositories/memory/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
93
93
|
julee/repositories/memory/tests/test_document.py,sha256=Dp4yTZfXwdjjv7U98eqvvlOcnd-CkKe4PjjTjAovp24,7825
|
|
@@ -99,7 +99,7 @@ julee/repositories/minio/assembly_specification.py,sha256=rCO2rpsAIMzTrX_Pf02FPm
|
|
|
99
99
|
julee/repositories/minio/client.py,sha256=n_MhJDGqYb03qxRgwlIcFU02nGuI2wGl6hBjpV-V8nA,18472
|
|
100
100
|
julee/repositories/minio/document.py,sha256=LFD2TqphrjuLk6IdS6iRMVVKTwjo9MWE0hAA1nXJlMY,20093
|
|
101
101
|
julee/repositories/minio/document_policy_validation.py,sha256=7pYvICuvNCL2tzJufXVZxY151m9Klzie-UiNf7VfIuQ,4908
|
|
102
|
-
julee/repositories/minio/knowledge_service_config.py,sha256=
|
|
102
|
+
julee/repositories/minio/knowledge_service_config.py,sha256=l3JZgBiwW1aUGJ6uO2GJ8xEaWIiBB3IBfLpE4lKhWRY,6762
|
|
103
103
|
julee/repositories/minio/knowledge_service_query.py,sha256=N-US7TqW7hBcSMSzVoLpbRJZcv1rgQ0EGgSElJUl08s,7006
|
|
104
104
|
julee/repositories/minio/policy.py,sha256=QvmaMLUR7ZerpF67iwiGju9qeuScLuPXhDvwAZoo2rs,3918
|
|
105
105
|
julee/repositories/minio/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -119,7 +119,7 @@ julee/repositories/temporal/proxies.py,sha256=MaJ1vU89iw-w4gI0OxInDwQOO5hJXL0P9V
|
|
|
119
119
|
julee/services/__init__.py,sha256=LNoQvHMWQi1YMQW0xWw9KeTHOVMsYdhLj-nvu4HClFU,560
|
|
120
120
|
julee/services/knowledge_service/__init__.py,sha256=M0BfyW4Pckh06DyoaZqKuMCOa6ZtFqbiW7hO1ikLdTE,1149
|
|
121
121
|
julee/services/knowledge_service/factory.py,sha256=9Eo0ZCR_As5pxAcSYqsRU7oRQhSOPKjAkzJ_vVAjc0E,4636
|
|
122
|
-
julee/services/knowledge_service/knowledge_service.py,sha256=
|
|
122
|
+
julee/services/knowledge_service/knowledge_service.py,sha256=ns2psBsTaU7WWoXGQbWTl0phmQm5MW_UPymSQeaNU0k,6435
|
|
123
123
|
julee/services/knowledge_service/test_factory.py,sha256=hbsdZoZLRg-oHieQ0as5KccS2vkbJK97RzP_OSRJNUU,3976
|
|
124
124
|
julee/services/knowledge_service/anthropic/__init__.py,sha256=eO_85w4dd9hgzcnsqMoE0bvcjBtTuIhyQ0vqdPHdoQ4,297
|
|
125
125
|
julee/services/knowledge_service/anthropic/knowledge_service.py,sha256=6ciA1TlUx1kjdnW_ZeO1eI0AxU9LyNoKaNJArn0PJu0,11948
|
|
@@ -133,7 +133,7 @@ julee/services/temporal/activity_names.py,sha256=OG0XqCLt40m8h7nglV-k6K5Oyk9bUex
|
|
|
133
133
|
julee/services/temporal/proxies.py,sha256=Ekgze5cmU-1ugDy0k2AQT0boQQXxKVyBMoKZ_z3KMRg,1264
|
|
134
134
|
julee/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
135
135
|
julee/util/domain.py,sha256=TjmJDrZuetEI1SL7fZ7o8IzOMhnzijvBUlExNNg9QQ8,3293
|
|
136
|
-
julee/util/repositories.py,sha256=
|
|
136
|
+
julee/util/repositories.py,sha256=Vcj4PAtgLpKhl6jzJcPE8hxUVBkFKYnj3WpAaDg0K-Q,1841
|
|
137
137
|
julee/util/repos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
138
138
|
julee/util/repos/minio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
139
139
|
julee/util/repos/minio/file_storage.py,sha256=VwWI8vO8scnh1CjocdRcNxemWEZYbnC1QwBeqRtq3eY,7604
|
|
@@ -144,8 +144,8 @@ julee/util/repos/temporal/client_proxies/file_storage.py,sha256=V3KP8ieskPIOmaNL
|
|
|
144
144
|
julee/util/repos/temporal/proxies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
145
145
|
julee/util/repos/temporal/proxies/file_storage.py,sha256=QwDWo0w7biPjg3CuHCjZOvkHS215ja5VcFAox3xOd2w,2492
|
|
146
146
|
julee/util/temporal/__init__.py,sha256=86xXEL8K5NAhT4s2H1uov8jV68NLkJiCZl2GDJaLnPg,491
|
|
147
|
-
julee/util/temporal/activities.py,sha256=
|
|
148
|
-
julee/util/temporal/decorators.py,sha256=
|
|
147
|
+
julee/util/temporal/activities.py,sha256=j-xV12x-5KJQWT1I8_KhIWtPVYysLJo9A2Xwx4e31bc,4383
|
|
148
|
+
julee/util/temporal/decorators.py,sha256=n9gS-codo9Vi_ZLQ53gXh8jNhPtWnO3MI-Mmu2bNkNM,17975
|
|
149
149
|
julee/util/tests/__init__.py,sha256=guP9qBQwD15l3fIX1kYS8v67pKHAHOCCqib9Us_eJ1Y,61
|
|
150
150
|
julee/util/tests/test_decorators.py,sha256=8axHCzoZhhPwjytGZvNEfBe1AtA7omXY0DVO3_wPR8w,27493
|
|
151
151
|
julee/util/validation/__init__.py,sha256=Jp8A3iXEvLRaj07Z2UPnOBVO2QAUOW5ITCwMdLAgQyw,769
|
|
@@ -154,8 +154,8 @@ julee/util/validation/type_guards.py,sha256=39QY4NsB9Hav_PW2uMnyL9q7loQORYbFZPuF
|
|
|
154
154
|
julee/workflows/__init__.py,sha256=Ff4-23DutwUdEQuB_U7tZKJEfv9W3OY9Jtyj74516Dg,724
|
|
155
155
|
julee/workflows/extract_assemble.py,sha256=u_J7dLlUDRkj0p0Nsndb_tGx8oqowfXxEZPfm3zg3JE,7875
|
|
156
156
|
julee/workflows/validate_document.py,sha256=pJ4eSGr3UNvo0rz51xy2KnnP2wu7Almu2mRi_s9GD1U,8229
|
|
157
|
-
julee-0.1.
|
|
158
|
-
julee-0.1.
|
|
159
|
-
julee-0.1.
|
|
160
|
-
julee-0.1.
|
|
161
|
-
julee-0.1.
|
|
157
|
+
julee-0.1.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
158
|
+
julee-0.1.2.dist-info/METADATA,sha256=882cAdXFDuy1CklK272SF8uBUTV0oM-KSmKukKIIdtk,7014
|
|
159
|
+
julee-0.1.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
160
|
+
julee-0.1.2.dist-info/top_level.txt,sha256=woyPXhn9n-aM3oekZ341P1enrjj6nIcTwOxQL32VCLc,6
|
|
161
|
+
julee-0.1.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|