csu 2.0.0__tar.gz → 2.0.2__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 (102) hide show
  1. {csu-2.0.0 → csu-2.0.2}/.bumpversion.cfg +1 -1
  2. {csu-2.0.0 → csu-2.0.2}/.cookiecutterrc +1 -1
  3. {csu-2.0.0 → csu-2.0.2}/PKG-INFO +3 -3
  4. {csu-2.0.0 → csu-2.0.2}/README.rst +2 -2
  5. {csu-2.0.0 → csu-2.0.2}/pyproject.toml +1 -1
  6. {csu-2.0.0 → csu-2.0.2}/src/csu/__init__.py +1 -1
  7. {csu-2.0.0 → csu-2.0.2}/src/csu/service.py +37 -32
  8. {csu-2.0.0 → csu-2.0.2}/src/csu.egg-info/PKG-INFO +3 -3
  9. {csu-2.0.0 → csu-2.0.2}/tests/test_service.py +18 -18
  10. {csu-2.0.0 → csu-2.0.2}/.coveragerc +0 -0
  11. {csu-2.0.0 → csu-2.0.2}/.editorconfig +0 -0
  12. {csu-2.0.0 → csu-2.0.2}/.github/workflows/github-actions.yml +0 -0
  13. {csu-2.0.0 → csu-2.0.2}/.pre-commit-config.yaml +0 -0
  14. {csu-2.0.0 → csu-2.0.2}/.taplo.toml +0 -0
  15. {csu-2.0.0 → csu-2.0.2}/AUTHORS.rst +0 -0
  16. {csu-2.0.0 → csu-2.0.2}/CHANGELOG.rst +0 -0
  17. {csu-2.0.0 → csu-2.0.2}/CONTRIBUTING.rst +0 -0
  18. {csu-2.0.0 → csu-2.0.2}/LICENSE +0 -0
  19. {csu-2.0.0 → csu-2.0.2}/MANIFEST.in +0 -0
  20. {csu-2.0.0 → csu-2.0.2}/ci/bootstrap.py +0 -0
  21. {csu-2.0.0 → csu-2.0.2}/ci/requirements.txt +0 -0
  22. {csu-2.0.0 → csu-2.0.2}/ci/templates/.github/workflows/github-actions.yml +0 -0
  23. {csu-2.0.0 → csu-2.0.2}/pytest.ini +0 -0
  24. {csu-2.0.0 → csu-2.0.2}/setup.cfg +0 -0
  25. {csu-2.0.0 → csu-2.0.2}/src/csu/admin.py +0 -0
  26. {csu-2.0.0 → csu-2.0.2}/src/csu/conf.py +0 -0
  27. {csu-2.0.0 → csu-2.0.2}/src/csu/consts.py +0 -0
  28. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/__init__.py +0 -0
  29. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/auth.py +0 -0
  30. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/fields.py +0 -0
  31. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/forms.py +0 -0
  32. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/perms.py +0 -0
  33. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/phonenumber.py +0 -0
  34. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/serializers.py +0 -0
  35. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/test_auth.py +0 -0
  36. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/test_fields.py +0 -0
  37. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/test_forms.py +0 -0
  38. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/test_phonenumber.py +0 -0
  39. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/test_serializers.py +0 -0
  40. {csu-2.0.0 → csu-2.0.2}/src/csu/drf/views.py +0 -0
  41. {csu-2.0.0 → csu-2.0.2}/src/csu/enums.py +0 -0
  42. {csu-2.0.0 → csu-2.0.2}/src/csu/env.py +0 -0
  43. {csu-2.0.0 → csu-2.0.2}/src/csu/exceptions.py +0 -0
  44. {csu-2.0.0 → csu-2.0.2}/src/csu/export.py +0 -0
  45. {csu-2.0.0 → csu-2.0.2}/src/csu/fixups.py +0 -0
  46. {csu-2.0.0 → csu-2.0.2}/src/csu/forms/__init__.py +0 -0
  47. {csu-2.0.0 → csu-2.0.2}/src/csu/forms/crispy.py +0 -0
  48. {csu-2.0.0 → csu-2.0.2}/src/csu/forms/fields.py +0 -0
  49. {csu-2.0.0 → csu-2.0.2}/src/csu/gettext.py +0 -0
  50. {csu-2.0.0 → csu-2.0.2}/src/csu/gettext_lazy.py +0 -0
  51. {csu-2.0.0 → csu-2.0.2}/src/csu/locale/ro/LC_MESSAGES/django.mo +0 -0
  52. {csu-2.0.0 → csu-2.0.2}/src/csu/locale/ro/LC_MESSAGES/django.po +0 -0
  53. {csu-2.0.0 → csu-2.0.2}/src/csu/logging.py +0 -0
  54. {csu-2.0.0 → csu-2.0.2}/src/csu/management.py +0 -0
  55. {csu-2.0.0 → csu-2.0.2}/src/csu/models.py +0 -0
  56. {csu-2.0.0 → csu-2.0.2}/src/csu/query.py +0 -0
  57. {csu-2.0.0 → csu-2.0.2}/src/csu/routers.py +0 -0
  58. {csu-2.0.0 → csu-2.0.2}/src/csu/templates/api_exception.html +0 -0
  59. {csu-2.0.0 → csu-2.0.2}/src/csu/templates/forms/widgets/opaquewidget.html +0 -0
  60. {csu-2.0.0 → csu-2.0.2}/src/csu/test_consts.py +0 -0
  61. {csu-2.0.0 → csu-2.0.2}/src/csu/test_env.py +0 -0
  62. {csu-2.0.0 → csu-2.0.2}/src/csu/test_exceptions.py +0 -0
  63. {csu-2.0.0 → csu-2.0.2}/src/csu/test_logging.py +0 -0
  64. {csu-2.0.0 → csu-2.0.2}/src/csu/test_management.py +0 -0
  65. {csu-2.0.0 → csu-2.0.2}/src/csu/test_service.py +0 -0
  66. {csu-2.0.0 → csu-2.0.2}/src/csu/test_timezones.py +0 -0
  67. {csu-2.0.0 → csu-2.0.2}/src/csu/test_utils.py +0 -0
  68. {csu-2.0.0 → csu-2.0.2}/src/csu/test_xml.py +0 -0
  69. {csu-2.0.0 → csu-2.0.2}/src/csu/timezones.py +0 -0
  70. {csu-2.0.0 → csu-2.0.2}/src/csu/utils.py +0 -0
  71. {csu-2.0.0 → csu-2.0.2}/src/csu/views.py +0 -0
  72. {csu-2.0.0 → csu-2.0.2}/src/csu/worker/__init__.py +0 -0
  73. {csu-2.0.0 → csu-2.0.2}/src/csu/worker/admin.py +0 -0
  74. {csu-2.0.0 → csu-2.0.2}/src/csu/worker/asgi.py +0 -0
  75. {csu-2.0.0 → csu-2.0.2}/src/csu/worker/engine.py +0 -0
  76. {csu-2.0.0 → csu-2.0.2}/src/csu/worker/enums.py +0 -0
  77. {csu-2.0.0 → csu-2.0.2}/src/csu/worker/job.py +0 -0
  78. {csu-2.0.0 → csu-2.0.2}/src/csu/worker/models.py +0 -0
  79. {csu-2.0.0 → csu-2.0.2}/src/csu/worker/registry.py +0 -0
  80. {csu-2.0.0 → csu-2.0.2}/src/csu/wsgi.py +0 -0
  81. {csu-2.0.0 → csu-2.0.2}/src/csu/xml.py +0 -0
  82. {csu-2.0.0 → csu-2.0.2}/src/csu.egg-info/SOURCES.txt +0 -0
  83. {csu-2.0.0 → csu-2.0.2}/src/csu.egg-info/dependency_links.txt +0 -0
  84. {csu-2.0.0 → csu-2.0.2}/src/csu.egg-info/requires.txt +0 -0
  85. {csu-2.0.0 → csu-2.0.2}/src/csu.egg-info/top_level.txt +0 -0
  86. {csu-2.0.0 → csu-2.0.2}/tests/cassettes/test_service/test_custom_context.yaml +0 -0
  87. {csu-2.0.0 → csu-2.0.2}/tests/cassettes/test_service/test_custom_context_0_retries.yaml +0 -0
  88. {csu-2.0.0 → csu-2.0.2}/tests/cassettes/test_service/test_decoding.yaml +0 -0
  89. {csu-2.0.0 → csu-2.0.2}/tests/cassettes/test_service/test_error.yaml +0 -0
  90. {csu-2.0.0 → csu-2.0.2}/tests/cassettes/test_service/test_logging.yaml +0 -0
  91. {csu-2.0.0 → csu-2.0.2}/tests/cassettes/test_service/test_redirects.yaml +0 -0
  92. {csu-2.0.0 → csu-2.0.2}/tests/conftest.py +0 -0
  93. {csu-2.0.0 → csu-2.0.2}/tests/exampleworker.py +0 -0
  94. {csu-2.0.0 → csu-2.0.2}/tests/test_models.py +0 -0
  95. {csu-2.0.0 → csu-2.0.2}/tests/test_views.py +0 -0
  96. {csu-2.0.0 → csu-2.0.2}/tests/test_worker.py +0 -0
  97. {csu-2.0.0 → csu-2.0.2}/tests/testproject/__init__.py +0 -0
  98. {csu-2.0.0 → csu-2.0.2}/tests/testproject/fixtures/testuser.json +0 -0
  99. {csu-2.0.0 → csu-2.0.2}/tests/testproject/models.py +0 -0
  100. {csu-2.0.0 → csu-2.0.2}/tests/testproject/settings.py +0 -0
  101. {csu-2.0.0 → csu-2.0.2}/tests/testproject/urls.py +0 -0
  102. {csu-2.0.0 → csu-2.0.2}/tox.ini +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 2.0.0
2
+ current_version = 2.0.2
3
3
  commit = True
4
4
  tag = True
5
5
 
@@ -40,7 +40,7 @@ default_context:
40
40
  sphinx_theme: furo
41
41
  test_matrix_separate_coverage: 'no'
42
42
  tests_inside_package: 'yes'
43
- version: 2.0.0
43
+ version: 2.0.2
44
44
  version_manager: bump2version
45
45
  website: https://blog.ionelmc.ro
46
46
  year_from: '2024'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csu
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: Clean Slate Utils - bunch of utility code, mostly Django/DRF specific.
5
5
  Author-email: Ionel Cristian Mărieș <contact@ionelmc.ro>
6
6
  License-Expression: BSD-2-Clause
@@ -77,9 +77,9 @@ Overview
77
77
  .. |supported-implementations| image:: https://img.shields.io/pypi/implementation/csu.svg
78
78
  :alt: Supported implementations
79
79
  :target: https://pypi.org/project/csu
80
- .. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.0.0.svg
80
+ .. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.0.2.svg
81
81
  :alt: Commits since latest release
82
- :target: https://github.com/ionelmc/python-csu/compare/v2.0.0...main
82
+ :target: https://github.com/ionelmc/python-csu/compare/v2.0.2...main
83
83
  .. |scrutinizer| image:: https://img.shields.io/scrutinizer/quality/g/ionelmc/python-csu/main.svg
