httpware 0.15.2__tar.gz → 0.16.0__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 (29) hide show
  1. {httpware-0.15.2 → httpware-0.16.0}/PKG-INFO +2 -1
  2. {httpware-0.15.2 → httpware-0.16.0}/pyproject.toml +6 -1
  3. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/middleware/resilience/_event_loop_guard.py +3 -3
  4. {httpware-0.15.2 → httpware-0.16.0}/README.md +0 -0
  5. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/__init__.py +0 -0
  6. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/_internal/__init__.py +0 -0
  7. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/_internal/body_cap.py +0 -0
  8. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/_internal/exception_mapping.py +0 -0
  9. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/_internal/import_checker.py +0 -0
  10. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/_internal/observability.py +0 -0
  11. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/_internal/redaction.py +0 -0
  12. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/_internal/status.py +0 -0
  13. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/client.py +0 -0
  14. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/decoders/__init__.py +0 -0
  15. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/decoders/_caching.py +0 -0
  16. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/decoders/_resolver.py +0 -0
  17. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/decoders/msgspec.py +0 -0
  18. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/decoders/pydantic.py +0 -0
  19. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/errors.py +0 -0
  20. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/middleware/__init__.py +0 -0
  21. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/middleware/chain.py +0 -0
  22. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/middleware/resilience/__init__.py +0 -0
  23. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/middleware/resilience/_backoff.py +0 -0
  24. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/middleware/resilience/budget.py +0 -0
  25. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/middleware/resilience/bulkhead.py +0 -0
  26. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/middleware/resilience/circuit_breaker.py +0 -0
  27. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/middleware/resilience/retry.py +0 -0
  28. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/middleware/resilience/timeout.py +0 -0
  29. {httpware-0.15.2 → httpware-0.16.0}/src/httpware/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: httpware
3
- Version: 0.15.2
3
+ Version: 0.16.0
4
4
  Summary: Python HTTP client framework with sync & async clients and built-in resilience
5
5
  Keywords: http-client,httpx,async,asyncio,resilience,retry,circuit-breaker,bulkhead,middleware,pydantic,msgspec,python
6
6
  Author: Artur Shiriev
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta
15
16
  Classifier: Typing :: Typed
16
17
  Classifier: Topic :: Software Development :: Libraries
17
18
  Classifier: Topic :: Internet :: WWW/HTTP
@@ -26,12 +26,13 @@ classifiers = [
26
26
  "Programming Language :: Python :: 3.12",
27
27
  "Programming Language :: Python :: 3.13",
28
28
  "Programming Language :: Python :: 3.14",
29
+ "Programming Language :: Python :: Free Threading :: 2 - Beta",
29
30
  "Typing :: Typed",
30
31
  "Topic :: Software Development :: Libraries",
31
32
  "Topic :: Internet :: WWW/HTTP",
32
33
  "Framework :: AsyncIO",
33
34
  ]
34
- version = "0.15.2"
35
+ version = "0.16.0"
35
36
  dependencies = [
36
37
  "httpx2>=2.0.0,<3.0",
37
38
  ]
@@ -102,7 +103,11 @@ addopts = "--cov=. --cov-report term-missing --cov-fail-under=100"
102
103
  asyncio_mode = "auto"
103
104
  pythonpath = ["src"]
104
105
  asyncio_default_fixture_loop_scope = "function"
106
+ markers = [
107
+ "stress: concurrency stress test; proves thread-safety under free-threaded CPython (3.14t). Runs under the GIL too, so it counts toward coverage.",
108
+ ]
105
109
 
106
110
  [tool.coverage]
107
111
  run.concurrency = ["thread"]
112
+ run.omit = ["benchmarks/*"]
108
113
  report.exclude_also = ["if typing.TYPE_CHECKING:", 'pytest\.fail\(']
@@ -30,8 +30,8 @@ def check_event_loop(
30
30
  cached = get_loop()
31
31
  if cached is None:
32
32
  set_loop(current)
33
- # pragma below: inner double-check-with-lock race arm; only reachable when
34
- # two threads simultaneously pass the outer check, which single-threaded
35
- # tests can't trigger.
33
+ # pragma below: inner double-check-with-lock race arm. Reachable only when two
34
+ # threads pass the outer check and race for loop_lock — free-threaded CPython can
35
+ # reach it, but only nondeterministically, so it stays excluded from coverage.
36
36
  elif cached is not current: # pragma: no cover
37
37
  raise RuntimeError(message_template.format(first=cached, current=current))
File without changes