vws-python 2026.2.21__tar.gz → 2026.2.22__tar.gz

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 (58) hide show
  1. {vws_python-2026.2.21 → vws_python-2026.2.22}/CHANGELOG.rst +4 -0
  2. {vws_python-2026.2.21/src/vws_python.egg-info → vws_python-2026.2.22}/PKG-INFO +2 -2
  3. {vws_python-2026.2.21 → vws_python-2026.2.22}/conftest.py +1 -0
  4. {vws_python-2026.2.21 → vws_python-2026.2.22}/pyproject.toml +3 -3
  5. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/_vws_request.py +1 -3
  6. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/query.py +3 -2
  7. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/vws.py +3 -1
  8. {vws_python-2026.2.21 → vws_python-2026.2.22/src/vws_python.egg-info}/PKG-INFO +2 -2
  9. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws_python.egg-info/requires.txt +1 -1
  10. {vws_python-2026.2.21 → vws_python-2026.2.22}/tests/test_cloud_reco_exceptions.py +2 -0
  11. {vws_python-2026.2.21 → vws_python-2026.2.22}/tests/test_query.py +43 -2
  12. {vws_python-2026.2.21 → vws_python-2026.2.22}/tests/test_vws.py +32 -3
  13. {vws_python-2026.2.21 → vws_python-2026.2.22}/tests/test_vws_exceptions.py +13 -1
  14. {vws_python-2026.2.21 → vws_python-2026.2.22}/.git_archival.txt +0 -0
  15. {vws_python-2026.2.21 → vws_python-2026.2.22}/.gitattributes +0 -0
  16. {vws_python-2026.2.21 → vws_python-2026.2.22}/.github/dependabot.yml +0 -0
  17. {vws_python-2026.2.21 → vws_python-2026.2.22}/.github/workflows/ci.yml +0 -0
  18. {vws_python-2026.2.21 → vws_python-2026.2.22}/.github/workflows/dependabot-merge.yml +0 -0
  19. {vws_python-2026.2.21 → vws_python-2026.2.22}/.github/workflows/lint.yml +0 -0
  20. {vws_python-2026.2.21 → vws_python-2026.2.22}/.github/workflows/publish-site.yml +0 -0
  21. {vws_python-2026.2.21 → vws_python-2026.2.22}/.github/workflows/release.yml +0 -0
  22. {vws_python-2026.2.21 → vws_python-2026.2.22}/.gitignore +0 -0
  23. {vws_python-2026.2.21 → vws_python-2026.2.22}/.pre-commit-config.yaml +0 -0
  24. {vws_python-2026.2.21 → vws_python-2026.2.22}/.prettierrc +0 -0
  25. {vws_python-2026.2.21 → vws_python-2026.2.22}/.vscode/extensions.json +0 -0
  26. {vws_python-2026.2.21 → vws_python-2026.2.22}/.vscode/settings.json +0 -0
  27. {vws_python-2026.2.21 → vws_python-2026.2.22}/CODE_OF_CONDUCT.rst +0 -0
  28. {vws_python-2026.2.21 → vws_python-2026.2.22}/LICENSE +0 -0
  29. {vws_python-2026.2.21 → vws_python-2026.2.22}/README.rst +0 -0
  30. {vws_python-2026.2.21 → vws_python-2026.2.22}/docs/source/__init__.py +0 -0
  31. {vws_python-2026.2.21 → vws_python-2026.2.22}/docs/source/api-reference.rst +0 -0
  32. {vws_python-2026.2.21 → vws_python-2026.2.22}/docs/source/changelog.rst +0 -0
  33. {vws_python-2026.2.21 → vws_python-2026.2.22}/docs/source/conf.py +0 -0
  34. {vws_python-2026.2.21 → vws_python-2026.2.22}/docs/source/contributing.rst +0 -0
  35. {vws_python-2026.2.21 → vws_python-2026.2.22}/docs/source/exceptions.rst +0 -0
  36. {vws_python-2026.2.21 → vws_python-2026.2.22}/docs/source/index.rst +0 -0
  37. {vws_python-2026.2.21 → vws_python-2026.2.22}/docs/source/release-process.rst +0 -0
  38. {vws_python-2026.2.21 → vws_python-2026.2.22}/setup.cfg +0 -0
  39. {vws_python-2026.2.21 → vws_python-2026.2.22}/spelling_private_dict.txt +0 -0
  40. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/__init__.py +0 -0
  41. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/exceptions/__init__.py +0 -0
  42. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/exceptions/base_exceptions.py +0 -0
  43. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/exceptions/cloud_reco_exceptions.py +0 -0
  44. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/exceptions/custom_exceptions.py +0 -0
  45. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/exceptions/vws_exceptions.py +0 -0
  46. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/include_target_data.py +0 -0
  47. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/py.typed +0 -0
  48. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/reports.py +0 -0
  49. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/response.py +0 -0
  50. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/vumark_accept.py +0 -0
  51. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws/vumark_service.py +0 -0
  52. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws_python.egg-info/SOURCES.txt +0 -0
  53. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws_python.egg-info/dependency_links.txt +0 -0
  54. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws_python.egg-info/not-zip-safe +0 -0
  55. {vws_python-2026.2.21 → vws_python-2026.2.22}/src/vws_python.egg-info/top_level.txt +0 -0
  56. {vws_python-2026.2.21 → vws_python-2026.2.22}/tests/__init__.py +0 -0
  57. {vws_python-2026.2.21 → vws_python-2026.2.22}/tests/conftest.py +0 -0
  58. {vws_python-2026.2.21 → vws_python-2026.2.22}/zizmor.yml +0 -0
