arkindex-base-worker 0.4.0rc5__py3-none-any.whl → 0.5.0__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.4.0rc5.dist-info → arkindex_base_worker-0.5.0.dist-info}/METADATA +10 -13
  2. arkindex_base_worker-0.5.0.dist-info/RECORD +60 -0
  3. {arkindex_base_worker-0.4.0rc5.dist-info → arkindex_base_worker-0.5.0.dist-info}/WHEEL +1 -1
  4. {arkindex_base_worker-0.4.0rc5.dist-info → arkindex_base_worker-0.5.0.dist-info}/top_level.txt +1 -0
  5. arkindex_worker/__init__.py +3 -0
  6. arkindex_worker/cache.py +6 -25
  7. arkindex_worker/image.py +105 -66
  8. arkindex_worker/utils.py +2 -1
  9. arkindex_worker/worker/__init__.py +22 -32
  10. arkindex_worker/worker/base.py +16 -9
  11. arkindex_worker/worker/classification.py +36 -34
  12. arkindex_worker/worker/corpus.py +3 -3
  13. arkindex_worker/worker/dataset.py +9 -9
  14. arkindex_worker/worker/element.py +261 -231
  15. arkindex_worker/worker/entity.py +137 -206
  16. arkindex_worker/worker/image.py +3 -3
  17. arkindex_worker/worker/metadata.py +27 -38
  18. arkindex_worker/worker/process.py +24 -0
  19. arkindex_worker/worker/task.py +9 -9
  20. arkindex_worker/worker/training.py +15 -11
  21. arkindex_worker/worker/transcription.py +77 -71
  22. examples/standalone/python/worker.py +171 -0
  23. examples/tooled/python/worker.py +50 -0
  24. tests/conftest.py +22 -36
  25. tests/test_base_worker.py +1 -1
  26. tests/test_cache.py +1 -2
  27. tests/test_dataset_worker.py +1 -1
  28. tests/test_elements_worker/test_element.py +200 -26
  29. tests/test_elements_worker/{test_entity_create.py → test_entity.py} +220 -227
  30. tests/test_elements_worker/test_metadata.py +0 -47
  31. tests/test_elements_worker/test_process.py +89 -0
  32. tests/test_elements_worker/test_training.py +8 -8
  33. tests/test_elements_worker/test_worker.py +61 -14
  34. tests/test_image.py +244 -126
  35. tests/test_merge.py +0 -7
  36. tests/test_utils.py +37 -0
  37. arkindex_base_worker-0.4.0rc5.dist-info/RECORD +0 -60
  38. arkindex_worker/worker/version.py +0 -58
  39. tests/test_elements_worker/test_entity_list_and_check.py +0 -160
  40. tests/test_elements_worker/test_version.py +0 -60
  41. {arkindex_base_worker-0.4.0rc5.dist-info → arkindex_base_worker-0.5.0.dist-info/licenses}/LICENSE +0 -0
