arkindex-base-worker 0.3.6rc4__py3-none-any.whl → 0.3.7__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 (41) hide show
  1. arkindex_base_worker-0.3.7.dist-info/LICENSE +21 -0
  2. arkindex_base_worker-0.3.7.dist-info/METADATA +77 -0
  3. arkindex_base_worker-0.3.7.dist-info/RECORD +47 -0
  4. {arkindex_base_worker-0.3.6rc4.dist-info → arkindex_base_worker-0.3.7.dist-info}/WHEEL +1 -1
  5. {arkindex_base_worker-0.3.6rc4.dist-info → arkindex_base_worker-0.3.7.dist-info}/top_level.txt +2 -0
  6. arkindex_worker/cache.py +14 -0
  7. arkindex_worker/image.py +29 -19
  8. arkindex_worker/models.py +14 -2
  9. arkindex_worker/utils.py +17 -3
  10. arkindex_worker/worker/__init__.py +122 -125
  11. arkindex_worker/worker/base.py +24 -24
  12. arkindex_worker/worker/classification.py +18 -25
  13. arkindex_worker/worker/dataset.py +24 -18
  14. arkindex_worker/worker/element.py +100 -19
  15. arkindex_worker/worker/entity.py +35 -4
  16. arkindex_worker/worker/metadata.py +21 -11
  17. arkindex_worker/worker/training.py +13 -0
  18. arkindex_worker/worker/transcription.py +45 -5
  19. arkindex_worker/worker/version.py +22 -0
  20. hooks/pre_gen_project.py +3 -0
  21. tests/conftest.py +16 -8
  22. tests/test_base_worker.py +0 -6
  23. tests/test_dataset_worker.py +291 -409
  24. tests/test_elements_worker/test_classifications.py +365 -539
  25. tests/test_elements_worker/test_cli.py +1 -1
  26. tests/test_elements_worker/test_dataset.py +97 -116
  27. tests/test_elements_worker/test_elements.py +354 -76
  28. tests/test_elements_worker/test_entities.py +22 -2
  29. tests/test_elements_worker/test_metadata.py +53 -27
  30. tests/test_elements_worker/test_training.py +35 -0
  31. tests/test_elements_worker/test_transcriptions.py +149 -16
  32. tests/test_elements_worker/test_worker.py +19 -6
  33. tests/test_image.py +37 -0
  34. tests/test_utils.py +23 -1
  35. worker-demo/tests/__init__.py +0 -0
  36. worker-demo/tests/conftest.py +32 -0
  37. worker-demo/tests/test_worker.py +12 -0
  38. worker-demo/worker_demo/__init__.py +6 -0
  39. worker-demo/worker_demo/worker.py +19 -0
  40. arkindex_base_worker-0.3.6rc4.dist-info/METADATA +0 -47
  41. arkindex_base_worker-0.3.6rc4.dist-info/RECORD +0 -40
@@ -428,19 +428,7 @@ def test_create_sub_element_wrong_name(mock_elements_worker):
428
428
  def test_create_sub_element_wrong_polygon(mock_elements_worker):
429
429
  elt = Element({"zone": None})
430
430
 
431
- with pytest.raises(
432
- AssertionError, match="polygon shouldn't be null and should be of type list"
433
- ):
434
- mock_elements_worker.create_sub_element(
435
- element=elt,
436
- type="something",
437
- name="0",
438
- polygon=None,
439
- )
440
-
441
- with pytest.raises(
442
- AssertionError, match="polygon shouldn't be null and should be of type list"
443
- ):
431
+ with pytest.raises(AssertionError, match="polygon should be None or a list"):
444
432
  mock_elements_worker.create_sub_element(
445
433
  element=elt,
446
434
  type="something",
@@ -504,6 +492,42 @@ def test_create_sub_element_wrong_confidence(mock_elements_worker, confidence):
504
492
  )
505
493
 
506
494
 
