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.
Files changed (43) hide show
  1. arkindex_base_worker-0.3.6rc2.dist-info/METADATA +39 -0
  2. arkindex_base_worker-0.3.6rc2.dist-info/RECORD +40 -0
  3. arkindex_worker/__init__.py +0 -1
  4. arkindex_worker/cache.py +19 -25
  5. arkindex_worker/image.py +16 -17
  6. arkindex_worker/models.py +17 -21
  7. arkindex_worker/utils.py +16 -17
  8. arkindex_worker/worker/__init__.py +14 -23
  9. arkindex_worker/worker/base.py +12 -7
  10. arkindex_worker/worker/classification.py +13 -15
  11. arkindex_worker/worker/dataset.py +3 -4
  12. arkindex_worker/worker/element.py +80 -75
  13. arkindex_worker/worker/entity.py +27 -29
  14. arkindex_worker/worker/metadata.py +19 -25
  15. arkindex_worker/worker/task.py +2 -3
  16. arkindex_worker/worker/training.py +21 -22
  17. arkindex_worker/worker/transcription.py +37 -34
  18. arkindex_worker/worker/version.py +1 -2
  19. tests/conftest.py +55 -75
  20. tests/test_base_worker.py +37 -31
  21. tests/test_cache.py +14 -7
  22. tests/test_dataset_worker.py +4 -4
  23. tests/test_element.py +0 -1
  24. tests/test_elements_worker/__init__.py +0 -1
  25. tests/test_elements_worker/test_classifications.py +0 -1
  26. tests/test_elements_worker/test_cli.py +22 -17
  27. tests/test_elements_worker/test_dataset.py +9 -10
  28. tests/test_elements_worker/test_elements.py +58 -63
  29. tests/test_elements_worker/test_entities.py +10 -20
  30. tests/test_elements_worker/test_metadata.py +72 -96
  31. tests/test_elements_worker/test_task.py +9 -10
  32. tests/test_elements_worker/test_training.py +20 -13
  33. tests/test_elements_worker/test_transcriptions.py +6 -10
  34. tests/test_elements_worker/test_worker.py +16 -14
  35. tests/test_image.py +21 -20
  36. tests/test_merge.py +5 -6
  37. tests/test_utils.py +0 -1
  38. arkindex_base_worker-0.3.6rc1.dist-info/METADATA +0 -27
  39. arkindex_base_worker-0.3.6rc1.dist-info/RECORD +0 -42
  40. arkindex_worker/git.py +0 -392
  41. tests/test_git.py +0 -480
  42. {arkindex_base_worker-0.3.6rc1.dist-info → arkindex_base_worker-0.3.6rc2.dist-info}/WHEEL +0 -0
  43. {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
- "metadatas",
249
+ "metadata_list",
251
250
  [
252
- ([{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"}]),
253
- (
254
- [
255
- {
256
- "type": MetaType.Text,
257
- "name": "fake_name",
258
- "value": "fake_value",
259
- "entity_id": "fake_entity_id",
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, metadatas):
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": metadatas[0]["type"].value,
277
- "name": metadatas[0]["name"],
278
- "value": metadatas[0]["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": metadatas[0].get("entity_id"),
277
+ "entity_id": metadata_list[0].get("entity_id"),
281
278
  }
282
279
  ],
283
280
  },
284
281
  )
285
282
 
286
- created_metadatas = mock_elements_worker.create_metadatas(element, metadatas)
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": metadatas[0]["type"].value,
300
- "name": metadatas[0]["name"],
301
- "value": metadatas[0]["value"],
302
- "entity_id": metadatas[0].get("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 created_metadatas == [
304
+ assert created_metadata_list == [
306
305
  {
307
306
  "id": "fake_metadata_id",
308
- "type": metadatas[0]["type"].value,
309
- "name": metadatas[0]["name"],
310
- "value": metadatas[0]["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": metadatas[0].get("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
- "metadatas",
317
+ "metadata_list",
319
318
  [
320
- ([{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"}]),
321
- (
322
- [
323
- {
324
- "type": MetaType.Text,
325
- "name": "fake_name",
326
- "value": "fake_value",
327
- "entity_id": "fake_entity_id",
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, metadatas
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": metadatas[0]["type"].value,
349
- "name": metadatas[0]["name"],
350
- "value": metadatas[0]["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": metadatas[0].get("entity_id"),
349
+ "entity_id": metadata_list[0].get("entity_id"),
353
350
  }
354
351
  ],
355
352
  },
356
353
  )
357
354
 
358
- created_metadatas = mock_elements_worker_with_cache.create_metadatas(
359
- element, metadatas
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": metadatas[0]["type"].value,
374
- "name": metadatas[0]["name"],
375
- "value": metadatas[0]["value"],
376
- "entity_id": metadatas[0].get("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 created_metadatas == [
376
+ assert created_metadata_list == [
380
377
  {
381
378
  "id": "fake_metadata_id",
382
- "type": metadatas[0]["type"].value,
383
- "name": metadatas[0]["name"],
384
- "value": metadatas[0]["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": metadatas[0].get("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
- wrong_metadatas = [
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=wrong_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
- wrong_metadatas = [{"type": wrong_type, "name": "fake_name", "value": "fake_value"}]
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=wrong_metadatas
412
+ element=element, metadatas=wrong_metadata_list
430
413
  )
431
414
 
432
415
 
433
- @pytest.mark.parametrize("wrong_name", [(None), (1234), (12.5), ([1, 2, 3, 4])])
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
- wrong_metadatas = [
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=wrong_metadatas
426
+ element=element, metadatas=wrong_metadata_list
444
427
  )
445
428
 
446
429
 
447
- @pytest.mark.parametrize("wrong_value", [(None), ([1, 2, 3, 4])])
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
- wrong_metadatas = [
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=wrong_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
- wrong_metadatas = [
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=wrong_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
- metadatas = [
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, metadatas)
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.Response(method="PUT", url=s3_endpoint_url, status=400))
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(Exception):
88
- mock_training_worker.upload_to_s3(file_path, {"s3_put_url": s3_endpoint_url})
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
- ("publish_model_version"),
95
- ("create_model_version"),
96
- ("update_model_version"),
97
- ("upload_to_s3"),
98
- ("validate_model_version"),
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
- def test_activities_disabled(responses, monkeypatch, mock_worker_run_api):
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
- def test_update_call(responses, mock_elements_worker, mock_worker_run_api):
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
- def test_run_cache(
214
- monkeypatch,
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 self.assertRaises(
249
- AssertionError, msg="Input polygon must be a valid list or tuple of points."
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 self.assertRaises(
309
- AssertionError, msg="This polygon is entirely outside the image's bounds."
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 self.assertRaises(
332
- AssertionError, msg="Polygon point coordinates must be integers."
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 self.assertRaises(
351
- AssertionError, msg="Polygon points must be tuples or lists."
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 self.assertRaises(
370
- AssertionError, msg="Polygon points must be tuples or lists of 2 elements."
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: