edri 2025.10.1rc1__tar.gz → 2025.11.1rc1__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 (167) hide show
  1. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/PKG-INFO +2 -1
  2. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/handlers/base_handler.py +3 -1
  3. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/handlers/http_handler.py +1 -1
  4. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/validation.py +14 -7
  5. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri.egg-info/PKG-INFO +2 -1
  6. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/setup.py +2 -1
  7. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/README.md +0 -0
  8. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/__init__.py +0 -0
  9. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/abstract/__init__.py +0 -0
  10. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/abstract/manager/__init__.py +0 -0
  11. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/abstract/manager/manager_base.py +0 -0
  12. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/abstract/manager/manager_priority_base.py +0 -0
  13. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/abstract/manager/worker.py +0 -0
  14. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/abstract/worker/__init__.py +0 -0
  15. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/abstract/worker/worker.py +0 -0
  16. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/abstract/worker/worker_process.py +0 -0
  17. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/abstract/worker/worker_thread.py +0 -0
  18. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/__init__.py +0 -0
  19. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/broker.py +0 -0
  20. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/dataclass/__init__.py +0 -0
  21. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/dataclass/api_event.py +0 -0
  22. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/dataclass/client.py +0 -0
  23. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/dataclass/file.py +0 -0
  24. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/extensions/__init__.py +0 -0
  25. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/extensions/url_extension.py +0 -0
  26. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/extensions/url_prefix.py +0 -0
  27. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/handlers/__init__.py +0 -0
  28. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/handlers/html_handler.py +0 -0
  29. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/handlers/rest_handler.py +0 -0
  30. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/handlers/websocket_handler.py +0 -0
  31. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/listener.py +0 -0
  32. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/middleware.py +0 -0
  33. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/static_pages/documentation.j2 +0 -0
  34. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/static_pages/health_check_status.j2 +0 -0
  35. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/static_pages/status_300.j2 +0 -0
  36. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/static_pages/status_400.j2 +0 -0
  37. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/api/static_pages/status_500.j2 +0 -0
  38. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/config/__init__.py +0 -0
  39. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/config/constant.py +0 -0
  40. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/config/setting.py +0 -0
  41. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/dataclass/__init__.py +0 -0
  42. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/dataclass/directive/__init__.py +0 -0
  43. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/dataclass/directive/base.py +0 -0
  44. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/dataclass/directive/html.py +0 -0
  45. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/dataclass/directive/http.py +0 -0
  46. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/dataclass/event.py +0 -0
  47. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/dataclass/health_checker.py +0 -0
  48. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/dataclass/injection.py +0 -0
  49. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/dataclass/response.py +0 -0
  50. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/__init__.py +0 -0
  51. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/__init__.py +0 -0
  52. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/client/__init__.py +0 -0
  53. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/client/documentation.py +0 -0
  54. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/client/register.py +0 -0
  55. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/client/unregister.py +0 -0
  56. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/group/__init__.py +0 -0
  57. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/group/client.py +0 -0
  58. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/group/manage.py +0 -0
  59. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/manage/__init__.py +0 -0
  60. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/manage/list_registered.py +0 -0
  61. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/manage/register.py +0 -0
  62. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/manage/unregister.py +0 -0
  63. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/api/manage/unregister_all.py +0 -0
  64. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/__init__.py +0 -0
  65. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/group/__init__.py +0 -0
  66. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/group/manager.py +0 -0
  67. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/group/router.py +0 -0
  68. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/group/scheduler.py +0 -0
  69. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/group/store.py +0 -0
  70. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/group/switch.py +0 -0
  71. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/group/test.py +0 -0
  72. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/manager/__init__.py +0 -0
  73. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/manager/restart.py +0 -0
  74. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/manager/stream_close.py +0 -0
  75. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/manager/stream_create.py +0 -0
  76. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/manager/stream_message.py +0 -0
  77. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/manager/worker_quit.py +0 -0
  78. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/__init__.py +0 -0
  79. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/demands.py +0 -0
  80. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/health_check.py +0 -0
  81. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/last_events.py +0 -0
  82. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/send_from.py +0 -0
  83. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/subscribe.py +0 -0
  84. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/subscribe_connector.py +0 -0
  85. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/subscribed_external.py +0 -0
  86. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/subscribed_new.py +0 -0
  87. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/unsubscribe.py +0 -0
  88. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/router/unsubscribe_all.py +0 -0
  89. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/scheduler/__init__.py +0 -0
  90. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/scheduler/cancel.py +0 -0
  91. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/scheduler/set.py +0 -0
  92. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/scheduler/set_or_update.py +0 -0
  93. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/scheduler/update.py +0 -0
  94. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/store/__init__.py +0 -0
  95. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/store/delete.py +0 -0
  96. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/store/get.py +0 -0
  97. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/store/get_callback.py +0 -0
  98. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/events/edri/store/set.py +0 -0
  99. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/router/__init__.py +0 -0
  100. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/router/cache.py +0 -0
  101. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/router/connector/__init__.py +0 -0
  102. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/router/connector/connector.py +0 -0
  103. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/router/connector/socket.py +0 -0
  104. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/router/health_checker.py +0 -0
  105. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/router/router.py +0 -0
  106. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/switch/__init__.py +0 -0
  107. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/switch/connection.py +0 -0
  108. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/switch/forwarder.py +0 -0
  109. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/switch/receiver.py +0 -0
  110. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/switch/sender.py +0 -0
  111. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/switch/switch.py +0 -0
  112. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/__init__.py +0 -0
  113. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/function.py +0 -0
  114. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/json_encoder.py +0 -0
  115. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/manager/__init__.py +0 -0
  116. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/manager/scheduler.py +0 -0
  117. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/manager/store.py +0 -0
  118. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/normalized_default_dict.py +0 -0
  119. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/queue.py +0 -0
  120. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/shared_memory_pipe.py +0 -0
  121. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/storage.py +0 -0
  122. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/transformation.py +0 -0
  123. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri/utility/watcher.py +0 -0
  124. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri.egg-info/SOURCES.txt +0 -0
  125. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri.egg-info/dependency_links.txt +0 -0
  126. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri.egg-info/requires.txt +0 -0
  127. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/edri.egg-info/top_level.txt +0 -0
  128. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/setup.cfg +0 -0
  129. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/__init__.py +0 -0
  130. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/abstract/__init__.py +0 -0
  131. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/abstract/manager/__init__.py +0 -0
  132. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/abstract/manager/test_manager_base.py +0 -0
  133. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/abstract/manager/test_manager_base_priority.py +0 -0
  134. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/abstract/worker/__init__.py +0 -0
  135. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/abstract/worker/test_worker.py +0 -0
  136. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/api/__init__.py +0 -0
  137. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/api/handlers/__init__.py +0 -0
  138. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/api/handlers/test_base_handler.py +0 -0
  139. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/api/handlers/test_html_handler.py +0 -0
  140. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/api/handlers/test_http_handler.py +0 -0
  141. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/api/test_broker.py +0 -0
  142. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/dataclass/__init__.py +0 -0
  143. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/dataclass/event/__init__.py +0 -0
  144. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/dataclass/event/test_event.py +0 -0
  145. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/dataclass/event/test_event_init.py +0 -0
  146. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/dataclass/event/test_response.py +0 -0
  147. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/events/__init__.py +0 -0
  148. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/events/test/__init__.py +0 -0
  149. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/events/test/event_request.py +0 -0
  150. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/events/test/ping.py +0 -0
  151. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/events/test/ping2.py +0 -0
  152. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/router/__init__.py +0 -0
  153. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/router/test_cache.py +0 -0
  154. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/router/test_health_checker.py +0 -0
  155. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/router/test_router.py +0 -0
  156. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/test_edri_init.py +0 -0
  157. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/__init__.py +0 -0
  158. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/manager/__init__.py +0 -0
  159. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/manager/test_scheduler.py +0 -0
  160. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/manager/test_store.py +0 -0
  161. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/test_function.py +0 -0
  162. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/test_json_encoder.py +0 -0
  163. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/test_normalized_default_dict.py +0 -0
  164. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/test_shared_memory_pipe.py +0 -0
  165. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/test_storage.py +0 -0
  166. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/test_transformation.py +0 -0
  167. {edri-2025.10.1rc1 → edri-2025.11.1rc1}/tests/utility/test_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edri
