arkindex-base-worker 0.3.7rc10__py3-none-any.whl → 0.4.0a1__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.3.7rc10.dist-info → arkindex_base_worker-0.4.0a1.dist-info}/METADATA +10 -16
- arkindex_base_worker-0.4.0a1.dist-info/RECORD +51 -0
- arkindex_worker/models.py +6 -0
- arkindex_worker/utils.py +3 -4
- arkindex_worker/worker/__init__.py +23 -2
- arkindex_worker/worker/base.py +3 -23
- arkindex_worker/worker/corpus.py +69 -0
- arkindex_worker/worker/image.py +21 -0
- arkindex_worker/worker/training.py +12 -0
- tests/__init__.py +8 -0
- tests/conftest.py +4 -8
- tests/test_base_worker.py +8 -9
- tests/test_dataset_worker.py +14 -41
- tests/test_elements_worker/test_classifications.py +22 -39
- tests/test_elements_worker/test_cli.py +3 -11
- tests/test_elements_worker/test_corpus.py +137 -0
- tests/test_elements_worker/test_dataset.py +6 -11
- tests/test_elements_worker/test_elements.py +106 -85
- tests/test_elements_worker/test_entities.py +15 -39
- tests/test_elements_worker/test_image.py +65 -0
- tests/test_elements_worker/test_metadata.py +6 -40
- tests/test_elements_worker/test_task.py +7 -17
- tests/test_elements_worker/test_training.py +35 -0
- tests/test_elements_worker/test_transcriptions.py +10 -27
- tests/test_elements_worker/test_worker.py +2 -1
- tests/test_image.py +3 -5
- arkindex_base_worker-0.3.7rc10.dist-info/RECORD +0 -47
- {arkindex_base_worker-0.3.7rc10.dist-info → arkindex_base_worker-0.4.0a1.dist-info}/LICENSE +0 -0
- {arkindex_base_worker-0.3.7rc10.dist-info → arkindex_base_worker-0.4.0a1.dist-info}/WHEEL +0 -0
- {arkindex_base_worker-0.3.7rc10.dist-info → arkindex_base_worker-0.4.0a1.dist-info}/top_level.txt +0 -0
|
@@ -17,6 +17,7 @@ from arkindex_worker.cache import (
|
|
|
17
17
|
from arkindex_worker.models import Element
|
|
18
18
|
from arkindex_worker.worker import ElementsWorker
|
|
19
19
|
from arkindex_worker.worker.element import MissingTypeError
|
|
20
|
+
from tests import CORPUS_ID
|
|
20
21
|
|
|
21
22
|
from . import BASE_API_CALLS
|
|
22
23
|
|
|
@@ -32,12 +33,11 @@ def test_check_required_types_argument_types(mock_elements_worker):
|
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
def test_check_required_types(responses, mock_elements_worker):
|
|
35
|
-
corpus_id = "11111111-1111-1111-1111-111111111111"
|
|
36
36
|
responses.add(
|
|
37
37
|
responses.GET,
|
|
38
|
-
f"http://testserver/api/v1/corpus/{
|
|
38
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/",
|
|
39
39
|
json={
|
|
40
|
-
"id":
|
|
40
|
+
"id": CORPUS_ID,
|
|
41
41
|
"name": "Some Corpus",
|
|
42
42
|
"types": [{"slug": "folder"}, {"slug": "page"}],
|
|
43
43
|
},
|
|
@@ -57,13 +57,11 @@ def test_check_required_types(responses, mock_elements_worker):
|
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
def test_create_missing_types(responses, mock_elements_worker):
|
|
60
|
-
corpus_id = "11111111-1111-1111-1111-111111111111"
|
|
61
|
-
|
|
62
60
|
responses.add(
|
|
63
61
|
responses.GET,
|
|
64
|
-
f"http://testserver/api/v1/corpus/{
|
|
62
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/",
|
|
65
63
|
json={
|
|
66
|
-
"id":
|
|
64
|
+
"id": CORPUS_ID,
|
|
67
65
|
"name": "Some Corpus",
|
|
68
66
|
"types": [{"slug": "folder"}, {"slug": "page"}],
|
|
69
67
|
},
|
|
@@ -77,7 +75,7 @@ def test_create_missing_types(responses, mock_elements_worker):
|
|
|
77
75
|
"slug": "text_line",
|
|
78
76
|
"display_name": "text_line",
|
|
79
77
|
"folder": False,
|
|
80
|
-
"corpus":
|
|
78
|
+
"corpus": CORPUS_ID,
|
|
81
79
|
}
|
|
82
80
|
)
|
|
83
81
|
],
|
|
@@ -91,7 +89,7 @@ def test_create_missing_types(responses, mock_elements_worker):
|
|
|
91
89
|
"slug": "act",
|
|
92
90
|
"display_name": "act",
|
|
93
91
|
"folder": False,
|
|
94
|
-
"corpus":
|
|
92
|
+
"corpus": CORPUS_ID,
|
|
95
93
|
}
|
|
96
94
|
)
|
|
97
95
|
],
|
|
@@ -135,8 +133,7 @@ def test_list_elements_elements_list_arg_missing_id(
|
|
|
135
133
|
monkeypatch, tmp_path, mock_elements_worker
|
|
136
134
|
):
|
|
137
135
|
elements_path = tmp_path / "elements.json"
|
|
138
|
-
|
|
139
|
-
json.dump([{"type": "volume"}], f)
|
|
136
|
+
elements_path.write_text(json.dumps([{"type": "volume"}]))
|
|
140
137
|
|
|
141
138
|
monkeypatch.setenv("TASK_ELEMENTS", str(elements_path))
|
|
142
139
|
worker = ElementsWorker()
|
|
@@ -147,18 +144,43 @@ def test_list_elements_elements_list_arg_missing_id(
|
|
|
147
144
|
assert elt_list == []
|
|
148
145
|
|
|
149
146
|
|
|
150
|
-
def
|
|
147
|
+
def test_list_elements_elements_list_arg_not_uuid(
|
|
148
|
+
monkeypatch, tmp_path, mock_elements_worker
|
|
149
|
+
):
|
|
151
150
|
elements_path = tmp_path / "elements.json"
|
|
152
|
-
|
|
153
|
-
json.
|
|
151
|
+
elements_path.write_text(
|
|
152
|
+
json.dumps(
|
|
154
153
|
[
|
|
155
154
|
{"id": "volumeid", "type": "volume"},
|
|
156
155
|
{"id": "pageid", "type": "page"},
|
|
157
156
|
{"id": "actid", "type": "act"},
|
|
158
157
|
{"id": "surfaceid", "type": "surface"},
|
|
159
|
-
]
|
|
160
|
-
|
|
158
|
+
]
|
|
159
|
+
)
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
monkeypatch.setenv("TASK_ELEMENTS", str(elements_path))
|
|
163
|
+
worker = ElementsWorker()
|
|
164
|
+
worker.configure()
|
|
165
|
+
|
|
166
|
+
with pytest.raises(
|
|
167
|
+
Exception,
|
|
168
|
+
match="These element IDs are invalid: volumeid, pageid, actid, surfaceid",
|
|
169
|
+
):
|
|
170
|
+
worker.list_elements()
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def test_list_elements_elements_list_arg(monkeypatch, tmp_path, mock_elements_worker):
|
|
174
|
+
elements_path = tmp_path / "elements.json"
|
|
175
|
+
elements_path.write_text(
|
|
176
|
+
json.dumps(
|
|
177
|
+
[
|
|
178
|
+
{"id": "11111111-1111-1111-1111-111111111111", "type": "volume"},
|
|
179
|
+
{"id": "22222222-2222-2222-2222-222222222222", "type": "page"},
|
|
180
|
+
{"id": "33333333-3333-3333-3333-333333333333", "type": "act"},
|
|
181
|
+
]
|
|
161
182
|
)
|
|
183
|
+
)
|
|
162
184
|
|
|
163
185
|
monkeypatch.setenv("TASK_ELEMENTS", str(elements_path))
|
|
164
186
|
worker = ElementsWorker()
|
|
@@ -166,10 +188,14 @@ def test_list_elements_elements_list_arg(monkeypatch, tmp_path, mock_elements_wo
|
|
|
166
188
|
|
|
167
189
|
elt_list = worker.list_elements()
|
|
168
190
|
|
|
169
|
-
assert elt_list == [
|
|
191
|
+
assert elt_list == [
|
|
192
|
+
"11111111-1111-1111-1111-111111111111",
|
|
193
|
+
"22222222-2222-2222-2222-222222222222",
|
|
194
|
+
"33333333-3333-3333-3333-333333333333",
|
|
195
|
+
]
|
|
170
196
|
|
|
171
197
|
|
|
172
|
-
def
|
|
198
|
+
def test_list_elements_element_arg_not_uuid(mocker, mock_elements_worker):
|
|
173
199
|
mocker.patch(
|
|
174
200
|
"arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
|
|
175
201
|
return_value=Namespace(
|
|
@@ -184,23 +210,50 @@ def test_list_elements_element_arg(mocker, mock_elements_worker):
|
|
|
184
210
|
worker = ElementsWorker()
|
|
185
211
|
worker.configure()
|
|
186
212
|
|
|
213
|
+
with pytest.raises(
|
|
214
|
+
Exception, match="These element IDs are invalid: volumeid, pageid"
|
|
215
|
+
):
|
|
216
|
+
worker.list_elements()
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def test_list_elements_element_arg(mocker, mock_elements_worker):
|
|
220
|
+
mocker.patch(
|
|
221
|
+
"arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
|
|
222
|
+
return_value=Namespace(
|
|
223
|
+
element=[
|
|
224
|
+
"11111111-1111-1111-1111-111111111111",
|
|
225
|
+
"22222222-2222-2222-2222-222222222222",
|
|
226
|
+
],
|
|
227
|
+
verbose=False,
|
|
228
|
+
elements_list=None,
|
|
229
|
+
database=None,
|
|
230
|
+
dev=False,
|
|
231
|
+
),
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
worker = ElementsWorker()
|
|
235
|
+
worker.configure()
|
|
236
|
+
|
|
187
237
|
elt_list = worker.list_elements()
|
|
188
238
|
|
|
189
|
-
assert elt_list == [
|
|
239
|
+
assert elt_list == [
|
|
240
|
+
"11111111-1111-1111-1111-111111111111",
|
|
241
|
+
"22222222-2222-2222-2222-222222222222",
|
|
242
|
+
]
|
|
190
243
|
|
|
191
244
|
|
|
192
245
|
def test_list_elements_both_args_error(mocker, mock_elements_worker, tmp_path):
|
|
193
246
|
elements_path = tmp_path / "elements.json"
|
|
194
|
-
|
|
195
|
-
json.
|
|
247
|
+
elements_path.write_text(
|
|
248
|
+
json.dumps(
|
|
196
249
|
[
|
|
197
250
|
{"id": "volumeid", "type": "volume"},
|
|
198
251
|
{"id": "pageid", "type": "page"},
|
|
199
252
|
{"id": "actid", "type": "act"},
|
|
200
253
|
{"id": "surfaceid", "type": "surface"},
|
|
201
|
-
]
|
|
202
|
-
f,
|
|
254
|
+
]
|
|
203
255
|
)
|
|
256
|
+
)
|
|
204
257
|
mocker.patch(
|
|
205
258
|
"arkindex_worker.worker.base.argparse.ArgumentParser.parse_args",
|
|
206
259
|
return_value=Namespace(
|
|
@@ -272,8 +325,8 @@ def test_database_arg_cache_missing_version_table(
|
|
|
272
325
|
def test_load_corpus_classes_api_error(responses, mock_elements_worker):
|
|
273
326
|
responses.add(
|
|
274
327
|
responses.GET,
|
|
275
|
-
"http://testserver/api/v1/corpus/
|
|
276
|
-
status=
|
|
328
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/classes/",
|
|
329
|
+
status=418,
|
|
277
330
|
)
|
|
278
331
|
|
|
279
332
|
assert not mock_elements_worker.classes
|
|
@@ -289,23 +342,23 @@ def test_load_corpus_classes_api_error(responses, mock_elements_worker):
|
|
|
289
342
|
# We do 5 retries
|
|
290
343
|
(
|
|
291
344
|
"GET",
|
|
292
|
-
"http://testserver/api/v1/corpus/
|
|
345
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/classes/",
|
|
293
346
|
),
|
|
294
347
|
(
|
|
295
348
|
"GET",
|
|
296
|
-
"http://testserver/api/v1/corpus/
|
|
349
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/classes/",
|
|
297
350
|
),
|
|
298
351
|
(
|
|
299
352
|
"GET",
|
|
300
|
-
"http://testserver/api/v1/corpus/
|
|
353
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/classes/",
|
|
301
354
|
),
|
|
302
355
|
(
|
|
303
356
|
"GET",
|
|
304
|
-
"http://testserver/api/v1/corpus/
|
|
357
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/classes/",
|
|
305
358
|
),
|
|
306
359
|
(
|
|
307
360
|
"GET",
|
|
308
|
-
"http://testserver/api/v1/corpus/
|
|
361
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/classes/",
|
|
309
362
|
),
|
|
310
363
|
]
|
|
311
364
|
assert not mock_elements_worker.classes
|
|
@@ -314,7 +367,7 @@ def test_load_corpus_classes_api_error(responses, mock_elements_worker):
|
|
|
314
367
|
def test_load_corpus_classes(responses, mock_elements_worker):
|
|
315
368
|
responses.add(
|
|
316
369
|
responses.GET,
|
|
317
|
-
"http://testserver/api/v1/corpus/
|
|
370
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/classes/",
|
|
318
371
|
status=200,
|
|
319
372
|
json={
|
|
320
373
|
"count": 3,
|
|
@@ -345,7 +398,7 @@ def test_load_corpus_classes(responses, mock_elements_worker):
|
|
|
345
398
|
] == BASE_API_CALLS + [
|
|
346
399
|
(
|
|
347
400
|
"GET",
|
|
348
|
-
"http://testserver/api/v1/corpus/
|
|
401
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/classes/",
|
|
349
402
|
),
|
|
350
403
|
]
|
|
351
404
|
assert mock_elements_worker.classes == {
|
|
@@ -532,14 +585,14 @@ def test_create_sub_element_api_error(responses, mock_elements_worker):
|
|
|
532
585
|
elt = Element(
|
|
533
586
|
{
|
|
534
587
|
"id": "12341234-1234-1234-1234-123412341234",
|
|
535
|
-
"corpus": {"id":
|
|
588
|
+
"corpus": {"id": CORPUS_ID},
|
|
536
589
|
"zone": {"image": {"id": "22222222-2222-2222-2222-222222222222"}},
|
|
537
590
|
}
|
|
538
591
|
)
|
|
539
592
|
responses.add(
|
|
540
593
|
responses.POST,
|
|
541
594
|
"http://testserver/api/v1/elements/create/",
|
|
542
|
-
status=
|
|
595
|
+
status=418,
|
|
543
596
|
)
|
|
544
597
|
|
|
545
598
|
with pytest.raises(ErrorResponse):
|
|
@@ -550,17 +603,10 @@ def test_create_sub_element_api_error(responses, mock_elements_worker):
|
|
|
550
603
|
polygon=[[1, 1], [2, 2], [2, 1], [1, 2]],
|
|
551
604
|
)
|
|
552
605
|
|
|
553
|
-
assert len(responses.calls) == len(BASE_API_CALLS) +
|
|
606
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
554
607
|
assert [
|
|
555
608
|
(call.request.method, call.request.url) for call in responses.calls
|
|
556
|
-
] == BASE_API_CALLS + [
|
|
557
|
-
# We retry 5 times the API call
|
|
558
|
-
("POST", "http://testserver/api/v1/elements/create/"),
|
|
559
|
-
("POST", "http://testserver/api/v1/elements/create/"),
|
|
560
|
-
("POST", "http://testserver/api/v1/elements/create/"),
|
|
561
|
-
("POST", "http://testserver/api/v1/elements/create/"),
|
|
562
|
-
("POST", "http://testserver/api/v1/elements/create/"),
|
|
563
|
-
]
|
|
609
|
+
] == BASE_API_CALLS + [("POST", "http://testserver/api/v1/elements/create/")]
|
|
564
610
|
|
|
565
611
|
|
|
566
612
|
@pytest.mark.parametrize("slim_output", [True, False])
|
|
@@ -568,13 +614,13 @@ def test_create_sub_element(responses, mock_elements_worker, slim_output):
|
|
|
568
614
|
elt = Element(
|
|
569
615
|
{
|
|
570
616
|
"id": "12341234-1234-1234-1234-123412341234",
|
|
571
|
-
"corpus": {"id":
|
|
617
|
+
"corpus": {"id": CORPUS_ID},
|
|
572
618
|
"zone": {"image": {"id": "22222222-2222-2222-2222-222222222222"}},
|
|
573
619
|
}
|
|
574
620
|
)
|
|
575
621
|
child_elt = {
|
|
576
622
|
"id": "12345678-1234-1234-1234-123456789123",
|
|
577
|
-
"corpus": {"id":
|
|
623
|
+
"corpus": {"id": CORPUS_ID},
|
|
578
624
|
"zone": {"image": {"id": "22222222-2222-2222-2222-222222222222"}},
|
|
579
625
|
}
|
|
580
626
|
responses.add(
|
|
@@ -605,7 +651,7 @@ def test_create_sub_element(responses, mock_elements_worker, slim_output):
|
|
|
605
651
|
"type": "something",
|
|
606
652
|
"name": "0",
|
|
607
653
|
"image": None,
|
|
608
|
-
"corpus":
|
|
654
|
+
"corpus": CORPUS_ID,
|
|
609
655
|
"polygon": [[1, 1], [2, 2], [2, 1], [1, 2]],
|
|
610
656
|
"parent": "12341234-1234-1234-1234-123412341234",
|
|
611
657
|
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
@@ -621,7 +667,7 @@ def test_create_sub_element_confidence(responses, mock_elements_worker):
|
|
|
621
667
|
elt = Element(
|
|
622
668
|
{
|
|
623
669
|
"id": "12341234-1234-1234-1234-123412341234",
|
|
624
|
-
"corpus": {"id":
|
|
670
|
+
"corpus": {"id": CORPUS_ID},
|
|
625
671
|
"zone": {"image": {"id": "22222222-2222-2222-2222-222222222222"}},
|
|
626
672
|
}
|
|
627
673
|
)
|
|
@@ -650,7 +696,7 @@ def test_create_sub_element_confidence(responses, mock_elements_worker):
|
|
|
650
696
|
"type": "something",
|
|
651
697
|
"name": "0",
|
|
652
698
|
"image": None,
|
|
653
|
-
"corpus":
|
|
699
|
+
"corpus": CORPUS_ID,
|
|
654
700
|
"polygon": [[1, 1], [2, 2], [2, 1], [1, 2]],
|
|
655
701
|
"parent": "12341234-1234-1234-1234-123412341234",
|
|
656
702
|
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
@@ -931,7 +977,7 @@ def test_create_elements_api_error(responses, mock_elements_worker):
|
|
|
931
977
|
responses.add(
|
|
932
978
|
responses.POST,
|
|
933
979
|
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/children/bulk/",
|
|
934
|
-
status=
|
|
980
|
+
status=418,
|
|
935
981
|
)
|
|
936
982
|
|
|
937
983
|
with pytest.raises(ErrorResponse):
|
|
@@ -946,31 +992,14 @@ def test_create_elements_api_error(responses, mock_elements_worker):
|
|
|
946
992
|
],
|
|
947
993
|
)
|
|
948
994
|
|
|
949
|
-
assert len(responses.calls) == len(BASE_API_CALLS) +
|
|
995
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
950
996
|
assert [
|
|
951
997
|
(call.request.method, call.request.url) for call in responses.calls
|
|
952
998
|
] == BASE_API_CALLS + [
|
|
953
|
-
# We retry 5 times the API call
|
|
954
999
|
(
|
|
955
1000
|
"POST",
|
|
956
1001
|
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/children/bulk/",
|
|
957
|
-
)
|
|
958
|
-
(
|
|
959
|
-
"POST",
|
|
960
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/children/bulk/",
|
|
961
|
-
),
|
|
962
|
-
(
|
|
963
|
-
"POST",
|
|
964
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/children/bulk/",
|
|
965
|
-
),
|
|
966
|
-
(
|
|
967
|
-
"POST",
|
|
968
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/children/bulk/",
|
|
969
|
-
),
|
|
970
|
-
(
|
|
971
|
-
"POST",
|
|
972
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/children/bulk/",
|
|
973
|
-
),
|
|
1002
|
+
)
|
|
974
1003
|
]
|
|
975
1004
|
|
|
976
1005
|
|
|
@@ -1275,7 +1304,7 @@ def test_create_element_parent_api_error(responses, mock_elements_worker):
|
|
|
1275
1304
|
responses.add(
|
|
1276
1305
|
responses.POST,
|
|
1277
1306
|
"http://testserver/api/v1/element/497f6eca-6276-4993-bfeb-53cbbbba6f08/parent/12341234-1234-1234-1234-123412341234/",
|
|
1278
|
-
status=
|
|
1307
|
+
status=418,
|
|
1279
1308
|
)
|
|
1280
1309
|
|
|
1281
1310
|
with pytest.raises(ErrorResponse):
|
|
@@ -1284,16 +1313,15 @@ def test_create_element_parent_api_error(responses, mock_elements_worker):
|
|
|
1284
1313
|
child=child,
|
|
1285
1314
|
)
|
|
1286
1315
|
|
|
1287
|
-
assert len(responses.calls) == len(BASE_API_CALLS) +
|
|
1316
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
1288
1317
|
assert [
|
|
1289
1318
|
(call.request.method, call.request.url) for call in responses.calls
|
|
1290
1319
|
] == BASE_API_CALLS + [
|
|
1291
|
-
# We retry 5 times the API call
|
|
1292
1320
|
(
|
|
1293
1321
|
"POST",
|
|
1294
1322
|
"http://testserver/api/v1/element/497f6eca-6276-4993-bfeb-53cbbbba6f08/parent/12341234-1234-1234-1234-123412341234/",
|
|
1295
|
-
)
|
|
1296
|
-
]
|
|
1323
|
+
)
|
|
1324
|
+
]
|
|
1297
1325
|
|
|
1298
1326
|
|
|
1299
1327
|
def test_create_element_parent(responses, mock_elements_worker):
|
|
@@ -1527,7 +1555,7 @@ def test_partial_update_element_api_error(responses, mock_elements_worker):
|
|
|
1527
1555
|
responses.add(
|
|
1528
1556
|
responses.PATCH,
|
|
1529
1557
|
f"http://testserver/api/v1/element/{elt.id}/",
|
|
1530
|
-
status=
|
|
1558
|
+
status=418,
|
|
1531
1559
|
)
|
|
1532
1560
|
|
|
1533
1561
|
with pytest.raises(ErrorResponse):
|
|
@@ -1538,17 +1566,10 @@ def test_partial_update_element_api_error(responses, mock_elements_worker):
|
|
|
1538
1566
|
polygon=[[1, 1], [2, 2], [2, 1], [1, 2]],
|
|
1539
1567
|
)
|
|
1540
1568
|
|
|
1541
|
-
assert len(responses.calls) == len(BASE_API_CALLS) +
|
|
1569
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
1542
1570
|
assert [
|
|
1543
1571
|
(call.request.method, call.request.url) for call in responses.calls
|
|
1544
|
-
] == BASE_API_CALLS + [
|
|
1545
|
-
# We retry 5 times the API call
|
|
1546
|
-
("PATCH", f"http://testserver/api/v1/element/{elt.id}/"),
|
|
1547
|
-
("PATCH", f"http://testserver/api/v1/element/{elt.id}/"),
|
|
1548
|
-
("PATCH", f"http://testserver/api/v1/element/{elt.id}/"),
|
|
1549
|
-
("PATCH", f"http://testserver/api/v1/element/{elt.id}/"),
|
|
1550
|
-
("PATCH", f"http://testserver/api/v1/element/{elt.id}/"),
|
|
1551
|
-
]
|
|
1572
|
+
] == BASE_API_CALLS + [("PATCH", f"http://testserver/api/v1/element/{elt.id}/")]
|
|
1552
1573
|
|
|
1553
1574
|
|
|
1554
1575
|
@pytest.mark.usefixtures("_mock_cached_elements", "_mock_cached_images")
|
|
@@ -1860,7 +1881,7 @@ def test_list_element_children_api_error(responses, mock_elements_worker):
|
|
|
1860
1881
|
responses.add(
|
|
1861
1882
|
responses.GET,
|
|
1862
1883
|
"http://testserver/api/v1/elements/12341234-1234-1234-1234-123412341234/children/",
|
|
1863
|
-
status=
|
|
1884
|
+
status=418,
|
|
1864
1885
|
)
|
|
1865
1886
|
|
|
1866
1887
|
with pytest.raises(
|
|
@@ -2392,7 +2413,7 @@ def test_list_element_parents_api_error(responses, mock_elements_worker):
|
|
|
2392
2413
|
responses.add(
|
|
2393
2414
|
responses.GET,
|
|
2394
2415
|
"http://testserver/api/v1/elements/12341234-1234-1234-1234-123412341234/parents/",
|
|
2395
|
-
status=
|
|
2416
|
+
status=418,
|
|
2396
2417
|
)
|
|
2397
2418
|
|
|
2398
2419
|
with pytest.raises(
|
|
@@ -15,6 +15,7 @@ from arkindex_worker.cache import (
|
|
|
15
15
|
from arkindex_worker.models import Transcription
|
|
16
16
|
from arkindex_worker.worker.entity import MissingEntityType
|
|
17
17
|
from arkindex_worker.worker.transcription import TextOrientation
|
|
18
|
+
from tests import CORPUS_ID
|
|
18
19
|
|
|
19
20
|
from . import BASE_API_CALLS
|
|
20
21
|
|
|
@@ -90,7 +91,7 @@ def test_create_entity_api_error(responses, mock_elements_worker):
|
|
|
90
91
|
responses.add(
|
|
91
92
|
responses.POST,
|
|
92
93
|
"http://testserver/api/v1/entity/",
|
|
93
|
-
status=
|
|
94
|
+
status=418,
|
|
94
95
|
)
|
|
95
96
|
|
|
96
97
|
with pytest.raises(ErrorResponse):
|
|
@@ -99,17 +100,10 @@ def test_create_entity_api_error(responses, mock_elements_worker):
|
|
|
99
100
|
type="person",
|
|
100
101
|
)
|
|
101
102
|
|
|
102
|
-
assert len(responses.calls) == len(BASE_API_CALLS) +
|
|
103
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
103
104
|
assert [
|
|
104
105
|
(call.request.method, call.request.url) for call in responses.calls
|
|
105
|
-
] == BASE_API_CALLS + [
|
|
106
|
-
# We retry 5 times the API call
|
|
107
|
-
("POST", "http://testserver/api/v1/entity/"),
|
|
108
|
-
("POST", "http://testserver/api/v1/entity/"),
|
|
109
|
-
("POST", "http://testserver/api/v1/entity/"),
|
|
110
|
-
("POST", "http://testserver/api/v1/entity/"),
|
|
111
|
-
("POST", "http://testserver/api/v1/entity/"),
|
|
112
|
-
]
|
|
106
|
+
] == BASE_API_CALLS + [("POST", "http://testserver/api/v1/entity/")]
|
|
113
107
|
|
|
114
108
|
|
|
115
109
|
def test_create_entity(responses, mock_elements_worker):
|
|
@@ -139,7 +133,7 @@ def test_create_entity(responses, mock_elements_worker):
|
|
|
139
133
|
"type_id": "person-entity-type-id",
|
|
140
134
|
"metas": {},
|
|
141
135
|
"validated": None,
|
|
142
|
-
"corpus":
|
|
136
|
+
"corpus": CORPUS_ID,
|
|
143
137
|
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
144
138
|
}
|
|
145
139
|
assert entity_id == "12345678-1234-1234-1234-123456789123"
|
|
@@ -152,7 +146,7 @@ def test_create_entity_missing_type(responses, mock_elements_worker):
|
|
|
152
146
|
# Call to list entity types
|
|
153
147
|
responses.add(
|
|
154
148
|
responses.GET,
|
|
155
|
-
"http://testserver/api/v1/corpus/
|
|
149
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/entity-types/",
|
|
156
150
|
status=200,
|
|
157
151
|
json={
|
|
158
152
|
"count": 1,
|
|
@@ -177,7 +171,7 @@ def test_create_entity_missing_type(responses, mock_elements_worker):
|
|
|
177
171
|
] == BASE_API_CALLS + [
|
|
178
172
|
(
|
|
179
173
|
"GET",
|
|
180
|
-
"http://testserver/api/v1/corpus/
|
|
174
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/entity-types/",
|
|
181
175
|
),
|
|
182
176
|
]
|
|
183
177
|
|
|
@@ -209,7 +203,7 @@ def test_create_entity_with_cache(responses, mock_elements_worker_with_cache):
|
|
|
209
203
|
"type_id": "person-entity-type-id",
|
|
210
204
|
"metas": {},
|
|
211
205
|
"validated": None,
|
|
212
|
-
"corpus":
|
|
206
|
+
"corpus": CORPUS_ID,
|
|
213
207
|
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
214
208
|
}
|
|
215
209
|
assert entity_id == "12345678-1234-1234-1234-123456789123"
|
|
@@ -387,7 +381,7 @@ def test_create_transcription_entity_api_error(responses, mock_elements_worker):
|
|
|
387
381
|
responses.add(
|
|
388
382
|
responses.POST,
|
|
389
383
|
"http://testserver/api/v1/transcription/11111111-1111-1111-1111-111111111111/entity/",
|
|
390
|
-
status=
|
|
384
|
+
status=418,
|
|
391
385
|
)
|
|
392
386
|
|
|
393
387
|
with pytest.raises(ErrorResponse):
|
|
@@ -403,31 +397,14 @@ def test_create_transcription_entity_api_error(responses, mock_elements_worker):
|
|
|
403
397
|
length=10,
|
|
404
398
|
)
|
|
405
399
|
|
|
406
|
-
assert len(responses.calls) == len(BASE_API_CALLS) +
|
|
400
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
407
401
|
assert [
|
|
408
402
|
(call.request.method, call.request.url) for call in responses.calls
|
|
409
403
|
] == BASE_API_CALLS + [
|
|
410
|
-
# We retry 5 times the API call
|
|
411
404
|
(
|
|
412
405
|
"POST",
|
|
413
406
|
"http://testserver/api/v1/transcription/11111111-1111-1111-1111-111111111111/entity/",
|
|
414
|
-
)
|
|
415
|
-
(
|
|
416
|
-
"POST",
|
|
417
|
-
"http://testserver/api/v1/transcription/11111111-1111-1111-1111-111111111111/entity/",
|
|
418
|
-
),
|
|
419
|
-
(
|
|
420
|
-
"POST",
|
|
421
|
-
"http://testserver/api/v1/transcription/11111111-1111-1111-1111-111111111111/entity/",
|
|
422
|
-
),
|
|
423
|
-
(
|
|
424
|
-
"POST",
|
|
425
|
-
"http://testserver/api/v1/transcription/11111111-1111-1111-1111-111111111111/entity/",
|
|
426
|
-
),
|
|
427
|
-
(
|
|
428
|
-
"POST",
|
|
429
|
-
"http://testserver/api/v1/transcription/11111111-1111-1111-1111-111111111111/entity/",
|
|
430
|
-
),
|
|
407
|
+
)
|
|
431
408
|
]
|
|
432
409
|
|
|
433
410
|
|
|
@@ -746,10 +723,9 @@ def test_list_transcription_entities(fake_dummy_worker):
|
|
|
746
723
|
|
|
747
724
|
|
|
748
725
|
def test_list_corpus_entities(responses, mock_elements_worker):
|
|
749
|
-
corpus_id = "11111111-1111-1111-1111-111111111111"
|
|
750
726
|
responses.add(
|
|
751
727
|
responses.GET,
|
|
752
|
-
f"http://testserver/api/v1/corpus/{
|
|
728
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/entities/",
|
|
753
729
|
json={
|
|
754
730
|
"count": 1,
|
|
755
731
|
"next": None,
|
|
@@ -775,7 +751,7 @@ def test_list_corpus_entities(responses, mock_elements_worker):
|
|
|
775
751
|
] == BASE_API_CALLS + [
|
|
776
752
|
(
|
|
777
753
|
"GET",
|
|
778
|
-
f"http://testserver/api/v1/corpus/{
|
|
754
|
+
f"http://testserver/api/v1/corpus/{CORPUS_ID}/entities/",
|
|
779
755
|
),
|
|
780
756
|
]
|
|
781
757
|
|
|
@@ -807,13 +783,13 @@ def test_check_required_entity_types(responses, mock_elements_worker):
|
|
|
807
783
|
matchers.json_params_matcher(
|
|
808
784
|
{
|
|
809
785
|
"name": "new-entity",
|
|
810
|
-
"corpus":
|
|
786
|
+
"corpus": CORPUS_ID,
|
|
811
787
|
}
|
|
812
788
|
)
|
|
813
789
|
],
|
|
814
790
|
json={
|
|
815
791
|
"id": "new-entity-id",
|
|
816
|
-
"corpus":
|
|
792
|
+
"corpus": CORPUS_ID,
|
|
817
793
|
"name": "new-entity",
|
|
818
794
|
"color": "ffd1b3",
|
|
819
795
|
},
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from apistar.exceptions import ErrorResponse
|
|
5
|
+
|
|
6
|
+
from . import BASE_API_CALLS
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.parametrize(
|
|
10
|
+
("data", "error_message"),
|
|
11
|
+
[
|
|
12
|
+
(None, "url shouldn't be null and should be of type str"),
|
|
13
|
+
(1234, "url shouldn't be null and should be of type str"),
|
|
14
|
+
],
|
|
15
|
+
)
|
|
16
|
+
def test_create_iiif_url_wrong_data(data, error_message, mock_elements_worker):
|
|
17
|
+
with pytest.raises(AssertionError, match=error_message):
|
|
18
|
+
mock_elements_worker.create_iiif_url(url=data)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_create_iiif_url_api_error(responses, mock_elements_worker):
|
|
22
|
+
responses.add(
|
|
23
|
+
responses.POST,
|
|
24
|
+
"http://testserver/api/v1/image/iiif/url/",
|
|
25
|
+
status=418,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
with pytest.raises(ErrorResponse):
|
|
29
|
+
mock_elements_worker.create_iiif_url("http://url/to/my/image")
|
|
30
|
+
|
|
31
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
32
|
+
assert [
|
|
33
|
+
(call.request.method, call.request.url) for call in responses.calls
|
|
34
|
+
] == BASE_API_CALLS + [("POST", "http://testserver/api/v1/image/iiif/url/")]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_create_iiif_url(responses, mock_elements_worker):
|
|
38
|
+
responses.add(
|
|
39
|
+
responses.POST,
|
|
40
|
+
"http://testserver/api/v1/image/iiif/url/",
|
|
41
|
+
status=201,
|
|
42
|
+
json={
|
|
43
|
+
"id": "cafecafe-cafe-cafe-cafe-cafecafecafe",
|
|
44
|
+
"url": "http://url/to/my/image",
|
|
45
|
+
"status": "checked",
|
|
46
|
+
"server": {
|
|
47
|
+
"id": 5,
|
|
48
|
+
"display_name": "My server",
|
|
49
|
+
"url": "http://url/to/my",
|
|
50
|
+
"max_width": 42,
|
|
51
|
+
"max_height": 42,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
image = mock_elements_worker.create_iiif_url("http://url/to/my/image")
|
|
57
|
+
|
|
58
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
59
|
+
assert [
|
|
60
|
+
(call.request.method, call.request.url) for call in responses.calls
|
|
61
|
+
] == BASE_API_CALLS + [("POST", "http://testserver/api/v1/image/iiif/url/")]
|
|
62
|
+
assert json.loads(responses.calls[-1].request.body) == {
|
|
63
|
+
"url": "http://url/to/my/image"
|
|
64
|
+
}
|
|
65
|
+
assert image.id == "cafecafe-cafe-cafe-cafe-cafecafecafe"
|