arkindex-base-worker 0.3.6rc1__py3-none-any.whl → 0.3.6rc2__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.6rc2.dist-info/METADATA +39 -0
- arkindex_base_worker-0.3.6rc2.dist-info/RECORD +40 -0
- arkindex_worker/__init__.py +0 -1
- arkindex_worker/cache.py +19 -25
- arkindex_worker/image.py +16 -17
- arkindex_worker/models.py +17 -21
- arkindex_worker/utils.py +16 -17
- arkindex_worker/worker/__init__.py +14 -23
- arkindex_worker/worker/base.py +12 -7
- arkindex_worker/worker/classification.py +13 -15
- arkindex_worker/worker/dataset.py +3 -4
- arkindex_worker/worker/element.py +80 -75
- arkindex_worker/worker/entity.py +27 -29
- arkindex_worker/worker/metadata.py +19 -25
- arkindex_worker/worker/task.py +2 -3
- arkindex_worker/worker/training.py +21 -22
- arkindex_worker/worker/transcription.py +37 -34
- arkindex_worker/worker/version.py +1 -2
- tests/conftest.py +55 -75
- tests/test_base_worker.py +37 -31
- tests/test_cache.py +14 -7
- tests/test_dataset_worker.py +4 -4
- tests/test_element.py +0 -1
- tests/test_elements_worker/__init__.py +0 -1
- tests/test_elements_worker/test_classifications.py +0 -1
- tests/test_elements_worker/test_cli.py +22 -17
- tests/test_elements_worker/test_dataset.py +9 -10
- tests/test_elements_worker/test_elements.py +58 -63
- tests/test_elements_worker/test_entities.py +10 -20
- tests/test_elements_worker/test_metadata.py +72 -96
- tests/test_elements_worker/test_task.py +9 -10
- tests/test_elements_worker/test_training.py +20 -13
- tests/test_elements_worker/test_transcriptions.py +6 -10
- tests/test_elements_worker/test_worker.py +16 -14
- tests/test_image.py +21 -20
- tests/test_merge.py +5 -6
- tests/test_utils.py +0 -1
- arkindex_base_worker-0.3.6rc1.dist-info/METADATA +0 -27
- arkindex_base_worker-0.3.6rc1.dist-info/RECORD +0 -42
- arkindex_worker/git.py +0 -392
- tests/test_git.py +0 -480
- {arkindex_base_worker-0.3.6rc1.dist-info → arkindex_base_worker-0.3.6rc2.dist-info}/WHEEL +0 -0
- {arkindex_base_worker-0.3.6rc1.dist-info → arkindex_base_worker-0.3.6rc2.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
import json
|
|
3
2
|
import re
|
|
4
3
|
|
|
@@ -247,22 +246,20 @@ def test_create_metadata_cached_element(responses, mock_elements_worker_with_cac
|
|
|
247
246
|
|
|
248
247
|
|
|
249
248
|
@pytest.mark.parametrize(
|
|
250
|
-
"
|
|
249
|
+
"metadata_list",
|
|
251
250
|
[
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
]
|
|
262
|
-
),
|
|
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
|
+
],
|
|
263
260
|
],
|
|
264
261
|
)
|
|
265
|
-
def test_create_metadatas(responses, mock_elements_worker,
|
|
262
|
+
def test_create_metadatas(responses, mock_elements_worker, metadata_list):
|
|
266
263
|
element = Element({"id": "12341234-1234-1234-1234-123412341234"})
|
|
267
264
|
responses.add(
|
|
268
265
|
responses.POST,
|
|
@@ -273,17 +270,19 @@ def test_create_metadatas(responses, mock_elements_worker, metadatas):
|
|
|
273
270
|
"metadata_list": [
|
|
274
271
|
{
|
|
275
272
|
"id": "fake_metadata_id",
|
|
276
|
-
"type":
|
|
277
|
-
"name":
|
|
278
|
-
"value":
|
|
273
|
+
"type": metadata_list[0]["type"].value,
|
|
274
|
+
"name": metadata_list[0]["name"],
|
|
275
|
+
"value": metadata_list[0]["value"],
|
|
279
276
|
"dates": [],
|
|
280
|
-
"entity_id":
|
|
277
|
+
"entity_id": metadata_list[0].get("entity_id"),
|
|
281
278
|
}
|
|
282
279
|
],
|
|
283
280
|
},
|
|
284
281
|
)
|
|
285
282
|
|
|
286
|
-
|
|
283
|
+
created_metadata_list = mock_elements_worker.create_metadatas(
|
|
284
|
+
element, metadata_list
|
|
285
|
+
)
|
|
287
286
|
|
|
288
287
|
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
289
288
|
assert [
|
|
@@ -296,42 +295,40 @@ def test_create_metadatas(responses, mock_elements_worker, metadatas):
|
|
|
296
295
|
]
|
|
297
296
|
assert json.loads(responses.calls[-1].request.body)["metadata_list"] == [
|
|
298
297
|
{
|
|
299
|
-
"type":
|
|
300
|
-
"name":
|
|
301
|
-
"value":
|
|
302
|
-
"entity_id":
|
|
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"),
|
|
303
302
|
}
|
|
304
303
|
]
|
|
305
|
-
assert
|
|
304
|
+
assert created_metadata_list == [
|
|
306
305
|
{
|
|
307
306
|
"id": "fake_metadata_id",
|
|
308
|
-
"type":
|
|
309
|
-
"name":
|
|
310
|
-
"value":
|
|
307
|
+
"type": metadata_list[0]["type"].value,
|
|
308
|
+
"name": metadata_list[0]["name"],
|
|
309
|
+
"value": metadata_list[0]["value"],
|
|
311
310
|
"dates": [],
|
|
312
|
-
"entity_id":
|
|
311
|
+
"entity_id": metadata_list[0].get("entity_id"),
|
|
313
312
|
}
|
|
314
313
|
]
|
|
315
314
|
|
|
316
315
|
|
|
317
316
|
@pytest.mark.parametrize(
|
|
318
|
-
"
|
|
317
|
+
"metadata_list",
|
|
319
318
|
[
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
]
|
|
330
|
-
),
|
|
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
|
+
],
|
|
331
328
|
],
|
|
332
329
|
)
|
|
333
330
|
def test_create_metadatas_cached_element(
|
|
334
|
-
responses, mock_elements_worker_with_cache,
|
|
331
|
+
responses, mock_elements_worker_with_cache, metadata_list
|
|
335
332
|
):
|
|
336
333
|
element = CachedElement.create(
|
|
337
334
|
id="12341234-1234-1234-1234-123412341234", type="thing"
|
|
@@ -345,18 +342,18 @@ def test_create_metadatas_cached_element(
|
|
|
345
342
|
"metadata_list": [
|
|
346
343
|
{
|
|
347
344
|
"id": "fake_metadata_id",
|
|
348
|
-
"type":
|
|
349
|
-
"name":
|
|
350
|
-
"value":
|
|
345
|
+
"type": metadata_list[0]["type"].value,
|
|
346
|
+
"name": metadata_list[0]["name"],
|
|
347
|
+
"value": metadata_list[0]["value"],
|
|
351
348
|
"dates": [],
|
|
352
|
-
"entity_id":
|
|
349
|
+
"entity_id": metadata_list[0].get("entity_id"),
|
|
353
350
|
}
|
|
354
351
|
],
|
|
355
352
|
},
|
|
356
353
|
)
|
|
357
354
|
|
|
358
|
-
|
|
359
|
-
element,
|
|
355
|
+
created_metadata_list = mock_elements_worker_with_cache.create_metadatas(
|
|
356
|
+
element, metadata_list
|
|
360
357
|
)
|
|
361
358
|
|
|
362
359
|
assert len(responses.calls) == len(BASE_API_CALLS) + 1
|
|
@@ -370,35 +367,27 @@ def test_create_metadatas_cached_element(
|
|
|
370
367
|
]
|
|
371
368
|
assert json.loads(responses.calls[-1].request.body)["metadata_list"] == [
|
|
372
369
|
{
|
|
373
|
-
"type":
|
|
374
|
-
"name":
|
|
375
|
-
"value":
|
|
376
|
-
"entity_id":
|
|
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"),
|
|
377
374
|
}
|
|
378
375
|
]
|
|
379
|
-
assert
|
|
376
|
+
assert created_metadata_list == [
|
|
380
377
|
{
|
|
381
378
|
"id": "fake_metadata_id",
|
|
382
|
-
"type":
|
|
383
|
-
"name":
|
|
384
|
-
"value":
|
|
379
|
+
"type": metadata_list[0]["type"].value,
|
|
380
|
+
"name": metadata_list[0]["name"],
|
|
381
|
+
"value": metadata_list[0]["value"],
|
|
385
382
|
"dates": [],
|
|
386
|
-
"entity_id":
|
|
383
|
+
"entity_id": metadata_list[0].get("entity_id"),
|
|
387
384
|
}
|
|
388
385
|
]
|
|
389
386
|
|
|
390
387
|
|
|
391
|
-
@pytest.mark.parametrize(
|
|
392
|
-
"wrong_element",
|
|
393
|
-
[
|
|
394
|
-
None,
|
|
395
|
-
"not_element_type",
|
|
396
|
-
1234,
|
|
397
|
-
12.5,
|
|
398
|
-
],
|
|
399
|
-
)
|
|
388
|
+
@pytest.mark.parametrize("wrong_element", [None, "not_element_type", 1234, 12.5])
|
|
400
389
|
def test_create_metadatas_wrong_element(mock_elements_worker, wrong_element):
|
|
401
|
-
|
|
390
|
+
wrong_metadata_list = [
|
|
402
391
|
{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"}
|
|
403
392
|
]
|
|
404
393
|
with pytest.raises(
|
|
@@ -406,48 +395,42 @@ def test_create_metadatas_wrong_element(mock_elements_worker, wrong_element):
|
|
|
406
395
|
match="element shouldn't be null and should be of type Element or CachedElement",
|
|
407
396
|
):
|
|
408
397
|
mock_elements_worker.create_metadatas(
|
|
409
|
-
element=wrong_element, metadatas=
|
|
398
|
+
element=wrong_element, metadatas=wrong_metadata_list
|
|
410
399
|
)
|
|
411
400
|
|
|
412
401
|
|
|
413
|
-
@pytest.mark.parametrize(
|
|
414
|
-
"wrong_type",
|
|
415
|
-
[
|
|
416
|
-
None,
|
|
417
|
-
"not_metadata_type",
|
|
418
|
-
1234,
|
|
419
|
-
12.5,
|
|
420
|
-
],
|
|
421
|
-
)
|
|
402
|
+
@pytest.mark.parametrize("wrong_type", [None, "not_metadata_type", 1234, 12.5])
|
|
422
403
|
def test_create_metadatas_wrong_type(mock_elements_worker, wrong_type):
|
|
423
404
|
element = Element({"id": "12341234-1234-1234-1234-123412341234"})
|
|
424
|
-
|
|
405
|
+
wrong_metadata_list = [
|
|
406
|
+
{"type": wrong_type, "name": "fake_name", "value": "fake_value"}
|
|
407
|
+
]
|
|
425
408
|
with pytest.raises(
|
|
426
409
|
AssertionError, match="type shouldn't be null and should be of type MetaType"
|
|
427
410
|
):
|
|
428
411
|
mock_elements_worker.create_metadatas(
|
|
429
|
-
element=element, metadatas=
|
|
412
|
+
element=element, metadatas=wrong_metadata_list
|
|
430
413
|
)
|
|
431
414
|
|
|
432
415
|
|
|
433
|
-
@pytest.mark.parametrize("wrong_name", [
|
|
416
|
+
@pytest.mark.parametrize("wrong_name", [None, 1234, 12.5, [1, 2, 3, 4]])
|
|
434
417
|
def test_create_metadatas_wrong_name(mock_elements_worker, wrong_name):
|
|
435
418
|
element = Element({"id": "fake_element_id"})
|
|
436
|
-
|
|
419
|
+
wrong_metadata_list = [
|
|
437
420
|
{"type": MetaType.Text, "name": wrong_name, "value": "fake_value"}
|
|
438
421
|
]
|
|
439
422
|
with pytest.raises(
|
|
440
423
|
AssertionError, match="name shouldn't be null and should be of type str"
|
|
441
424
|
):
|
|
442
425
|
mock_elements_worker.create_metadatas(
|
|
443
|
-
element=element, metadatas=
|
|
426
|
+
element=element, metadatas=wrong_metadata_list
|
|
444
427
|
)
|
|
445
428
|
|
|
446
429
|
|
|
447
|
-
@pytest.mark.parametrize("wrong_value", [
|
|
430
|
+
@pytest.mark.parametrize("wrong_value", [None, [1, 2, 3, 4]])
|
|
448
431
|
def test_create_metadatas_wrong_value(mock_elements_worker, wrong_value):
|
|
449
432
|
element = Element({"id": "fake_element_id"})
|
|
450
|
-
|
|
433
|
+
wrong_metadata_list = [
|
|
451
434
|
{"type": MetaType.Text, "name": "fake_name", "value": wrong_value}
|
|
452
435
|
]
|
|
453
436
|
with pytest.raises(
|
|
@@ -457,21 +440,14 @@ def test_create_metadatas_wrong_value(mock_elements_worker, wrong_value):
|
|
|
457
440
|
),
|
|
458
441
|
):
|
|
459
442
|
mock_elements_worker.create_metadatas(
|
|
460
|
-
element=element, metadatas=
|
|
443
|
+
element=element, metadatas=wrong_metadata_list
|
|
461
444
|
)
|
|
462
445
|
|
|
463
446
|
|
|
464
|
-
@pytest.mark.parametrize(
|
|
465
|
-
"wrong_entity",
|
|
466
|
-
[
|
|
467
|
-
[1, 2, 3, 4],
|
|
468
|
-
1234,
|
|
469
|
-
12.5,
|
|
470
|
-
],
|
|
471
|
-
)
|
|
447
|
+
@pytest.mark.parametrize("wrong_entity", [[1, 2, 3, 4], 1234, 12.5])
|
|
472
448
|
def test_create_metadatas_wrong_entity(mock_elements_worker, wrong_entity):
|
|
473
449
|
element = Element({"id": "fake_element_id"})
|
|
474
|
-
|
|
450
|
+
wrong_metadata_list = [
|
|
475
451
|
{
|
|
476
452
|
"type": MetaType.Text,
|
|
477
453
|
"name": "fake_name",
|
|
@@ -481,13 +457,13 @@ def test_create_metadatas_wrong_entity(mock_elements_worker, wrong_entity):
|
|
|
481
457
|
]
|
|
482
458
|
with pytest.raises(AssertionError, match="entity_id should be None or a str"):
|
|
483
459
|
mock_elements_worker.create_metadatas(
|
|
484
|
-
element=element, metadatas=
|
|
460
|
+
element=element, metadatas=wrong_metadata_list
|
|
485
461
|
)
|
|
486
462
|
|
|
487
463
|
|
|
488
464
|
def test_create_metadatas_api_error(responses, mock_elements_worker):
|
|
489
465
|
element = Element({"id": "12341234-1234-1234-1234-123412341234"})
|
|
490
|
-
|
|
466
|
+
metadata_list = [
|
|
491
467
|
{
|
|
492
468
|
"type": MetaType.Text,
|
|
493
469
|
"name": "fake_name",
|
|
@@ -502,7 +478,7 @@ def test_create_metadatas_api_error(responses, mock_elements_worker):
|
|
|
502
478
|
)
|
|
503
479
|
|
|
504
480
|
with pytest.raises(ErrorResponse):
|
|
505
|
-
mock_elements_worker.create_metadatas(element,
|
|
481
|
+
mock_elements_worker.create_metadatas(element, metadata_list)
|
|
506
482
|
|
|
507
483
|
assert len(responses.calls) == len(BASE_API_CALLS) + 5
|
|
508
484
|
assert [
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
import uuid
|
|
3
2
|
|
|
4
3
|
import pytest
|
|
@@ -12,8 +11,8 @@ TASK_ID = uuid.UUID("cafecafe-cafe-cafe-cafe-cafecafecafe")
|
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
@pytest.mark.parametrize(
|
|
15
|
-
"payload, error",
|
|
16
|
-
|
|
14
|
+
("payload", "error"),
|
|
15
|
+
[
|
|
17
16
|
# Task ID
|
|
18
17
|
(
|
|
19
18
|
{"task_id": None},
|
|
@@ -23,7 +22,7 @@ TASK_ID = uuid.UUID("cafecafe-cafe-cafe-cafe-cafecafecafe")
|
|
|
23
22
|
{"task_id": "12341234-1234-1234-1234-123412341234"},
|
|
24
23
|
"task_id shouldn't be null and should be an UUID",
|
|
25
24
|
),
|
|
26
|
-
|
|
25
|
+
],
|
|
27
26
|
)
|
|
28
27
|
def test_list_artifacts_wrong_param_task_id(mock_dataset_worker, payload, error):
|
|
29
28
|
with pytest.raises(AssertionError, match=error):
|
|
@@ -97,8 +96,8 @@ def test_list_artifacts(
|
|
|
97
96
|
|
|
98
97
|
|
|
99
98
|
@pytest.mark.parametrize(
|
|
100
|
-
"payload, error",
|
|
101
|
-
|
|
99
|
+
("payload", "error"),
|
|
100
|
+
[
|
|
102
101
|
# Task ID
|
|
103
102
|
(
|
|
104
103
|
{"task_id": None},
|
|
@@ -108,7 +107,7 @@ def test_list_artifacts(
|
|
|
108
107
|
{"task_id": "12341234-1234-1234-1234-123412341234"},
|
|
109
108
|
"task_id shouldn't be null and should be an UUID",
|
|
110
109
|
),
|
|
111
|
-
|
|
110
|
+
],
|
|
112
111
|
)
|
|
113
112
|
def test_download_artifact_wrong_param_task_id(
|
|
114
113
|
mock_dataset_worker, default_artifact, payload, error
|
|
@@ -124,8 +123,8 @@ def test_download_artifact_wrong_param_task_id(
|
|
|
124
123
|
|
|
125
124
|
|
|
126
125
|
@pytest.mark.parametrize(
|
|
127
|
-
"payload, error",
|
|
128
|
-
|
|
126
|
+
("payload", "error"),
|
|
127
|
+
[
|
|
129
128
|
# Artifact
|
|
130
129
|
(
|
|
131
130
|
{"artifact": None},
|
|
@@ -135,7 +134,7 @@ def test_download_artifact_wrong_param_task_id(
|
|
|
135
134
|
{"artifact": "not artifact type"},
|
|
136
135
|
"artifact shouldn't be null and should be an Artifact",
|
|
137
136
|
),
|
|
138
|
-
|
|
137
|
+
],
|
|
139
138
|
)
|
|
140
139
|
def test_download_artifact_wrong_param_artifact(
|
|
141
140
|
mock_dataset_worker, default_artifact, payload, error
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
import logging
|
|
3
2
|
import sys
|
|
4
3
|
|
|
5
4
|
import pytest
|
|
6
|
-
import responses
|
|
7
5
|
|
|
8
6
|
from arkindex.mock import MockApiClient
|
|
9
7
|
from arkindex_worker.worker import BaseWorker
|
|
10
8
|
from arkindex_worker.worker.training import TrainingMixin, create_archive
|
|
11
9
|
|
|
12
10
|
|
|
13
|
-
@pytest.fixture
|
|
11
|
+
@pytest.fixture()
|
|
14
12
|
def mock_training_worker(monkeypatch):
|
|
15
13
|
class TrainingWorker(BaseWorker, TrainingMixin):
|
|
16
14
|
"""
|
|
@@ -24,7 +22,7 @@ def mock_training_worker(monkeypatch):
|
|
|
24
22
|
return training_worker
|
|
25
23
|
|
|
26
24
|
|
|
27
|
-
@pytest.fixture
|
|
25
|
+
@pytest.fixture()
|
|
28
26
|
def default_model_version():
|
|
29
27
|
return {
|
|
30
28
|
"id": "model_version_id",
|
|
@@ -79,23 +77,32 @@ def test_create_archive_with_subfolder(model_file_dir_with_subfolder):
|
|
|
79
77
|
assert not zst_archive_path.exists(), "Auto removal failed"
|
|
80
78
|
|
|
81
79
|
|
|
82
|
-
def test_handle_s3_uploading_errors(mock_training_worker, model_file_dir):
|
|
80
|
+
def test_handle_s3_uploading_errors(responses, mock_training_worker, model_file_dir):
|
|
83
81
|
s3_endpoint_url = "http://s3.localhost.com"
|
|
84
82
|
responses.add_passthru(s3_endpoint_url)
|
|
85
|
-
responses.add(responses.
|
|
83
|
+
responses.add(responses.PUT, s3_endpoint_url, status=400)
|
|
84
|
+
|
|
85
|
+
mock_training_worker.model_version = {
|
|
86
|
+
"state": "Created",
|
|
87
|
+
"s3_put_url": s3_endpoint_url,
|
|
88
|
+
}
|
|
89
|
+
|
|
86
90
|
file_path = model_file_dir / "model_file.pth"
|
|
87
|
-
with pytest.raises(
|
|
88
|
-
|
|
91
|
+
with pytest.raises(
|
|
92
|
+
Exception,
|
|
93
|
+
match="400 Client Error: Bad Request for url: http://s3.localhost.com/",
|
|
94
|
+
):
|
|
95
|
+
mock_training_worker.upload_to_s3(file_path)
|
|
89
96
|
|
|
90
97
|
|
|
91
98
|
@pytest.mark.parametrize(
|
|
92
99
|
"method",
|
|
93
100
|
[
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
101
|
+
"publish_model_version",
|
|
102
|
+
"create_model_version",
|
|
103
|
+
"update_model_version",
|
|
104
|
+
"upload_to_s3",
|
|
105
|
+
"validate_model_version",
|
|
99
106
|
],
|
|
100
107
|
)
|
|
101
108
|
def test_training_mixin_read_only(mock_training_worker, method, caplog):
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
import json
|
|
3
2
|
import re
|
|
4
3
|
from uuid import UUID
|
|
@@ -1867,9 +1866,10 @@ def test_list_transcriptions_manual_worker_version(responses, mock_elements_work
|
|
|
1867
1866
|
]
|
|
1868
1867
|
|
|
1869
1868
|
|
|
1869
|
+
@pytest.mark.usefixtures("_mock_cached_transcriptions")
|
|
1870
1870
|
@pytest.mark.parametrize(
|
|
1871
|
-
"filters, expected_ids",
|
|
1872
|
-
|
|
1871
|
+
("filters", "expected_ids"),
|
|
1872
|
+
[
|
|
1873
1873
|
# Filter on element should give first and sixth transcription
|
|
1874
1874
|
(
|
|
1875
1875
|
{
|
|
@@ -1963,14 +1963,10 @@ def test_list_transcriptions_manual_worker_version(responses, mock_elements_work
|
|
|
1963
1963
|
},
|
|
1964
1964
|
("66666666-6666-6666-6666-666666666666",),
|
|
1965
1965
|
),
|
|
1966
|
-
|
|
1966
|
+
],
|
|
1967
1967
|
)
|
|
1968
1968
|
def test_list_transcriptions_with_cache(
|
|
1969
|
-
responses,
|
|
1970
|
-
mock_elements_worker_with_cache,
|
|
1971
|
-
mock_cached_transcriptions,
|
|
1972
|
-
filters,
|
|
1973
|
-
expected_ids,
|
|
1969
|
+
responses, mock_elements_worker_with_cache, filters, expected_ids
|
|
1974
1970
|
):
|
|
1975
1971
|
# Check we have 5 elements already present in database
|
|
1976
1972
|
assert CachedTranscription.select().count() == 6
|
|
@@ -1979,7 +1975,7 @@ def test_list_transcriptions_with_cache(
|
|
|
1979
1975
|
transcriptions = mock_elements_worker_with_cache.list_transcriptions(**filters)
|
|
1980
1976
|
assert transcriptions.count() == len(expected_ids)
|
|
1981
1977
|
for transcription, expected_id in zip(
|
|
1982
|
-
transcriptions.order_by(CachedTranscription.id), expected_ids
|
|
1978
|
+
transcriptions.order_by(CachedTranscription.id), expected_ids, strict=True
|
|
1983
1979
|
):
|
|
1984
1980
|
assert transcription.id == UUID(expected_id)
|
|
1985
1981
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# . -*- coding: utf-8 -*-
|
|
2
1
|
import json
|
|
3
2
|
import sys
|
|
4
3
|
|
|
@@ -78,7 +77,8 @@ def test_readonly(responses, mock_elements_worker):
|
|
|
78
77
|
] == BASE_API_CALLS
|
|
79
78
|
|
|
80
79
|
|
|
81
|
-
|
|
80
|
+
@pytest.mark.usefixtures("_mock_worker_run_api")
|
|
81
|
+
def test_activities_disabled(responses, monkeypatch):
|
|
82
82
|
"""Test worker process elements without updating activities when they are disabled for the process"""
|
|
83
83
|
monkeypatch.setattr(sys, "argv", ["worker"])
|
|
84
84
|
worker = ElementsWorker()
|
|
@@ -105,7 +105,8 @@ def test_activities_dev_mode(mocker):
|
|
|
105
105
|
assert worker.store_activity is False
|
|
106
106
|
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
@pytest.mark.usefixtures("_mock_worker_run_api")
|
|
109
|
+
def test_update_call(responses, mock_elements_worker):
|
|
109
110
|
"""Test an update call with feature enabled triggers an API call"""
|
|
110
111
|
responses.add(
|
|
111
112
|
responses.PUT,
|
|
@@ -141,8 +142,9 @@ def test_update_call(responses, mock_elements_worker, mock_worker_run_api):
|
|
|
141
142
|
}
|
|
142
143
|
|
|
143
144
|
|
|
145
|
+
@pytest.mark.usefixtures("_mock_activity_calls")
|
|
144
146
|
@pytest.mark.parametrize(
|
|
145
|
-
"process_exception, final_state",
|
|
147
|
+
("process_exception", "final_state"),
|
|
146
148
|
[
|
|
147
149
|
# Successful process_element
|
|
148
150
|
(None, "processed"),
|
|
@@ -161,7 +163,6 @@ def test_run(
|
|
|
161
163
|
responses,
|
|
162
164
|
process_exception,
|
|
163
165
|
final_state,
|
|
164
|
-
mock_activity_calls,
|
|
165
166
|
):
|
|
166
167
|
"""Check the normal runtime sends 2 API calls to update activity"""
|
|
167
168
|
# Disable second configure call from run()
|
|
@@ -210,13 +211,8 @@ def test_run(
|
|
|
210
211
|
}
|
|
211
212
|
|
|
212
213
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
mocker,
|
|
216
|
-
mock_elements_worker_with_cache,
|
|
217
|
-
mock_cached_elements,
|
|
218
|
-
mock_activity_calls,
|
|
219
|
-
):
|
|
214
|
+
@pytest.mark.usefixtures("_mock_cached_elements", "_mock_activity_calls")
|
|
215
|
+
def test_run_cache(monkeypatch, mocker, mock_elements_worker_with_cache):
|
|
220
216
|
# Disable second configure call from run()
|
|
221
217
|
monkeypatch.setattr(mock_elements_worker_with_cache, "configure", lambda: None)
|
|
222
218
|
|
|
@@ -310,8 +306,14 @@ def test_start_activity_error(
|
|
|
310
306
|
|
|
311
307
|
|
|
312
308
|
@pytest.mark.parametrize(
|
|
313
|
-
"wk_version_config,wk_version_user_config,frontend_user_config,model_config,expected_config",
|
|
314
309
|
(
|
|
310
|
+
"wk_version_config",
|
|
311
|
+
"wk_version_user_config",
|
|
312
|
+
"frontend_user_config",
|
|
313
|
+
"model_config",
|
|
314
|
+
"expected_config",
|
|
315
|
+
),
|
|
316
|
+
[
|
|
315
317
|
({}, {}, {}, {}, {}),
|
|
316
318
|
# Keep parameters from worker version configuration
|
|
317
319
|
({"parameter": 0}, {}, {}, {}, {"parameter": 0}),
|
|
@@ -411,7 +413,7 @@ def test_start_activity_error(
|
|
|
411
413
|
{"parameter": 2},
|
|
412
414
|
{"parameter": 3},
|
|
413
415
|
),
|
|
414
|
-
|
|
416
|
+
],
|
|
415
417
|
)
|
|
416
418
|
def test_worker_config_multiple_source(
|
|
417
419
|
monkeypatch,
|
tests/test_image.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
import math
|
|
3
2
|
import unittest
|
|
4
3
|
import uuid
|
|
@@ -124,13 +123,13 @@ def test_download_tiles_small(responses):
|
|
|
124
123
|
|
|
125
124
|
|
|
126
125
|
@pytest.mark.parametrize(
|
|
127
|
-
"path, is_local",
|
|
128
|
-
|
|
126
|
+
("path", "is_local"),
|
|
127
|
+
[
|
|
129
128
|
("http://somewhere/test.jpg", False),
|
|
130
129
|
("https://somewhere/test.jpg", False),
|
|
131
130
|
("path/to/something", True),
|
|
132
131
|
("/absolute/path/to/something", True),
|
|
133
|
-
|
|
132
|
+
],
|
|
134
133
|
)
|
|
135
134
|
def test_open_image(path, is_local, monkeypatch):
|
|
136
135
|
"""Check if the path triggers a local load or a remote one"""
|
|
@@ -149,13 +148,13 @@ def test_open_image(path, is_local, monkeypatch):
|
|
|
149
148
|
|
|
150
149
|
|
|
151
150
|
@pytest.mark.parametrize(
|
|
152
|
-
"rotation_angle,mirrored,expected_path",
|
|
153
|
-
|
|
151
|
+
("rotation_angle", "mirrored", "expected_path"),
|
|
152
|
+
[
|
|
154
153
|
(0, False, TILE),
|
|
155
154
|
(45, False, ROTATED_IMAGE),
|
|
156
155
|
(0, True, MIRRORED_IMAGE),
|
|
157
156
|
(45, True, ROTATED_MIRRORED_IMAGE),
|
|
158
|
-
|
|
157
|
+
],
|
|
159
158
|
)
|
|
160
159
|
def test_open_image_rotate_mirror(rotation_angle, mirrored, expected_path):
|
|
161
160
|
expected = Image.open(expected_path).convert("RGB")
|
|
@@ -245,8 +244,9 @@ class TestTrimPolygon(unittest.TestCase):
|
|
|
245
244
|
[99, 208],
|
|
246
245
|
]
|
|
247
246
|
}
|
|
248
|
-
with
|
|
249
|
-
AssertionError,
|
|
247
|
+
with pytest.raises(
|
|
248
|
+
AssertionError,
|
|
249
|
+
match="Input polygon must be a valid list or tuple of points.",
|
|
250
250
|
):
|
|
251
251
|
trim_polygon(bad_polygon, TEST_IMAGE["width"], TEST_IMAGE["height"])
|
|
252
252
|
|
|
@@ -305,8 +305,8 @@ class TestTrimPolygon(unittest.TestCase):
|
|
|
305
305
|
[997, 206],
|
|
306
306
|
[999, 200],
|
|
307
307
|
]
|
|
308
|
-
with
|
|
309
|
-
AssertionError,
|
|
308
|
+
with pytest.raises(
|
|
309
|
+
AssertionError, match="This polygon is entirely outside the image's bounds."
|
|
310
310
|
):
|
|
311
311
|
trim_polygon(bad_polygon, TEST_IMAGE["width"], TEST_IMAGE["height"])
|
|
312
312
|
|
|
@@ -328,8 +328,8 @@ class TestTrimPolygon(unittest.TestCase):
|
|
|
328
328
|
[197, 206],
|
|
329
329
|
[99, 20.8],
|
|
330
330
|
]
|
|
331
|
-
with
|
|
332
|
-
AssertionError,
|
|
331
|
+
with pytest.raises(
|
|
332
|
+
AssertionError, match="Polygon point coordinates must be integers."
|
|
333
333
|
):
|
|
334
334
|
trim_polygon(bad_polygon, TEST_IMAGE["width"], TEST_IMAGE["height"])
|
|
335
335
|
|
|
@@ -347,8 +347,8 @@ class TestTrimPolygon(unittest.TestCase):
|
|
|
347
347
|
[72, 57],
|
|
348
348
|
[12, 56],
|
|
349
349
|
]
|
|
350
|
-
with
|
|
351
|
-
AssertionError,
|
|
350
|
+
with pytest.raises(
|
|
351
|
+
AssertionError, match="Polygon points must be tuples or lists."
|
|
352
352
|
):
|
|
353
353
|
trim_polygon(bad_polygon, TEST_IMAGE["width"], TEST_IMAGE["height"])
|
|
354
354
|
|
|
@@ -366,15 +366,16 @@ class TestTrimPolygon(unittest.TestCase):
|
|
|
366
366
|
[72, 57],
|
|
367
367
|
[12, 56],
|
|
368
368
|
]
|
|
369
|
-
with
|
|
370
|
-
AssertionError,
|
|
369
|
+
with pytest.raises(
|
|
370
|
+
AssertionError,
|
|
371
|
+
match="Polygon points must be tuples or lists of 2 elements.",
|
|
371
372
|
):
|
|
372
373
|
trim_polygon(bad_polygon, TEST_IMAGE["width"], TEST_IMAGE["height"])
|
|
373
374
|
|
|
374
375
|
|
|
375
376
|
@pytest.mark.parametrize(
|
|
376
|
-
"angle, mirrored, updated_bounds, reverse",
|
|
377
|
-
|
|
377
|
+
("angle", "mirrored", "updated_bounds", "reverse"),
|
|
378
|
+
[
|
|
378
379
|
(
|
|
379
380
|
0,
|
|
380
381
|
False,
|
|
@@ -471,7 +472,7 @@ class TestTrimPolygon(unittest.TestCase):
|
|
|
471
472
|
{"x": 11, "y": 295, "width": 47, "height": 111}, # upper right
|
|
472
473
|
False,
|
|
473
474
|
),
|
|
474
|
-
|
|
475
|
+
],
|
|
475
476
|
)
|
|
476
477
|
def test_revert_orientation(angle, mirrored, updated_bounds, reverse, tmp_path):
|
|
477
478
|
"""Test cases, for both Elements and CachedElements:
|