wsbuilder 1.2.2__tar.gz → 1.2.3__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 (131) hide show
  1. {wsbuilder-1.2.2/src/wsbuilder.egg-info → wsbuilder-1.2.3}/PKG-INFO +1 -1
  2. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/pyproject.toml +1 -1
  3. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/__init__.py +1 -1
  4. wsbuilder-1.2.3/src/wsbuilder/_coerce.py +17 -0
  5. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/cache.py +3 -14
  6. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/caches.py +2 -14
  7. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/metrics.py +2 -14
  8. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/proxyi.py +2 -14
  9. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/security.py +2 -14
  10. {wsbuilder-1.2.2 → wsbuilder-1.2.3/src/wsbuilder.egg-info}/PKG-INFO +1 -1
  11. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder.egg-info/SOURCES.txt +1 -0
  12. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/LICENSE +0 -0
  13. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/MANIFEST.in +0 -0
  14. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/README.md +0 -0
  15. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/404.html +0 -0
  16. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/CNAME +0 -0
  17. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/advanced.md +0 -0
  18. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/ai-predict.md +0 -0
  19. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/api-map.md +0 -0
  20. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/app-http.md +0 -0
  21. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/architecture.md +0 -0
  22. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/assets/wsbuilder-mark.svg +0 -0
  23. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/beginners.md +0 -0
  24. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/cache-security.md +0 -0
  25. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/cache.md +0 -0
  26. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/capabilities.md +0 -0
  27. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/data-orm.md +0 -0
  28. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/dns.md +0 -0
  29. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/full-project.md +0 -0
  30. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/getting-started.md +0 -0
  31. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/help/index.md +0 -0
  32. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/http-versions.md +0 -0
  33. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/http.md +0 -0
  34. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/ia.md +0 -0
  35. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/index.md +0 -0
  36. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/install.md +0 -0
  37. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/intermediate.md +0 -0
  38. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/mdns.md +0 -0
  39. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/network-edge.md +0 -0
  40. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/observability-tasks.md +0 -0
  41. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/observability.md +0 -0
  42. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/persistence.md +0 -0
  43. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/proxy.md +0 -0
  44. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/reference/index.md +0 -0
  45. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/security.md +0 -0
  46. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/stylesheets/extra.css +0 -0
  47. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/tasks.md +0 -0
  48. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/tls-certificates.md +0 -0
  49. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/docs/websocket.md +0 -0
  50. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/examples/full-project/.gitignore +0 -0
  51. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/examples/full-project/README.md +0 -0
  52. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/examples/full-project/app.py +0 -0
  53. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/examples/full-project/pyproject.toml +0 -0
  54. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/examples/full-project/upstream.py +0 -0
  55. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/mkdocs.yml +0 -0
  56. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/setup.cfg +0 -0
  57. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/__main__.py +0 -0
  58. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/app.py +0 -0
  59. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/constants.py +0 -0
  60. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/cookies.py +0 -0
  61. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/db_replicas.py +0 -0
  62. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/dns.py +0 -0
  63. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/framework.py +0 -0
  64. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/headers.py +0 -0
  65. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/hpack.py +0 -0
  66. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/http.py +0 -0
  67. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/http1.py +0 -0
  68. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/http2.py +0 -0
  69. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/http3.py +0 -0
  70. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/http3_server.py +0 -0
  71. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/http3_websocket.py +0 -0
  72. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/ia.py +0 -0
  73. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/logs.py +0 -0
  74. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/mdns.py +0 -0
  75. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/orm.py +0 -0
  76. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/pki.py +0 -0
  77. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/predicts.py +0 -0
  78. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/qpack.py +0 -0
  79. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/quic/__init__.py +0 -0
  80. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/quic/address.py +0 -0
  81. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/quic/connection.py +0 -0
  82. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/quic/crypto.py +0 -0
  83. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/quic/frames.py +0 -0
  84. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/quic/packet.py +0 -0
  85. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/quic/recovery.py +0 -0
  86. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/quic/tls.py +0 -0
  87. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/quic/varint.py +0 -0
  88. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/server.py +0 -0
  89. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/tasks.py +0 -0
  90. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder/ws.py +0 -0
  91. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder.egg-info/dependency_links.txt +0 -0
  92. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder.egg-info/entry_points.txt +0 -0
  93. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder.egg-info/requires.txt +0 -0
  94. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/src/wsbuilder.egg-info/top_level.txt +0 -0
  95. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_app_threads.py +0 -0
  96. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_cache.py +0 -0
  97. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_caches.py +0 -0
  98. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_contributing_policy.py +0 -0
  99. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_demo_monitor.py +0 -0
  100. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_dns.py +0 -0
  101. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_docs.py +0 -0
  102. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_documentation_files.py +0 -0
  103. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_headers_cookies.py +0 -0
  104. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_hpack.py +0 -0
  105. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_http.py +0 -0
  106. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_http1.py +0 -0
  107. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_http2.py +0 -0
  108. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_http3.py +0 -0
  109. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_http3_server.py +0 -0
  110. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_http3_streaming.py +0 -0
  111. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_http3_streaming_udp.py +0 -0
  112. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_ia.py +0 -0
  113. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_logs.py +0 -0
  114. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_mdns.py +0 -0
  115. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_metrics.py +0 -0
  116. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_orm.py +0 -0
  117. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_orm_replicas.py +0 -0
  118. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_pki.py +0 -0
  119. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_pr_identity_policy.py +0 -0
  120. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_predicts.py +0 -0
  121. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_proxyi.py +0 -0
  122. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_quic_address.py +0 -0
  123. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_quic_crypto.py +0 -0
  124. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_quic_protocol.py +0 -0
  125. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_quic_recovery.py +0 -0
  126. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_quic_tls.py +0 -0
  127. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_security.py +0 -0
  128. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_server.py +0 -0
  129. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_server_errors.py +0 -0
  130. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_tasks.py +0 -0
  131. {wsbuilder-1.2.2 → wsbuilder-1.2.3}/tests/test_ws.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wsbuilder