495
+ @pytest.mark.parametrize(
496
+ ("image", "error_type", "error_message"),
497
+ [
498
+ (1, AssertionError, "image should be None or string"),
499
+ ("not a uuid", ValueError, "image is not a valid uuid."),
500
+ ],
501
+ )
502
+ def test_create_sub_element_wrong_image(
503
+ mock_elements_worker, image, error_type, error_message
504
+ ):
505
+ with pytest.raises(error_type, match=re.escape(error_message)):
506
+ mock_elements_worker.create_sub_element(
507
+ element=Element({"zone": None}),
508
+ type="something",
509
+ name="blah",
510
+ polygon=[[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]],
511
+ image=image,
512
+ )
513
+
514
+
515
+ def test_create_sub_element_wrong_image_and_polygon(mock_elements_worker):
516
+ with pytest.raises(
517
+ AssertionError,
518
+ match=re.escape(
519
+ "An image or a parent with an image is required to create an element with a polygon."
520
+ ),
521
+ ):
522
+ mock_elements_worker.create_sub_element(
523
+ element=Element({"zone": None}),
524
+ type="something",
525
+ name="blah",
526
+ polygon=[[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]],
527
+ image=None,
528
+ )
529
+
530
+
507
531
  def test_create_sub_element_api_error(responses, mock_elements_worker):