84
84
  :alt: Scrutinizer Status
85
85
  :target: https://scrutinizer-ci.com/g/ionelmc/python-csu/
@@ -34,9 +34,9 @@ Overview
34
34
  .. |supported-implementations| image:: https://img.shields.io/pypi/implementation/csu.svg
35
35
  :alt: Supported implementations
36
36
  :target: https://pypi.org/project/csu
37
- .. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.0.0.svg
37
+ .. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.0.2.svg
38
38
  :alt: Commits since latest release
39
- :target: https://github.com/ionelmc/python-csu/compare/v2.0.0...main
39
+ :target: https://github.com/ionelmc/python-csu/compare/v2.0.2...main
40
40
  .. |scrutinizer| image:: https://img.shields.io/scrutinizer/quality/g/ionelmc/python-csu/main.svg
41
41
  :alt: Scrutinizer Status
42
42
  :target: https://scrutinizer-ci.com/g/ionelmc/python-csu/
@@ -12,7 +12,7 @@ dynamic = [
12
12
  "readme",
13
13
  ]
14
14
  name = "csu"
15
- version = "2.0.0"
15
+ version = "2.0.2"
16
16
  license = "BSD-2-Clause"
17
17
  license-files = ["LICENSE"]
18
18
  description = "Clean Slate Utils - bunch of utility code, mostly Django/DRF specific."
