arkindex-base-worker 0.5.0rc1__tar.gz → 0.5.1b2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/PKG-INFO +3 -3
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_base_worker.egg-info/PKG-INFO +3 -3
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_base_worker.egg-info/SOURCES.txt +1 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_base_worker.egg-info/requires.txt +2 -2
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/__init__.py +75 -6
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/base.py +44 -1
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/element.py +9 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/pyproject.toml +3 -3
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/conftest.py +90 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_base_worker.py +66 -2
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_dataset_worker.py +5 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/__init__.py +4 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_worker.py +94 -0
- arkindex_base_worker-0.5.1b2/tests/test_modern_config.py +81 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/LICENSE +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/README.md +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_base_worker.egg-info/dependency_links.txt +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_base_worker.egg-info/top_level.txt +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/__init__.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/cache.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/image.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/models.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/utils.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/classification.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/corpus.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/dataset.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/entity.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/image.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/metadata.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/process.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/task.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/training.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/transcription.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/examples/standalone/python/worker.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/examples/tooled/python/worker.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/hooks/pre_gen_project.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/setup.cfg +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/__init__.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_cache.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_element.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_classification.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_cli.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_corpus.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_dataset.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_element.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_element_create_multiple.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_element_create_single.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_element_list_children.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_element_list_parents.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_entity.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_image.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_metadata.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_process.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_task.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_training.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_transcription_create.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_transcription_create_with_elements.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_elements_worker/test_transcription_list.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_image.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_merge.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/tests/test_utils.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/worker-demo/tests/__init__.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/worker-demo/tests/conftest.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/worker-demo/tests/test_worker.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/worker-demo/worker_demo/__init__.py +0 -0
- {arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/worker-demo/worker_demo/worker.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: arkindex-base-worker
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.1b2
|
|
4
4
|
Summary: Base Worker to easily build Arkindex ML workflows
|
|
5
5
|
Author-email: Teklia <contact@teklia.com>
|
|
6
6
|
Maintainer-email: Teklia <contact@teklia.com>
|
|
@@ -43,10 +43,10 @@ Description-Content-Type: text/markdown
|
|
|
43
43
|
License-File: LICENSE
|
|
44
44
|
Requires-Dist: humanize==4.12.3
|
|
45
45
|
Requires-Dist: peewee~=3.17
|
|
46
|
-
Requires-Dist: Pillow==11.
|
|
46
|
+
Requires-Dist: Pillow==11.3.0
|
|
47
47
|
Requires-Dist: python-gnupg==0.5.4
|
|
48
48
|
Requires-Dist: shapely==2.0.6
|
|
49
|
-
Requires-Dist: teklia-toolbox==0.1.
|
|
49
|
+
Requires-Dist: teklia-toolbox==0.1.11
|
|
50
50
|
Requires-Dist: zstandard==0.23.0
|
|
51
51
|
Provides-Extra: tests
|
|
52
52
|
Requires-Dist: pytest==8.3.5; extra == "tests"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: arkindex-base-worker
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.1b2
|
|
4
4
|
Summary: Base Worker to easily build Arkindex ML workflows
|
|
5
5
|
Author-email: Teklia <contact@teklia.com>
|
|
6
6
|
Maintainer-email: Teklia <contact@teklia.com>
|
|
@@ -43,10 +43,10 @@ Description-Content-Type: text/markdown
|
|
|
43
43
|
License-File: LICENSE
|
|
44
44
|
Requires-Dist: humanize==4.12.3
|
|
45
45
|
Requires-Dist: peewee~=3.17
|
|
46
|
-
Requires-Dist: Pillow==11.
|
|
46
|
+
Requires-Dist: Pillow==11.3.0
|
|
47
47
|
Requires-Dist: python-gnupg==0.5.4
|
|
48
48
|
Requires-Dist: shapely==2.0.6
|
|
49
|
-
Requires-Dist: teklia-toolbox==0.1.
|
|
49
|
+
Requires-Dist: teklia-toolbox==0.1.11
|
|
50
50
|
Requires-Dist: zstandard==0.23.0
|
|
51
51
|
Provides-Extra: tests
|
|
52
52
|
Requires-Dist: pytest==8.3.5; extra == "tests"
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/__init__.py
RENAMED
|
@@ -32,6 +32,49 @@ from arkindex_worker.worker.task import TaskMixin
|
|
|
32
32
|
from arkindex_worker.worker.transcription import TranscriptionMixin
|
|
33
33
|
|
|
34
34
|
|
|
35
|
+
class WorkerActivityIterator:
|
|
36
|
+
def __init__(self, api_client, types):
|
|
37
|
+
# Use same api client as main class
|
|
38
|
+
self.api_client = api_client
|
|
39
|
+
|
|
40
|
+
# Index element types by ID
|
|
41
|
+
self.types = {t["id"]: t["slug"] for t in types}
|
|
42
|
+
|
|
43
|
+
logger.info(
|
|
44
|
+
"Using StartWorkerActivity instead of reading init_elements JSON file"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def __bool__(self):
|
|
48
|
+
# Needed to bypass `not elements` check
|
|
49
|
+
return True
|
|
50
|
+
|
|
51
|
+
def __iter__(self):
|
|
52
|
+
return self
|
|
53
|
+
|
|
54
|
+
def __next__(self):
|
|
55
|
+
"""
|
|
56
|
+
Provide a new element from a worker activity upon each iteration
|
|
57
|
+
"""
|
|
58
|
+
try:
|
|
59
|
+
data = self.api_client.request("StartWorkerActivity")
|
|
60
|
+
except ErrorResponse as e:
|
|
61
|
+
# Arkindex will provide a 404 or 400 when there are no worker activities left or the task has completed
|
|
62
|
+
if e.status_code in (400, 404):
|
|
63
|
+
raise StopIteration from e
|
|
64
|
+
|
|
65
|
+
logger.warning(
|
|
66
|
+
f"Failed to start a new worker activity of element due to an API error: {e.content}"
|
|
67
|
+
)
|
|
68
|
+
raise e
|
|
69
|
+
|
|
70
|
+
# Find the type slug using API provided type_id
|
|
71
|
+
type_id = data["type_id"]
|
|
72
|
+
if type_id not in self.types:
|
|
73
|
+
raise Exception(f"Unknown type {type_id}")
|
|
74
|
+
|
|
75
|
+
return Element(type=self.types[type_id], **data)
|
|
76
|
+
|
|
77
|
+
|
|
35
78
|
class ElementsWorker(
|
|
36
79
|
ElementMixin,
|
|
37
80
|
DatasetMixin,
|
|
@@ -60,7 +103,9 @@ class ElementsWorker(
|
|
|
60
103
|
"""
|
|
61
104
|
super().__init__(description, support_cache)
|
|
62
105
|
|
|
63
|
-
def get_elements(
|
|
106
|
+
def get_elements(
|
|
107
|
+
self,
|
|
108
|
+
) -> Iterable[CachedElement] | list[str] | list[Element] | WorkerActivityIterator:
|
|
64
109
|
"""
|
|
65
110
|
List the elements to be processed, either from the CLI arguments or
|
|
66
111
|
the cache database when enabled.
|
|
@@ -109,6 +154,14 @@ class ElementsWorker(
|
|
|
109
154
|
elif self.process_mode == ProcessMode.Export:
|
|
110
155
|
# For export mode processes, use list_process_elements and return element IDs
|
|
111
156
|
return {item["id"] for item in self.list_process_elements()}
|
|
157
|
+
elif self.args.consume_worker_activities:
|
|
158
|
+
# We need to list corpus types as the StartWorkerActivity endpoint only provide type_id
|
|
159
|
+
self.list_corpus_types()
|
|
160
|
+
|
|
161
|
+
# Consume worker activitives one by one
|
|
162
|
+
return WorkerActivityIterator(
|
|
163
|
+
self.api_client, types=self.corpus_types.values()
|
|
164
|
+
)
|
|
112
165
|
|
|
113
166
|
invalid_element_ids = list(filter(invalid_element_id, out))
|
|
114
167
|
assert not invalid_element_ids, (
|
|
@@ -135,6 +188,15 @@ class ElementsWorker(
|
|
|
135
188
|
)
|
|
136
189
|
return self.process_information.get("activity_state") == "ready"
|
|
137
190
|
|
|
191
|
+
@property
|
|
192
|
+
def unknown_nb_elements(self) -> bool:
|
|
193
|
+
"""
|
|
194
|
+
Whether or not the worker knows the total number of elements to process
|
|
195
|
+
- when running with init_elements, we have a known list
|
|
196
|
+
- when running with StartWorkerActivity, we have a queue of unknown size
|
|
197
|
+
"""
|
|
198
|
+
return self.args.consume_worker_activities
|
|
199
|
+
|
|
138
200
|
def run(self):
|
|
139
201
|
"""
|
|
140
202
|
Implements an Arkindex worker that goes through each element returned by
|
|
@@ -157,7 +219,8 @@ class ElementsWorker(
|
|
|
157
219
|
)
|
|
158
220
|
|
|
159
221
|
# Process every element
|
|
160
|
-
|
|
222
|
+
# We cannot know the number of elements when consuming a list of worker activities
|
|
223
|
+
count = None if self.unknown_nb_elements else len(elements)
|
|
161
224
|
failed = 0
|
|
162
225
|
for i, item in enumerate(elements, start=1):
|
|
163
226
|
element = None
|
|
@@ -171,10 +234,16 @@ class ElementsWorker(
|
|
|
171
234
|
**self.api_client.request("RetrieveElement", id=item)
|
|
172
235
|
)
|
|
173
236
|
|
|
174
|
-
|
|
237
|
+
if self.unknown_nb_elements:
|
|
238
|
+
logger.info(f"Processing {element} (n°{i})")
|
|
239
|
+
else:
|
|
240
|
+
logger.info(f"Processing {element} ({i}/{count})")
|
|
175
241
|
|
|
176
242
|
# Process the element and report its progress if activities are enabled
|
|
177
|
-
|
|
243
|
+
# We do not update the worker activity to "Started" state when consuming them
|
|
244
|
+
if self.args.consume_worker_activities or self.update_activity(
|
|
245
|
+
element.id, ActivityState.Started
|
|
246
|
+
):
|
|
178
247
|
self.process_element(element)
|
|
179
248
|
self.update_activity(element.id, ActivityState.Processed)
|
|
180
249
|
else:
|
|
@@ -207,10 +276,10 @@ class ElementsWorker(
|
|
|
207
276
|
with contextlib.suppress(Exception):
|
|
208
277
|
self.update_activity(element.id, ActivityState.Error)
|
|
209
278
|
|
|
210
|
-
message = f"Ran on {
|
|
279
|
+
message = f"Ran on {i} {pluralize('element', i)}: {i - failed} completed, {failed} failed"
|
|
211
280
|
if failed:
|
|
212
281
|
logger.error(message)
|
|
213
|
-
if failed >=
|
|
282
|
+
if failed >= i: # Everything failed!
|
|
214
283
|
sys.exit(1)
|
|
215
284
|
else:
|
|
216
285
|
logger.info(message)
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/base.py
RENAMED
|
@@ -9,12 +9,13 @@ import os
|
|
|
9
9
|
import shutil
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
from tempfile import mkdtemp
|
|
12
|
+
from typing import Any
|
|
12
13
|
|
|
13
14
|
import gnupg
|
|
14
15
|
import yaml
|
|
15
16
|
|
|
16
17
|
from arkindex import options_from_env
|
|
17
|
-
from arkindex.exceptions import ErrorResponse
|
|
18
|
+
from arkindex.exceptions import ClientError, ErrorResponse
|
|
18
19
|
from arkindex_worker import logger
|
|
19
20
|
from arkindex_worker.cache import (
|
|
20
21
|
check_version,
|
|
@@ -260,6 +261,48 @@ class BaseWorker:
|
|
|
260
261
|
|
|
261
262
|
logger.info(f"Loaded {worker_run['summary']} from API")
|
|
262
263
|
|
|
264
|
+
def _process_config_item(item: dict) -> tuple[str, Any]:
|
|
265
|
+
if not item["secret"]:
|
|
266
|
+
return (item["key"], item["value"])
|
|
267
|
+
|
|
268
|
+
# Load secret, only available in Arkindex EE
|
|
269
|
+
try:
|
|
270
|
+
secret = self.load_secret(Path(item["value"]))
|
|
271
|
+
except ClientError as e:
|
|
272
|
+
logger.error(
|
|
273
|
+
f"Failed to retrieve the secret {item['value']}, probably an Arkindex Community Edition: {e}"
|
|
274
|
+
)
|
|
275
|
+
return (item["key"], None)
|
|
276
|
+
|
|
277
|
+
return (item["key"], secret)
|
|
278
|
+
|
|
279
|
+
# Load worker run information
|
|
280
|
+
try:
|
|
281
|
+
config = self.api_client.request(
|
|
282
|
+
"RetrieveWorkerRunConfiguration", id=self.worker_run_id
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
# Provide the same configuration through all previous attributes
|
|
286
|
+
self.config = self.user_configuration = dict(
|
|
287
|
+
map(_process_config_item, config["configuration"])
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
# Provide secret values through the previous attribute
|
|
291
|
+
self.secrets = {
|
|
292
|
+
item["key"]: self.config[item["key"]]
|
|
293
|
+
for item in config["configuration"]
|
|
294
|
+
if item["secret"]
|
|
295
|
+
}
|
|
296
|
+
logger.info("Using modern configuration")
|
|
297
|
+
|
|
298
|
+
return # Stop here once we have modern configuration
|
|
299
|
+
|
|
300
|
+
except ErrorResponse as e:
|
|
301
|
+
if e.status_code != 400:
|
|
302
|
+
raise
|
|
303
|
+
logger.info("Modern configuration is not available")
|
|
304
|
+
|
|
305
|
+
# Use old-style configuration with local merge
|
|
263
306
|
# Load model version configuration when available
|
|
264
307
|
model_version = worker_run.get("model_version")
|
|
265
308
|
if model_version:
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/element.py
RENAMED
|
@@ -38,6 +38,15 @@ class ElementMixin:
|
|
|
38
38
|
type=open,
|
|
39
39
|
default=os.environ.get("TASK_ELEMENTS"),
|
|
40
40
|
)
|
|
41
|
+
self.parser.add_argument(
|
|
42
|
+
"--no-elements-list",
|
|
43
|
+
help=(
|
|
44
|
+
"Consume worker activities from Arkindex API instead of using a static elements list"
|
|
45
|
+
),
|
|
46
|
+
dest="consume_worker_activities",
|
|
47
|
+
action="store_true",
|
|
48
|
+
default=os.environ.get("SKIP_TASK_ELEMENTS") is not None,
|
|
49
|
+
)
|
|
41
50
|
self.parser.add_argument(
|
|
42
51
|
"--element",
|
|
43
52
|
type=str,
|
|
@@ -4,16 +4,16 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "arkindex-base-worker"
|
|
7
|
-
version = "0.5.
|
|
7
|
+
version = "0.5.1b2"
|
|
8
8
|
description = "Base Worker to easily build Arkindex ML workflows"
|
|
9
9
|
license = { file = "LICENSE" }
|
|
10
10
|
dependencies = [
|
|
11
11
|
"humanize==4.12.3",
|
|
12
12
|
"peewee~=3.17",
|
|
13
|
-
"Pillow==11.
|
|
13
|
+
"Pillow==11.3.0",
|
|
14
14
|
"python-gnupg==0.5.4",
|
|
15
15
|
"shapely==2.0.6",
|
|
16
|
-
"teklia-toolbox==0.1.
|
|
16
|
+
"teklia-toolbox==0.1.11",
|
|
17
17
|
"zstandard==0.23.0",
|
|
18
18
|
]
|
|
19
19
|
authors = [
|
|
@@ -165,6 +165,13 @@ def _mock_worker_run_api(responses):
|
|
|
165
165
|
content_type="application/json",
|
|
166
166
|
)
|
|
167
167
|
|
|
168
|
+
# By default, stick to classic configuration
|
|
169
|
+
responses.add(
|
|
170
|
+
responses.GET,
|
|
171
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
172
|
+
status=400,
|
|
173
|
+
)
|
|
174
|
+
|
|
168
175
|
|
|
169
176
|
@pytest.fixture
|
|
170
177
|
def _mock_worker_run_no_revision_api(responses):
|
|
@@ -233,6 +240,56 @@ def _mock_worker_run_no_revision_api(responses):
|
|
|
233
240
|
)
|
|
234
241
|
|
|
235
242
|
|
|
243
|
+
@pytest.fixture
|
|
244
|
+
def mock_base_worker_modern_conf(mocker, responses):
|
|
245
|
+
"""
|
|
246
|
+
Provide a base worker to test modern configuration with (not provided in the fixture)
|
|
247
|
+
"""
|
|
248
|
+
worker = BaseWorker()
|
|
249
|
+
mocker.patch.object(sys, "argv")
|
|
250
|
+
worker.args = worker.parser.parse_args()
|
|
251
|
+
|
|
252
|
+
payload = {
|
|
253
|
+
"id": "56785678-5678-5678-5678-567856785678",
|
|
254
|
+
"parents": [],
|
|
255
|
+
"worker_version": {
|
|
256
|
+
"id": "12341234-1234-1234-1234-123412341234",
|
|
257
|
+
"worker": {
|
|
258
|
+
"id": "deadbeef-1234-5678-1234-worker",
|
|
259
|
+
"name": "Fake worker",
|
|
260
|
+
"slug": "fake_worker",
|
|
261
|
+
"type": "classifier",
|
|
262
|
+
},
|
|
263
|
+
"revision": {"hash": "deadbeef1234"},
|
|
264
|
+
"configuration": {
|
|
265
|
+
"configuration": {"extra_key1": "not showing up"},
|
|
266
|
+
"user_configuration": {"extra_key2": "not showing up"},
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
"configuration": {
|
|
270
|
+
"id": "af0daaf4-983e-4703-a7ed-a10f146d6684",
|
|
271
|
+
"name": "my-userconfig",
|
|
272
|
+
"configuration": {
|
|
273
|
+
"extra_key3": "not showing up",
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
"model_version": None,
|
|
277
|
+
"process": {
|
|
278
|
+
"id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeffff",
|
|
279
|
+
"corpus": CORPUS_ID,
|
|
280
|
+
},
|
|
281
|
+
"summary": "Worker Fake worker @ 123412",
|
|
282
|
+
}
|
|
283
|
+
responses.add(
|
|
284
|
+
responses.GET,
|
|
285
|
+
"http://testserver/api/v1/process/workers/56785678-5678-5678-5678-567856785678/",
|
|
286
|
+
status=200,
|
|
287
|
+
json=payload,
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
return worker
|
|
291
|
+
|
|
292
|
+
|
|
236
293
|
@pytest.fixture
|
|
237
294
|
def _mock_activity_calls(responses):
|
|
238
295
|
"""
|
|
@@ -282,6 +339,39 @@ def mock_elements_worker_with_list(monkeypatch, responses, mock_elements_worker)
|
|
|
282
339
|
return mock_elements_worker
|
|
283
340
|
|
|
284
341
|
|
|
342
|
+
@pytest.fixture
|
|
343
|
+
def mock_elements_worker_consume_wa(monkeypatch, responses, mock_elements_worker):
|
|
344
|
+
"""
|
|
345
|
+
Mock a worker instance to use StartWorkerActivity to consume worker activities
|
|
346
|
+
instead of reading a JSON file
|
|
347
|
+
"""
|
|
348
|
+
|
|
349
|
+
# Enable consume worker activities mode from CLI args
|
|
350
|
+
mock_elements_worker.args.consume_worker_activities = True
|
|
351
|
+
|
|
352
|
+
# Worker requires element types from corpus details as they are not provided by StartWorkerActivity
|
|
353
|
+
responses.add(
|
|
354
|
+
responses.GET,
|
|
355
|
+
"http://testserver/api/v1/corpus/11111111-1111-1111-1111-111111111111/",
|
|
356
|
+
status=200,
|
|
357
|
+
json={
|
|
358
|
+
"id": "11111111-1111-1111-1111-111111111111",
|
|
359
|
+
"name": "Test corpus",
|
|
360
|
+
"types": [
|
|
361
|
+
{
|
|
362
|
+
"id": "page-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
|
363
|
+
"slug": "page",
|
|
364
|
+
"display_name": "Page",
|
|
365
|
+
"folder": False,
|
|
366
|
+
"color": "28b62c",
|
|
367
|
+
}
|
|
368
|
+
],
|
|
369
|
+
},
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
return mock_elements_worker
|
|
373
|
+
|
|
374
|
+
|
|
285
375
|
@pytest.fixture
|
|
286
376
|
def mock_cache_db(tmp_path):
|
|
287
377
|
cache_path = tmp_path / "db.sqlite"
|
|
@@ -190,6 +190,14 @@ def test_configure_worker_run(mocker, responses, caplog):
|
|
|
190
190
|
body=json.dumps(payload),
|
|
191
191
|
content_type="application/json",
|
|
192
192
|
)
|
|
193
|
+
|
|
194
|
+
# By default, stick to classic configuration
|
|
195
|
+
responses.add(
|
|
196
|
+
responses.GET,
|
|
197
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
198
|
+
status=400,
|
|
199
|
+
)
|
|
200
|
+
|
|
193
201
|
worker.args = worker.parser.parse_args()
|
|
194
202
|
assert worker.is_read_only is False
|
|
195
203
|
assert worker.worker_run_id == "56785678-5678-5678-5678-567856785678"
|
|
@@ -205,6 +213,11 @@ def test_configure_worker_run(mocker, responses, caplog):
|
|
|
205
213
|
logging.INFO,
|
|
206
214
|
"Loaded Worker Fake worker @ 123412 from API",
|
|
207
215
|
),
|
|
216
|
+
(
|
|
217
|
+
"arkindex_worker",
|
|
218
|
+
logging.INFO,
|
|
219
|
+
"Modern configuration is not available",
|
|
220
|
+
),
|
|
208
221
|
("arkindex_worker", logging.INFO, "Loaded user configuration from WorkerRun"),
|
|
209
222
|
("arkindex_worker", logging.INFO, "User configuration retrieved"),
|
|
210
223
|
]
|
|
@@ -213,9 +226,16 @@ def test_configure_worker_run(mocker, responses, caplog):
|
|
|
213
226
|
|
|
214
227
|
|
|
215
228
|
@pytest.mark.usefixtures("_mock_worker_run_no_revision_api")
|
|
216
|
-
def test_configure_worker_run_no_revision(mocker, caplog):
|
|
229
|
+
def test_configure_worker_run_no_revision(mocker, caplog, responses):
|
|
217
230
|
worker = BaseWorker()
|
|
218
231
|
|
|
232
|
+
# By default, stick to classic configuration
|
|
233
|
+
responses.add(
|
|
234
|
+
responses.GET,
|
|
235
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
236
|
+
status=400,
|
|
237
|
+
)
|
|
238
|
+
|
|
219
239
|
mocker.patch.object(sys, "argv", ["worker"])
|
|
220
240
|
worker.args = worker.parser.parse_args()
|
|
221
241
|
assert worker.is_read_only is False
|
|
@@ -227,7 +247,12 @@ def test_configure_worker_run_no_revision(mocker, caplog):
|
|
|
227
247
|
worker.configure()
|
|
228
248
|
|
|
229
249
|
assert caplog.record_tuples == [
|
|
230
|
-
("arkindex_worker", logging.INFO, "Loaded Worker Fake worker @ 1 from API")
|
|
250
|
+
("arkindex_worker", logging.INFO, "Loaded Worker Fake worker @ 1 from API"),
|
|
251
|
+
(
|
|
252
|
+
"arkindex_worker",
|
|
253
|
+
logging.INFO,
|
|
254
|
+
"Modern configuration is not available",
|
|
255
|
+
),
|
|
231
256
|
]
|
|
232
257
|
|
|
233
258
|
|
|
@@ -283,6 +308,13 @@ def test_configure_user_configuration_defaults(mocker, responses):
|
|
|
283
308
|
content_type="application/json",
|
|
284
309
|
)
|
|
285
310
|
|
|
311
|
+
# By default, stick to classic configuration
|
|
312
|
+
responses.add(
|
|
313
|
+
responses.GET,
|
|
314
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
315
|
+
status=400,
|
|
316
|
+
)
|
|
317
|
+
|
|
286
318
|
worker.configure()
|
|
287
319
|
|
|
288
320
|
assert worker.user_configuration == {
|
|
@@ -340,6 +372,13 @@ def test_configure_user_config_debug(mocker, responses, debug):
|
|
|
340
372
|
body=json.dumps(payload),
|
|
341
373
|
content_type="application/json",
|
|
342
374
|
)
|
|
375
|
+
|
|
376
|
+
# By default, stick to classic configuration
|
|
377
|
+
responses.add(
|
|
378
|
+
responses.GET,
|
|
379
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
380
|
+
status=400,
|
|
381
|
+
)
|
|
343
382
|
worker.args = worker.parser.parse_args()
|
|
344
383
|
worker.configure()
|
|
345
384
|
|
|
@@ -388,6 +427,12 @@ def test_configure_worker_run_missing_conf(mocker, responses):
|
|
|
388
427
|
body=json.dumps(payload),
|
|
389
428
|
content_type="application/json",
|
|
390
429
|
)
|
|
430
|
+
# By default, stick to classic configuration
|
|
431
|
+
responses.add(
|
|
432
|
+
responses.GET,
|
|
433
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
434
|
+
status=400,
|
|
435
|
+
)
|
|
391
436
|
worker.args = worker.parser.parse_args()
|
|
392
437
|
worker.configure()
|
|
393
438
|
|
|
@@ -430,6 +475,12 @@ def test_configure_worker_run_no_worker_run_conf(mocker, responses):
|
|
|
430
475
|
body=json.dumps(payload),
|
|
431
476
|
content_type="application/json",
|
|
432
477
|
)
|
|
478
|
+
# By default, stick to classic configuration
|
|
479
|
+
responses.add(
|
|
480
|
+
responses.GET,
|
|
481
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
482
|
+
status=400,
|
|
483
|
+
)
|
|
433
484
|
worker.args = worker.parser.parse_args()
|
|
434
485
|
worker.configure()
|
|
435
486
|
|
|
@@ -480,6 +531,12 @@ def test_configure_load_model_configuration(mocker, responses):
|
|
|
480
531
|
body=json.dumps(payload),
|
|
481
532
|
content_type="application/json",
|
|
482
533
|
)
|
|
534
|
+
# By default, stick to classic configuration
|
|
535
|
+
responses.add(
|
|
536
|
+
responses.GET,
|
|
537
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
538
|
+
status=400,
|
|
539
|
+
)
|
|
483
540
|
worker.args = worker.parser.parse_args()
|
|
484
541
|
assert worker.is_read_only is False
|
|
485
542
|
assert worker.worker_run_id == "56785678-5678-5678-5678-567856785678"
|
|
@@ -947,6 +1004,13 @@ def test_worker_config_multiple_source(
|
|
|
947
1004
|
content_type="application/json",
|
|
948
1005
|
)
|
|
949
1006
|
|
|
1007
|
+
# By default, stick to classic configuration
|
|
1008
|
+
responses.add(
|
|
1009
|
+
responses.GET,
|
|
1010
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
1011
|
+
status=400,
|
|
1012
|
+
)
|
|
1013
|
+
|
|
950
1014
|
# Create and configure a worker
|
|
951
1015
|
monkeypatch.setattr(sys, "argv", ["worker"])
|
|
952
1016
|
worker = BaseWorker()
|
|
@@ -430,6 +430,7 @@ def test_run_no_sets(mocker, caplog, mock_dataset_worker):
|
|
|
430
430
|
|
|
431
431
|
assert [(level, message) for _, level, message in caplog.record_tuples] == [
|
|
432
432
|
(logging.INFO, "Loaded Worker Fake worker @ 123412 from API"),
|
|
433
|
+
(logging.INFO, "Modern configuration is not available"),
|
|
433
434
|
(logging.WARNING, "No sets to process, stopping."),
|
|
434
435
|
]
|
|
435
436
|
|
|
@@ -453,6 +454,7 @@ def test_run_initial_dataset_state_error(
|
|
|
453
454
|
|
|
454
455
|
assert [(level, message) for _, level, message in caplog.record_tuples] == [
|
|
455
456
|
(logging.INFO, "Loaded Worker Fake worker @ 123412 from API"),
|
|
457
|
+
(logging.INFO, "Modern configuration is not available"),
|
|
456
458
|
(
|
|
457
459
|
logging.WARNING,
|
|
458
460
|
"Failed running worker on Set (train) from Dataset (dataset_id): AssertionError('When processing a set, its dataset state should be Complete.')",
|
|
@@ -497,6 +499,7 @@ def test_run_download_dataset_artifact_api_error(
|
|
|
497
499
|
|
|
498
500
|
assert [(level, message) for _, level, message in caplog.record_tuples] == [
|
|
499
501
|
(logging.INFO, "Loaded Worker Fake worker @ 123412 from API"),
|
|
502
|
+
(logging.INFO, "Modern configuration is not available"),
|
|
500
503
|
(
|
|
501
504
|
logging.INFO,
|
|
502
505
|
"Retrieving data for Set (train) from Dataset (dataset_id) (1/1)",
|
|
@@ -550,6 +553,7 @@ def test_run_no_downloaded_dataset_artifact_error(
|
|
|
550
553
|
|
|
551
554
|
assert [(level, message) for _, level, message in caplog.record_tuples] == [
|
|
552
555
|
(logging.INFO, "Loaded Worker Fake worker @ 123412 from API"),
|
|
556
|
+
(logging.INFO, "Modern configuration is not available"),
|
|
553
557
|
(
|
|
554
558
|
logging.INFO,
|
|
555
559
|
"Retrieving data for Set (train) from Dataset (dataset_id) (1/1)",
|
|
@@ -626,6 +630,7 @@ def test_run(
|
|
|
626
630
|
|
|
627
631
|
assert [(level, message) for _, level, message in caplog.record_tuples] == [
|
|
628
632
|
(logging.INFO, "Loaded Worker Fake worker @ 123412 from API"),
|
|
633
|
+
(logging.INFO, "Modern configuration is not available"),
|
|
629
634
|
(
|
|
630
635
|
logging.INFO,
|
|
631
636
|
"Retrieving data for Set (train) from Dataset (dataset_id) (1/1)",
|
|
@@ -685,6 +685,100 @@ def test_run_cache(monkeypatch, mocker, mock_elements_worker_with_cache):
|
|
|
685
685
|
]
|
|
686
686
|
|
|
687
687
|
|
|
688
|
+
def test_run_consuming_worker_activities(
|
|
689
|
+
monkeypatch,
|
|
690
|
+
mock_elements_worker_consume_wa,
|
|
691
|
+
responses,
|
|
692
|
+
caplog,
|
|
693
|
+
):
|
|
694
|
+
"""Check the consuming worker activities runtime uses StartWorkerActivity + UpdateWorkerActivity"""
|
|
695
|
+
# Disable second configure call from run()
|
|
696
|
+
monkeypatch.setattr(mock_elements_worker_consume_wa, "configure", lambda: None)
|
|
697
|
+
|
|
698
|
+
assert mock_elements_worker_consume_wa.is_read_only is False
|
|
699
|
+
|
|
700
|
+
# Provide 2 worker activities to run and the corresponding update call
|
|
701
|
+
for elt_id in ("page_1", "page_2"):
|
|
702
|
+
responses.add(
|
|
703
|
+
responses.POST,
|
|
704
|
+
"http://testserver/api/v1/process/start-activity/",
|
|
705
|
+
status=200,
|
|
706
|
+
json={
|
|
707
|
+
"id": elt_id,
|
|
708
|
+
"type_id": "page-aaaa-aaaa-aaaa-aaaaaaaaaaaa", # Element type provided by mock corpus
|
|
709
|
+
"name": "Page XXX",
|
|
710
|
+
},
|
|
711
|
+
)
|
|
712
|
+
responses.add(
|
|
713
|
+
responses.PUT,
|
|
714
|
+
"http://testserver/api/v1/workers/versions/56785678-5678-5678-5678-567856785678/activity/",
|
|
715
|
+
status=200,
|
|
716
|
+
)
|
|
717
|
+
|
|
718
|
+
# Then a 404 to stop iterating
|
|
719
|
+
responses.add(
|
|
720
|
+
responses.POST,
|
|
721
|
+
"http://testserver/api/v1/process/start-activity/",
|
|
722
|
+
status=404,
|
|
723
|
+
)
|
|
724
|
+
|
|
725
|
+
# Simply run the process
|
|
726
|
+
mock_elements_worker_consume_wa.run()
|
|
727
|
+
|
|
728
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 6
|
|
729
|
+
assert [
|
|
730
|
+
(call.request.method, call.request.url) for call in responses.calls
|
|
731
|
+
] == BASE_API_CALLS + [
|
|
732
|
+
(
|
|
733
|
+
"GET",
|
|
734
|
+
"http://testserver/api/v1/corpus/11111111-1111-1111-1111-111111111111/",
|
|
735
|
+
),
|
|
736
|
+
(
|
|
737
|
+
"POST",
|
|
738
|
+
"http://testserver/api/v1/process/start-activity/",
|
|
739
|
+
),
|
|
740
|
+
(
|
|
741
|
+
"PUT",
|
|
742
|
+
"http://testserver/api/v1/workers/versions/56785678-5678-5678-5678-567856785678/activity/",
|
|
743
|
+
),
|
|
744
|
+
(
|
|
745
|
+
"POST",
|
|
746
|
+
"http://testserver/api/v1/process/start-activity/",
|
|
747
|
+
),
|
|
748
|
+
(
|
|
749
|
+
"PUT",
|
|
750
|
+
"http://testserver/api/v1/workers/versions/56785678-5678-5678-5678-567856785678/activity/",
|
|
751
|
+
),
|
|
752
|
+
(
|
|
753
|
+
"POST",
|
|
754
|
+
"http://testserver/api/v1/process/start-activity/",
|
|
755
|
+
),
|
|
756
|
+
]
|
|
757
|
+
|
|
758
|
+
assert [(record.levelno, record.message) for record in caplog.records] == [
|
|
759
|
+
(
|
|
760
|
+
logging.INFO,
|
|
761
|
+
"Loaded 1 element type in corpus (11111111-1111-1111-1111-111111111111).",
|
|
762
|
+
),
|
|
763
|
+
(
|
|
764
|
+
logging.INFO,
|
|
765
|
+
"Using StartWorkerActivity instead of reading init_elements JSON file",
|
|
766
|
+
),
|
|
767
|
+
(
|
|
768
|
+
logging.INFO,
|
|
769
|
+
"Processing page Page XXX (page_1) (n°1)",
|
|
770
|
+
),
|
|
771
|
+
(
|
|
772
|
+
logging.INFO,
|
|
773
|
+
"Processing page Page XXX (page_2) (n°2)",
|
|
774
|
+
),
|
|
775
|
+
(
|
|
776
|
+
logging.INFO,
|
|
777
|
+
"Ran on 2 elements: 2 completed, 0 failed",
|
|
778
|
+
),
|
|
779
|
+
]
|
|
780
|
+
|
|
781
|
+
|
|
688
782
|
def test_start_activity_conflict(
|
|
689
783
|
monkeypatch, responses, mock_elements_worker_with_list, caplog
|
|
690
784
|
):
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
def test_simple_configuration(mock_base_worker_modern_conf, responses):
|
|
2
|
+
# Provide the full configuration directly from the worker run
|
|
3
|
+
responses.add(
|
|
4
|
+
responses.GET,
|
|
5
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
6
|
+
status=200,
|
|
7
|
+
json={"configuration": [{"key": "some_key", "value": "test", "secret": False}]},
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
mock_base_worker_modern_conf.configure()
|
|
11
|
+
|
|
12
|
+
assert mock_base_worker_modern_conf.config == {"some_key": "test"}
|
|
13
|
+
assert (
|
|
14
|
+
mock_base_worker_modern_conf.user_configuration
|
|
15
|
+
== mock_base_worker_modern_conf.config
|
|
16
|
+
)
|
|
17
|
+
assert mock_base_worker_modern_conf.secrets == {}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_empty(mock_base_worker_modern_conf, responses):
|
|
21
|
+
# Provide the full configuration directly from the worker run
|
|
22
|
+
responses.add(
|
|
23
|
+
responses.GET,
|
|
24
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
25
|
+
status=200,
|
|
26
|
+
json={"configuration": []},
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
mock_base_worker_modern_conf.configure()
|
|
30
|
+
|
|
31
|
+
assert mock_base_worker_modern_conf.config == {}
|
|
32
|
+
assert (
|
|
33
|
+
mock_base_worker_modern_conf.user_configuration
|
|
34
|
+
== mock_base_worker_modern_conf.config
|
|
35
|
+
)
|
|
36
|
+
assert mock_base_worker_modern_conf.secrets == {}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_with_secrets(mock_base_worker_modern_conf, responses):
|
|
40
|
+
# Provide the full configuration directly from the worker run
|
|
41
|
+
responses.add(
|
|
42
|
+
responses.GET,
|
|
43
|
+
"http://testserver/api/v1/workers/runs/56785678-5678-5678-5678-567856785678/configuration/",
|
|
44
|
+
status=200,
|
|
45
|
+
json={
|
|
46
|
+
"configuration": [
|
|
47
|
+
{"key": "some_key", "value": "test", "secret": False},
|
|
48
|
+
{
|
|
49
|
+
"key": "a_secret",
|
|
50
|
+
"value": "471b9e64-29af-48dc-8bda-1a64a2da0c12",
|
|
51
|
+
"secret": True,
|
|
52
|
+
},
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# Provide a secret value
|
|
58
|
+
responses.add(
|
|
59
|
+
responses.GET,
|
|
60
|
+
"http://testserver/api/v1/secret/471b9e64-29af-48dc-8bda-1a64a2da0c12",
|
|
61
|
+
status=200,
|
|
62
|
+
json={
|
|
63
|
+
"id": "471b9e64-29af-48dc-8bda-1a64a2da0c12",
|
|
64
|
+
"name": "a_secret",
|
|
65
|
+
"content": "My super duper secret value",
|
|
66
|
+
},
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
mock_base_worker_modern_conf.configure()
|
|
70
|
+
|
|
71
|
+
assert mock_base_worker_modern_conf.config == {
|
|
72
|
+
"a_secret": "My super duper secret value",
|
|
73
|
+
"some_key": "test",
|
|
74
|
+
}
|
|
75
|
+
assert (
|
|
76
|
+
mock_base_worker_modern_conf.user_configuration
|
|
77
|
+
== mock_base_worker_modern_conf.config
|
|
78
|
+
)
|
|
79
|
+
assert mock_base_worker_modern_conf.secrets == {
|
|
80
|
+
"a_secret": "My super duper secret value"
|
|
81
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/corpus.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/dataset.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/entity.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/image.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/metadata.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/process.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/task.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/arkindex_worker/worker/training.py
RENAMED
|
File without changes
|
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/examples/standalone/python/worker.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/examples/tooled/python/worker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/worker-demo/tests/__init__.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/worker-demo/tests/conftest.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/worker-demo/tests/test_worker.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/worker-demo/worker_demo/__init__.py
RENAMED
|
File without changes
|
{arkindex_base_worker-0.5.0rc1 → arkindex_base_worker-0.5.1b2}/worker-demo/worker_demo/worker.py
RENAMED
|
File without changes
|