3
- Version: 2025.10.1rc1
3
+ Version: 2025.11.1rc1
4
4
  Summary: Event Driven Routing Infrastructure
5
5
  Author: Marek Olšan
6
6
  Author-email: marek.olsan@gmail.com
@@ -9,6 +9,7 @@ Classifier: License :: OSI Approved :: MIT License
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Programming Language :: Python :: 3.12
11
11
  Classifier: Programming Language :: Python :: 3.13
12
+ Classifier: Programming Language :: Python :: 3.14
12
13
  Classifier: Operating System :: POSIX
13
14
  Classifier: Operating System :: POSIX :: Linux
14
15
  Classifier: Intended Audience :: Developers
@@ -2,7 +2,7 @@ from abc import ABC, abstractmethod
2
2
  from dataclasses import fields, MISSING
3
3
  from logging import getLogger
4
4
  from types import UnionType, NoneType
5
- from typing import Callable, Type, get_origin, Union, get_args, Any, TypedDict, Literal
5
+ from typing import Callable, Type, get_origin, Union, get_args, Any, TypedDict, Literal, TypeAliasType
6
6
  from urllib.parse import parse_qs, unquote
7
7
 
8
8
  from edri.dataclass.directive import ResponseDirective
@@ -91,6 +91,8 @@ class BaseHandler[T: ResponseDirective](ABC):
91
91
  Raises:
