arkindex-base-worker 0.3.7rc5__py3-none-any.whl → 0.5.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.7rc5.dist-info → arkindex_base_worker-0.5.0a1.dist-info}/METADATA +18 -19
- arkindex_base_worker-0.5.0a1.dist-info/RECORD +61 -0
- {arkindex_base_worker-0.3.7rc5.dist-info → arkindex_base_worker-0.5.0a1.dist-info}/WHEEL +1 -1
- {arkindex_base_worker-0.3.7rc5.dist-info → arkindex_base_worker-0.5.0a1.dist-info}/top_level.txt +2 -0
- arkindex_worker/cache.py +1 -1
- arkindex_worker/image.py +167 -2
- arkindex_worker/models.py +18 -0
- arkindex_worker/utils.py +98 -4
- arkindex_worker/worker/__init__.py +117 -218
- arkindex_worker/worker/base.py +39 -46
- arkindex_worker/worker/classification.py +34 -18
- arkindex_worker/worker/corpus.py +86 -0
- arkindex_worker/worker/dataset.py +89 -26
- arkindex_worker/worker/element.py +352 -91
- arkindex_worker/worker/entity.py +13 -11
- arkindex_worker/worker/image.py +21 -0
- arkindex_worker/worker/metadata.py +26 -16
- arkindex_worker/worker/process.py +92 -0
- arkindex_worker/worker/task.py +5 -4
- arkindex_worker/worker/training.py +25 -10
- arkindex_worker/worker/transcription.py +89 -68
- arkindex_worker/worker/version.py +3 -1
- hooks/pre_gen_project.py +3 -0
- tests/__init__.py +8 -0
- tests/conftest.py +47 -58
- tests/test_base_worker.py +212 -12
- tests/test_dataset_worker.py +294 -437
- tests/test_elements_worker/{test_classifications.py → test_classification.py} +216 -100
- tests/test_elements_worker/test_cli.py +3 -11
- tests/test_elements_worker/test_corpus.py +168 -0
- tests/test_elements_worker/test_dataset.py +106 -157
- 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} +37 -195
- tests/test_elements_worker/test_entity_list_and_check.py +160 -0
- tests/test_elements_worker/test_image.py +66 -0
- tests/test_elements_worker/test_metadata.py +252 -161
- tests/test_elements_worker/test_process.py +89 -0
- tests/test_elements_worker/test_task.py +8 -18
- tests/test_elements_worker/test_training.py +17 -8
- 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 +578 -293
- tests/test_image.py +542 -209
- tests/test_merge.py +1 -2
- tests/test_utils.py +89 -4
- worker-demo/tests/__init__.py +0 -0
- worker-demo/tests/conftest.py +32 -0
- worker-demo/tests/test_worker.py +12 -0
- worker-demo/worker_demo/__init__.py +6 -0
- worker-demo/worker_demo/worker.py +19 -0
- arkindex_base_worker-0.3.7rc5.dist-info/RECORD +0 -41
- tests/test_elements_worker/test_elements.py +0 -2713
- tests/test_elements_worker/test_transcriptions.py +0 -2119
- {arkindex_base_worker-0.3.7rc5.dist-info → arkindex_base_worker-0.5.0a1.dist-info}/LICENSE +0 -0
|
@@ -2,11 +2,12 @@ import json
|
|
|
2
2
|
import re
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
|
-
from apistar.exceptions import ErrorResponse
|
|
6
5
|
|
|
6
|
+
from arkindex.exceptions import ErrorResponse
|
|
7
7
|
from arkindex.mock import MockApiClient
|
|
8
8
|
from arkindex_worker.cache import CachedElement
|
|
9
9
|
from arkindex_worker.models import Element
|
|
10
|
+
from arkindex_worker.utils import DEFAULT_BATCH_SIZE
|
|
10
11
|
from arkindex_worker.worker import MetaType
|
|
11
12
|
|
|
12
13
|
from . import BASE_API_CALLS
|
|
@@ -136,7 +137,7 @@ def test_create_metadata_api_error(responses, mock_elements_worker):
|
|
|
136
137
|
responses.add(
|
|
137
138
|
responses.POST,
|
|
138
139
|
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/",
|
|
139
|
-
status=
|
|
140
|
+
status=418,
|
|
140
141
|
)
|
|
141
142
|
|
|
142
143
|
with pytest.raises(ErrorResponse):
|
|
@@ -147,31 +148,14 @@ def test_create_metadata_api_error(responses, mock_elements_worker):
|
|
|
147
148
|
value="La Turbine, Grenoble 38000",
|
|
148
149
|
)
|
|
149
150
|
|
|
150
|
-
assert len(responses.calls) == len(BASE_API_CALLS) +
|
|
151
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
151
152
|
assert [
|
|
152
153
|
(call.request.method, call.request.url) for call in responses.calls
|
|
153
154
|
] == BASE_API_CALLS + [
|
|
154
|
-
# We retry 5 times the API call
|
|
155
|
-
(
|
|
156
|
-
"POST",
|
|
157
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/",
|
|
158
|
-
),
|
|
159
|
-
(
|
|
160
|
-
"POST",
|
|
161
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/",
|
|
162
|
-
),
|
|
163
|
-
(
|
|
164
|
-
"POST",
|
|
165
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/",
|
|
166
|
-
),
|
|
167
155
|
(
|
|
168
156
|
"POST",
|
|
169
157
|
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/",
|
|
170
|
-
)
|
|
171
|
-
(
|
|
172
|
-
"POST",
|
|
173
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/",
|
|
174
|
-
),
|
|
158
|
+
)
|
|
175
159
|
]
|
|
176
160
|
|
|
177
161
|
|
|
@@ -245,148 +229,272 @@ def test_create_metadata_cached_element(responses, mock_elements_worker_with_cac
|
|
|
245
229
|
assert metadata_id == "12345678-1234-1234-1234-123456789123"
|
|
246
230
|
|
|
247
231
|
|
|
248
|
-
@pytest.mark.parametrize(
|
|
249
|
-
|
|
250
|
-
[
|
|
251
|
-
[{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"}],
|
|
252
|
-
[
|
|
253
|
-
{
|
|
254
|
-
"type": MetaType.Text,
|
|
255
|
-
"name": "fake_name",
|
|
256
|
-
"value": "fake_value",
|
|
257
|
-
"entity_id": "fake_entity_id",
|
|
258
|
-
}
|
|
259
|
-
],
|
|
260
|
-
],
|
|
261
|
-
)
|
|
262
|
-
def test_create_metadatas(responses, mock_elements_worker, metadata_list):
|
|
232
|
+
@pytest.mark.parametrize("batch_size", [DEFAULT_BATCH_SIZE, 1])
|
|
233
|
+
def test_create_metadata_bulk(batch_size, responses, mock_elements_worker):
|
|
263
234
|
element = Element({"id": "12341234-1234-1234-1234-123412341234"})
|
|
264
|
-
responses.add(
|
|
265
|
-
responses.POST,
|
|
266
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
267
|
-
status=201,
|
|
268
|
-
json={
|
|
269
|
-
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
270
|
-
"metadata_list": [
|
|
271
|
-
{
|
|
272
|
-
"id": "fake_metadata_id",
|
|
273
|
-
"type": metadata_list[0]["type"].value,
|
|
274
|
-
"name": metadata_list[0]["name"],
|
|
275
|
-
"value": metadata_list[0]["value"],
|
|
276
|
-
"dates": [],
|
|
277
|
-
"entity_id": metadata_list[0].get("entity_id"),
|
|
278
|
-
}
|
|
279
|
-
],
|
|
280
|
-
},
|
|
281
|
-
)
|
|
282
235
|
|
|
283
|
-
|
|
284
|
-
|
|
236
|
+
metadata_list = [
|
|
237
|
+
{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"},
|
|
238
|
+
{
|
|
239
|
+
"type": MetaType.Text,
|
|
240
|
+
"name": "Year",
|
|
241
|
+
"value": "2024",
|
|
242
|
+
"entity_id": "entity_id",
|
|
243
|
+
},
|
|
244
|
+
]
|
|
245
|
+
if batch_size > 1:
|
|
246
|
+
responses.add(
|
|
247
|
+
responses.POST,
|
|
248
|
+
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
249
|
+
status=201,
|
|
250
|
+
json={
|
|
251
|
+
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
252
|
+
"metadata_list": [
|
|
253
|
+
{
|
|
254
|
+
"id": "fake_metadata_id1",
|
|
255
|
+
"type": metadata_list[0]["type"].value,
|
|
256
|
+
"name": metadata_list[0]["name"],
|
|
257
|
+
"value": metadata_list[0]["value"],
|
|
258
|
+
"dates": [],
|
|
259
|
+
"entity_id": None,
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"id": "fake_metadata_id2",
|
|
263
|
+
"type": metadata_list[1]["type"].value,
|
|
264
|
+
"name": metadata_list[1]["name"],
|
|
265
|
+
"value": metadata_list[1]["value"],
|
|
266
|
+
"dates": [],
|
|
267
|
+
"entity_id": metadata_list[1]["entity_id"],
|
|
268
|
+
},
|
|
269
|
+
],
|
|
270
|
+
},
|
|
271
|
+
)
|
|
272
|
+
else:
|
|
273
|
+
for idx, meta in enumerate(metadata_list, start=1):
|
|
274
|
+
responses.add(
|
|
275
|
+
responses.POST,
|
|
276
|
+
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
277
|
+
status=201,
|
|
278
|
+
json={
|
|
279
|
+
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
280
|
+
"metadata_list": [
|
|
281
|
+
{
|
|
282
|
+
"id": f"fake_metadata_id{idx}",
|
|
283
|
+
"type": meta["type"].value,
|
|
284
|
+
"name": meta["name"],
|
|
285
|
+
"value": meta["value"],
|
|
286
|
+
"dates": [],
|
|
287
|
+
"entity_id": meta.get("entity_id"),
|
|
288
|
+
}
|
|
289
|
+
],
|
|
290
|
+
},
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
created_metadata_list = mock_elements_worker.create_metadata_bulk(
|
|
294
|
+
element, metadata_list, batch_size=batch_size
|
|
285
295
|
)
|
|
286
296
|
|
|
287
|
-
|
|
288
|
-
assert [
|
|
289
|
-
(call.request.method, call.request.url) for call in responses.calls
|
|
290
|
-
] == BASE_API_CALLS + [
|
|
297
|
+
bulk_api_calls = [
|
|
291
298
|
(
|
|
292
299
|
"POST",
|
|
293
300
|
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
294
|
-
)
|
|
295
|
-
]
|
|
296
|
-
assert json.loads(responses.calls[-1].request.body)["metadata_list"] == [
|
|
297
|
-
{
|
|
298
|
-
"type": metadata_list[0]["type"].value,
|
|
299
|
-
"name": metadata_list[0]["name"],
|
|
300
|
-
"value": metadata_list[0]["value"],
|
|
301
|
-
"entity_id": metadata_list[0].get("entity_id"),
|
|
302
|
-
}
|
|
301
|
+
)
|
|
303
302
|
]
|
|
303
|
+
if batch_size != DEFAULT_BATCH_SIZE:
|
|
304
|
+
bulk_api_calls.append(
|
|
305
|
+
(
|
|
306
|
+
"POST",
|
|
307
|
+
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
308
|
+
)
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + len(bulk_api_calls)
|
|
312
|
+
assert [
|
|
313
|
+
(call.request.method, call.request.url) for call in responses.calls
|
|
314
|
+
] == BASE_API_CALLS + bulk_api_calls
|
|
315
|
+
|
|
316
|
+
first_meta = {
|
|
317
|
+
**metadata_list[0],
|
|
318
|
+
"type": metadata_list[0]["type"].value,
|
|
319
|
+
"entity_id": None,
|
|
320
|
+
}
|
|
321
|
+
second_meta = {**metadata_list[1], "type": metadata_list[1]["type"].value}
|
|
322
|
+
empty_payload = {
|
|
323
|
+
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
324
|
+
"metadata_list": [],
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
bodies = []
|
|
328
|
+
first_call_idx = None
|
|
329
|
+
if batch_size > 1:
|
|
330
|
+
first_call_idx = -1
|
|
331
|
+
bodies.append({**empty_payload, "metadata_list": [first_meta, second_meta]})
|
|
332
|
+
else:
|
|
333
|
+
first_call_idx = -2
|
|
334
|
+
bodies.append({**empty_payload, "metadata_list": [first_meta]})
|
|
335
|
+
bodies.append({**empty_payload, "metadata_list": [second_meta]})
|
|
336
|
+
|
|
337
|
+
assert [
|
|
338
|
+
json.loads(bulk_call.request.body)
|
|
339
|
+
for bulk_call in responses.calls[first_call_idx:]
|
|
340
|
+
] == bodies
|
|
341
|
+
|
|
304
342
|
assert created_metadata_list == [
|
|
305
343
|
{
|
|
306
|
-
"id": "
|
|
344
|
+
"id": "fake_metadata_id1",
|
|
307
345
|
"type": metadata_list[0]["type"].value,
|
|
308
346
|
"name": metadata_list[0]["name"],
|
|
309
347
|
"value": metadata_list[0]["value"],
|
|
310
348
|
"dates": [],
|
|
311
|
-
"entity_id":
|
|
312
|
-
}
|
|
349
|
+
"entity_id": None,
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
"id": "fake_metadata_id2",
|
|
353
|
+
"type": metadata_list[1]["type"].value,
|
|
354
|
+
"name": metadata_list[1]["name"],
|
|
355
|
+
"value": metadata_list[1]["value"],
|
|
356
|
+
"dates": [],
|
|
357
|
+
"entity_id": metadata_list[1]["entity_id"],
|
|
358
|
+
},
|
|
313
359
|
]
|
|
314
360
|
|
|
315
361
|
|
|
316
|
-
@pytest.mark.parametrize(
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
[{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"}],
|
|
320
|
-
[
|
|
321
|
-
{
|
|
322
|
-
"type": MetaType.Text,
|
|
323
|
-
"name": "fake_name",
|
|
324
|
-
"value": "fake_value",
|
|
325
|
-
"entity_id": "fake_entity_id",
|
|
326
|
-
}
|
|
327
|
-
],
|
|
328
|
-
],
|
|
329
|
-
)
|
|
330
|
-
def test_create_metadatas_cached_element(
|
|
331
|
-
responses, mock_elements_worker_with_cache, metadata_list
|
|
362
|
+
@pytest.mark.parametrize("batch_size", [DEFAULT_BATCH_SIZE, 1])
|
|
363
|
+
def test_create_metadata_bulk_cached_element(
|
|
364
|
+
batch_size, responses, mock_elements_worker_with_cache
|
|
332
365
|
):
|
|
333
366
|
element = CachedElement.create(
|
|
334
367
|
id="12341234-1234-1234-1234-123412341234", type="thing"
|
|
335
368
|
)
|
|
336
|
-
responses.add(
|
|
337
|
-
responses.POST,
|
|
338
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
339
|
-
status=201,
|
|
340
|
-
json={
|
|
341
|
-
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
342
|
-
"metadata_list": [
|
|
343
|
-
{
|
|
344
|
-
"id": "fake_metadata_id",
|
|
345
|
-
"type": metadata_list[0]["type"].value,
|
|
346
|
-
"name": metadata_list[0]["name"],
|
|
347
|
-
"value": metadata_list[0]["value"],
|
|
348
|
-
"dates": [],
|
|
349
|
-
"entity_id": metadata_list[0].get("entity_id"),
|
|
350
|
-
}
|
|
351
|
-
],
|
|
352
|
-
},
|
|
353
|
-
)
|
|
354
369
|
|
|
355
|
-
|
|
356
|
-
|
|
370
|
+
metadata_list = [
|
|
371
|
+
{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"},
|
|
372
|
+
{
|
|
373
|
+
"type": MetaType.Text,
|
|
374
|
+
"name": "Year",
|
|
375
|
+
"value": "2024",
|
|
376
|
+
"entity_id": "entity_id",
|
|
377
|
+
},
|
|
378
|
+
]
|
|
379
|
+
if batch_size > 1:
|
|
380
|
+
responses.add(
|
|
381
|
+
responses.POST,
|
|
382
|
+
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
383
|
+
status=201,
|
|
384
|
+
json={
|
|
385
|
+
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
386
|
+
"metadata_list": [
|
|
387
|
+
{
|
|
388
|
+
"id": "fake_metadata_id1",
|
|
389
|
+
"type": metadata_list[0]["type"].value,
|
|
390
|
+
"name": metadata_list[0]["name"],
|
|
391
|
+
"value": metadata_list[0]["value"],
|
|
392
|
+
"dates": [],
|
|
393
|
+
"entity_id": None,
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
"id": "fake_metadata_id2",
|
|
397
|
+
"type": metadata_list[1]["type"].value,
|
|
398
|
+
"name": metadata_list[1]["name"],
|
|
399
|
+
"value": metadata_list[1]["value"],
|
|
400
|
+
"dates": [],
|
|
401
|
+
"entity_id": metadata_list[1]["entity_id"],
|
|
402
|
+
},
|
|
403
|
+
],
|
|
404
|
+
},
|
|
405
|
+
)
|
|
406
|
+
else:
|
|
407
|
+
for idx, meta in enumerate(metadata_list, start=1):
|
|
408
|
+
responses.add(
|
|
409
|
+
responses.POST,
|
|
410
|
+
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
411
|
+
status=201,
|
|
412
|
+
json={
|
|
413
|
+
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
414
|
+
"metadata_list": [
|
|
415
|
+
{
|
|
416
|
+
"id": f"fake_metadata_id{idx}",
|
|
417
|
+
"type": meta["type"].value,
|
|
418
|
+
"name": meta["name"],
|
|
419
|
+
"value": meta["value"],
|
|
420
|
+
"dates": [],
|
|
421
|
+
"entity_id": meta.get("entity_id"),
|
|
422
|
+
}
|
|
423
|
+
],
|
|
424
|
+
},
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
created_metadata_list = mock_elements_worker_with_cache.create_metadata_bulk(
|
|
428
|
+
element, metadata_list, batch_size=batch_size
|
|
357
429
|
)
|
|
358
430
|
|
|
359
|
-
|
|
360
|
-
assert [
|
|
361
|
-
(call.request.method, call.request.url) for call in responses.calls
|
|
362
|
-
] == BASE_API_CALLS + [
|
|
431
|
+
bulk_api_calls = [
|
|
363
432
|
(
|
|
364
433
|
"POST",
|
|
365
434
|
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
366
|
-
)
|
|
367
|
-
]
|
|
368
|
-
assert json.loads(responses.calls[-1].request.body)["metadata_list"] == [
|
|
369
|
-
{
|
|
370
|
-
"type": metadata_list[0]["type"].value,
|
|
371
|
-
"name": metadata_list[0]["name"],
|
|
372
|
-
"value": metadata_list[0]["value"],
|
|
373
|
-
"entity_id": metadata_list[0].get("entity_id"),
|
|
374
|
-
}
|
|
435
|
+
)
|
|
375
436
|
]
|
|
437
|
+
if batch_size != DEFAULT_BATCH_SIZE:
|
|
438
|
+
bulk_api_calls.append(
|
|
439
|
+
(
|
|
440
|
+
"POST",
|
|
441
|
+
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
442
|
+
)
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + len(bulk_api_calls)
|
|
446
|
+
assert [
|
|
447
|
+
(call.request.method, call.request.url) for call in responses.calls
|
|
448
|
+
] == BASE_API_CALLS + bulk_api_calls
|
|
449
|
+
|
|
450
|
+
first_meta = {
|
|
451
|
+
**metadata_list[0],
|
|
452
|
+
"type": metadata_list[0]["type"].value,
|
|
453
|
+
"entity_id": None,
|
|
454
|
+
}
|
|
455
|
+
second_meta = {**metadata_list[1], "type": metadata_list[1]["type"].value}
|
|
456
|
+
empty_payload = {
|
|
457
|
+
"worker_run_id": "56785678-5678-5678-5678-567856785678",
|
|
458
|
+
"metadata_list": [],
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
bodies = []
|
|
462
|
+
first_call_idx = None
|
|
463
|
+
if batch_size > 1:
|
|
464
|
+
first_call_idx = -1
|
|
465
|
+
bodies.append({**empty_payload, "metadata_list": [first_meta, second_meta]})
|
|
466
|
+
else:
|
|
467
|
+
first_call_idx = -2
|
|
468
|
+
bodies.append({**empty_payload, "metadata_list": [first_meta]})
|
|
469
|
+
bodies.append({**empty_payload, "metadata_list": [second_meta]})
|
|
470
|
+
|
|
471
|
+
assert [
|
|
472
|
+
json.loads(bulk_call.request.body)
|
|
473
|
+
for bulk_call in responses.calls[first_call_idx:]
|
|
474
|
+
] == bodies
|
|
475
|
+
|
|
376
476
|
assert created_metadata_list == [
|
|
377
477
|
{
|
|
378
|
-
"id": "
|
|
478
|
+
"id": "fake_metadata_id1",
|
|
379
479
|
"type": metadata_list[0]["type"].value,
|
|
380
480
|
"name": metadata_list[0]["name"],
|
|
381
481
|
"value": metadata_list[0]["value"],
|
|
382
482
|
"dates": [],
|
|
383
|
-
"entity_id":
|
|
384
|
-
}
|
|
483
|
+
"entity_id": None,
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
"id": "fake_metadata_id2",
|
|
487
|
+
"type": metadata_list[1]["type"].value,
|
|
488
|
+
"name": metadata_list[1]["name"],
|
|
489
|
+
"value": metadata_list[1]["value"],
|
|
490
|
+
"dates": [],
|
|
491
|
+
"entity_id": metadata_list[1]["entity_id"],
|
|
492
|
+
},
|
|
385
493
|
]
|
|
386
494
|
|
|
387
495
|
|
|
388
496
|
@pytest.mark.parametrize("wrong_element", [None, "not_element_type", 1234, 12.5])
|
|
389
|
-
def
|
|
497
|
+
def test_create_metadata_bulk_wrong_element(mock_elements_worker, wrong_element):
|
|
390
498
|
wrong_metadata_list = [
|
|
391
499
|
{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"}
|
|
392
500
|
]
|
|
@@ -394,13 +502,13 @@ def test_create_metadatas_wrong_element(mock_elements_worker, wrong_element):
|
|
|
394
502
|
AssertionError,
|
|
395
503
|
match="element shouldn't be null and should be of type Element or CachedElement",
|
|
396
504
|
):
|
|
397
|
-
mock_elements_worker.
|
|
398
|
-
element=wrong_element,
|
|
505
|
+
mock_elements_worker.create_metadata_bulk(
|
|
506
|
+
element=wrong_element, metadata_list=wrong_metadata_list
|
|
399
507
|
)
|
|
400
508
|
|
|
401
509
|
|
|
402
510
|
@pytest.mark.parametrize("wrong_type", [None, "not_metadata_type", 1234, 12.5])
|
|
403
|
-
def
|
|
511
|
+
def test_create_metadata_bulk_wrong_type(mock_elements_worker, wrong_type):
|
|
404
512
|
element = Element({"id": "12341234-1234-1234-1234-123412341234"})
|
|
405
513
|
wrong_metadata_list = [
|
|
406
514
|
{"type": wrong_type, "name": "fake_name", "value": "fake_value"}
|
|
@@ -408,13 +516,13 @@ def test_create_metadatas_wrong_type(mock_elements_worker, wrong_type):
|
|
|
408
516
|
with pytest.raises(
|
|
409
517
|
AssertionError, match="type shouldn't be null and should be of type MetaType"
|
|
410
518
|
):
|
|
411
|
-
mock_elements_worker.
|
|
412
|
-
element=element,
|
|
519
|
+
mock_elements_worker.create_metadata_bulk(
|
|
520
|
+
element=element, metadata_list=wrong_metadata_list
|
|
413
521
|
)
|
|
414
522
|
|
|
415
523
|
|
|
416
524
|
@pytest.mark.parametrize("wrong_name", [None, 1234, 12.5, [1, 2, 3, 4]])
|
|
417
|
-
def
|
|
525
|
+
def test_create_metadata_bulk_wrong_name(mock_elements_worker, wrong_name):
|
|
418
526
|
element = Element({"id": "fake_element_id"})
|
|
419
527
|
wrong_metadata_list = [
|
|
420
528
|
{"type": MetaType.Text, "name": wrong_name, "value": "fake_value"}
|
|
@@ -422,13 +530,13 @@ def test_create_metadatas_wrong_name(mock_elements_worker, wrong_name):
|
|
|
422
530
|
with pytest.raises(
|
|
423
531
|
AssertionError, match="name shouldn't be null and should be of type str"
|
|
424
532
|
):
|
|
425
|
-
mock_elements_worker.
|
|
426
|
-
element=element,
|
|
533
|
+
mock_elements_worker.create_metadata_bulk(
|
|
534
|
+
element=element, metadata_list=wrong_metadata_list
|
|
427
535
|
)
|
|
428
536
|
|
|
429
537
|
|
|
430
538
|
@pytest.mark.parametrize("wrong_value", [None, [1, 2, 3, 4]])
|
|
431
|
-
def
|
|
539
|
+
def test_create_metadata_bulk_wrong_value(mock_elements_worker, wrong_value):
|
|
432
540
|
element = Element({"id": "fake_element_id"})
|
|
433
541
|
wrong_metadata_list = [
|
|
434
542
|
{"type": MetaType.Text, "name": "fake_name", "value": wrong_value}
|
|
@@ -439,13 +547,13 @@ def test_create_metadatas_wrong_value(mock_elements_worker, wrong_value):
|
|
|
439
547
|
"value shouldn't be null and should be of type (str or float or int)"
|
|
440
548
|
),
|
|
441
549
|
):
|
|
442
|
-
mock_elements_worker.
|
|
443
|
-
element=element,
|
|
550
|
+
mock_elements_worker.create_metadata_bulk(
|
|
551
|
+
element=element, metadata_list=wrong_metadata_list
|
|
444
552
|
)
|
|
445
553
|
|
|
446
554
|
|
|
447
555
|
@pytest.mark.parametrize("wrong_entity", [[1, 2, 3, 4], 1234, 12.5])
|
|
448
|
-
def
|
|
556
|
+
def test_create_metadata_bulk_wrong_entity(mock_elements_worker, wrong_entity):
|
|
449
557
|
element = Element({"id": "fake_element_id"})
|
|
450
558
|
wrong_metadata_list = [
|
|
451
559
|
{
|
|
@@ -456,12 +564,12 @@ def test_create_metadatas_wrong_entity(mock_elements_worker, wrong_entity):
|
|
|
456
564
|
}
|
|
457
565
|
]
|
|
458
566
|
with pytest.raises(AssertionError, match="entity_id should be None or a str"):
|
|
459
|
-
mock_elements_worker.
|
|
460
|
-
element=element,
|
|
567
|
+
mock_elements_worker.create_metadata_bulk(
|
|
568
|
+
element=element, metadata_list=wrong_metadata_list
|
|
461
569
|
)
|
|
462
570
|
|
|
463
571
|
|
|
464
|
-
def
|
|
572
|
+
def test_create_metadata_bulk_api_error(responses, mock_elements_worker):
|
|
465
573
|
element = Element({"id": "12341234-1234-1234-1234-123412341234"})
|
|
466
574
|
metadata_list = [
|
|
467
575
|
{
|
|
@@ -474,37 +582,20 @@ def test_create_metadatas_api_error(responses, mock_elements_worker):
|
|
|
474
582
|
responses.add(
|
|
475
583
|
responses.POST,
|
|
476
584
|
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
477
|
-
status=
|
|
585
|
+
status=418,
|
|
478
586
|
)
|
|
479
587
|
|
|
480
588
|
with pytest.raises(ErrorResponse):
|
|
481
|
-
mock_elements_worker.
|
|
589
|
+
mock_elements_worker.create_metadata_bulk(element, metadata_list)
|
|
482
590
|
|
|
483
|
-
assert len(responses.calls) == len(BASE_API_CALLS) +
|
|
591
|
+
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
484
592
|
assert [
|
|
485
593
|
(call.request.method, call.request.url) for call in responses.calls
|
|
486
594
|
] == BASE_API_CALLS + [
|
|
487
|
-
# We retry 5 times the API call
|
|
488
|
-
(
|
|
489
|
-
"POST",
|
|
490
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
491
|
-
),
|
|
492
|
-
(
|
|
493
|
-
"POST",
|
|
494
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
495
|
-
),
|
|
496
595
|
(
|
|
497
596
|
"POST",
|
|
498
597
|
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
499
|
-
)
|
|
500
|
-
(
|
|
501
|
-
"POST",
|
|
502
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
503
|
-
),
|
|
504
|
-
(
|
|
505
|
-
"POST",
|
|
506
|
-
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
|
|
507
|
-
),
|
|
598
|
+
)
|
|
508
599
|
]
|
|
509
600
|
|
|
510
601
|
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from tests import PROCESS_ID
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@pytest.mark.parametrize(
|
|
7
|
+
("with_image", "elements"),
|
|
8
|
+
[
|
|
9
|
+
(
|
|
10
|
+
False,
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
"id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
|
14
|
+
"type_id": "baaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
|
15
|
+
"name": "element 1",
|
|
16
|
+
"confidence": 1,
|
|
17
|
+
"image_id": None,
|
|
18
|
+
"image_width": None,
|
|
19
|
+
"image_height": None,
|
|
20
|
+
"image_url": None,
|
|
21
|
+
"polygon": None,
|
|
22
|
+
"rotation_angle": 0,
|
|
23
|
+
"mirrored": False,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa0",
|
|
27
|
+
"type_id": "baaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
|
28
|
+
"name": "element 2",
|
|
29
|
+
"confidence": 1,
|
|
30
|
+
"image_id": None,
|
|
31
|
+
"image_width": None,
|
|
32
|
+
"image_height": None,
|
|
33
|
+
"image_url": None,
|
|
34
|
+
"polygon": None,
|
|
35
|
+
"rotation_angle": 0,
|
|
36
|
+
"mirrored": False,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
),
|
|
40
|
+
(
|
|
41
|
+
True,
|
|
42
|
+
[
|
|
43
|
+
{
|
|
44
|
+
"id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
|
45
|
+
"type_id": "baaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
|
46
|
+
"name": "element 1",
|
|
47
|
+
"confidence": 1,
|
|
48
|
+
"image_id": "aaa2aaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
|
49
|
+
"image_width": 76,
|
|
50
|
+
"image_height": 138,
|
|
51
|
+
"image_url": "http://somewhere.com/iiif/image.jpeg",
|
|
52
|
+
"polygon": [[0, 0], [0, 40], [20, 40], [20, 0]],
|
|
53
|
+
"rotation_angle": 0,
|
|
54
|
+
"mirrored": False,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa0",
|
|
58
|
+
"type_id": "baaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
|
59
|
+
"name": "element 2",
|
|
60
|
+
"confidence": 1,
|
|
61
|
+
"image_id": "aaa2aaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
|
|
62
|
+
"image_width": 138,
|
|
63
|
+
"image_height": 76,
|
|
64
|
+
"image_url": "http://somewhere.com/iiif/image.jpeg",
|
|
65
|
+
"polygon": [[0, 0], [0, 40], [20, 40], [20, 0]],
|
|
66
|
+
"rotation_angle": 0,
|
|
67
|
+
"mirrored": False,
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
),
|
|
71
|
+
],
|
|
72
|
+
)
|
|
73
|
+
def test_list_process_elements_with_image(
|
|
74
|
+
responses, mock_elements_worker, with_image, elements
|
|
75
|
+
):
|
|
76
|
+
responses.add(
|
|
77
|
+
responses.GET,
|
|
78
|
+
f"http://testserver/api/v1/process/{PROCESS_ID}/elements/?page_size=500&with_count=true&with_image={with_image}",
|
|
79
|
+
status=200,
|
|
80
|
+
json={
|
|
81
|
+
"count": 2,
|
|
82
|
+
"next": None,
|
|
83
|
+
"results": elements,
|
|
84
|
+
},
|
|
85
|
+
)
|
|
86
|
+
assert (
|
|
87
|
+
list(mock_elements_worker.list_process_elements(with_image=with_image))
|
|
88
|
+
== elements
|
|
89
|
+
)
|