@@ -4,6 +4,10 @@ Changelog
4
4
  Next
5
5
  ----
6
6
 
7
+ 2026.02.22
8
+ ----------
9
+
10
+
7
11
  2026.02.21
8
12
  ----------
9
13
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vws-python
3
- Version: 2026.2.21
3
+ Version: 2026.2.22
4
4
  Summary: Interact with the Vuforia Web Services (VWS) API.
5
5
  Author-email: Adam Dangoor <adamdangoor@gmail.com>
6
6
  License-Expression: MIT
@@ -60,7 +60,7 @@ Requires-Dist: torchvision>=0.20.1; extra == "dev"
60
60
  Requires-Dist: ty==0.0.17; extra == "dev"
61
61
  Requires-Dist: types-requests==2.32.4.20260107; extra == "dev"
62
62
  Requires-Dist: vulture==2.14; extra == "dev"
63
- Requires-Dist: vws-python-mock==2026.2.21; extra == "dev"
63
+ Requires-Dist: vws-python-mock==2026.2.22.2; extra == "dev"
64
64
  Requires-Dist: vws-test-fixtures==2023.3.5; extra == "dev"
65
65
  Requires-Dist: yamlfix==1.19.1; extra == "dev"
66
66
  Requires-Dist: zizmor==1.22.0; extra == "dev"
@@ -18,6 +18,7 @@ from sybil.parsers.rest import (
18
18
  )
19
19
 
20
20
 
21
+ @beartype
21
22
  def pytest_collection_modifyitems(items: list[pytest.Item]) -> None:
22
23
  """Apply the beartype decorator to all collected test functions."""
23
24
  for item in items:
@@ -82,7 +82,7 @@ optional-dependencies.dev = [
82
82
  "ty==0.0.17",
83
83
  "types-requests==2.32.4.20260107",
84
84
  "vulture==2.14",
85
- "vws-python-mock==2026.2.21",
85
+ "vws-python-mock==2026.2.22.2",
86
86
  "vws-test-fixtures==2023.3.5",
87
87
  "yamlfix==1.19.1",
88
88
  "zizmor==1.22.0",
@@ -301,8 +301,8 @@ keep_full_version = true
301
301
  max_supported_python = "3.14"
302
302
 
303
303
  [tool.pytest]
304
- ini_options.xfail_strict = true
305
- ini_options.log_cli = true
304
+ xfail_strict = true
305
+ log_cli = true
306
306
 
307
307
  [tool.coverage]
308
308
  run.branch = true
@@ -2,8 +2,6 @@
2
2
  API.
3
3
  """
4
4
 
5
- from urllib.parse import urljoin
6
-
7
5
  import requests
8
6
  from beartype import BeartypeConf, beartype
9
7
  from vws_auth_tools import authorization_header, rfc_1123_date
@@ -64,7 +62,7 @@ def target_api_request(
64
62
  **extra_headers,
65
63
  }
66
64
 
67
- url = urljoin(base=base_vws_url, url=request_path)
65
+ url = base_vws_url.rstrip("/") + request_path
68
66
 
69
67
  requests_response = requests.request(
70
68
  method=method,
@@ -5,7 +5,6 @@ import io
5
5
  import json
6
6
  from http import HTTPMethod, HTTPStatus
7
7
  from typing import Any, BinaryIO
8
- from urllib.parse import urljoin
9
8
 
10
9
  import requests
11
10
  from beartype import BeartypeConf, beartype
@@ -46,6 +45,7 @@ class CloudRecoService:
46
45
 
47
46
  def __init__(
48
47
  self,
48
+ *,
49
49
  client_access_key: str,
50
50
  client_secret_key: str,
51
51
  base_vwq_url: str = "https://cloudreco.vuforia.com",
@@ -68,6 +68,7 @@ class CloudRecoService:
68
68
 
69
69
  def query(
70
70
  self,
71
+ *,
71
72
  image: _ImageType,
72
73
  max_num_results: int = 1,
73
74
  include_target_data: CloudRecoIncludeTargetData = (
@@ -144,7 +145,7 @@ class CloudRecoService:
144
145
 
145
146
  requests_response = requests.request(
146
147
  method=method,
147
- url=urljoin(base=self._base_vwq_url, url=request_path),
148
+ url=self._base_vwq_url.rstrip("/") + request_path,
148
149
  headers=headers,
149
150
  data=content,
150
151
  timeout=self._request_timeout_seconds,
@@ -63,6 +63,7 @@ class VWS:
63
63
 
64
64
  def __init__(
65
65
  self,
66
+ *,
66
67
  server_access_key: str,
67
68
  server_secret_key: str,
68
69
  base_vws_url: str = "https://vws.vuforia.com",
@@ -171,11 +172,11 @@ class VWS:
171
172
 
172
173
  def add_target(
173
174
  self,
175
+ *,
174
176
  name: str,
175
177
  width: float,
176
178
  image: _ImageType,
177
179
  application_metadata: str | None,
178
- *,
179
180
  active_flag: bool,
180
181
  ) -> str:
181
182
  """Add a target to a Vuforia Web Services database.
@@ -302,6 +303,7 @@ class VWS:
302
303
 
303
304
  def wait_for_target_processed(
304
305
  self,
306
+ *,
305
307
  target_id: str,
306
308
  seconds_between_requests: float = 0.2,
307
309
  timeout_seconds: float = 60 * 5,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vws-python
3
- Version: 2026.2.21
3
+ Version: 2026.2.22
4
4
  Summary: Interact with the Vuforia Web Services (VWS) API.
5
5
  Author-email: Adam Dangoor <adamdangoor@gmail.com>
6
6
  License-Expression: MIT
@@ -60,7 +60,7 @@ Requires-Dist: torchvision>=0.20.1; extra == "dev"
60
60
  Requires-Dist: ty==0.0.17; extra == "dev"
61
61
  Requires-Dist: types-requests==2.32.4.20260107; extra == "dev"
62
62
  Requires-Dist: vulture==2.14; extra == "dev"
63
- Requires-Dist: vws-python-mock==2026.2.21; extra == "dev"
63
+ Requires-Dist: vws-python-mock==2026.2.22.2; extra == "dev"
64
64
  Requires-Dist: vws-test-fixtures==2023.3.5; extra == "dev"
65
65
  Requires-Dist: yamlfix==1.19.1; extra == "dev"
66
66
  Requires-Dist: zizmor==1.22.0; extra == "dev"
@@ -42,7 +42,7 @@ torchvision>=0.20.1
42
42
  ty==0.0.17
43
43
  types-requests==2.32.4.20260107
44
44
  vulture==2.14
45
- vws-python-mock==2026.2.21
45
+ vws-python-mock==2026.2.22.2
46
46
  vws-test-fixtures==2023.3.5
47
47
  yamlfix==1.19.1
48
48
  zizmor==1.22.0
@@ -24,6 +24,7 @@ from vws.exceptions.custom_exceptions import (
24
24
 
25
25
 
26
26
  def test_too_many_max_results(
27
+ *,
27
28
  cloud_reco_client: CloudRecoService,
28
29
  high_quality_image: io.BytesIO,
29
30
  ) -> None:
@@ -45,6 +46,7 @@ def test_too_many_max_results(
45
46
 
46
47
 
47
48
  def test_image_too_large(
49
+ *,
48
50
  cloud_reco_client: CloudRecoService,
49
51
  png_too_large: io.BytesIO | io.BufferedRandom,
50
52
  ) -> None:
@@ -20,6 +20,7 @@ class TestQuery:
20
20
 
21
21
  @staticmethod
22
22
  def test_no_matches(
23
+ *,
23
24
  cloud_reco_client: CloudRecoService,
24
25
  image: io.BytesIO | BinaryIO,
25
26
  ) -> None:
@@ -29,6 +30,7 @@ class TestQuery:
29
30
 
30
31
  @staticmethod
31
32
  def test_match(
33
+ *,
32
34
  vws_client: VWS,
33
35
  cloud_reco_client: CloudRecoService,
34
36
  image: io.BytesIO | BinaryIO,
@@ -55,8 +57,8 @@ class TestDefaultRequestTimeout:
55
57
  argvalues=[(29, False), (31, True)],
56
58
  )
57
59
  def test_default_timeout(
58
- image: io.BytesIO | BinaryIO,
59
60
  *,
61
+ image: io.BytesIO | BinaryIO,
60
62
  response_delay_seconds: int,
61
63
  expect_timeout: bool,
62
64
  ) -> None:
@@ -110,8 +112,8 @@ class TestCustomRequestTimeout:
110
112
  ],
111
113
  )
112
114
  def test_custom_timeout(
113
- image: io.BytesIO | BinaryIO,
114
115
  *,
116
+ image: io.BytesIO | BinaryIO,
115
117
  custom_timeout: float | tuple[float, float],
116
118
  response_delay_seconds: float,
117
119
  expect_timeout: bool,
@@ -188,12 +190,46 @@ class TestCustomBaseVWQURL:
188
190
  match = matches[0]
189
191
  assert match.target_id == target_id
190
192
 
193
+ @staticmethod
194
+ def test_custom_base_url_with_path_prefix(
195
+ image: io.BytesIO | BinaryIO,
196
+ ) -> None:
197
+ """
198
+ A base VWQ URL with a path prefix is used as-is, without the
199
+ prefix being dropped.
200
+ """
201
+ base_vwq_url = "http://example.com/prefix"
202
+ with MockVWS(base_vwq_url=base_vwq_url) as mock:
203
+ database = CloudDatabase()
204
+ mock.add_cloud_database(cloud_database=database)
205
+ vws_client = VWS(
206
+ server_access_key=database.server_access_key,
207
+ server_secret_key=database.server_secret_key,
208
+ )
209
+ target_id = vws_client.add_target(
210
+ name="x",
211
+ width=1,
212
+ image=image,
213
+ active_flag=True,
214
+ application_metadata=None,
215
+ )
216
+ vws_client.wait_for_target_processed(target_id=target_id)
217
+ cloud_reco_client = CloudRecoService(
218
+ client_access_key=database.client_access_key,
219
+ client_secret_key=database.client_secret_key,
220
+ base_vwq_url=base_vwq_url,
221
+ )
222
+
223
+ matches = cloud_reco_client.query(image=image)
224
+ assert len(matches) == 1
225
+
191
226
 
192
227
  class TestMaxNumResults:
193
228
  """Tests for the ``max_num_results`` parameter of ``query``."""
194
229
 
195
230
  @staticmethod
196
231
  def test_default(
232
+ *,
197
233
  vws_client: VWS,
198
234
  cloud_reco_client: CloudRecoService,
199
235
  image: io.BytesIO | BinaryIO,
@@ -220,6 +256,7 @@ class TestMaxNumResults:
220
256
 
221
257
  @staticmethod
222
258
  def test_custom(
259
+ *,
223
260
  vws_client: VWS,
224
261
  cloud_reco_client: CloudRecoService,
225
262
  image: io.BytesIO | BinaryIO,
@@ -262,6 +299,7 @@ class TestIncludeTargetData:
262
299
 
263
300
  @staticmethod
264
301
  def test_default(
302
+ *,
265
303
  vws_client: VWS,
266
304
  cloud_reco_client: CloudRecoService,
267
305
  image: io.BytesIO | BinaryIO,
@@ -292,6 +330,7 @@ class TestIncludeTargetData:
292
330
 
293
331
  @staticmethod
294
332
  def test_top(
333
+ *,
295
334
  vws_client: VWS,
296
335
  cloud_reco_client: CloudRecoService,
297
336
  image: io.BytesIO | BinaryIO,
@@ -327,6 +366,7 @@ class TestIncludeTargetData:
327
366
 
328
367
  @staticmethod
329
368
  def test_none(
369
+ *,
330
370
  vws_client: VWS,
331
371
  cloud_reco_client: CloudRecoService,
332
372
  image: io.BytesIO | BinaryIO,
@@ -363,6 +403,7 @@ class TestIncludeTargetData:
363
403
 
364
404
  @staticmethod
365
405
  def test_all(
406
+ *,
366
407
  vws_client: VWS,
367
408
  cloud_reco_client: CloudRecoService,
368
409
  image: io.BytesIO | BinaryIO,
@@ -34,11 +34,11 @@ class TestAddTarget:
34
34
  )
35
35
  @pytest.mark.parametrize(argnames="active_flag", argvalues=[True, False])
36
36
  def test_add_target(
37
+ *,
37
38
  vws_client: VWS,
38
39
  image: io.BytesIO | BinaryIO,
39
40
  application_metadata: bytes | None,
40
41
  cloud_reco_client: CloudRecoService,
41
- *,
42
42
  active_flag: bool,
43
43
  ) -> None:
44
44
  """No exception is raised when adding one target."""
@@ -76,6 +76,7 @@ class TestAddTarget:
76
76
 
77
77
  @staticmethod
78
78
  def test_add_two_targets(
79
+ *,
79
80
  vws_client: VWS,
80
81
  image: io.BytesIO | BinaryIO,
81
82
  ) -> None:
@@ -103,8 +104,8 @@ class TestDefaultRequestTimeout:
103
104
  argvalues=[(29, False), (31, True)],
104
105
  )
105
106
  def test_default_timeout(
106
- image: io.BytesIO | BinaryIO,
107
107
  *,
108
+ image: io.BytesIO | BinaryIO,
108
109
  response_delay_seconds: int,
109
110
  expect_timeout: bool,
110
111
  ) -> None:
@@ -169,8 +170,8 @@ class TestCustomRequestTimeout:
169
170
  ],
170
171
  )
171
172
  def test_custom_timeout(
172
- image: io.BytesIO | BinaryIO,
173
173
  *,
174
+ image: io.BytesIO | BinaryIO,
174
175
  custom_timeout: float | tuple[float, float],
175
176
  response_delay_seconds: float,
176
177
  expect_timeout: bool,
@@ -245,12 +246,31 @@ class TestCustomBaseVWSURL:
245
246
  application_metadata=None,
246
247
  )
247
248
 
249
+ @staticmethod
250
+ def test_custom_base_url_with_path_prefix() -> None:
251
+ """
252
+ A base VWS URL with a path prefix is used as-is, without the
253
+ prefix being dropped.
254
+ """
255
+ base_vws_url = "http://example.com/prefix"
256
+ with MockVWS(base_vws_url=base_vws_url) as mock:
257
+ database = CloudDatabase()
258
+ mock.add_cloud_database(cloud_database=database)
259
+ vws_client = VWS(
260
+ server_access_key=database.server_access_key,
261
+ server_secret_key=database.server_secret_key,
262
+ base_vws_url=base_vws_url,
263
+ )
264
+
265
+ assert not vws_client.list_targets()
266
+
248
267
 
249
268
  class TestListTargets:
250
269
  """Tests for listing targets."""
251
270
 
252
271
  @staticmethod
253
272
  def test_list_targets(
273
+ *,
254
274
  vws_client: VWS,
255
275
  image: io.BytesIO | BinaryIO,
256
276
  ) -> None:
@@ -277,6 +297,7 @@ class TestDelete:
277
297
 
278
298
  @staticmethod
279
299
  def test_delete_target(
300
+ *,
280
301
  vws_client: VWS,
281
302
  image: io.BytesIO | BinaryIO,
282
303
  ) -> None:
@@ -300,6 +321,7 @@ class TestGetTargetSummaryReport:
300
321
 
301
322
  @staticmethod
302
323
  def test_get_target_summary_report(
324
+ *,
303
325
  vws_client: VWS,
304
326
  image: io.BytesIO | BinaryIO,
305
327
  ) -> None:
@@ -398,6 +420,7 @@ class TestGetTargetRecord:
398
420
 
399
421
  @staticmethod
400
422
  def test_get_target_record(
423
+ *,
401
424
  vws_client: VWS,
402
425
  image: io.BytesIO | BinaryIO,
403
426
  ) -> None:
@@ -444,6 +467,7 @@ class TestGetTargetRecord:
444
467
 
445
468
  @staticmethod
446
469
  def test_get_failed(
470
+ *,
447
471
  vws_client: VWS,
448
472
  image_file_failed_state: io.BytesIO,
449
473
  ) -> None:
@@ -467,6 +491,7 @@ class TestWaitForTargetProcessed:
467
491
 
468
492
  @staticmethod
469
493
  def test_wait_for_target_processed(
494
+ *,
470
495
  vws_client: VWS,
471
496
  image: io.BytesIO | BinaryIO,
472
497
  ) -> None:
@@ -628,6 +653,7 @@ class TestGetDuplicateTargets:
628
653
 
629
654
  @staticmethod
630
655
  def test_get_duplicate_targets(
656
+ *,
631
657
  vws_client: VWS,
632
658
  image: io.BytesIO | BinaryIO,
633
659
  ) -> None:
@@ -658,6 +684,7 @@ class TestUpdateTarget:
658
684
 
659
685
  @staticmethod
660
686
  def test_update_target(
687
+ *,
661
688
  vws_client: VWS,
662
689
  image: io.BytesIO | BinaryIO,
663
690
  different_high_quality_image: io.BytesIO,
@@ -717,6 +744,7 @@ class TestUpdateTarget:
717
744
 
718
745
  @staticmethod
719
746
  def test_no_fields_given(
747
+ *,
720
748
  vws_client: VWS,
721
749
  image: io.BytesIO | BinaryIO,
722
750
  ) -> None:
@@ -745,6 +773,7 @@ class TestGenerateVumarkInstance:
745
773
  ],
746
774
  )
747
775
  def test_generate_vumark_instance(
776
+ *,
748
777
  vumark_service_client: VuMarkService,
749
778
  vumark_target_id: str,
750
779
  accept: VuMarkAccept,
@@ -41,6 +41,7 @@ from vws.vumark_accept import VuMarkAccept
41
41
 
42
42
 
43
43
  def test_image_too_large(
44
+ *,
44
45
  vws_client: VWS,
45
46
  png_too_large: io.BytesIO | io.BufferedRandom,
46
47
  ) -> None:
@@ -75,7 +76,11 @@ def test_invalid_given_id(vws_client: VWS) -> None:
75
76
  assert exc.value.target_id == target_id
76
77
 
77
78
 
78
- def test_add_bad_name(vws_client: VWS, high_quality_image: io.BytesIO) -> None:
79
+ def test_add_bad_name(
80
+ *,
81
+ vws_client: VWS,
82
+ high_quality_image: io.BytesIO,
83
+ ) -> None:
79
84
  """
80
85
  When a name with a bad character is given, a ``ServerError``
81
86
  exception
@@ -143,6 +148,7 @@ def test_bad_image(vws_client: VWS) -> None:
143
148
 
144
149
 
145
150
  def test_target_name_exist(
151
+ *,
146
152
  vws_client: VWS,
147
153
  high_quality_image: io.BytesIO,
148
154
  ) -> None:
@@ -201,6 +207,7 @@ def test_project_inactive(
201
207
 
202
208
 
203
209
  def test_target_status_processing(
210
+ *,
204
211
  vws_client: VWS,
205
212
  high_quality_image: io.BytesIO,
206
213
  ) -> None:
@@ -225,6 +232,7 @@ def test_target_status_processing(
225
232
 
226
233
 
227
234
  def test_metadata_too_large(
235
+ *,
228
236
  vws_client: VWS,
229
237
  high_quality_image: io.BytesIO,
230
238
  ) -> None:
@@ -246,6 +254,7 @@ def test_metadata_too_large(
246
254
 
247
255
 
248
256
  def test_request_time_too_skewed(
257
+ *,
249
258
  vws_client: VWS,
250
259
  high_quality_image: io.BytesIO,
251
260
  ) -> None:
@@ -316,6 +325,7 @@ def test_authentication_failure(
316
325
 
317
326
 
318
327
  def test_target_status_not_success(
328
+ *,
319
329
  vws_client: VWS,
320
330
  high_quality_image: io.BytesIO,
321
331
  ) -> None:
@@ -368,6 +378,7 @@ def test_vwsexception_inheritance() -> None:
368
378
 
369
379
 
370
380
  def test_invalid_instance_id(
381
+ *,
371
382
  vumark_service_client: VuMarkService,
372
383
  vumark_target_id: str,
373
384
  ) -> None:
@@ -423,6 +434,7 @@ def test_invalid_target_type(
423
434
 
424
435
 
425
436
  def test_base_exception(
437
+ *,
426
438
  vws_client: VWS,
427
439
  high_quality_image: io.BytesIO,
428
440
  ) -> None:
File without changes
File without changes