92
92
  TypeError: If the value cannot be converted to the specified type.
93
93
  """
94
+ if isinstance(annotation, TypeAliasType):
95
+ annotation = annotation.__value__
94
96
  if get_origin(annotation) or isinstance(annotation, UnionType):
95
97
  if isinstance(annotation, UnionType) or get_origin(annotation) == Union:
96
98
  annotations = get_args(annotation)
@@ -486,7 +486,7 @@ class HTTPHandler[T: HTTPResponseDirective](BaseHandler, ABC):
486
486
 
487
487
  async def parse_body(self, event: Type[Event]) -> None:
488
488
  if not self.headers["content-type"]:
489
- return
489
+ self.headers["content-type"] = ["application/octet-stream"]
490
490
 
491
491
  if event._is_file_only is None:
492
492
  while self.body.tell() < MAX_BODY_SIZE:
@@ -1,5 +1,6 @@
1
1
  from datetime import date, datetime, time
2
2
  from re import Pattern
3
+ from typing import Self
3
4
 
4
5
 
5
6
  class StringValidation(str):
@@ -11,7 +12,7 @@ class StringValidation(str):
11
12
  - Minimum and maximum allowed lengths.
12
13
 
13
14
  Args:
14
- data (str): The input string to validate.
15
+ value (str): The input string to validate.
15
16
  maximum_length (int, optional): Maximum allowed length of the string.
16
17
  minimum_length (int, optional): Minimum required length of the string.
17
18
  regex (Pattern, optional): A compiled regex pattern the string must match.
@@ -27,20 +28,26 @@ class StringValidation(str):
27
28
  def __new__(cls, value, /, *,
28
29
  maximum_length: int = None,
29
30
  minimum_length: int = None,
30
- regex: Pattern | None = None,
31
- ):
31
+ regex: Pattern[str] | None = None,
32
+ ) -> Self:
32
33
 
33
34
  value = super().__new__(cls, value)
34
35
  if regex is not None:
35
- if not regex.match(value):
36
- raise ValueError(f"Invalid data provided. Data '{value}' not match pattern '{regex.pattern}'")
36
+ if not regex.fullmatch(value):
37
+ raise ValueError(
38
+ f"Invalid data provided. Data '{cls.safe_val(value)}' does not match pattern '{regex.pattern}'")
37
39
  if minimum_length is not None and len(value) < minimum_length:
38
- raise ValueError(f"Invalid data provided. Data '{value}' is too short")
40
+ raise ValueError(f"Invalid data provided. Data '{cls.safe_val(value)}' is too short")
39
41
  if maximum_length is not None and len(value) > maximum_length:
40
- raise ValueError(f"Invalid data provided. Data '{value}' is too long")
42
+ raise ValueError(f"Invalid data provided. Data '{cls.safe_val(value)}' is too long")
41
43
 
42
44
  return value
43
45
 
46
+ @staticmethod
47
+ def safe_val(v, max_len=20):
48
+ """Return truncated display string, not full content."""
49
+ return (v[:max_len] + "…") if len(v) > max_len else v
50
+
44
51
 
45
52
  class IntegerValidation(int):
46
53
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edri
3
- Version: 2025.10.1rc1
3
+ Version: 2025.11.1rc1
4
4
  Summary: Event Driven Routing Infrastructure
5
5
  Author: Marek Olšan
6
6
  Author-email: marek.olsan@gmail.com
@@ -9,6 +9,7 @@ Classifier: License :: OSI Approved :: MIT License
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Programming Language :: Python :: 3.12
11
11
  Classifier: Programming Language :: Python :: 3.13
12
+ Classifier: Programming Language :: Python :: 3.14
12
13
  Classifier: Operating System :: POSIX
13
14
  Classifier: Operating System :: POSIX :: Linux
14
15
  Classifier: Intended Audience :: Developers
@@ -122,7 +122,7 @@ Whether you're building a real-time data processing system, a distributed servic
122
122
 
123
123
  setup(
124
124
  name='edri',
125
- version='2025.10.01rc1',
125
+ version='2025.11.01rc1',
126
126
  packages=find_packages(),
127
127
  description='Event Driven Routing Infrastructure',
128
128
  long_description=long_description,
@@ -163,6 +163,7 @@ setup(
163
163
  "Programming Language :: Python :: 3",
164
164
  "Programming Language :: Python :: 3.12",
165
165
  "Programming Language :: Python :: 3.13",
166
+ "Programming Language :: Python :: 3.14",
166
167
  "Operating System :: POSIX",
167
168
  "Operating System :: POSIX :: Linux",
168
169
  "Intended Audience :: Developers",
File without changes
File without changes