508
532
  elt = Element(
509
533
  {
@@ -580,7 +604,7 @@ def test_create_sub_element(responses, mock_elements_worker, slim_output):
580
604
  assert json.loads(responses.calls[-1].request.body) == {
581
605
  "type": "something",
582
606
  "name": "0",
583
- "image": "22222222-2222-2222-2222-222222222222",
607
+ "image": None,
584
608
  "corpus": "11111111-1111-1111-1111-111111111111",
585
609
  "polygon": [[1, 1], [2, 2], [2, 1], [1, 2]],
586
610
  "parent": "12341234-1234-1234-1234-123412341234",
@@ -625,7 +649,7 @@ def test_create_sub_element_confidence(responses, mock_elements_worker):
625
649
  assert json.loads(responses.calls[-1].request.body) == {
626
650
  "type": "something",
627
651
  "name": "0",
628
- "image": "22222222-2222-2222-2222-222222222222",
652
+ "image": None,
629
653
  "corpus": "11111111-1111-1111-1111-111111111111",
630
654
  "polygon": [[1, 1], [2, 2], [2, 1], [1, 2]],
631
655
  "parent": "12341234-1234-1234-1234-123412341234",
@@ -1217,6 +1241,94 @@ def test_create_elements_integrity_error(
1217
1241
  assert list(CachedElement.select()) == []
1218
1242
 
1219
1243
 
1244
+ @pytest.mark.parametrize(
1245
+ ("params", "error_message"),
1246
+ [
1247
+ (
1248
+ {"parent": None, "child": None},
1249
+ "parent shouldn't be null and should be of type Element",
1250
+ ),
1251
+ (
1252
+ {"parent": "not an element", "child": None},
1253
+ "parent shouldn't be null and should be of type Element",
1254
+ ),
1255
+ (
1256
+ {"parent": Element(zone=None), "child": None},
1257
+ "child shouldn't be null and should be of type Element",
1258
+ ),
1259
+ (
1260
+ {"parent": Element(zone=None), "child": "not an element"},
1261
+ "child shouldn't be null and should be of type Element",
1262
+ ),
1263
+ ],
1264
+ )
1265
+ def test_create_element_parent_invalid_params(
1266
+ mock_elements_worker, params, error_message
1267
+ ):
1268
+ with pytest.raises(AssertionError, match=re.escape(error_message)):
1269
+ mock_elements_worker.create_element_parent(**params)
1270
+
1271
+
1272
+ def test_create_element_parent_api_error(responses, mock_elements_worker):
1273
+ parent = Element({"id": "12341234-1234-1234-1234-123412341234"})
1274
+ child = Element({"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"})
1275
+ responses.add(
1276
+ responses.POST,
1277
+ "http://testserver/api/v1/element/497f6eca-6276-4993-bfeb-53cbbbba6f08/parent/12341234-1234-1234-1234-123412341234/",
1278
+ status=500,
1279
+ )
1280
+
1281
+ with pytest.raises(ErrorResponse):
1282
+ mock_elements_worker.create_element_parent(
1283
+ parent=parent,
1284
+ child=child,
1285
+ )
1286
+
1287
+ assert len(responses.calls) == len(BASE_API_CALLS) + 5
1288
+ assert [
1289
+ (call.request.method, call.request.url) for call in responses.calls
1290
+ ] == BASE_API_CALLS + [
1291
+ # We retry 5 times the API call
1292
+ (
1293
+ "POST",
1294
+ "http://testserver/api/v1/element/497f6eca-6276-4993-bfeb-53cbbbba6f08/parent/12341234-1234-1234-1234-123412341234/",
1295
+ ),
1296
+ ] * 5
1297
+
1298
+
1299
+ def test_create_element_parent(responses, mock_elements_worker):
1300
+ parent = Element({"id": "12341234-1234-1234-1234-123412341234"})
1301
+ child = Element({"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"})
1302
+ responses.add(
1303
+ responses.POST,
1304
+ "http://testserver/api/v1/element/497f6eca-6276-4993-bfeb-53cbbbba6f08/parent/12341234-1234-1234-1234-123412341234/",
1305
+ status=200,
1306
+ json={
1307
+ "parent": "12341234-1234-1234-1234-123412341234",
1308
+ "child": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
1309
+ },
1310
+ )
1311
+
1312
+ created_element_parent = mock_elements_worker.create_element_parent(
1313
+ parent=parent,
1314
+ child=child,
1315
+ )
1316
+
1317
+ assert len(responses.calls) == len(BASE_API_CALLS) + 1
1318
+ assert [
1319
+ (call.request.method, call.request.url) for call in responses.calls
1320
+ ] == BASE_API_CALLS + [
1321
+ (
1322
+ "POST",
1323
+ "http://testserver/api/v1/element/497f6eca-6276-4993-bfeb-53cbbbba6f08/parent/12341234-1234-1234-1234-123412341234/",
1324
+ ),
1325
+ ]
1326
+ assert created_element_parent == {
1327
+ "parent": "12341234-1234-1234-1234-123412341234",
1328
+ "child": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
1329
+ }
1330
+
1331
+
1220
1332
  @pytest.mark.parametrize(
1221
1333
  ("payload", "error"),
1222
1334
  [
@@ -1658,13 +1770,11 @@ def test_list_element_children_wrong_with_metadata(mock_elements_worker):
1658
1770
  @pytest.mark.parametrize(
1659
1771
  ("param", "value"),
1660
1772
  [
1661
- ("worker_version", 1234),
1662
1773
  ("worker_run", 1234),
1663
- ("transcription_worker_version", 1234),
1664
1774
  ("transcription_worker_run", 1234),
1665
1775
  ],
1666
1776
  )
1667
- def test_list_element_children_wrong_worker_version(mock_elements_worker, param, value):
1777
+ def test_list_element_children_wrong_worker_run(mock_elements_worker, param, value):
1668
1778
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
1669
1779
 
1670
1780
  with pytest.raises(AssertionError, match=f"{param} should be of type str or bool"):
@@ -1674,16 +1784,39 @@ def test_list_element_children_wrong_worker_version(mock_elements_worker, param,
1674
1784
  )
1675
1785
 
1676
1786
 
1787
+ @pytest.mark.parametrize(
1788
+ ("param", "alternative", "value"),
1789
+ [
1790
+ ("worker_version", "worker_run", 1234),
1791
+ ("transcription_worker_version", "transcription_worker_run", 1234),
1792
+ ],
1793
+ )
1794
+ def test_list_element_children_wrong_worker_version(
1795
+ mock_elements_worker, param, alternative, value
1796
+ ):
1797
+ elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
1798
+
1799
+ # WARNING: pytest.deprecated_call must be placed BEFORE pytest.raises, otherwise `match` argument won't be checked
1800
+ with (
1801
+ pytest.deprecated_call(
1802
+ match=f"`{param}` usage is deprecated. Consider using `{alternative}` instead."
1803
+ ),
1804
+ pytest.raises(AssertionError, match=f"{param} should be of type str or bool"),
1805
+ ):
1806
+ mock_elements_worker.list_element_children(
1807
+ element=elt,
1808
+ **{param: value},
1809
+ )
1810
+
1811
+
1677
1812
  @pytest.mark.parametrize(
1678
1813
  "param",
1679
1814
  [
1680
- "worker_version",
1681
1815
  "worker_run",
1682
- "transcription_worker_version",
1683
1816
  "transcription_worker_run",
1684
1817
  ],
1685
1818
  )
1686
- def test_list_element_children_wrong_bool_worker_version(mock_elements_worker, param):
1819
+ def test_list_element_children_wrong_bool_worker_run(mock_elements_worker, param):
1687
1820
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
1688
1821
 
1689
1822
  with pytest.raises(
@@ -1695,6 +1828,33 @@ def test_list_element_children_wrong_bool_worker_version(mock_elements_worker, p
1695
1828
  )
1696
1829
 
1697
1830
 
1831
+ @pytest.mark.parametrize(
1832
+ ("param", "alternative"),
1833
+ [
1834
+ ("worker_version", "worker_run"),
1835
+ ("transcription_worker_version", "transcription_worker_run"),
1836
+ ],
1837
+ )
1838
+ def test_list_element_children_wrong_bool_worker_version(
1839
+ mock_elements_worker, param, alternative
1840
+ ):
1841
+ elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
1842
+
1843
+ # WARNING: pytest.deprecated_call must be placed BEFORE pytest.raises, otherwise `match` argument won't be checked
1844
+ with (
1845
+ pytest.deprecated_call(
1846
+ match=f"`{param}` usage is deprecated. Consider using `{alternative}` instead."
1847
+ ),
1848
+ pytest.raises(
1849
+ AssertionError, match=f"if of type bool, {param} can only be set to False"
1850
+ ),
1851
+ ):
1852
+ mock_elements_worker.list_element_children(
1853
+ element=elt,
1854
+ **{param: True},
1855
+ )
1856
+
1857
+
1698
1858
  def test_list_element_children_api_error(responses, mock_elements_worker):
1699
1859
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
1700
1860
  responses.add(
@@ -1830,10 +1990,15 @@ def test_list_element_children_manual_worker_version(responses, mock_elements_wo
1830
1990
  },
1831
1991
  )
1832
1992
 
1833
- for idx, child in enumerate(
1834
- mock_elements_worker.list_element_children(element=elt, worker_version=False)
1993
+ with pytest.deprecated_call(
1994
+ match="`worker_version` usage is deprecated. Consider using `worker_run` instead."
1835
1995
  ):
1836
- assert child == expected_children[idx]
1996
+ for idx, child in enumerate(
1997
+ mock_elements_worker.list_element_children(
1998
+ element=elt, worker_version=False
1999
+ )
2000
+ ):
2001
+ assert child == expected_children[idx]
1837
2002
 
1838
2003
  assert len(responses.calls) == len(BASE_API_CALLS) + 1
1839
2004
  assert [
@@ -1926,56 +2091,84 @@ def test_list_element_children_with_cache_unhandled_param(
1926
2091
  },
1927
2092
  ("22222222-2222-2222-2222-222222222222",),
1928
2093
  ),
1929
- # Filter on element and worker version should give first two elements
2094
+ # Filter on element and worker run should give second
1930
2095
  (
1931
2096
  {
1932
2097
  "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
1933
- "worker_version": "56785678-5678-5678-5678-567856785678",
2098
+ "worker_run": "56785678-5678-5678-5678-567856785678",
1934
2099
  },
1935
- (
1936
- "11111111-1111-1111-1111-111111111111",
1937
- "22222222-2222-2222-2222-222222222222",
1938
- ),
2100
+ ("22222222-2222-2222-2222-222222222222",),
1939
2101
  ),
1940
- # Filter on element, type something and worker version should give first
2102
+ # Filter on element, manual worker run should give first and third
1941
2103
  (
1942
2104
  {
1943
2105
  "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
1944
- "type": "something",
1945
- "worker_version": "56785678-5678-5678-5678-567856785678",
2106
+ "worker_run": False,
1946
2107
  },
1947
- ("11111111-1111-1111-1111-111111111111",),
2108
+ (
2109
+ "11111111-1111-1111-1111-111111111111",
2110
+ "33333333-3333-3333-3333-333333333333",
2111
+ ),
1948
2112
  ),
1949
- # Filter on element, manual worker version should give third
2113
+ ],
2114
+ )
2115
+ def test_list_element_children_with_cache(
2116
+ responses,
2117
+ mock_elements_worker_with_cache,
2118
+ filters,
2119
+ expected_ids,
2120
+ ):
2121
+ # Check we have 5 elements already present in database
2122
+ assert CachedElement.select().count() == 5
2123
+
2124
+ # Query database through cache
2125
+ elements = mock_elements_worker_with_cache.list_element_children(**filters)
2126
+ assert elements.count() == len(expected_ids)
2127
+ for child, expected_id in zip(elements.order_by("id"), expected_ids, strict=True):
2128
+ assert child.id == UUID(expected_id)
2129
+
2130
+ # Check the worker never hits the API for elements
2131
+ assert len(responses.calls) == len(BASE_API_CALLS)
2132
+ assert [
2133
+ (call.request.method, call.request.url) for call in responses.calls
2134
+ ] == BASE_API_CALLS
2135
+
2136
+
2137
+ @pytest.mark.usefixtures("_mock_cached_elements")
2138
+ @pytest.mark.parametrize(
2139
+ ("filters", "expected_ids"),
2140
+ [
2141
+ # Filter on element and worker version
1950
2142
  (
1951
2143
  {
1952
2144
  "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
1953
- "worker_version": False,
2145
+ "worker_version": "56785678-5678-5678-5678-567856785678",
1954
2146
  },
1955
- ("33333333-3333-3333-3333-333333333333",),
2147
+ (
2148
+ "11111111-1111-1111-1111-111111111111",
2149
+ "22222222-2222-2222-2222-222222222222",
2150
+ ),
1956
2151
  ),
1957
- # Filter on element and worker run should give second
2152
+ # Filter on element, type double_page and worker version
1958
2153
  (
1959
2154
  {
1960
2155
  "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
1961
- "worker_run": "56785678-5678-5678-5678-567856785678",
2156
+ "type": "page",
2157
+ "worker_version": "56785678-5678-5678-5678-567856785678",
1962
2158
  },
1963
2159
  ("22222222-2222-2222-2222-222222222222",),
1964
2160
  ),
1965
- # Filter on element, manual worker run should give first and third
2161
+ # Filter on element, manual worker version
1966
2162
  (
1967
2163
  {
1968
2164
  "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
1969
- "worker_run": False,
2165
+ "worker_version": False,
1970
2166
  },
1971
- (
1972
- "11111111-1111-1111-1111-111111111111",
1973
- "33333333-3333-3333-3333-333333333333",
1974
- ),
2167
+ ("33333333-3333-3333-3333-333333333333",),
1975
2168
  ),
1976
2169
  ],
1977
2170
  )
1978
- def test_list_element_children_with_cache(
2171
+ def test_list_element_children_with_cache_deprecation(
1979
2172
  responses,
1980
2173
  mock_elements_worker_with_cache,
1981
2174
  filters,
@@ -1984,8 +2177,11 @@ def test_list_element_children_with_cache(
1984
2177
  # Check we have 5 elements already present in database
1985
2178
  assert CachedElement.select().count() == 5
1986
2179
 
1987
- # Query database through cache
1988
- elements = mock_elements_worker_with_cache.list_element_children(**filters)
2180
+ with pytest.deprecated_call(
2181
+ match="`worker_version` usage is deprecated. Consider using `worker_run` instead."
2182
+ ):
2183
+ # Query database through cache
2184
+ elements = mock_elements_worker_with_cache.list_element_children(**filters)
1989
2185
  assert elements.count() == len(expected_ids)
1990
2186
  for child, expected_id in zip(elements.order_by("id"), expected_ids, strict=True):
1991
2187
  assert child.id == UUID(expected_id)
@@ -2106,13 +2302,11 @@ def test_list_element_parents_wrong_with_metadata(mock_elements_worker):
2106
2302
  @pytest.mark.parametrize(
2107
2303
  ("param", "value"),
2108
2304
  [
2109
- ("worker_version", 1234),
2110
2305
  ("worker_run", 1234),
2111
- ("transcription_worker_version", 1234),
2112
2306
  ("transcription_worker_run", 1234),
2113
2307
  ],
2114
2308
  )
2115
- def test_list_element_parents_wrong_worker_version(mock_elements_worker, param, value):
2309
+ def test_list_element_parents_wrong_worker_run(mock_elements_worker, param, value):
2116
2310
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
2117
2311
 
2118
2312
  with pytest.raises(AssertionError, match=f"{param} should be of type str or bool"):
@@ -2122,16 +2316,39 @@ def test_list_element_parents_wrong_worker_version(mock_elements_worker, param,
2122
2316
  )
2123
2317
 
2124
2318
 
2319
+ @pytest.mark.parametrize(
2320
+ ("param", "alternative", "value"),
2321
+ [
2322
+ ("worker_version", "worker_run", 1234),
2323
+ ("transcription_worker_version", "transcription_worker_run", 1234),
2324
+ ],
2325
+ )
2326
+ def test_list_element_parents_wrong_worker_version(
2327
+ mock_elements_worker, param, alternative, value
2328
+ ):
2329
+ elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
2330
+
2331
+ # WARNING: pytest.deprecated_call must be placed BEFORE pytest.raises, otherwise `match` argument won't be checked
2332
+ with (
2333
+ pytest.deprecated_call(
2334
+ match=f"`{param}` usage is deprecated. Consider using `{alternative}` instead."
2335
+ ),
2336
+ pytest.raises(AssertionError, match=f"{param} should be of type str or bool"),
2337
+ ):
2338
+ mock_elements_worker.list_element_parents(
2339
+ element=elt,
2340
+ **{param: value},
2341
+ )
2342
+
2343
+
2125
2344
  @pytest.mark.parametrize(
2126
2345
  "param",
2127
2346
  [
2128
- "worker_version",
2129
2347
  "worker_run",
2130
- "transcription_worker_version",
2131
2348
  "transcription_worker_run",
2132
2349
  ],
2133
2350
  )
2134
- def test_list_element_parents_wrong_bool_worker_version(mock_elements_worker, param):
2351
+ def test_list_element_parents_wrong_bool_worker_run(mock_elements_worker, param):
2135
2352
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
2136
2353
 
2137
2354
  with pytest.raises(
@@ -2143,6 +2360,33 @@ def test_list_element_parents_wrong_bool_worker_version(mock_elements_worker, pa
2143
2360
  )
2144
2361
 
2145
2362
 
2363
+ @pytest.mark.parametrize(
2364
+ ("param", "alternative"),
2365
+ [
2366
+ ("worker_version", "worker_run"),
2367
+ ("transcription_worker_version", "transcription_worker_run"),
2368
+ ],
2369
+ )
2370
+ def test_list_element_parents_wrong_bool_worker_version(
2371
+ mock_elements_worker, param, alternative
2372
+ ):
2373
+ elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
2374
+
2375
+ # WARNING: pytest.deprecated_call must be placed BEFORE pytest.raises, otherwise `match` argument won't be checked
2376
+ with (
2377
+ pytest.deprecated_call(
2378
+ match=f"`{param}` usage is deprecated. Consider using `{alternative}` instead."
2379
+ ),
2380
+ pytest.raises(
2381
+ AssertionError, match=f"if of type bool, {param} can only be set to False"
2382
+ ),
2383
+ ):
2384
+ mock_elements_worker.list_element_parents(
2385
+ element=elt,
2386
+ **{param: True},
2387
+ )
2388
+
2389
+
2146
2390
  def test_list_element_parents_api_error(responses, mock_elements_worker):
2147
2391
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
2148
2392
  responses.add(
@@ -2278,10 +2522,13 @@ def test_list_element_parents_manual_worker_version(responses, mock_elements_wor
2278
2522
  },
2279
2523
  )
2280
2524
 
2281
- for idx, parent in enumerate(
2282
- mock_elements_worker.list_element_parents(element=elt, worker_version=False)
2525
+ with pytest.deprecated_call(
2526
+ match="`worker_version` usage is deprecated. Consider using `worker_run` instead."
2283
2527
  ):
2284
- assert parent == expected_parents[idx]
2528
+ for idx, parent in enumerate(
2529
+ mock_elements_worker.list_element_parents(element=elt, worker_version=False)
2530
+ ):
2531
+ assert parent == expected_parents[idx]
2285
2532
 
2286
2533
  assert len(responses.calls) == len(BASE_API_CALLS) + 1
2287
2534
  assert [
@@ -2370,6 +2617,50 @@ def test_list_element_parents_with_cache_unhandled_param(
2370
2617
  },
2371
2618
  "12341234-1234-1234-1234-123412341234",
2372
2619
  ),
2620
+ # Filter on element and worker run
2621
+ (
2622
+ {
2623
+ "element": CachedElement(id="22222222-2222-2222-2222-222222222222"),
2624
+ "worker_run": "56785678-5678-5678-5678-567856785678",
2625
+ },
2626
+ "12341234-1234-1234-1234-123412341234",
2627
+ ),
2628
+ # Filter on element, manual worker run
2629
+ (
2630
+ {
2631
+ "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
2632
+ "worker_run": False,
2633
+ },
2634
+ "99999999-9999-9999-9999-999999999999",
2635
+ ),
2636
+ ],
2637
+ )
2638
+ def test_list_element_parents_with_cache(
2639
+ responses,
2640
+ mock_elements_worker_with_cache,
2641
+ filters,
2642
+ expected_id,
2643
+ ):
2644
+ # Check we have 5 elements already present in database
2645
+ assert CachedElement.select().count() == 5
2646
+
2647
+ # Query database through cache
2648
+ elements = mock_elements_worker_with_cache.list_element_parents(**filters)
2649
+ assert elements.count() == 1
2650
+ for parent in elements.order_by("id"):
2651
+ assert parent.id == UUID(expected_id)
2652
+
2653
+ # Check the worker never hits the API for elements
2654
+ assert len(responses.calls) == len(BASE_API_CALLS)
2655
+ assert [
2656
+ (call.request.method, call.request.url) for call in responses.calls
2657
+ ] == BASE_API_CALLS
2658
+
2659
+
2660
+ @pytest.mark.usefixtures("_mock_cached_elements")
2661
+ @pytest.mark.parametrize(
2662
+ ("filters", "expected_id"),
2663
+ [
2373
2664
  # Filter on element and worker version
2374
2665
  (
2375
2666
  {
@@ -2395,25 +2686,9 @@ def test_list_element_parents_with_cache_unhandled_param(
2395
2686
  },
2396
2687
  "99999999-9999-9999-9999-999999999999",
2397
2688
  ),
2398
- # Filter on element and worker run
2399
- (
2400
- {
2401
- "element": CachedElement(id="22222222-2222-2222-2222-222222222222"),
2402
- "worker_run": "56785678-5678-5678-5678-567856785678",
2403
- },
2404
- "12341234-1234-1234-1234-123412341234",
2405
- ),
2406
- # Filter on element, manual worker run
2407
- (
2408
- {
2409
- "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
2410
- "worker_run": False,
2411
- },
2412
- "99999999-9999-9999-9999-999999999999",
2413
- ),
2414
2689
  ],
2415
2690
  )
2416
- def test_list_element_parents_with_cache(
2691
+ def test_list_element_parents_with_cache_deprecation(
2417
2692
  responses,
2418
2693
  mock_elements_worker_with_cache,
2419
2694
  filters,
@@ -2422,8 +2697,11 @@ def test_list_element_parents_with_cache(
2422
2697
  # Check we have 5 elements already present in database
2423
2698
  assert CachedElement.select().count() == 5
2424
2699
 
2425
- # Query database through cache
2426
- elements = mock_elements_worker_with_cache.list_element_parents(**filters)
2700
+ with pytest.deprecated_call(
2701
+ match="`worker_version` usage is deprecated. Consider using `worker_run` instead."
2702
+ ):
2703
+ # Query database through cache
2704
+ elements = mock_elements_worker_with_cache.list_element_parents(**filters)
2427
2705
  assert elements.count() == 1
2428
2706
  for parent in elements.order_by("id"):
2429
2707
  assert parent.id == UUID(expected_id)
@@ -708,7 +708,7 @@ def test_create_transcription_entity_with_confidence_with_cache(
708
708
  ]
709
709
 
710
710
 
711
- def test_list_transcription_entities(fake_dummy_worker):
711
+ def test_list_transcription_entities_deprecation(fake_dummy_worker):
712
712
  transcription = Transcription({"id": "fake_transcription_id"})
713
713
  worker_version = "worker_version_id"
714
714
  fake_dummy_worker.api_client.add_response(
@@ -717,8 +717,28 @@ def test_list_transcription_entities(fake_dummy_worker):
717
717
  worker_version=worker_version,
718
718
  response={"id": "entity_id"},
719
719
  )
720
+ with pytest.deprecated_call(
721
+ match="`worker_version` usage is deprecated. Consider using `worker_run` instead."
722
+ ):
723
+ assert fake_dummy_worker.list_transcription_entities(
724
+ transcription, worker_version=worker_version
725
+ ) == {"id": "entity_id"}
726
+
727
+ assert len(fake_dummy_worker.api_client.history) == 1
728
+ assert len(fake_dummy_worker.api_client.responses) == 0
729
+
730
+
731
+ def test_list_transcription_entities(fake_dummy_worker):
732
+ transcription = Transcription({"id": "fake_transcription_id"})
733
+ worker_run = "worker_run_id"
734
+ fake_dummy_worker.api_client.add_response(
735
+ "ListTranscriptionEntities",
736
+ id=transcription.id,
737
+ worker_run=worker_run,
738
+ response={"id": "entity_id"},
739
+ )
720
740
  assert fake_dummy_worker.list_transcription_entities(
721
- transcription, worker_version
741
+ transcription, worker_run=worker_run
722
742
  ) == {"id": "entity_id"}
723
743
 
724
744
  assert len(fake_dummy_worker.api_client.history) == 1