@@ -1,58 +0,0 @@
1
- """
2
- ElementsWorker methods for worker versions.
3
- """
4
-
5
- import functools
6
- from warnings import warn
7
-
8
-
9
- def worker_version_deprecation(func):
10
- @functools.wraps(func)
11
- def wrapper(self, *args, **kwargs):
12
- warn("WorkerVersion usage is deprecated.", DeprecationWarning, stacklevel=2)
13
- return func(self, *args, **kwargs)
14
-
15
- return wrapper
16
-
17
-
18
- class WorkerVersionMixin:
19
- @worker_version_deprecation
20
- def get_worker_version(self, worker_version_id: str) -> dict:
21
- """
22
- Warns:
23
- ----
24
- This method is **deprecated**.
25
-
26
- Retrieve a worker version, using the [ElementsWorker][arkindex_worker.worker.ElementsWorker]'s internal cache when possible.
27
-
28
- :param worker_version_id: ID of the worker version to retrieve.
29
- :returns: The requested worker version, as returned by the ``RetrieveWorkerVersion`` API endpoint.
30
- """
31
- if worker_version_id is None:
32
- raise ValueError("No worker version ID")
33
-
34
- if worker_version_id in self._worker_version_cache:
35
- return self._worker_version_cache[worker_version_id]
36
-
37
- worker_version = self.api_client.request(
38
- "RetrieveWorkerVersion", id=worker_version_id
39
- )
40
- self._worker_version_cache[worker_version_id] = worker_version
41
-
42
- return worker_version
43
-
44
- @worker_version_deprecation
45
- def get_worker_version_slug(self, worker_version_id: str) -> str:
46
- """
47
- Warns:
48
- ----
49
- This method is **deprecated**.
50
-
51
- Retrieve the slug of the worker of a worker version, from a worker version UUID.
52
- Uses a worker version from the internal cache if possible, otherwise makes an API request.
53
-
54
- :param worker_version_id: ID of the worker version to find a slug for.
55
- :returns: Slug of the worker of this worker version.
56
- """
57
- worker_version = self.get_worker_version(worker_version_id)
58
- return worker_version["worker"]["slug"]
@@ -1,160 +0,0 @@
1
- import pytest
2
- from responses import matchers
3
-
4
- from arkindex_worker.models import Transcription
5
- from arkindex_worker.worker.entity import MissingEntityType
6
- from tests import CORPUS_ID
7
-
8
- from . import BASE_API_CALLS
9
-
10
-
11
- def test_check_required_entity_types(responses, mock_elements_worker):
12
- # Set one entity type
13
- mock_elements_worker.entity_types = {"person": "person-entity-type-id"}
14
-
15
- checked_types = ["person", "new-entity"]
16
-
17
- # Call to create new entity type
18
- responses.add(
19
- responses.POST,
20
- "http://testserver/api/v1/entity/types/",
21
- status=200,
22
- match=[
23
- matchers.json_params_matcher(
24
- {
25
- "name": "new-entity",
26
- "corpus": CORPUS_ID,
27
- }
28
- )
29
- ],
30
- json={
31
- "id": "new-entity-id",
32
- "corpus": CORPUS_ID,
33
- "name": "new-entity",
34
- "color": "ffd1b3",
35
- },
36
- )
37
-
38
- mock_elements_worker.check_required_entity_types(
39
- entity_types=checked_types,
40
- )
41
-
42
- # Make sure the entity_types entry has been updated
43
- assert mock_elements_worker.entity_types == {
44
- "person": "person-entity-type-id",
45
- "new-entity": "new-entity-id",
46
- }
47
-
48
- assert len(responses.calls) == len(BASE_API_CALLS) + 1
49
- assert [
50
- (call.request.method, call.request.url) for call in responses.calls
51
- ] == BASE_API_CALLS + [
52
- (
53
- "POST",
54
- "http://testserver/api/v1/entity/types/",
55
- ),
56
- ]
57
-
58
-
59
- def test_check_required_entity_types_no_creation_allowed(
60
- responses, mock_elements_worker
61
- ):
62
- # Set one entity type
63
- mock_elements_worker.entity_types = {"person": "person-entity-type-id"}
64
-
65
- checked_types = ["person", "new-entity"]
66
-
67
- with pytest.raises(
68
- MissingEntityType, match="Entity type `new-entity` was not in the corpus."
69
- ):
70
- mock_elements_worker.check_required_entity_types(
71
- entity_types=checked_types, create_missing=False
72
- )
73
-
74
- assert len(responses.calls) == len(BASE_API_CALLS)
75
- assert [
76
- (call.request.method, call.request.url) for call in responses.calls
77
- ] == BASE_API_CALLS
78
-
79
-
80
- def test_list_transcription_entities_deprecation(fake_dummy_worker):
81
- transcription = Transcription({"id": "fake_transcription_id"})
82
- worker_version = "worker_version_id"
83
- fake_dummy_worker.api_client.add_response(
84
- "ListTranscriptionEntities",
85
- id=transcription.id,
86
- worker_version=worker_version,
87
- response={"id": "entity_id"},
88
- )
89
- with pytest.deprecated_call(
90
- match="`worker_version` usage is deprecated. Consider using `worker_run` instead."
91
- ):
92
- assert fake_dummy_worker.list_transcription_entities(
93
- transcription, worker_version=worker_version
94
- ) == {"id": "entity_id"}
95
-
96
- assert len(fake_dummy_worker.api_client.history) == 1
97
- assert len(fake_dummy_worker.api_client.responses) == 0
98
-
99
-
100
- def test_list_transcription_entities(fake_dummy_worker):
101
- transcription = Transcription({"id": "fake_transcription_id"})
102
- worker_run = "worker_run_id"
103
- fake_dummy_worker.api_client.add_response(
104
- "ListTranscriptionEntities",
105
- id=transcription.id,
106
- worker_run=worker_run,
107
- response={"id": "entity_id"},
108
- )
109
- assert fake_dummy_worker.list_transcription_entities(
110
- transcription, worker_run=worker_run
111
- ) == {"id": "entity_id"}
112
-
113
- assert len(fake_dummy_worker.api_client.history) == 1
114
- assert len(fake_dummy_worker.api_client.responses) == 0
115
-
116
-
117
- def test_list_corpus_entities(responses, mock_elements_worker):
118
- responses.add(
119
- responses.GET,
120
- f"http://testserver/api/v1/corpus/{CORPUS_ID}/entities/",
121
- json={
122
- "count": 1,
123
- "next": None,
124
- "results": [
125
- {
126
- "id": "fake_entity_id",
127
- }
128
- ],
129
- },
130
- )
131
-
132
- mock_elements_worker.list_corpus_entities()
133
-
134
- assert mock_elements_worker.entities == {
135
- "fake_entity_id": {
136
- "id": "fake_entity_id",
137
- }
138
- }
139
-
140
- assert len(responses.calls) == len(BASE_API_CALLS) + 1
141
- assert [
142
- (call.request.method, call.request.url) for call in responses.calls
143
- ] == BASE_API_CALLS + [
144
- (
145
- "GET",
146
- f"http://testserver/api/v1/corpus/{CORPUS_ID}/entities/",
147
- ),
148
- ]
149
-
150
-
151
- @pytest.mark.parametrize("wrong_name", [1234, 12.5])
152
- def test_list_corpus_entities_wrong_name(mock_elements_worker, wrong_name):
153
- with pytest.raises(AssertionError, match="name should be of type str"):
154
- mock_elements_worker.list_corpus_entities(name=wrong_name)
155
-
156
-
157
- @pytest.mark.parametrize("wrong_parent", [{"id": "element_id"}, 12.5, "blabla"])
158
- def test_list_corpus_entities_wrong_parent(mock_elements_worker, wrong_parent):
159
- with pytest.raises(AssertionError, match="parent should be of type Element"):
160
- mock_elements_worker.list_corpus_entities(parent=wrong_parent)
@@ -1,60 +0,0 @@
1
- import pytest
2
-
3
- TEST_VERSION_ID = "test_123"
4
- TEST_SLUG = "some_slug"
5
-
6
-
7
- def test_get_worker_version(fake_dummy_worker):
8
- api_client = fake_dummy_worker.api_client
9
-
10
- response = {"worker": {"slug": TEST_SLUG}}
11
-
12
- api_client.add_response("RetrieveWorkerVersion", response, id=TEST_VERSION_ID)
13
-
14
- with pytest.deprecated_call(match="WorkerVersion usage is deprecated."):
15
- res = fake_dummy_worker.get_worker_version(TEST_VERSION_ID)
16
-
17
- assert res == response
18
- assert fake_dummy_worker._worker_version_cache[TEST_VERSION_ID] == response
19
-
20
-
21
- def test_get_worker_version__uses_cache(fake_dummy_worker):
22
- api_client = fake_dummy_worker.api_client
23
-
24
- response = {"worker": {"slug": TEST_SLUG}}
25
-
26
- api_client.add_response("RetrieveWorkerVersion", response, id=TEST_VERSION_ID)
27
-
28
- with pytest.deprecated_call(match="WorkerVersion usage is deprecated."):
29
- response_1 = fake_dummy_worker.get_worker_version(TEST_VERSION_ID)
30
-
31
- with pytest.deprecated_call(match="WorkerVersion usage is deprecated."):
32
- response_2 = fake_dummy_worker.get_worker_version(TEST_VERSION_ID)
33
-
34
- assert response_1 == response
35
- assert response_1 == response_2
36
-
37
- # assert that only one call to the API
38
- assert len(api_client.history) == 1
39
- assert not api_client.responses
40
-
41
-
42
- def test_get_worker_version_slug(mocker, fake_dummy_worker):
43
- fake_dummy_worker.get_worker_version = mocker.MagicMock()
44
- fake_dummy_worker.get_worker_version.return_value = {
45
- "id": TEST_VERSION_ID,
46
- "worker": {"slug": "mock_slug"},
47
- }
48
-
49
- with pytest.deprecated_call(match="WorkerVersion usage is deprecated."):
50
- slug = fake_dummy_worker.get_worker_version_slug(TEST_VERSION_ID)
51
- assert slug == "mock_slug"
52
-
53
-
54
- def test_get_worker_version_slug_none(fake_dummy_worker):
55
- # WARNING: pytest.deprecated_call must be placed BEFORE pytest.raises, otherwise `match` argument won't be checked
56
- with (
57
- pytest.deprecated_call(match="WorkerVersion usage is deprecated."),
58
- pytest.raises(ValueError, match="No worker version ID"),
59
- ):
60
- fake_dummy_worker.get_worker_version_slug(None)