arkindex-base-worker 0.3.6rc5__py3-none-any.whl → 0.3.7.post1__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 (40) hide show
  1. {arkindex_base_worker-0.3.6rc5.dist-info → arkindex_base_worker-0.3.7.post1.dist-info}/METADATA +14 -16
  2. arkindex_base_worker-0.3.7.post1.dist-info/RECORD +47 -0
  3. {arkindex_base_worker-0.3.6rc5.dist-info → arkindex_base_worker-0.3.7.post1.dist-info}/WHEEL +1 -1
  4. {arkindex_base_worker-0.3.6rc5.dist-info → arkindex_base_worker-0.3.7.post1.dist-info}/top_level.txt +2 -0
  5. arkindex_worker/cache.py +14 -0
  6. arkindex_worker/image.py +29 -19
  7. arkindex_worker/models.py +14 -2
  8. arkindex_worker/utils.py +17 -3
  9. arkindex_worker/worker/__init__.py +122 -125
  10. arkindex_worker/worker/base.py +25 -45
  11. arkindex_worker/worker/classification.py +18 -25
  12. arkindex_worker/worker/dataset.py +24 -18
  13. arkindex_worker/worker/element.py +45 -6
  14. arkindex_worker/worker/entity.py +35 -4
  15. arkindex_worker/worker/metadata.py +21 -11
  16. arkindex_worker/worker/training.py +16 -0
  17. arkindex_worker/worker/transcription.py +45 -5
  18. arkindex_worker/worker/version.py +22 -0
  19. hooks/pre_gen_project.py +3 -0
  20. tests/conftest.py +15 -7
  21. tests/test_base_worker.py +0 -6
  22. tests/test_dataset_worker.py +292 -410
  23. tests/test_elements_worker/test_classifications.py +365 -539
  24. tests/test_elements_worker/test_cli.py +1 -1
  25. tests/test_elements_worker/test_dataset.py +97 -116
  26. tests/test_elements_worker/test_elements.py +227 -61
  27. tests/test_elements_worker/test_entities.py +22 -2
  28. tests/test_elements_worker/test_metadata.py +53 -27
  29. tests/test_elements_worker/test_training.py +35 -0
  30. tests/test_elements_worker/test_transcriptions.py +149 -16
  31. tests/test_elements_worker/test_worker.py +19 -6
  32. tests/test_image.py +37 -0
  33. tests/test_utils.py +23 -1
  34. worker-demo/tests/__init__.py +0 -0
  35. worker-demo/tests/conftest.py +32 -0
  36. worker-demo/tests/test_worker.py +12 -0
  37. worker-demo/worker_demo/__init__.py +6 -0
  38. worker-demo/worker_demo/worker.py +19 -0
  39. arkindex_base_worker-0.3.6rc5.dist-info/RECORD +0 -41
  40. {arkindex_base_worker-0.3.6rc5.dist-info → arkindex_base_worker-0.3.7.post1.dist-info}/LICENSE +0 -0
@@ -1770,13 +1770,11 @@ def test_list_element_children_wrong_with_metadata(mock_elements_worker):
1770
1770
  @pytest.mark.parametrize(
1771
1771
  ("param", "value"),
1772
1772
  [
1773
- ("worker_version", 1234),
1774
1773
  ("worker_run", 1234),
1775
- ("transcription_worker_version", 1234),
1776
1774
  ("transcription_worker_run", 1234),
1777
1775
  ],
1778
1776
  )
1779
- 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):
1780
1778
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
1781
1779
 
1782
1780
  with pytest.raises(AssertionError, match=f"{param} should be of type str or bool"):
@@ -1786,16 +1784,39 @@ def test_list_element_children_wrong_worker_version(mock_elements_worker, param,
1786
1784
  )
1787
1785
 
1788
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
+
1789
1812
  @pytest.mark.parametrize(
1790
1813
  "param",
1791
1814
  [
1792
- "worker_version",
1793
1815
  "worker_run",
1794
- "transcription_worker_version",
1795
1816
  "transcription_worker_run",
1796
1817
  ],
1797
1818
  )
1798
- 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):
1799
1820
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
1800
1821
 
1801
1822
  with pytest.raises(
@@ -1807,6 +1828,33 @@ def test_list_element_children_wrong_bool_worker_version(mock_elements_worker, p
1807
1828
  )
1808
1829
 
1809
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
+
1810
1858
  def test_list_element_children_api_error(responses, mock_elements_worker):
1811
1859
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
1812
1860
  responses.add(
@@ -1942,10 +1990,15 @@ def test_list_element_children_manual_worker_version(responses, mock_elements_wo
1942
1990
  },
1943
1991
  )
1944
1992
 
1945
- for idx, child in enumerate(
1946
- 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."
1947
1995
  ):
1948
- 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]
1949
2002
 
1950
2003
  assert len(responses.calls) == len(BASE_API_CALLS) + 1
1951
2004
  assert [
@@ -2038,56 +2091,84 @@ def test_list_element_children_with_cache_unhandled_param(
2038
2091
  },
2039
2092
  ("22222222-2222-2222-2222-222222222222",),
2040
2093
  ),
2041
- # Filter on element and worker version should give first two elements
2094
+ # Filter on element and worker run should give second
2042
2095
  (
2043
2096
  {
2044
2097
  "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
2045
- "worker_version": "56785678-5678-5678-5678-567856785678",
2098
+ "worker_run": "56785678-5678-5678-5678-567856785678",
2046
2099
  },
2047
- (
2048
- "11111111-1111-1111-1111-111111111111",
2049
- "22222222-2222-2222-2222-222222222222",
2050
- ),
2100
+ ("22222222-2222-2222-2222-222222222222",),
2051
2101
  ),
2052
- # Filter on element, type something and worker version should give first
2102
+ # Filter on element, manual worker run should give first and third
2053
2103
  (
2054
2104
  {
2055
2105
  "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
2056
- "type": "something",
2057
- "worker_version": "56785678-5678-5678-5678-567856785678",
2106
+ "worker_run": False,
2058
2107
  },
2059
- ("11111111-1111-1111-1111-111111111111",),
2108
+ (
2109
+ "11111111-1111-1111-1111-111111111111",
2110
+ "33333333-3333-3333-3333-333333333333",
2111
+ ),
2060
2112
  ),
2061
- # 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
2062
2142
  (
2063
2143
  {
2064
2144
  "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
2065
- "worker_version": False,
2145
+ "worker_version": "56785678-5678-5678-5678-567856785678",
2066
2146
  },
2067
- ("33333333-3333-3333-3333-333333333333",),
2147
+ (
2148
+ "11111111-1111-1111-1111-111111111111",
2149
+ "22222222-2222-2222-2222-222222222222",
2150
+ ),
2068
2151
  ),
2069
- # Filter on element and worker run should give second
2152
+ # Filter on element, type double_page and worker version
2070
2153
  (
2071
2154
  {
2072
2155
  "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
2073
- "worker_run": "56785678-5678-5678-5678-567856785678",
2156
+ "type": "page",
2157
+ "worker_version": "56785678-5678-5678-5678-567856785678",
2074
2158
  },
2075
2159
  ("22222222-2222-2222-2222-222222222222",),
2076
2160
  ),
2077
- # Filter on element, manual worker run should give first and third
2161
+ # Filter on element, manual worker version
2078
2162
  (
2079
2163
  {
2080
2164
  "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
2081
- "worker_run": False,
2165
+ "worker_version": False,
2082
2166
  },
2083
- (
2084
- "11111111-1111-1111-1111-111111111111",
2085
- "33333333-3333-3333-3333-333333333333",
2086
- ),
2167
+ ("33333333-3333-3333-3333-333333333333",),
2087
2168
  ),
2088
2169
  ],
2089
2170
  )
2090
- def test_list_element_children_with_cache(
2171
+ def test_list_element_children_with_cache_deprecation(
2091
2172
  responses,
2092
2173
  mock_elements_worker_with_cache,
2093
2174
  filters,
@@ -2096,8 +2177,11 @@ def test_list_element_children_with_cache(
2096
2177
  # Check we have 5 elements already present in database
2097
2178
  assert CachedElement.select().count() == 5
2098
2179
 
2099
- # Query database through cache
2100
- 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)
2101
2185
  assert elements.count() == len(expected_ids)
2102
2186
  for child, expected_id in zip(elements.order_by("id"), expected_ids, strict=True):
2103
2187
  assert child.id == UUID(expected_id)
@@ -2218,13 +2302,11 @@ def test_list_element_parents_wrong_with_metadata(mock_elements_worker):
2218
2302
  @pytest.mark.parametrize(
2219
2303
  ("param", "value"),
2220
2304
  [
2221
- ("worker_version", 1234),
2222
2305
  ("worker_run", 1234),
2223
- ("transcription_worker_version", 1234),
2224
2306
  ("transcription_worker_run", 1234),
2225
2307
  ],
2226
2308
  )
2227
- 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):
2228
2310
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
2229
2311
 
2230
2312
  with pytest.raises(AssertionError, match=f"{param} should be of type str or bool"):
@@ -2234,16 +2316,39 @@ def test_list_element_parents_wrong_worker_version(mock_elements_worker, param,
2234
2316
  )
2235
2317
 
2236
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
+
2237
2344
  @pytest.mark.parametrize(
2238
2345
  "param",
2239
2346
  [
2240
- "worker_version",
2241
2347
  "worker_run",
2242
- "transcription_worker_version",
2243
2348
  "transcription_worker_run",
2244
2349
  ],
2245
2350
  )
2246
- 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):
2247
2352
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
2248
2353
 
2249
2354
  with pytest.raises(
@@ -2255,6 +2360,33 @@ def test_list_element_parents_wrong_bool_worker_version(mock_elements_worker, pa
2255
2360
  )
2256
2361
 
2257
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
+
2258
2390
  def test_list_element_parents_api_error(responses, mock_elements_worker):
2259
2391
  elt = Element({"id": "12341234-1234-1234-1234-123412341234"})
2260
2392
  responses.add(
@@ -2390,10 +2522,13 @@ def test_list_element_parents_manual_worker_version(responses, mock_elements_wor
2390
2522
  },
2391
2523
  )
2392
2524
 
2393
- for idx, parent in enumerate(
2394
- 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."
2395
2527
  ):
2396
- 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]
2397
2532
 
2398
2533
  assert len(responses.calls) == len(BASE_API_CALLS) + 1
2399
2534
  assert [
@@ -2482,6 +2617,50 @@ def test_list_element_parents_with_cache_unhandled_param(
2482
2617
  },
2483
2618
  "12341234-1234-1234-1234-123412341234",
2484
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
+ [
2485
2664
  # Filter on element and worker version
2486
2665
  (
2487
2666
  {
@@ -2507,25 +2686,9 @@ def test_list_element_parents_with_cache_unhandled_param(
2507
2686
  },
2508
2687
  "99999999-9999-9999-9999-999999999999",
2509
2688
  ),
2510
- # Filter on element and worker run
2511
- (
2512
- {
2513
- "element": CachedElement(id="22222222-2222-2222-2222-222222222222"),
2514
- "worker_run": "56785678-5678-5678-5678-567856785678",
2515
- },
2516
- "12341234-1234-1234-1234-123412341234",
2517
- ),
2518
- # Filter on element, manual worker run
2519
- (
2520
- {
2521
- "element": CachedElement(id="12341234-1234-1234-1234-123412341234"),
2522
- "worker_run": False,
2523
- },
2524
- "99999999-9999-9999-9999-999999999999",
2525
- ),
2526
2689
  ],
2527
2690
  )
2528
- def test_list_element_parents_with_cache(
2691
+ def test_list_element_parents_with_cache_deprecation(
2529
2692
  responses,
2530
2693
  mock_elements_worker_with_cache,
2531
2694
  filters,
@@ -2534,8 +2697,11 @@ def test_list_element_parents_with_cache(
2534
2697
  # Check we have 5 elements already present in database
2535
2698
  assert CachedElement.select().count() == 5
2536
2699
 
2537
- # Query database through cache
2538
- 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)
2539
2705
  assert elements.count() == 1
2540
2706
  for parent in elements.order_by("id"):
2541
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
@@ -259,7 +259,7 @@ def test_create_metadata_cached_element(responses, mock_elements_worker_with_cac
259
259
  ],
260
260
  ],
261
261
  )
262
- def test_create_metadatas(responses, mock_elements_worker, metadata_list):
262
+ def test_create_metadata_bulk(responses, mock_elements_worker, metadata_list):
263
263
  element = Element({"id": "12341234-1234-1234-1234-123412341234"})
264
264
  responses.add(
265
265
  responses.POST,
@@ -280,7 +280,7 @@ def test_create_metadatas(responses, mock_elements_worker, metadata_list):
280
280
  },
281
281
  )
282
282
 
283
- created_metadata_list = mock_elements_worker.create_metadatas(
283
+ created_metadata_list = mock_elements_worker.create_metadata_bulk(
284
284
  element, metadata_list
285
285
  )
286
286
 
@@ -327,7 +327,7 @@ def test_create_metadatas(responses, mock_elements_worker, metadata_list):
327
327
  ],
328
328
  ],
329
329
  )
330
- def test_create_metadatas_cached_element(
330
+ def test_create_metadata_bulk_cached_element(
331
331
  responses, mock_elements_worker_with_cache, metadata_list
332
332
  ):
333
333
  element = CachedElement.create(
@@ -352,7 +352,7 @@ def test_create_metadatas_cached_element(
352
352
  },
353
353
  )
354
354
 
355
- created_metadata_list = mock_elements_worker_with_cache.create_metadatas(
355
+ created_metadata_list = mock_elements_worker_with_cache.create_metadata_bulk(
356
356
  element, metadata_list
357
357
  )
358
358
 
@@ -386,7 +386,7 @@ def test_create_metadatas_cached_element(
386
386
 
387
387
 
388
388
  @pytest.mark.parametrize("wrong_element", [None, "not_element_type", 1234, 12.5])
389
- def test_create_metadatas_wrong_element(mock_elements_worker, wrong_element):
389
+ def test_create_metadata_bulk_wrong_element(mock_elements_worker, wrong_element):
390
390
  wrong_metadata_list = [
391
391
  {"type": MetaType.Text, "name": "fake_name", "value": "fake_value"}
392
392
  ]
@@ -394,13 +394,13 @@ def test_create_metadatas_wrong_element(mock_elements_worker, wrong_element):
394
394
  AssertionError,
395
395
  match="element shouldn't be null and should be of type Element or CachedElement",
396
396
  ):
397
- mock_elements_worker.create_metadatas(
398
- element=wrong_element, metadatas=wrong_metadata_list
397
+ mock_elements_worker.create_metadata_bulk(
398
+ element=wrong_element, metadata_list=wrong_metadata_list
399
399
  )
400
400
 
401
401
 
402
402
  @pytest.mark.parametrize("wrong_type", [None, "not_metadata_type", 1234, 12.5])
403
- def test_create_metadatas_wrong_type(mock_elements_worker, wrong_type):
403
+ def test_create_metadata_bulk_wrong_type(mock_elements_worker, wrong_type):
404
404
  element = Element({"id": "12341234-1234-1234-1234-123412341234"})
405
405
  wrong_metadata_list = [
406
406
  {"type": wrong_type, "name": "fake_name", "value": "fake_value"}
@@ -408,13 +408,13 @@ def test_create_metadatas_wrong_type(mock_elements_worker, wrong_type):
408
408
  with pytest.raises(
409
409
  AssertionError, match="type shouldn't be null and should be of type MetaType"
410
410
  ):
411
- mock_elements_worker.create_metadatas(
412
- element=element, metadatas=wrong_metadata_list
411
+ mock_elements_worker.create_metadata_bulk(
412
+ element=element, metadata_list=wrong_metadata_list
413
413
  )
414
414
 
415
415
 
416
416
  @pytest.mark.parametrize("wrong_name", [None, 1234, 12.5, [1, 2, 3, 4]])
417
- def test_create_metadatas_wrong_name(mock_elements_worker, wrong_name):
417
+ def test_create_metadata_bulk_wrong_name(mock_elements_worker, wrong_name):
418
418
  element = Element({"id": "fake_element_id"})
419
419
  wrong_metadata_list = [
420
420
  {"type": MetaType.Text, "name": wrong_name, "value": "fake_value"}
@@ -422,13 +422,13 @@ def test_create_metadatas_wrong_name(mock_elements_worker, wrong_name):
422
422
  with pytest.raises(
423
423
  AssertionError, match="name shouldn't be null and should be of type str"
424
424
  ):
425
- mock_elements_worker.create_metadatas(
426
- element=element, metadatas=wrong_metadata_list
425
+ mock_elements_worker.create_metadata_bulk(
426
+ element=element, metadata_list=wrong_metadata_list
427
427
  )
428
428
 
429
429
 
430
430
  @pytest.mark.parametrize("wrong_value", [None, [1, 2, 3, 4]])
431
- def test_create_metadatas_wrong_value(mock_elements_worker, wrong_value):
431
+ def test_create_metadata_bulk_wrong_value(mock_elements_worker, wrong_value):
432
432
  element = Element({"id": "fake_element_id"})
433
433
  wrong_metadata_list = [
434
434
  {"type": MetaType.Text, "name": "fake_name", "value": wrong_value}
@@ -439,13 +439,13 @@ def test_create_metadatas_wrong_value(mock_elements_worker, wrong_value):
439
439
  "value shouldn't be null and should be of type (str or float or int)"
440
440
  ),
441
441
  ):
442
- mock_elements_worker.create_metadatas(
443
- element=element, metadatas=wrong_metadata_list
442
+ mock_elements_worker.create_metadata_bulk(
443
+ element=element, metadata_list=wrong_metadata_list
444
444
  )
445
445
 
446
446
 
447
447
  @pytest.mark.parametrize("wrong_entity", [[1, 2, 3, 4], 1234, 12.5])
448
- def test_create_metadatas_wrong_entity(mock_elements_worker, wrong_entity):
448
+ def test_create_metadata_bulk_wrong_entity(mock_elements_worker, wrong_entity):
449
449
  element = Element({"id": "fake_element_id"})
450
450
  wrong_metadata_list = [
451
451
  {
@@ -456,12 +456,12 @@ def test_create_metadatas_wrong_entity(mock_elements_worker, wrong_entity):
456
456
  }
457
457
  ]
458
458
  with pytest.raises(AssertionError, match="entity_id should be None or a str"):
459
- mock_elements_worker.create_metadatas(
460
- element=element, metadatas=wrong_metadata_list
459
+ mock_elements_worker.create_metadata_bulk(
460
+ element=element, metadata_list=wrong_metadata_list
461
461
  )
462
462
 
463
463
 
464
- def test_create_metadatas_api_error(responses, mock_elements_worker):
464
+ def test_create_metadata_bulk_api_error(responses, mock_elements_worker):
465
465
  element = Element({"id": "12341234-1234-1234-1234-123412341234"})
466
466
  metadata_list = [
467
467
  {
@@ -478,7 +478,7 @@ def test_create_metadatas_api_error(responses, mock_elements_worker):
478
478
  )
479
479
 
480
480
  with pytest.raises(ErrorResponse):
481
- mock_elements_worker.create_metadatas(element, metadata_list)
481
+ mock_elements_worker.create_metadata_bulk(element, metadata_list)
482
482
 
483
483
  assert len(responses.calls) == len(BASE_API_CALLS) + 5
484
484
  assert [
@@ -508,14 +508,23 @@ def test_create_metadatas_api_error(responses, mock_elements_worker):
508
508
  ]
509
509
 
510
510
 
511
+ def test_list_element_metadata_wrong_load_parents(fake_dummy_worker):
512
+ element = Element({"id": "element_id"})
513
+ with pytest.raises(AssertionError, match="load_parents should be of type bool"):
514
+ fake_dummy_worker.list_element_metadata(
515
+ element=element,
516
+ load_parents="not bool",
517
+ )
518
+
519
+
511
520
  def test_list_element_metadata(fake_dummy_worker):
512
521
  element = Element({"id": "element_id"})
513
522
  fake_dummy_worker.api_client.add_response(
514
523
  "ListElementMetaData",
515
524
  id=element.id,
516
- response={"id": "metadata_id"},
525
+ response=[{"id": "metadata_id"}],
517
526
  )
518
- assert fake_dummy_worker.list_element_metadata(element) == {"id": "metadata_id"}
527
+ assert fake_dummy_worker.list_element_metadata(element) == [{"id": "metadata_id"}]
519
528
 
520
529
  assert len(fake_dummy_worker.api_client.history) == 1
521
530
  assert len(fake_dummy_worker.api_client.responses) == 0
@@ -527,11 +536,28 @@ def test_list_element_metadata_cached_element(mock_elements_worker_with_cache):
527
536
  mock_elements_worker_with_cache.api_client.add_response(
528
537
  "ListElementMetaData",
529
538
  id="element_id",
530
- response={"id": "metadata_id"},
539
+ response=[{"id": "metadata_id"}],
531
540
  )
532
- assert mock_elements_worker_with_cache.list_element_metadata(element) == {
533
- "id": "metadata_id"
534
- }
541
+ assert mock_elements_worker_with_cache.list_element_metadata(element) == [
542
+ {"id": "metadata_id"}
543
+ ]
535
544
 
536
545
  assert len(mock_elements_worker_with_cache.api_client.history) == 1
537
546
  assert len(mock_elements_worker_with_cache.api_client.responses) == 0
547
+
548
+
549
+ def test_list_element_metadata_with_load_parents(fake_dummy_worker):
550
+ element = Element({"id": "element_id"})
551
+ fake_dummy_worker.api_client.add_response(
552
+ "ListElementMetaData",
553
+ id=element.id,
554
+ load_parents=True,
555
+ response=[{"id": "metadata_id"}, {"id": "parent_metadata_id"}],
556
+ )
557
+ assert fake_dummy_worker.list_element_metadata(element, load_parents=True) == [
558
+ {"id": "metadata_id"},
559
+ {"id": "parent_metadata_id"},
560
+ ]
561
+
562
+ assert len(fake_dummy_worker.api_client.history) == 1
563
+ assert len(fake_dummy_worker.api_client.responses) == 0