arkindex-base-worker 0.4.0rc2__py3-none-any.whl → 0.4.0rc4__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.
- {arkindex_base_worker-0.4.0rc2.dist-info → arkindex_base_worker-0.4.0rc4.dist-info}/METADATA +15 -14
- arkindex_base_worker-0.4.0rc4.dist-info/RECORD +60 -0
- {arkindex_base_worker-0.4.0rc2.dist-info → arkindex_base_worker-0.4.0rc4.dist-info}/WHEEL +1 -1
- arkindex_worker/cache.py +1 -1
- arkindex_worker/worker/__init__.py +1 -2
- arkindex_worker/worker/base.py +1 -1
- arkindex_worker/worker/classification.py +1 -1
- arkindex_worker/worker/corpus.py +21 -6
- arkindex_worker/worker/entity.py +1 -1
- arkindex_worker/worker/task.py +1 -2
- arkindex_worker/worker/training.py +1 -1
- tests/test_dataset_worker.py +1 -1
- tests/test_elements_worker/{test_classifications.py → test_classification.py} +87 -1
- tests/test_elements_worker/test_corpus.py +32 -1
- tests/test_elements_worker/test_dataset.py +1 -1
- tests/test_elements_worker/test_element.py +427 -0
- tests/test_elements_worker/test_element_create_multiple.py +715 -0
- tests/test_elements_worker/test_element_create_single.py +528 -0
- tests/test_elements_worker/test_element_list_children.py +969 -0
- tests/test_elements_worker/test_element_list_parents.py +530 -0
- tests/test_elements_worker/{test_entities.py → test_entity_create.py} +1 -154
- tests/test_elements_worker/test_entity_list_and_check.py +160 -0
- tests/test_elements_worker/test_image.py +2 -1
- tests/test_elements_worker/test_metadata.py +1 -1
- tests/test_elements_worker/test_task.py +1 -1
- tests/test_elements_worker/test_transcription_create.py +873 -0
- tests/test_elements_worker/test_transcription_create_with_elements.py +951 -0
- tests/test_elements_worker/test_transcription_list.py +450 -0
- tests/test_elements_worker/test_version.py +60 -0
- tests/test_elements_worker/test_worker.py +526 -89
- tests/test_image.py +181 -198
- arkindex_base_worker-0.4.0rc2.dist-info/RECORD +0 -52
- tests/test_elements_worker/test_elements.py +0 -3704
- tests/test_elements_worker/test_transcriptions.py +0 -2252
- {arkindex_base_worker-0.4.0rc2.dist-info → arkindex_base_worker-0.4.0rc4.dist-info}/LICENSE +0 -0
- {arkindex_base_worker-0.4.0rc2.dist-info → arkindex_base_worker-0.4.0rc4.dist-info}/top_level.txt +0 -0
|
@@ -1,89 +1,526 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import sys
|
|
3
|
+
from argparse import Namespace
|
|
4
|
+
from uuid import UUID
|
|
3
5
|
|
|
4
6
|
import pytest
|
|
5
|
-
from apistar.exceptions import ErrorResponse
|
|
6
7
|
|
|
7
|
-
from
|
|
8
|
+
from arkindex.exceptions import ErrorResponse
|
|
9
|
+
from arkindex_worker.cache import (
|
|
10
|
+
SQL_VERSION,
|
|
11
|
+
CachedElement,
|
|
12
|
+
create_version_table,
|
|
13
|
+
init_cache_db,
|
|
14
|
+
)
|
|
15
|
+
from arkindex_worker.models import Element
|
|
8
16
|
from arkindex_worker.worker import ActivityState, ElementsWorker
|
|
17
|
+
from arkindex_worker.worker.dataset import DatasetState
|
|
18
|
+
from arkindex_worker.worker.process import ProcessMode
|
|
9
19
|
|
|
10
20
|
from . import BASE_API_CALLS
|
|
11
21
|
|
|
12
|
-
TEST_VERSION_ID = "test_123"
|
|
13
|
-
TEST_SLUG = "some_slug"
|
|
14
22
|
|
|
23
|
+
def test_database_arg(mocker, mock_elements_worker, tmp_path):
|
|
24
|
+
database_path = tmp_path / "my_database.sqlite"
|
|
25
|
+
init_cache_db(database_path)
|
|
26
|
+
create_version_table()
|
|
27
|
+
|
|
28
|
+
mocker.patch(
|
|
29
|
+
"arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
|
|
30
|
+
return_value=Namespace(
|
|
31
|
+
element=["volumeid", "pageid"],
|
|
32
|
+
verbose=False,
|
|
33
|
+
elements_list=None,
|
|
34
|
+
database=database_path,
|
|
35
|
+
dev=False,
|
|
36
|
+
set=[],
|
|
37
|
+
),
|
|
38
|
+
)
|
|
15
39
|
|
|
16
|
-
|
|
17
|
-
|
|
40
|
+
worker = ElementsWorker(support_cache=True)
|
|
41
|
+
worker.configure()
|
|
18
42
|
|
|
19
|
-
|
|
43
|
+
assert worker.use_cache is True
|
|
44
|
+
assert worker.cache_path == database_path
|
|
20
45
|
|
|
21
|
-
api_client.add_response("RetrieveWorkerVersion", response, id=TEST_VERSION_ID)
|
|
22
46
|
|
|
23
|
-
|
|
24
|
-
|
|
47
|
+
def test_database_arg_cache_missing_version_table(
|
|
48
|
+
mocker, mock_elements_worker, tmp_path
|
|
49
|
+
):
|
|
50
|
+
database_path = tmp_path / "my_database.sqlite"
|
|
51
|
+
database_path.touch()
|
|
52
|
+
|
|
53
|
+
mocker.patch(
|
|
54
|
+
"arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
|
|
55
|
+
return_value=Namespace(
|
|
56
|
+
element=["volumeid", "pageid"],
|
|
57
|
+
verbose=False,
|
|
58
|
+
elements_list=None,
|
|
59
|
+
database=database_path,
|
|
60
|
+
dev=False,
|
|
61
|
+
set=[],
|
|
62
|
+
),
|
|
63
|
+
)
|
|
25
64
|
|
|
26
|
-
|
|
27
|
-
|
|
65
|
+
worker = ElementsWorker(support_cache=True)
|
|
66
|
+
with pytest.raises(
|
|
67
|
+
AssertionError,
|
|
68
|
+
match=f"The SQLite database {database_path} does not have the correct cache version, it should be {SQL_VERSION}",
|
|
69
|
+
):
|
|
70
|
+
worker.configure()
|
|
28
71
|
|
|
29
72
|
|
|
30
|
-
def
|
|
31
|
-
|
|
73
|
+
def test_readonly(responses, mock_elements_worker):
|
|
74
|
+
"""Test readonly worker does not trigger any API calls"""
|
|
32
75
|
|
|
33
|
-
|
|
76
|
+
# Setup the worker as read-only
|
|
77
|
+
mock_elements_worker.worker_run_id = None
|
|
78
|
+
assert mock_elements_worker.is_read_only is True
|
|
34
79
|
|
|
35
|
-
|
|
80
|
+
out = mock_elements_worker.update_activity("1234-deadbeef", ActivityState.Processed)
|
|
36
81
|
|
|
37
|
-
|
|
38
|
-
|
|
82
|
+
# update_activity returns False in very specific cases
|
|
83
|
+
assert out is True
|
|
84
|
+
assert len(responses.calls) == len(BASE_API_CALLS)
|
|
85
|
+
assert [
|
|
86
|
+
(call.request.method, call.request.url) for call in responses.calls
|
|
87
|
+
] == BASE_API_CALLS
|
|
39
88
|
|
|
40
|
-
with pytest.deprecated_call(match="WorkerVersion usage is deprecated."):
|
|
41
|
-
response_2 = fake_dummy_worker.get_worker_version(TEST_VERSION_ID)
|
|
42
89
|
|
|
43
|
-
|
|
44
|
-
|
|
90
|
+
def test_get_elements_elements_list_arg_wrong_type(
|
|
91
|
+
monkeypatch, tmp_path, mock_elements_worker
|
|
92
|
+
):
|
|
93
|
+
elements_path = tmp_path / "elements.json"
|
|
94
|
+
elements_path.write_text("{}")
|
|
45
95
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
96
|
+
monkeypatch.setenv("TASK_ELEMENTS", str(elements_path))
|
|
97
|
+
worker = ElementsWorker()
|
|
98
|
+
worker.configure()
|
|
49
99
|
|
|
100
|
+
with pytest.raises(AssertionError, match="Elements list must be a list"):
|
|
101
|
+
worker.get_elements()
|
|
50
102
|
|
|
51
|
-
def test_get_worker_version_slug(mocker, fake_dummy_worker):
|
|
52
|
-
fake_dummy_worker.get_worker_version = mocker.MagicMock()
|
|
53
|
-
fake_dummy_worker.get_worker_version.return_value = {
|
|
54
|
-
"id": TEST_VERSION_ID,
|
|
55
|
-
"worker": {"slug": "mock_slug"},
|
|
56
|
-
}
|
|
57
103
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
104
|
+
def test_get_elements_elements_list_arg_empty_list(
|
|
105
|
+
monkeypatch, tmp_path, mock_elements_worker
|
|
106
|
+
):
|
|
107
|
+
elements_path = tmp_path / "elements.json"
|
|
108
|
+
elements_path.write_text("[]")
|
|
61
109
|
|
|
110
|
+
monkeypatch.setenv("TASK_ELEMENTS", str(elements_path))
|
|
111
|
+
worker = ElementsWorker()
|
|
112
|
+
worker.configure()
|
|
113
|
+
|
|
114
|
+
with pytest.raises(AssertionError, match="No elements in elements list"):
|
|
115
|
+
worker.get_elements()
|
|
62
116
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
117
|
+
|
|
118
|
+
def test_get_elements_elements_list_arg_missing_id(
|
|
119
|
+
monkeypatch, tmp_path, mock_elements_worker
|
|
120
|
+
):
|
|
121
|
+
elements_path = tmp_path / "elements.json"
|
|
122
|
+
elements_path.write_text(json.dumps([{"type": "volume"}]))
|
|
123
|
+
|
|
124
|
+
monkeypatch.setenv("TASK_ELEMENTS", str(elements_path))
|
|
125
|
+
worker = ElementsWorker()
|
|
126
|
+
worker.configure()
|
|
127
|
+
|
|
128
|
+
elt_list = worker.get_elements()
|
|
129
|
+
|
|
130
|
+
assert elt_list == []
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def test_get_elements_elements_list_arg_not_uuid(
|
|
134
|
+
monkeypatch, tmp_path, mock_elements_worker
|
|
135
|
+
):
|
|
136
|
+
elements_path = tmp_path / "elements.json"
|
|
137
|
+
elements_path.write_text(
|
|
138
|
+
json.dumps(
|
|
139
|
+
[
|
|
140
|
+
{"id": "volumeid", "type": "volume"},
|
|
141
|
+
{"id": "pageid", "type": "page"},
|
|
142
|
+
{"id": "actid", "type": "act"},
|
|
143
|
+
{"id": "surfaceid", "type": "surface"},
|
|
144
|
+
]
|
|
145
|
+
)
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
monkeypatch.setenv("TASK_ELEMENTS", str(elements_path))
|
|
149
|
+
worker = ElementsWorker()
|
|
150
|
+
worker.configure()
|
|
151
|
+
|
|
152
|
+
with pytest.raises(
|
|
153
|
+
Exception,
|
|
154
|
+
match="These element IDs are invalid: volumeid, pageid, actid, surfaceid",
|
|
68
155
|
):
|
|
69
|
-
|
|
156
|
+
worker.get_elements()
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def test_get_elements_elements_list_arg(monkeypatch, tmp_path, mock_elements_worker):
|
|
160
|
+
elements_path = tmp_path / "elements.json"
|
|
161
|
+
elements_path.write_text(
|
|
162
|
+
json.dumps(
|
|
163
|
+
[
|
|
164
|
+
{"id": "11111111-1111-1111-1111-111111111111", "type": "volume"},
|
|
165
|
+
{"id": "22222222-2222-2222-2222-222222222222", "type": "page"},
|
|
166
|
+
{"id": "33333333-3333-3333-3333-333333333333", "type": "act"},
|
|
167
|
+
]
|
|
168
|
+
)
|
|
169
|
+
)
|
|
70
170
|
|
|
171
|
+
monkeypatch.setenv("TASK_ELEMENTS", str(elements_path))
|
|
172
|
+
worker = ElementsWorker()
|
|
173
|
+
worker.configure()
|
|
71
174
|
|
|
72
|
-
|
|
73
|
-
"""Test readonly worker does not trigger any API calls"""
|
|
175
|
+
elt_list = worker.get_elements()
|
|
74
176
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
177
|
+
assert elt_list == [
|
|
178
|
+
"11111111-1111-1111-1111-111111111111",
|
|
179
|
+
"22222222-2222-2222-2222-222222222222",
|
|
180
|
+
"33333333-3333-3333-3333-333333333333",
|
|
181
|
+
]
|
|
78
182
|
|
|
79
|
-
out = mock_elements_worker.update_activity("1234-deadbeef", ActivityState.Processed)
|
|
80
183
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
184
|
+
def test_get_elements_element_arg_not_uuid(mocker, mock_elements_worker):
|
|
185
|
+
mocker.patch(
|
|
186
|
+
"arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
|
|
187
|
+
return_value=Namespace(
|
|
188
|
+
element=["volumeid", "pageid"],
|
|
189
|
+
config={},
|
|
190
|
+
verbose=False,
|
|
191
|
+
elements_list=None,
|
|
192
|
+
database=None,
|
|
193
|
+
dev=True,
|
|
194
|
+
set=[],
|
|
195
|
+
),
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
worker = ElementsWorker()
|
|
199
|
+
worker.configure()
|
|
200
|
+
|
|
201
|
+
with pytest.raises(
|
|
202
|
+
Exception, match="These element IDs are invalid: volumeid, pageid"
|
|
203
|
+
):
|
|
204
|
+
worker.get_elements()
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def test_get_elements_element_arg(mocker, mock_elements_worker):
|
|
208
|
+
mocker.patch(
|
|
209
|
+
"arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
|
|
210
|
+
return_value=Namespace(
|
|
211
|
+
element=[
|
|
212
|
+
"11111111-1111-1111-1111-111111111111",
|
|
213
|
+
"22222222-2222-2222-2222-222222222222",
|
|
214
|
+
],
|
|
215
|
+
config={},
|
|
216
|
+
verbose=False,
|
|
217
|
+
elements_list=None,
|
|
218
|
+
database=None,
|
|
219
|
+
dev=True,
|
|
220
|
+
set=[],
|
|
221
|
+
),
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
worker = ElementsWorker()
|
|
225
|
+
worker.configure()
|
|
226
|
+
|
|
227
|
+
elt_list = worker.get_elements()
|
|
228
|
+
|
|
229
|
+
assert elt_list == [
|
|
230
|
+
"11111111-1111-1111-1111-111111111111",
|
|
231
|
+
"22222222-2222-2222-2222-222222222222",
|
|
232
|
+
]
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def test_get_elements_dataset_set_arg(responses, mocker, mock_elements_worker):
|
|
236
|
+
mocker.patch(
|
|
237
|
+
"arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
|
|
238
|
+
return_value=Namespace(
|
|
239
|
+
element=[],
|
|
240
|
+
config={},
|
|
241
|
+
verbose=False,
|
|
242
|
+
elements_list=None,
|
|
243
|
+
database=None,
|
|
244
|
+
dev=True,
|
|
245
|
+
set=[(UUID("11111111-1111-1111-1111-111111111111"), "train")],
|
|
246
|
+
),
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
# Mock RetrieveDataset call
|
|
250
|
+
responses.add(
|
|
251
|
+
responses.GET,
|
|
252
|
+
"http://testserver/api/v1/datasets/11111111-1111-1111-1111-111111111111/",
|
|
253
|
+
status=200,
|
|
254
|
+
json={
|
|
255
|
+
"id": "11111111-1111-1111-1111-111111111111",
|
|
256
|
+
"name": "My dataset",
|
|
257
|
+
"description": "A dataset about cats.",
|
|
258
|
+
"sets": ["train", "dev", "test"],
|
|
259
|
+
"state": DatasetState.Complete.value,
|
|
260
|
+
},
|
|
261
|
+
content_type="application/json",
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
# Mock ListSetElements call
|
|
265
|
+
element = {
|
|
266
|
+
"id": "22222222-2222-2222-2222-222222222222",
|
|
267
|
+
"type": "page",
|
|
268
|
+
"name": "1",
|
|
269
|
+
"corpus": {
|
|
270
|
+
"id": "11111111-1111-1111-1111-111111111111",
|
|
271
|
+
},
|
|
272
|
+
"thumbnail_url": "http://example.com",
|
|
273
|
+
"zone": {
|
|
274
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
275
|
+
"polygon": [[0, 0], [0, 0], [0, 0]],
|
|
276
|
+
"image": {
|
|
277
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
278
|
+
"path": "string",
|
|
279
|
+
"width": 0,
|
|
280
|
+
"height": 0,
|
|
281
|
+
"url": "http://example.com",
|
|
282
|
+
"s3_url": "string",
|
|
283
|
+
"status": "checked",
|
|
284
|
+
"server": {
|
|
285
|
+
"display_name": "string",
|
|
286
|
+
"url": "http://example.com",
|
|
287
|
+
"max_width": 2147483647,
|
|
288
|
+
"max_height": 2147483647,
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
"url": "http://example.com",
|
|
292
|
+
},
|
|
293
|
+
"rotation_angle": 0,
|
|
294
|
+
"mirrored": False,
|
|
295
|
+
"created": "2019-08-24T14:15:22Z",
|
|
296
|
+
"classes": [
|
|
297
|
+
{
|
|
298
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
299
|
+
"ml_class": {
|
|
300
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
301
|
+
"name": "string",
|
|
302
|
+
},
|
|
303
|
+
"state": "pending",
|
|
304
|
+
"confidence": 0,
|
|
305
|
+
"high_confidence": True,
|
|
306
|
+
"worker_run": {
|
|
307
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
308
|
+
"summary": "string",
|
|
309
|
+
},
|
|
310
|
+
}
|
|
311
|
+
],
|
|
312
|
+
"metadata": [
|
|
313
|
+
{
|
|
314
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
315
|
+
"type": "text",
|
|
316
|
+
"name": "string",
|
|
317
|
+
"value": "string",
|
|
318
|
+
"dates": [{"type": "exact", "year": 0, "month": 1, "day": 1}],
|
|
319
|
+
}
|
|
320
|
+
],
|
|
321
|
+
"transcriptions": [
|
|
322
|
+
{
|
|
323
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
324
|
+
"text": "string",
|
|
325
|
+
"confidence": 0,
|
|
326
|
+
"orientation": "horizontal-lr",
|
|
327
|
+
"worker_run": {
|
|
328
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
329
|
+
"summary": "string",
|
|
330
|
+
},
|
|
331
|
+
}
|
|
332
|
+
],
|
|
333
|
+
"has_children": True,
|
|
334
|
+
"worker_run": {
|
|
335
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
336
|
+
"summary": "string",
|
|
337
|
+
},
|
|
338
|
+
"confidence": 1,
|
|
339
|
+
}
|
|
340
|
+
responses.add(
|
|
341
|
+
responses.GET,
|
|
342
|
+
"http://testserver/api/v1/datasets/11111111-1111-1111-1111-111111111111/elements/?set=train&with_count=true",
|
|
343
|
+
status=200,
|
|
344
|
+
json={
|
|
345
|
+
"next": None,
|
|
346
|
+
"previous": None,
|
|
347
|
+
"results": [
|
|
348
|
+
{
|
|
349
|
+
"set": "train",
|
|
350
|
+
"element": element,
|
|
351
|
+
}
|
|
352
|
+
],
|
|
353
|
+
"count": 1,
|
|
354
|
+
},
|
|
355
|
+
content_type="application/json",
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
worker = ElementsWorker()
|
|
359
|
+
worker.configure()
|
|
360
|
+
|
|
361
|
+
elt_list = worker.get_elements()
|
|
362
|
+
|
|
363
|
+
assert elt_list == [
|
|
364
|
+
Element(**element),
|
|
365
|
+
]
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def test_get_elements_dataset_set_api(responses, mocker, mock_elements_worker):
|
|
369
|
+
# Mock ListProcessSets call
|
|
370
|
+
responses.add(
|
|
371
|
+
responses.GET,
|
|
372
|
+
"http://testserver/api/v1/process/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeffff/sets/",
|
|
373
|
+
status=200,
|
|
374
|
+
json={
|
|
375
|
+
"next": None,
|
|
376
|
+
"previous": None,
|
|
377
|
+
"results": [
|
|
378
|
+
{
|
|
379
|
+
"id": "33333333-3333-3333-3333-333333333333",
|
|
380
|
+
"dataset": {"id": "11111111-1111-1111-1111-111111111111"},
|
|
381
|
+
"set_name": "train",
|
|
382
|
+
}
|
|
383
|
+
],
|
|
384
|
+
"count": 1,
|
|
385
|
+
},
|
|
386
|
+
content_type="application/json",
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
# Mock ListSetElements call
|
|
390
|
+
element = {
|
|
391
|
+
"id": "22222222-2222-2222-2222-222222222222",
|
|
392
|
+
"type": "page",
|
|
393
|
+
"name": "1",
|
|
394
|
+
"corpus": {
|
|
395
|
+
"id": "11111111-1111-1111-1111-111111111111",
|
|
396
|
+
},
|
|
397
|
+
"thumbnail_url": "http://example.com",
|
|
398
|
+
"zone": {
|
|
399
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
400
|
+
"polygon": [[0, 0], [0, 0], [0, 0]],
|
|
401
|
+
"image": {
|
|
402
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
403
|
+
"path": "string",
|
|
404
|
+
"width": 0,
|
|
405
|
+
"height": 0,
|
|
406
|
+
"url": "http://example.com",
|
|
407
|
+
"s3_url": "string",
|
|
408
|
+
"status": "checked",
|
|
409
|
+
"server": {
|
|
410
|
+
"display_name": "string",
|
|
411
|
+
"url": "http://example.com",
|
|
412
|
+
"max_width": 2147483647,
|
|
413
|
+
"max_height": 2147483647,
|
|
414
|
+
},
|
|
415
|
+
},
|
|
416
|
+
"url": "http://example.com",
|
|
417
|
+
},
|
|
418
|
+
"rotation_angle": 0,
|
|
419
|
+
"mirrored": False,
|
|
420
|
+
"created": "2019-08-24T14:15:22Z",
|
|
421
|
+
"classes": [
|
|
422
|
+
{
|
|
423
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
424
|
+
"ml_class": {
|
|
425
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
426
|
+
"name": "string",
|
|
427
|
+
},
|
|
428
|
+
"state": "pending",
|
|
429
|
+
"confidence": 0,
|
|
430
|
+
"high_confidence": True,
|
|
431
|
+
"worker_run": {
|
|
432
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
433
|
+
"summary": "string",
|
|
434
|
+
},
|
|
435
|
+
}
|
|
436
|
+
],
|
|
437
|
+
"metadata": [
|
|
438
|
+
{
|
|
439
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
440
|
+
"type": "text",
|
|
441
|
+
"name": "string",
|
|
442
|
+
"value": "string",
|
|
443
|
+
"dates": [{"type": "exact", "year": 0, "month": 1, "day": 1}],
|
|
444
|
+
}
|
|
445
|
+
],
|
|
446
|
+
"transcriptions": [
|
|
447
|
+
{
|
|
448
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
449
|
+
"text": "string",
|
|
450
|
+
"confidence": 0,
|
|
451
|
+
"orientation": "horizontal-lr",
|
|
452
|
+
"worker_run": {
|
|
453
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
454
|
+
"summary": "string",
|
|
455
|
+
},
|
|
456
|
+
}
|
|
457
|
+
],
|
|
458
|
+
"has_children": True,
|
|
459
|
+
"worker_run": {
|
|
460
|
+
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
|
|
461
|
+
"summary": "string",
|
|
462
|
+
},
|
|
463
|
+
"confidence": 1,
|
|
464
|
+
}
|
|
465
|
+
responses.add(
|
|
466
|
+
responses.GET,
|
|
467
|
+
"http://testserver/api/v1/datasets/11111111-1111-1111-1111-111111111111/elements/?set=train&with_count=true",
|
|
468
|
+
status=200,
|
|
469
|
+
json={
|
|
470
|
+
"next": None,
|
|
471
|
+
"previous": None,
|
|
472
|
+
"results": [
|
|
473
|
+
{
|
|
474
|
+
"set": "train",
|
|
475
|
+
"element": element,
|
|
476
|
+
}
|
|
477
|
+
],
|
|
478
|
+
"count": 1,
|
|
479
|
+
},
|
|
480
|
+
content_type="application/json",
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
# Update ProcessMode to Dataset
|
|
484
|
+
mock_elements_worker.process_information["mode"] = ProcessMode.Dataset
|
|
485
|
+
|
|
486
|
+
elt_list = mock_elements_worker.get_elements()
|
|
487
|
+
|
|
488
|
+
assert elt_list == [
|
|
489
|
+
Element(**element),
|
|
490
|
+
]
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def test_get_elements_both_args_error(mocker, mock_elements_worker, tmp_path):
|
|
494
|
+
elements_path = tmp_path / "elements.json"
|
|
495
|
+
elements_path.write_text(
|
|
496
|
+
json.dumps(
|
|
497
|
+
[
|
|
498
|
+
{"id": "volumeid", "type": "volume"},
|
|
499
|
+
{"id": "pageid", "type": "page"},
|
|
500
|
+
{"id": "actid", "type": "act"},
|
|
501
|
+
{"id": "surfaceid", "type": "surface"},
|
|
502
|
+
]
|
|
503
|
+
)
|
|
504
|
+
)
|
|
505
|
+
mocker.patch(
|
|
506
|
+
"arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
|
|
507
|
+
return_value=Namespace(
|
|
508
|
+
element=["anotherid", "againanotherid"],
|
|
509
|
+
verbose=False,
|
|
510
|
+
elements_list=elements_path.open(),
|
|
511
|
+
database=None,
|
|
512
|
+
dev=False,
|
|
513
|
+
set=[],
|
|
514
|
+
),
|
|
515
|
+
)
|
|
516
|
+
|
|
517
|
+
worker = ElementsWorker()
|
|
518
|
+
worker.configure()
|
|
519
|
+
|
|
520
|
+
with pytest.raises(
|
|
521
|
+
AssertionError, match="elements-list and element CLI args shouldn't be both set"
|
|
522
|
+
):
|
|
523
|
+
worker.get_elements()
|
|
87
524
|
|
|
88
525
|
|
|
89
526
|
@pytest.mark.usefixtures("_mock_worker_run_api")
|
|
@@ -114,43 +551,6 @@ def test_activities_dev_mode(mocker):
|
|
|
114
551
|
assert worker.store_activity is False
|
|
115
552
|
|
|
116
553
|
|
|
117
|
-
@pytest.mark.usefixtures("_mock_worker_run_api")
|
|
118
|
-
def test_update_call(responses, mock_elements_worker):
|
|
119
|
-
"""Test an update call with feature enabled triggers an API call"""
|
|
120
|
-
responses.add(
|
|
121
|
-
responses.PUT,
|
|
122
|
-
"http://testserver/api/v1/workers/versions/56785678-5678-5678-5678-567856785678/activity/",
|
|
123
|
-
status=200,
|
|
124
|
-
json={
|
|
125
|
-
"element_id": "1234-deadbeef",
|
|
126
|
-
"process_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeffff",
|
|
127
|
-
"state": "processed",
|
|
128
|
-
},
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
out = mock_elements_worker.update_activity("1234-deadbeef", ActivityState.Processed)
|
|
132
|
-
|
|
133
|
-
# Check the response received by worker
|
|
134
|
-
assert out is True
|
|
135
|
-
|
|
136
|
-
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
137
|
-
assert [
|
|
138
|
-
(call.request.method, call.request.url) for call in responses.calls
|
|
139
|
-
] == BASE_API_CALLS + [
|
|
140
|
-
(
|
|
141
|
-
"PUT",
|
|
142
|
-
"http://testserver/api/v1/workers/versions/56785678-5678-5678-5678-567856785678/activity/",
|
|
143
|
-
),
|
|
144
|
-
]
|
|
145
|
-
|
|
146
|
-
# Check the request sent by worker
|
|
147
|
-
assert json.loads(responses.calls[-1].request.body) == {
|
|
148
|
-
"element_id": "1234-deadbeef",
|
|
149
|
-
"process_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeffff",
|
|
150
|
-
"state": "processed",
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
|
|
154
554
|
@pytest.mark.usefixtures("_mock_activity_calls")
|
|
155
555
|
@pytest.mark.parametrize(
|
|
156
556
|
("process_exception", "final_state"),
|
|
@@ -312,3 +712,40 @@ def test_start_activity_error(
|
|
|
312
712
|
assert logger.error.call_args_list == [
|
|
313
713
|
mocker.call("Ran on 1 element: 0 completed, 1 failed")
|
|
314
714
|
]
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
@pytest.mark.usefixtures("_mock_worker_run_api")
|
|
718
|
+
def test_update_activity(responses, mock_elements_worker):
|
|
719
|
+
"""Test an update call with feature enabled triggers an API call"""
|
|
720
|
+
responses.add(
|
|
721
|
+
responses.PUT,
|
|
722
|
+
"http://testserver/api/v1/workers/versions/56785678-5678-5678-5678-567856785678/activity/",
|
|
723
|
+
status=200,
|
|
724
|
+
json={
|
|
725
|
+
"element_id": "1234-deadbeef",
|
|
726
|
+
"process_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeffff",
|
|
727
|
+
"state": "processed",
|
|
728
|
+
},
|
|
729
|
+
)
|
|
730
|
+
|
|
731
|
+
out = mock_elements_worker.update_activity("1234-deadbeef", ActivityState.Processed)
|
|
732
|
+
|
|
733
|
+
# Check the response received by worker
|
|
734
|
+
assert out is True
|
|
735
|
+
|
|
736
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
737
|
+
assert [
|
|
738
|
+
(call.request.method, call.request.url) for call in responses.calls
|
|
739
|
+
] == BASE_API_CALLS + [
|
|
740
|
+
(
|
|
741
|
+
"PUT",
|
|
742
|
+
"http://testserver/api/v1/workers/versions/56785678-5678-5678-5678-567856785678/activity/",
|
|
743
|
+
),
|
|
744
|
+
]
|
|
745
|
+
|
|
746
|
+
# Check the request sent by worker
|
|
747
|
+
assert json.loads(responses.calls[-1].request.body) == {
|
|
748
|
+
"element_id": "1234-deadbeef",
|
|
749
|
+
"process_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeffff",
|
|
750
|
+
"state": "processed",
|
|
751
|
+
}
|