3
- Version: 1.2.2
3
+ Version: 1.2.3
4
4
  Summary: Lightweight HTTP + WebSocket framework for Python.
5
5
  Author: wsbuilder Authors
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "wsbuilder"
7
- version = "1.2.2"
7
+ version = "1.2.3"
8
8
  description = "Lightweight HTTP + WebSocket framework for Python."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -126,7 +126,7 @@ def __getattr__(name):
126
126
  def __dir__():
127
127
  return sorted(set(globals()) | _PKI_EXPORTS)
128
128
 
129
- __version__ = "1.2.2"
129
+ __version__ = "1.2.3"
130
130
 
131
131
  __all__ = [
132
132
  "App",
@@ -0,0 +1,17 @@
1
+ """Lenient number coercion shared by config-reading modules."""
2
+
3
+
4
+ def safe_int(value, default):
5
+ """``int(value)``, or ``default`` when the value cannot be converted."""
6
+ try:
7
+ return int(value)
8
+ except (TypeError, ValueError, OverflowError):
9
+ return default
10
+
11
+
12
+ def safe_float(value, default):
13
+ """``float(value)``, or ``default`` when the value cannot be converted."""
14
+ try:
15
+ return float(value)
16
+ except (TypeError, ValueError, OverflowError):
17
+ return default
@@ -9,24 +9,13 @@ import threading
9
9
  import time
10
10
  from collections.abc import Mapping
11
11
 
12
+ from ._coerce import safe_float as _safe_float
13
+ from ._coerce import safe_int as _safe_int
14
+
12
15
  DEFAULT_NAMESPACE = "default"
13
16
  DEFAULT_CLEANUP_INTERVAL_SECONDS = 30.0
14
17
 
15
18
 
16
- def _safe_float(value, default):
17
- try:
18
- return float(value)
19
- except (TypeError, ValueError, OverflowError):
20
- return default
21
-
22
-
23
- def _safe_int(value, default):
24
- try:
25
- return int(value)
26
- except (TypeError, ValueError, OverflowError):
27
- return default
28
-
29
-
30
19
  class _ValueCodec:
31
20
  def __init__(self, *, allow_pickle=False):
32
21
  self.allow_pickle = bool(allow_pickle)
@@ -11,6 +11,8 @@ import time
11
11
  from collections.abc import Iterable, Mapping
12
12
  from dataclasses import dataclass
13
13
 
14
+ from ._coerce import safe_float as _safe_float
15
+ from ._coerce import safe_int as _safe_int
14
16
  from .cache import SQLiteMemoryCache
15
17
  from .http import Response
16
18
 
@@ -36,20 +38,6 @@ _DROP_HEADERS = {
36
38
  }
37
39
 
38
40
 
39
- def _safe_float(value, default):
40
- try:
41
- return float(value)
42
- except (TypeError, ValueError, OverflowError):
43
- return default
44
-
45
-
46
- def _safe_int(value, default):
47
- try:
48
- return int(value)
49
- except (TypeError, ValueError, OverflowError):
50
- return default
51
-
52
-
53
41
  def _normalize_mimetype(content_type):
54
42
  text = str(content_type or "").strip().lower()
55
43
  if not text:
@@ -5,6 +5,8 @@ import threading
5
5
  import time
6
6
  from datetime import UTC, datetime
7
7
 
8
+ from ._coerce import safe_float as _safe_float
9
+ from ._coerce import safe_int as _safe_int
8
10
  from .http import Response
9
11
 
10
12
  DEFAULT_STREAM_POINTS = 5
@@ -16,20 +18,6 @@ def _iso_utc(ts):
16
18
  return datetime.fromtimestamp(ts, UTC).isoformat()
17
19
 
18
20
 
19
- def _safe_int(value, default):
20
- try:
21
- return int(value)
22
- except (TypeError, ValueError, OverflowError):
23
- return default
24
-
25
-
26
- def _safe_float(value, default):
27
- try:
28
- return float(value)
29
- except (TypeError, ValueError, OverflowError):
30
- return default
31
-
32
-
33
21
  def _is_truthy(value):
34
22
  if value is None:
35
23
  return False
@@ -16,6 +16,8 @@ from dataclasses import dataclass, field
16
16
  from html import escape as html_escape
17
17
  from urllib.parse import urlsplit
18
18
 
19
+ from ._coerce import safe_float as _safe_float
20
+ from ._coerce import safe_int as _safe_int
19
21
  from .http import Response
20
22
 
21
23
  DEFAULT_STREAM_POINTS = 5
@@ -96,20 +98,6 @@ _SENSITIVE_HEADER_NAMES = {
96
98
  _REDACTED_HEADER_VALUE = "[REDACTED]"
97
99
 
98
100
 
99
- def _safe_int(value, default):
100
- try:
101
- return int(value)
102
- except (TypeError, ValueError, OverflowError):
103
- return default
104
-
105
-
106
- def _safe_float(value, default):
107
- try:
108
- return float(value)
109
- except (TypeError, ValueError, OverflowError):
110
- return default
111
-
112
-
113
101
  def _is_truthy(value):
114
102
  if value is None:
115
103
  return False
@@ -9,6 +9,8 @@ import time
9
9
  from collections import deque
10
10
  from dataclasses import dataclass
11
11
 
12
+ from ._coerce import safe_float as _safe_float
13
+ from ._coerce import safe_int as _safe_int
12
14
  from .headers import get_header
13
15
  from .http import Response
14
16
 
@@ -26,20 +28,6 @@ DEFAULT_MAX_TRACKED_CLIENTS = 20000
26
28
  DEFAULT_MAX_TEMPORARY_BLOCKS = 20000
27
29
 
28
30
 
29
- def _safe_int(value, default):
30
- try:
31
- return int(value)
32
- except (TypeError, ValueError, OverflowError):
33
- return default
34
-
35
-
36
- def _safe_float(value, default):
37
- try:
38
- return float(value)
39
- except (TypeError, ValueError, OverflowError):
40
- return default
41
-
42
-
43
31
  def _to_ip(value):
44
32
  text = str(value or "").strip()
45
33
  if not text:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wsbuilder
3
- Version: 1.2.2
3
+ Version: 1.2.3
4
4
  Summary: Lightweight HTTP + WebSocket framework for Python.
5
5
  Author: wsbuilder Authors
6
6
  License-Expression: MIT
@@ -45,6 +45,7 @@ examples/full-project/pyproject.toml
45
45
  examples/full-project/upstream.py
46
46
  src/wsbuilder/__init__.py
47
47
  src/wsbuilder/__main__.py
48
+ src/wsbuilder/_coerce.py
48
49
  src/wsbuilder/app.py
49
50
  src/wsbuilder/cache.py
50
51
  src/wsbuilder/caches.py
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