@@ -2,4 +2,4 @@
2
2
  a.k.a Clean Slate Utils
3
3
  """
4
4
 
5
- __version__ = "2.0.0"
5
+ __version__ = "2.0.2"
@@ -48,7 +48,36 @@ class HTTPServiceResponse:
48
48
  return getattr(self.http_response, name)
49
49
 
50
50
 
51
+ class HTTPServiceAuth(AuthBase):
52
+ context: HTTPServiceContext
53
+ service: HTTPService
54
+
55
+ def __init__(self, context: HTTPServiceContext, service: HTTPService):
56
+ self.context = context
57
+ self.service = service
58
+
59
+ def __call__(self, request: PreparedRequest) -> PreparedRequest:
60
+ authed_request = self.service.auth(request, self.context)
61
+ assert isinstance(authed_request, PreparedRequest), f"{self.service.auth} must return a PreparedRequest"
62
+ return authed_request
63
+
64
+
65
+ class AsyncHTTPServiceAuth(AsyncAuthBase):
66
+ context: AsyncHTTPServiceContext
67
+ service: AsyncHTTPService
68
+
69
+ def __init__(self, context: AsyncHTTPServiceContext, service: AsyncHTTPService):
70
+ self.context = context
71
+ self.service = service
72
+
73
+ async def __call__(self, request: PreparedRequest) -> PreparedRequest:
74
+ authed_request = await self.service.auth(request, self.context)
75
+ assert isinstance(authed_request, PreparedRequest), f"{self.service.auth} must return a PreparedRequest"
76
+ return authed_request
77
+
78
+
51
79
  class HTTPServiceContext[RTYPE = HTTPServiceResponse]:
80
+ auth_class = HTTPServiceAuth
52
81
  client_class = Session
53
82
  client: Session
54
83
  logger: Logger
@@ -57,7 +86,7 @@ class HTTPServiceContext[RTYPE = HTTPServiceResponse]:
57
86
 
58
87
  def __init__(self, service: HTTPService[Self], event_id=None, auth=None, **kwargs):
59
88
  if auth is None:
60
- auth = HTTPServiceAuth(self, service)
89
+ auth = self.auth_class(self, service)
61
90
  self.client = self.client_class(
62
91
  timeout=service.timeout,
63
92
  base_url=service.base_url,
@@ -271,7 +300,7 @@ class HTTPServiceContext[RTYPE = HTTPServiceResponse]:
271
300
  try:
272
301
  json = response.json(parse_float=Decimal)
273
302
  except Exception as exc:
274
- raise DecodeError(response, exc, event_id=self.event_id) from None
303
+ raise DecodeError(response, exc, event_id=self.event_id) from exc
275
304
  else:
276
305
  json = None
277
306
  return self.handle_process_response(response, retry_statuses=retry_statuses, accept_statuses=accept_statuses, json=json)
@@ -289,6 +318,7 @@ class HTTPServiceContext[RTYPE = HTTPServiceResponse]:
289
318
 
290
319
 
291
320
  class AsyncHTTPServiceContext[RT = HTTPServiceResponse](HTTPServiceContext[RT]):
321
+ auth_class = AsyncHTTPServiceAuth
292
322
  client_class = AsyncSession
293
323
  client: AsyncSession
294
324
  logger: Logger
@@ -348,9 +378,12 @@ class AsyncHTTPServiceContext[RT = HTTPServiceResponse](HTTPServiceContext[RT]):
348
378
  response = await self.client.send(prepared_request, timeout=self.client.timeout, allow_redirects=follow_redirects, **settings)
349
379
  if expect_json:
350
380
  try:
351
- json = await response.json(parse_float=Decimal)
381
+ if stream:
382
+ json = await response.json(parse_float=Decimal)
383
+ else:
384
+ json = response.json(parse_float=Decimal)
352
385
  except Exception as exc:
353
- raise DecodeError(response, exc, event_id=self.event_id) from None
386
+ raise DecodeError(response, exc, event_id=self.event_id) from exc
354
387
  else:
355
388
  json = None
356
389
  return self.handle_process_response(response, retry_statuses=retry_statuses, accept_statuses=accept_statuses, json=json)
@@ -409,31 +442,3 @@ class AsyncHTTPService[ACT = AsyncHTTPServiceContext](HTTPService[ACT]):
409
442
 
410
443
  async def auth(self, request: PreparedRequest, context: ACT) -> PreparedRequest:
411
444
  return request
412
-
413
-
414
- class HTTPServiceAuth(AuthBase):
415
- context: HTTPServiceContext
416
- service: HTTPService
417
-
418
- def __init__(self, context: HTTPServiceContext, service: HTTPService):
419
- self.context = context
420
- self.service = service
421
-
422
- def __call__(self, request: PreparedRequest) -> PreparedRequest:
423
- authed_request = self.service.auth(request, self.context)
424
- assert isinstance(authed_request, PreparedRequest), f"{self.service.auth} must return a PreparedRequest"
425
- return authed_request
426
-
427
-
428
- class AsyncHTTPServiceAuth(AsyncAuthBase):
429
- context: AsyncHTTPServiceContext
430
- service: AsyncHTTPService
431
-
432
- def __init__(self, context: AsyncHTTPServiceContext, service: AsyncHTTPService):
433
- self.context = context
434
- self.service = service
435
-
436
- async def __call__(self, request: PreparedRequest) -> PreparedRequest:
437
- authed_request = await self.service.auth(request, self.context)
438
- assert isinstance(authed_request, PreparedRequest), f"{self.service.auth} must return a PreparedRequest"
439
- return authed_request
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csu
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: Clean Slate Utils - bunch of utility code, mostly Django/DRF specific.
5
5
  Author-email: Ionel Cristian Mărieș <contact@ionelmc.ro>
6
6
  License-Expression: BSD-2-Clause
@@ -77,9 +77,9 @@ Overview
77
77
  .. |supported-implementations| image:: https://img.shields.io/pypi/implementation/csu.svg
78
78
  :alt: Supported implementations
79
79
  :target: https://pypi.org/project/csu
80
- .. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.0.0.svg
80
+ .. |commits-since| image:: https://img.shields.io/github/commits-since/ionelmc/python-csu/v2.0.2.svg
81
81
  :alt: Commits since latest release
82
- :target: https://github.com/ionelmc/python-csu/compare/v2.0.0...main
82
+ :target: https://github.com/ionelmc/python-csu/compare/v2.0.2...main
83
83
  .. |scrutinizer| image:: https://img.shields.io/scrutinizer/quality/g/ionelmc/python-csu/main.svg
84
84
  :alt: Scrutinizer Status
85
85
  :target: https://scrutinizer-ci.com/g/ionelmc/python-csu/
@@ -247,7 +247,7 @@ Traceback (most recent call last):
247
247
  File "[&TEST_PATH]", line 76, in json
248
248
  return ctx.request("GET", "status/418", accept_statuses=[418]).json
249
249
  ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
250
- File "[&SERVICE_PATH]", line 274, in request
250
+ File "[&SERVICE_PATH]", line 303, in request
251
251
  raise DecodeError(response, exc, event_id=self.event_id) from None
252
252
  csu.exceptions.DecodeError: DecodeError(JSONDecodeError('Expecting value: line 2 column 5 (char 5)'), response=<Response Dummy [418]>)
253
253
  (418, b'\\n -=[ teapot ]=-\\n\\n _...._\\n .\\' _ _ `.\\n | ."` ^ `". _,\\n \\\\_;`"---"`|//\\n | ;/\\n \\\\_ _/\\n `"""`\\n')
@@ -310,10 +310,10 @@ Traceback (most recent call last):
310
310
  File "[&TEST_PATH]", line 45, in error
311
311
  return ctx.request("GET", "status/599", expect_json=False)
312
312
  ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
313
- File "[&SERVICE_PATH]", line 277, in request
313
+ File "[&SERVICE_PATH]", line 306, in request
314
314
  return self.handle_process_response(response, retry_statuses=retry_statuses, accept_statuses=accept_statuses, json=json)
315
315
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
316
- File "[&SERVICE_PATH]", line 197, in handle_process_response
316
+ File "[&SERVICE_PATH]", line 226, in handle_process_response
317
317
  raise UnexpectedStatusError(response, accept_statuses, event_id=self.event_id)
318
318
  csu.exceptions.UnexpectedStatusError: UnexpectedStatusError(<Response Dummy [599]>, accept_statuses=[200])
319
319
  (599, b'')
@@ -513,10 +513,10 @@ INFO | [01:000000.00] POST [&HTTPBIN]/anything?foo=bar&accept_statuses=%7B999
513
513
  """\
514
514
  ERROR | [01:000000.00] POST [&HTTPBIN]/anything?foo=bar&accept_statuses=%7B999%7D&expect_json=true&follow_redirects=false&retries_left=3&retry_count=0&retry_statuses=%7B200%7D !> RetryableStatusError('200 not in [999] but in [200]', 200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"3","retry_count":"0","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=3&retry_count=0&retry_statuses={200}"}\\n', event_id=241212:01:000000.00) (will retry 3 more times)
515
515
  Traceback (most recent call last):
516
- File "[&SERVICE_PATH]", line 277, in request
516
+ File "[&SERVICE_PATH]", line 306, in request
517
517
  return self.handle_process_response(response, retry_statuses=retry_statuses, accept_statuses=accept_statuses, json=json)
518
518
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
519
- File "[&SERVICE_PATH]", line 195, in handle_process_response
519
+ File "[&SERVICE_PATH]", line 224, in handle_process_response
520
520
  raise RetryableStatusError(response, accept_statuses, retry_statuses, event_id=self.event_id)
521
521
  csu.exceptions.RetryableStatusError: RetryableStatusError(<Response Dummy [200]>, accept_statuses=[999], retry_statuses=[200])
522
522
  (200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"3","retry_count":"0","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=3&retry_count=0&retry_statuses={200}"}\\n')
@@ -550,10 +550,10 @@ INFO | [01:000000.00] POST [&HTTPBIN]/anything?foo=bar&accept_statuses=%7B999
550
550
  """\
551
551
  ERROR | [01:000000.00] POST [&HTTPBIN]/anything?foo=bar&accept_statuses=%7B999%7D&expect_json=true&follow_redirects=false&retries_left=2&retry_count=1&retry_statuses=%7B200%7D !> RetryableStatusError('200 not in [999] but in [200]', 200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"2","retry_count":"1","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=2&retry_count=1&retry_statuses={200}"}\\n', event_id=241212:01:000000.00) (will retry 2 more times)
552
552
  Traceback (most recent call last):
553
- File "[&SERVICE_PATH]", line 277, in request
553
+ File "[&SERVICE_PATH]", line 306, in request
554
554
  return self.handle_process_response(response, retry_statuses=retry_statuses, accept_statuses=accept_statuses, json=json)
555
555
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
556
- File "[&SERVICE_PATH]", line 195, in handle_process_response
556
+ File "[&SERVICE_PATH]", line 224, in handle_process_response
557
557
  raise RetryableStatusError(response, accept_statuses, retry_statuses, event_id=self.event_id)
558
558
  csu.exceptions.RetryableStatusError: RetryableStatusError(<Response Dummy [200]>, accept_statuses=[999], retry_statuses=[200])
559
559
  (200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"2","retry_count":"1","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=2&retry_count=1&retry_statuses={200}"}\\n')
@@ -587,10 +587,10 @@ INFO | [01:000000.00] POST [&HTTPBIN]/anything?foo=bar&accept_statuses=%7B999
587
587
  """\
588
588
  ERROR | [01:000000.00] POST [&HTTPBIN]/anything?foo=bar&accept_statuses=%7B999%7D&expect_json=true&follow_redirects=false&retries_left=1&retry_count=2&retry_statuses=%7B200%7D !> RetryableStatusError('200 not in [999] but in [200]', 200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"1","retry_count":"2","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=1&retry_count=2&retry_statuses={200}"}\\n', event_id=241212:01:000000.00) (will retry 1 more times)
589
589
  Traceback (most recent call last):
590
- File "[&SERVICE_PATH]", line 277, in request
590
+ File "[&SERVICE_PATH]", line 306, in request
591
591
  return self.handle_process_response(response, retry_statuses=retry_statuses, accept_statuses=accept_statuses, json=json)
592
592
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
593
- File "[&SERVICE_PATH]", line 195, in handle_process_response
593
+ File "[&SERVICE_PATH]", line 224, in handle_process_response
594
594
  raise RetryableStatusError(response, accept_statuses, retry_statuses, event_id=self.event_id)
595
595
  csu.exceptions.RetryableStatusError: RetryableStatusError(<Response Dummy [200]>, accept_statuses=[999], retry_statuses=[200])
596
596
  (200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"1","retry_count":"2","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=1&retry_count=2&retry_statuses={200}"}\\n')
@@ -638,43 +638,43 @@ ERROR | (renderer: NoneType)
638
638
  | ...<6 lines>...
639
639
  | accept_statuses=[999],
640
640
  | )
641
- | File "[&SERVICE_PATH]", line 288, in request
641
+ | File "[&SERVICE_PATH]", line 317, in request
642
642
  | raise ExhaustedRetriesError(retry_budget, retry_failures, event_id=self.event_id)
643
643
  | csu.exceptions.ExhaustedRetriesError: ExhaustedRetriesError(3)
644
644
  | ([RetryableStatusError('200 not in [999] but in [200]', 200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"3","retry_count":"0","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=3&retry_count=0&retry_statuses={200}"}\\n', event_id=241212:01:000000.00), RetryableStatusError('200 not in [999] but in [200]', 200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"2","retry_count":"1","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=2&retry_count=1&retry_statuses={200}"}\\n', event_id=241212:01:000000.00), RetryableStatusError('200 not in [999] but in [200]', 200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"1","retry_count":"2","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=1&retry_count=2&retry_statuses={200}"}\\n', event_id=241212:01:000000.00), RetryableStatusError('200 not in [999] but in [200]', 200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"0","retry_count":"3","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=0&retry_count=3&retry_statuses={200}"}\\n', event_id=241212:01:000000.00)],)
645
645
  +-+---------------- 1 ----------------
646
646
  | Traceback (most recent call last):
647
- | File "[&SERVICE_PATH]", line 277, in request
647
+ | File "[&SERVICE_PATH]", line 306, in request
648
648
  | return self.handle_process_response(response, retry_statuses=retry_statuses, accept_statuses=accept_statuses, json=json)
649
649
  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
650
- | File "[&SERVICE_PATH]", line 195, in handle_process_response
650
+ | File "[&SERVICE_PATH]", line 224, in handle_process_response
651
651
  | raise RetryableStatusError(response, accept_statuses, retry_statuses, event_id=self.event_id)
652
652
  | csu.exceptions.RetryableStatusError: RetryableStatusError(<Response Dummy [200]>, accept_statuses=[999], retry_statuses=[200])
653
653
  | (200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"3","retry_count":"0","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=3&retry_count=0&retry_statuses={200}"}\\n')
654
654
  +---------------- 2 ----------------
655
655
  | Traceback (most recent call last):
656
- | File "[&SERVICE_PATH]", line 277, in request
656
+ | File "[&SERVICE_PATH]", line 306, in request
657
657
  | return self.handle_process_response(response, retry_statuses=retry_statuses, accept_statuses=accept_statuses, json=json)
658
658
  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
659
- | File "[&SERVICE_PATH]", line 195, in handle_process_response
659
+ | File "[&SERVICE_PATH]", line 224, in handle_process_response
660
660
  | raise RetryableStatusError(response, accept_statuses, retry_statuses, event_id=self.event_id)
661
661
  | csu.exceptions.RetryableStatusError: RetryableStatusError(<Response Dummy [200]>, accept_statuses=[999], retry_statuses=[200])
662
662
  | (200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"2","retry_count":"1","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=2&retry_count=1&retry_statuses={200}"}\\n')
663
663
  +---------------- 3 ----------------
664
664
  | Traceback (most recent call last):
665
- | File "[&SERVICE_PATH]", line 277, in request
665
+ | File "[&SERVICE_PATH]", line 306, in request
666
666
  | return self.handle_process_response(response, retry_statuses=retry_statuses, accept_statuses=accept_statuses, json=json)
667
667
  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
668
- | File "[&SERVICE_PATH]", line 195, in handle_process_response
668
+ | File "[&SERVICE_PATH]", line 224, in handle_process_response
669
669
  | raise RetryableStatusError(response, accept_statuses, retry_statuses, event_id=self.event_id)
670
670
  | csu.exceptions.RetryableStatusError: RetryableStatusError(<Response Dummy [200]>, accept_statuses=[999], retry_statuses=[200])
671
671
  | (200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"1","retry_count":"2","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=1&retry_count=2&retry_statuses={200}"}\\n')
672
672
  +---------------- 4 ----------------
673
673
  | Traceback (most recent call last):
674
- | File "[&SERVICE_PATH]", line 277, in request
674
+ | File "[&SERVICE_PATH]", line 306, in request
675
675
  | return self.handle_process_response(response, retry_statuses=retry_statuses, accept_statuses=accept_statuses, json=json)
676
676
  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
677
- | File "[&SERVICE_PATH]", line 195, in handle_process_response
677
+ | File "[&SERVICE_PATH]", line 224, in handle_process_response
678
678
  | raise RetryableStatusError(response, accept_statuses, retry_statuses, event_id=self.event_id)
679
679
  | csu.exceptions.RetryableStatusError: RetryableStatusError(<Response Dummy [200]>, accept_statuses=[999], retry_statuses=[200])
680
680
  | (200, b'{"args":{"accept_statuses":"{999}","expect_json":"true","follow_redirects":"false","foo":"bar","retries_left":"0","retry_count":"3","retry_statuses":"{200}"},"data":"config={\\'custom\\': \\'config\\'}","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Content-Length":"27","Host":"127.0.0.1:12345","User-Agent":"python-httpx/0.X.X"},"json":null,"method":"POST","origin":"127.0.0.1","url":"http://127.0.0.1:12345/anything?foo=bar&accept_statuses={999}&expect_json=true&follow_redirects=false&retries_left=0&retry_count=3&retry_statuses={200}"}\\n')
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes