exonware-xwsystem 0.1.0.1__py3-none-any.whl → 0.1.0.4__py3-none-any.whl

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 (341) hide show
  1. exonware/__init__.py +2 -1
  2. exonware/conf.py +2 -2
  3. exonware/xwsystem/__init__.py +115 -43
  4. exonware/xwsystem/base.py +30 -0
  5. exonware/xwsystem/caching/__init__.py +39 -13
  6. exonware/xwsystem/caching/base.py +24 -6
  7. exonware/xwsystem/caching/bloom_cache.py +2 -2
  8. exonware/xwsystem/caching/cache_manager.py +2 -1
  9. exonware/xwsystem/caching/conditional.py +2 -2
  10. exonware/xwsystem/caching/contracts.py +85 -139
  11. exonware/xwsystem/caching/decorators.py +6 -19
  12. exonware/xwsystem/caching/defs.py +2 -1
  13. exonware/xwsystem/caching/disk_cache.py +2 -1
  14. exonware/xwsystem/caching/distributed.py +2 -1
  15. exonware/xwsystem/caching/errors.py +2 -1
  16. exonware/xwsystem/caching/events.py +110 -27
  17. exonware/xwsystem/caching/eviction_strategies.py +2 -2
  18. exonware/xwsystem/caching/external_caching_python.py +701 -0
  19. exonware/xwsystem/caching/facade.py +253 -0
  20. exonware/xwsystem/caching/factory.py +300 -0
  21. exonware/xwsystem/caching/fluent.py +14 -12
  22. exonware/xwsystem/caching/integrity.py +21 -6
  23. exonware/xwsystem/caching/lfu_cache.py +2 -1
  24. exonware/xwsystem/caching/lfu_optimized.py +18 -6
  25. exonware/xwsystem/caching/lru_cache.py +7 -4
  26. exonware/xwsystem/caching/memory_bounded.py +2 -2
  27. exonware/xwsystem/caching/metrics_exporter.py +2 -2
  28. exonware/xwsystem/caching/observable_cache.py +2 -2
  29. exonware/xwsystem/caching/pluggable_cache.py +2 -2
  30. exonware/xwsystem/caching/rate_limiter.py +2 -2
  31. exonware/xwsystem/caching/read_through.py +2 -2
  32. exonware/xwsystem/caching/secure_cache.py +81 -28
  33. exonware/xwsystem/caching/serializable.py +9 -7
  34. exonware/xwsystem/caching/stats.py +2 -2
  35. exonware/xwsystem/caching/tagging.py +2 -2
  36. exonware/xwsystem/caching/ttl_cache.py +4 -3
  37. exonware/xwsystem/caching/two_tier_cache.py +6 -3
  38. exonware/xwsystem/caching/utils.py +30 -12
  39. exonware/xwsystem/caching/validation.py +2 -2
  40. exonware/xwsystem/caching/warming.py +6 -3
  41. exonware/xwsystem/caching/write_behind.py +15 -6
  42. exonware/xwsystem/config/__init__.py +11 -17
  43. exonware/xwsystem/config/base.py +5 -5
  44. exonware/xwsystem/config/contracts.py +93 -153
  45. exonware/xwsystem/config/defaults.py +3 -2
  46. exonware/xwsystem/config/defs.py +3 -2
  47. exonware/xwsystem/config/errors.py +2 -5
  48. exonware/xwsystem/config/logging.py +12 -8
  49. exonware/xwsystem/config/logging_setup.py +3 -2
  50. exonware/xwsystem/config/performance.py +1 -46
  51. exonware/xwsystem/config/performance_modes.py +9 -8
  52. exonware/xwsystem/config/version_manager.py +1 -0
  53. exonware/xwsystem/config.py +27 -0
  54. exonware/xwsystem/console/__init__.py +53 -0
  55. exonware/xwsystem/console/base.py +133 -0
  56. exonware/xwsystem/console/cli/__init__.py +61 -0
  57. exonware/xwsystem/{cli → console/cli}/args.py +27 -24
  58. exonware/xwsystem/{cli → console/cli}/base.py +18 -87
  59. exonware/xwsystem/{cli → console/cli}/colors.py +15 -13
  60. exonware/xwsystem/console/cli/console.py +98 -0
  61. exonware/xwsystem/{cli → console/cli}/contracts.py +51 -69
  62. exonware/xwsystem/console/cli/defs.py +87 -0
  63. exonware/xwsystem/console/cli/encoding.py +69 -0
  64. exonware/xwsystem/{cli → console/cli}/errors.py +8 -3
  65. exonware/xwsystem/console/cli/event_logger.py +166 -0
  66. exonware/xwsystem/{cli → console/cli}/progress.py +25 -21
  67. exonware/xwsystem/{cli → console/cli}/prompts.py +3 -2
  68. exonware/xwsystem/{cli → console/cli}/tables.py +27 -24
  69. exonware/xwsystem/console/contracts.py +113 -0
  70. exonware/xwsystem/console/defs.py +154 -0
  71. exonware/xwsystem/console/errors.py +34 -0
  72. exonware/xwsystem/console/event_logger.py +385 -0
  73. exonware/xwsystem/console/writer.py +132 -0
  74. exonware/xwsystem/contracts.py +28 -0
  75. exonware/xwsystem/data_structures/__init__.py +23 -0
  76. exonware/xwsystem/data_structures/trie.py +34 -0
  77. exonware/xwsystem/data_structures/union_find.py +144 -0
  78. exonware/xwsystem/defs.py +17 -0
  79. exonware/xwsystem/errors.py +23 -0
  80. exonware/xwsystem/facade.py +62 -0
  81. exonware/xwsystem/http_client/__init__.py +22 -1
  82. exonware/xwsystem/http_client/advanced_client.py +8 -5
  83. exonware/xwsystem/http_client/base.py +3 -2
  84. exonware/xwsystem/http_client/client.py +7 -4
  85. exonware/xwsystem/http_client/contracts.py +42 -56
  86. exonware/xwsystem/http_client/defs.py +2 -1
  87. exonware/xwsystem/http_client/errors.py +2 -1
  88. exonware/xwsystem/http_client/facade.py +156 -0
  89. exonware/xwsystem/io/__init__.py +22 -3
  90. exonware/xwsystem/io/archive/__init__.py +8 -2
  91. exonware/xwsystem/io/archive/archive.py +1 -1
  92. exonware/xwsystem/io/archive/archive_files.py +4 -7
  93. exonware/xwsystem/io/archive/archivers.py +120 -10
  94. exonware/xwsystem/io/archive/base.py +4 -5
  95. exonware/xwsystem/io/archive/codec_integration.py +1 -2
  96. exonware/xwsystem/io/archive/compression.py +1 -2
  97. exonware/xwsystem/io/archive/facade.py +263 -0
  98. exonware/xwsystem/io/archive/formats/__init__.py +2 -3
  99. exonware/xwsystem/io/archive/formats/brotli_format.py +20 -7
  100. exonware/xwsystem/io/archive/formats/lz4_format.py +20 -7
  101. exonware/xwsystem/io/archive/formats/rar.py +11 -5
  102. exonware/xwsystem/io/archive/formats/sevenzip.py +12 -6
  103. exonware/xwsystem/io/archive/formats/squashfs_format.py +1 -2
  104. exonware/xwsystem/io/archive/formats/tar.py +52 -7
  105. exonware/xwsystem/io/archive/formats/wim_format.py +11 -5
  106. exonware/xwsystem/io/archive/formats/zip.py +1 -2
  107. exonware/xwsystem/io/archive/formats/zpaq_format.py +1 -2
  108. exonware/xwsystem/io/archive/formats/zstandard.py +20 -7
  109. exonware/xwsystem/io/base.py +119 -115
  110. exonware/xwsystem/io/codec/__init__.py +4 -2
  111. exonware/xwsystem/io/codec/base.py +19 -13
  112. exonware/xwsystem/io/codec/contracts.py +59 -2
  113. exonware/xwsystem/io/codec/registry.py +67 -21
  114. exonware/xwsystem/io/common/__init__.py +1 -1
  115. exonware/xwsystem/io/common/atomic.py +29 -16
  116. exonware/xwsystem/io/common/base.py +11 -10
  117. exonware/xwsystem/io/common/lock.py +6 -5
  118. exonware/xwsystem/io/common/path_manager.py +2 -1
  119. exonware/xwsystem/io/common/watcher.py +1 -2
  120. exonware/xwsystem/io/contracts.py +301 -433
  121. exonware/xwsystem/io/contracts_1.py +1180 -0
  122. exonware/xwsystem/io/data_operations.py +19 -20
  123. exonware/xwsystem/io/defs.py +4 -3
  124. exonware/xwsystem/io/errors.py +3 -2
  125. exonware/xwsystem/io/facade.py +87 -61
  126. exonware/xwsystem/io/file/__init__.py +1 -1
  127. exonware/xwsystem/io/file/base.py +8 -9
  128. exonware/xwsystem/io/file/conversion.py +2 -3
  129. exonware/xwsystem/io/file/file.py +61 -18
  130. exonware/xwsystem/io/file/paged_source.py +8 -8
  131. exonware/xwsystem/io/file/paging/__init__.py +1 -2
  132. exonware/xwsystem/io/file/paging/byte_paging.py +4 -5
  133. exonware/xwsystem/io/file/paging/line_paging.py +2 -3
  134. exonware/xwsystem/io/file/paging/record_paging.py +2 -3
  135. exonware/xwsystem/io/file/paging/registry.py +1 -2
  136. exonware/xwsystem/io/file/source.py +13 -17
  137. exonware/xwsystem/io/filesystem/__init__.py +1 -1
  138. exonware/xwsystem/io/filesystem/base.py +1 -2
  139. exonware/xwsystem/io/filesystem/local.py +3 -4
  140. exonware/xwsystem/io/folder/__init__.py +1 -1
  141. exonware/xwsystem/io/folder/base.py +1 -2
  142. exonware/xwsystem/io/folder/folder.py +16 -7
  143. exonware/xwsystem/io/indexing/__init__.py +14 -0
  144. exonware/xwsystem/io/indexing/facade.py +443 -0
  145. exonware/xwsystem/io/path_parser.py +98 -0
  146. exonware/xwsystem/io/serialization/__init__.py +21 -3
  147. exonware/xwsystem/io/serialization/auto_serializer.py +146 -20
  148. exonware/xwsystem/io/serialization/base.py +84 -34
  149. exonware/xwsystem/io/serialization/contracts.py +50 -73
  150. exonware/xwsystem/io/serialization/defs.py +2 -1
  151. exonware/xwsystem/io/serialization/errors.py +2 -1
  152. exonware/xwsystem/io/serialization/flyweight.py +154 -7
  153. exonware/xwsystem/io/serialization/format_detector.py +15 -14
  154. exonware/xwsystem/io/serialization/formats/__init__.py +8 -5
  155. exonware/xwsystem/io/serialization/formats/binary/bson.py +15 -6
  156. exonware/xwsystem/io/serialization/formats/binary/cbor.py +5 -5
  157. exonware/xwsystem/io/serialization/formats/binary/marshal.py +5 -5
  158. exonware/xwsystem/io/serialization/formats/binary/msgpack.py +5 -5
  159. exonware/xwsystem/io/serialization/formats/binary/pickle.py +5 -5
  160. exonware/xwsystem/io/serialization/formats/binary/plistlib.py +5 -5
  161. exonware/xwsystem/io/serialization/formats/database/dbm.py +7 -7
  162. exonware/xwsystem/io/serialization/formats/database/shelve.py +7 -7
  163. exonware/xwsystem/io/serialization/formats/database/sqlite3.py +7 -7
  164. exonware/xwsystem/io/serialization/formats/tabular/__init__.py +27 -0
  165. exonware/xwsystem/io/serialization/formats/tabular/base.py +89 -0
  166. exonware/xwsystem/io/serialization/formats/tabular/csv.py +319 -0
  167. exonware/xwsystem/io/serialization/formats/tabular/df.py +249 -0
  168. exonware/xwsystem/io/serialization/formats/tabular/excel.py +291 -0
  169. exonware/xwsystem/io/serialization/formats/tabular/googlesheets.py +374 -0
  170. exonware/xwsystem/io/serialization/formats/text/__init__.py +1 -1
  171. exonware/xwsystem/io/serialization/formats/text/append_only_log.py +5 -7
  172. exonware/xwsystem/io/serialization/formats/text/configparser.py +5 -5
  173. exonware/xwsystem/io/serialization/formats/text/csv.py +7 -5
  174. exonware/xwsystem/io/serialization/formats/text/formdata.py +5 -5
  175. exonware/xwsystem/io/serialization/formats/text/json.py +27 -18
  176. exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
  177. exonware/xwsystem/io/serialization/formats/text/jsonlines.py +18 -14
  178. exonware/xwsystem/io/serialization/formats/text/multipart.py +5 -5
  179. exonware/xwsystem/io/serialization/formats/text/toml.py +8 -6
  180. exonware/xwsystem/io/serialization/formats/text/xml.py +25 -20
  181. exonware/xwsystem/io/serialization/formats/text/yaml.py +8 -6
  182. exonware/xwsystem/io/serialization/parsers/__init__.py +3 -2
  183. exonware/xwsystem/io/serialization/parsers/base.py +6 -5
  184. exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +7 -6
  185. exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +10 -7
  186. exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +7 -6
  187. exonware/xwsystem/io/serialization/parsers/orjson_parser.py +11 -8
  188. exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +13 -9
  189. exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +10 -7
  190. exonware/xwsystem/io/serialization/parsers/registry.py +11 -10
  191. exonware/xwsystem/io/serialization/parsers/standard.py +7 -6
  192. exonware/xwsystem/io/serialization/parsers/ujson_parser.py +10 -7
  193. exonware/xwsystem/io/serialization/registry.py +4 -4
  194. exonware/xwsystem/io/serialization/serializer.py +168 -79
  195. exonware/xwsystem/io/serialization/universal_options.py +367 -0
  196. exonware/xwsystem/io/serialization/utils/__init__.py +1 -2
  197. exonware/xwsystem/io/serialization/utils/path_ops.py +5 -6
  198. exonware/xwsystem/io/source_reader.py +223 -0
  199. exonware/xwsystem/io/stream/__init__.py +1 -1
  200. exonware/xwsystem/io/stream/async_operations.py +61 -14
  201. exonware/xwsystem/io/stream/base.py +1 -2
  202. exonware/xwsystem/io/stream/codec_io.py +6 -7
  203. exonware/xwsystem/ipc/__init__.py +1 -0
  204. exonware/xwsystem/ipc/async_fabric.py +4 -4
  205. exonware/xwsystem/ipc/base.py +6 -5
  206. exonware/xwsystem/ipc/contracts.py +41 -66
  207. exonware/xwsystem/ipc/defs.py +2 -1
  208. exonware/xwsystem/ipc/errors.py +2 -1
  209. exonware/xwsystem/ipc/message_queue.py +5 -2
  210. exonware/xwsystem/ipc/pipes.py +70 -34
  211. exonware/xwsystem/ipc/process_manager.py +7 -5
  212. exonware/xwsystem/ipc/process_pool.py +6 -5
  213. exonware/xwsystem/ipc/shared_memory.py +64 -11
  214. exonware/xwsystem/monitoring/__init__.py +7 -0
  215. exonware/xwsystem/monitoring/base.py +11 -8
  216. exonware/xwsystem/monitoring/contracts.py +86 -144
  217. exonware/xwsystem/monitoring/defs.py +2 -1
  218. exonware/xwsystem/monitoring/error_recovery.py +16 -3
  219. exonware/xwsystem/monitoring/errors.py +2 -1
  220. exonware/xwsystem/monitoring/facade.py +183 -0
  221. exonware/xwsystem/monitoring/memory_monitor.py +1 -0
  222. exonware/xwsystem/monitoring/metrics.py +1 -0
  223. exonware/xwsystem/monitoring/performance_manager_generic.py +7 -7
  224. exonware/xwsystem/monitoring/performance_monitor.py +1 -0
  225. exonware/xwsystem/monitoring/performance_validator.py +1 -0
  226. exonware/xwsystem/monitoring/system_monitor.py +6 -5
  227. exonware/xwsystem/monitoring/tracing.py +18 -16
  228. exonware/xwsystem/monitoring/tracker.py +2 -1
  229. exonware/xwsystem/operations/__init__.py +5 -50
  230. exonware/xwsystem/operations/base.py +3 -44
  231. exonware/xwsystem/operations/contracts.py +25 -15
  232. exonware/xwsystem/operations/defs.py +1 -1
  233. exonware/xwsystem/operations/diff.py +5 -4
  234. exonware/xwsystem/operations/errors.py +1 -1
  235. exonware/xwsystem/operations/merge.py +6 -4
  236. exonware/xwsystem/operations/patch.py +5 -4
  237. exonware/xwsystem/patterns/__init__.py +1 -0
  238. exonware/xwsystem/patterns/base.py +2 -1
  239. exonware/xwsystem/patterns/context_manager.py +2 -1
  240. exonware/xwsystem/patterns/contracts.py +215 -256
  241. exonware/xwsystem/patterns/defs.py +2 -1
  242. exonware/xwsystem/patterns/dynamic_facade.py +1 -0
  243. exonware/xwsystem/patterns/errors.py +2 -4
  244. exonware/xwsystem/patterns/handler_factory.py +2 -3
  245. exonware/xwsystem/patterns/import_registry.py +1 -0
  246. exonware/xwsystem/patterns/object_pool.py +1 -0
  247. exonware/xwsystem/patterns/registry.py +4 -43
  248. exonware/xwsystem/plugins/__init__.py +2 -1
  249. exonware/xwsystem/plugins/base.py +6 -5
  250. exonware/xwsystem/plugins/contracts.py +94 -158
  251. exonware/xwsystem/plugins/defs.py +2 -1
  252. exonware/xwsystem/plugins/errors.py +2 -1
  253. exonware/xwsystem/py.typed +3 -0
  254. exonware/xwsystem/query/__init__.py +36 -0
  255. exonware/xwsystem/query/contracts.py +56 -0
  256. exonware/xwsystem/query/errors.py +22 -0
  257. exonware/xwsystem/query/registry.py +128 -0
  258. exonware/xwsystem/runtime/__init__.py +2 -1
  259. exonware/xwsystem/runtime/base.py +4 -3
  260. exonware/xwsystem/runtime/contracts.py +39 -60
  261. exonware/xwsystem/runtime/defs.py +2 -1
  262. exonware/xwsystem/runtime/env.py +11 -9
  263. exonware/xwsystem/runtime/errors.py +2 -1
  264. exonware/xwsystem/runtime/reflection.py +3 -2
  265. exonware/xwsystem/security/__init__.py +68 -11
  266. exonware/xwsystem/security/audit.py +167 -0
  267. exonware/xwsystem/security/base.py +121 -24
  268. exonware/xwsystem/security/contracts.py +91 -146
  269. exonware/xwsystem/security/crypto.py +17 -16
  270. exonware/xwsystem/security/defs.py +2 -1
  271. exonware/xwsystem/security/errors.py +2 -1
  272. exonware/xwsystem/security/facade.py +321 -0
  273. exonware/xwsystem/security/file_security.py +330 -0
  274. exonware/xwsystem/security/hazmat.py +11 -8
  275. exonware/xwsystem/security/monitor.py +372 -0
  276. exonware/xwsystem/security/path_validator.py +140 -18
  277. exonware/xwsystem/security/policy.py +357 -0
  278. exonware/xwsystem/security/resource_limits.py +1 -0
  279. exonware/xwsystem/security/validator.py +455 -0
  280. exonware/xwsystem/shared/__init__.py +14 -1
  281. exonware/xwsystem/shared/base.py +285 -2
  282. exonware/xwsystem/shared/contracts.py +415 -126
  283. exonware/xwsystem/shared/defs.py +2 -1
  284. exonware/xwsystem/shared/errors.py +2 -2
  285. exonware/xwsystem/shared/xwobject.py +316 -0
  286. exonware/xwsystem/structures/__init__.py +1 -0
  287. exonware/xwsystem/structures/base.py +3 -2
  288. exonware/xwsystem/structures/circular_detector.py +15 -14
  289. exonware/xwsystem/structures/contracts.py +53 -76
  290. exonware/xwsystem/structures/defs.py +2 -1
  291. exonware/xwsystem/structures/errors.py +2 -1
  292. exonware/xwsystem/structures/tree_walker.py +2 -1
  293. exonware/xwsystem/threading/__init__.py +21 -4
  294. exonware/xwsystem/threading/async_primitives.py +6 -5
  295. exonware/xwsystem/threading/base.py +3 -2
  296. exonware/xwsystem/threading/contracts.py +87 -143
  297. exonware/xwsystem/threading/defs.py +2 -1
  298. exonware/xwsystem/threading/errors.py +2 -1
  299. exonware/xwsystem/threading/facade.py +175 -0
  300. exonware/xwsystem/threading/locks.py +1 -0
  301. exonware/xwsystem/threading/safe_factory.py +1 -0
  302. exonware/xwsystem/utils/__init__.py +40 -0
  303. exonware/xwsystem/utils/base.py +22 -21
  304. exonware/xwsystem/utils/contracts.py +50 -73
  305. exonware/xwsystem/utils/dt/__init__.py +19 -3
  306. exonware/xwsystem/utils/dt/base.py +5 -4
  307. exonware/xwsystem/utils/dt/contracts.py +22 -29
  308. exonware/xwsystem/utils/dt/defs.py +2 -1
  309. exonware/xwsystem/utils/dt/errors.py +2 -5
  310. exonware/xwsystem/utils/dt/formatting.py +88 -2
  311. exonware/xwsystem/utils/dt/humanize.py +10 -9
  312. exonware/xwsystem/utils/dt/parsing.py +56 -5
  313. exonware/xwsystem/utils/dt/timezone_utils.py +2 -24
  314. exonware/xwsystem/utils/errors.py +2 -4
  315. exonware/xwsystem/utils/paths.py +1 -0
  316. exonware/xwsystem/utils/string.py +49 -0
  317. exonware/xwsystem/utils/test_runner.py +185 -0
  318. exonware/xwsystem/utils/utils_contracts.py +2 -1
  319. exonware/xwsystem/utils/web.py +110 -0
  320. exonware/xwsystem/validation/__init__.py +25 -1
  321. exonware/xwsystem/validation/base.py +6 -5
  322. exonware/xwsystem/validation/contracts.py +29 -41
  323. exonware/xwsystem/validation/data_validator.py +1 -0
  324. exonware/xwsystem/validation/declarative.py +11 -8
  325. exonware/xwsystem/validation/defs.py +2 -1
  326. exonware/xwsystem/validation/errors.py +2 -1
  327. exonware/xwsystem/validation/facade.py +198 -0
  328. exonware/xwsystem/validation/fluent_validator.py +22 -19
  329. exonware/xwsystem/validation/schema_discovery.py +210 -0
  330. exonware/xwsystem/validation/type_safety.py +2 -1
  331. exonware/xwsystem/version.py +2 -2
  332. {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.4.dist-info}/METADATA +71 -4
  333. exonware_xwsystem-0.1.0.4.dist-info/RECORD +337 -0
  334. exonware/xwsystem/cli/__init__.py +0 -43
  335. exonware/xwsystem/cli/console.py +0 -113
  336. exonware/xwsystem/cli/defs.py +0 -134
  337. exonware/xwsystem/conf.py +0 -44
  338. exonware/xwsystem/security/auth.py +0 -484
  339. exonware_xwsystem-0.1.0.1.dist-info/RECORD +0 -284
  340. {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.4.dist-info}/WHEEL +0 -0
  341. {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.4.dist-info}/licenses/LICENSE +0 -0
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/io/stream/async_operations.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.1.0.1
6
+ Version: 0.1.0.4
6
7
  Generation Date: September 04, 2025
7
8
 
8
9
  Asynchronous I/O operations for non-blocking file handling.
@@ -10,12 +11,13 @@ Asynchronous I/O operations for non-blocking file handling.
10
11
 
11
12
  import asyncio
12
13
  import os
14
+ import platform
13
15
  import shutil
14
16
  import tempfile
15
17
  import time
16
18
  from contextlib import asynccontextmanager
17
19
  from pathlib import Path
18
- from typing import Any, AsyncContextManager, BinaryIO, Optional, TextIO, Union
20
+ from typing import Any, AsyncContextManager, BinaryIO, Optional, TextIO
19
21
 
20
22
  # Import aiofiles - lazy installation system will handle it if missing
21
23
  import aiofiles
@@ -38,11 +40,11 @@ class AsyncAtomicFileWriter:
38
40
 
39
41
  def __init__(
40
42
  self,
41
- target_path: Union[str, Path],
43
+ target_path: str | Path,
42
44
  mode: str = "w",
43
45
  encoding: Optional[str] = "utf-8",
44
46
  backup: bool = False,
45
- temp_dir: Optional[Union[str, Path]] = None,
47
+ temp_dir: Optional[str | Path] = None,
46
48
  ):
47
49
  """
48
50
  Initialize async atomic file writer.
@@ -130,6 +132,51 @@ class AsyncAtomicFileWriter:
130
132
  await self._cleanup()
131
133
  raise FileOperationError(f"Failed to start async atomic write: {e}") from e
132
134
 
135
+ async def write(self, data: bytes | str) -> int:
136
+ """
137
+ Write data to the temporary file.
138
+
139
+ Automatically handles conversion between bytes and str based on file mode:
140
+ - Text mode ("w", "w+", etc.): Accepts str or bytes (bytes are decoded with encoding)
141
+ - Binary mode ("wb", "wb+", etc.): Accepts bytes only
142
+
143
+ Args:
144
+ data: Data to write (bytes or str)
145
+
146
+ Returns:
147
+ Number of bytes/characters written
148
+
149
+ Raises:
150
+ FileOperationError: If write operation not started or write fails
151
+ """
152
+ if not self._started:
153
+ raise FileOperationError("Async atomic write operation not started. Call start() first.")
154
+
155
+ if not self.file_handle:
156
+ raise FileOperationError("File handle not available")
157
+
158
+ try:
159
+ is_binary_mode = "b" in self.mode
160
+
161
+ if is_binary_mode:
162
+ # Binary mode: must write bytes
163
+ if isinstance(data, str):
164
+ # Convert string to bytes using the encoding if available
165
+ encoding = self.encoding or "utf-8"
166
+ data = data.encode(encoding)
167
+ await self.file_handle.write(data)
168
+ return len(data)
169
+ else:
170
+ # Text mode: write string
171
+ if isinstance(data, bytes):
172
+ # Decode bytes to string using the encoding
173
+ encoding = self.encoding or "utf-8"
174
+ data = data.decode(encoding)
175
+ await self.file_handle.write(data)
176
+ return len(data)
177
+ except Exception as e:
178
+ raise FileOperationError(f"Failed to write data: {e}") from e
179
+
133
180
  async def commit(self) -> None:
134
181
  """
135
182
  Commit the async atomic write operation.
@@ -161,8 +208,8 @@ class AsyncAtomicFileWriter:
161
208
  logger.warning(f"Temporary file is empty: {self.temp_path}")
162
209
 
163
210
  # Atomic move to target location
164
- # On Windows, need to remove target first if it exists
165
- if os.name == "nt" and await aiofiles.os.path.exists(self.target_path):
211
+ # On Windows, need to remove target first if it exists (Windows filesystem limitation)
212
+ if platform.system() == 'Windows' and await aiofiles.os.path.exists(self.target_path):
166
213
  await aiofiles.os.remove(self.target_path)
167
214
 
168
215
  # Perform the atomic move (using sync operation as aiofiles doesn't have move)
@@ -268,11 +315,11 @@ class AsyncAtomicFileWriter:
268
315
 
269
316
  @asynccontextmanager
270
317
  async def async_atomic_write(
271
- target_path: Union[str, Path],
318
+ target_path: str | Path,
272
319
  mode: str = "w",
273
320
  encoding: Optional[str] = "utf-8",
274
321
  backup: bool = True,
275
- temp_dir: Optional[Union[str, Path]] = None,
322
+ temp_dir: Optional[str | Path] = None,
276
323
  ) -> AsyncContextManager[Any]:
277
324
  """
278
325
  Async context manager for atomic file writing.
@@ -304,7 +351,7 @@ async def async_atomic_write(
304
351
 
305
352
 
306
353
  async def async_safe_write_text(
307
- target_path: Union[str, Path],
354
+ target_path: str | Path,
308
355
  content: str,
309
356
  encoding: str = "utf-8",
310
357
  backup: bool = True,
@@ -323,7 +370,7 @@ async def async_safe_write_text(
323
370
 
324
371
 
325
372
  async def async_safe_write_bytes(
326
- target_path: Union[str, Path], content: bytes, backup: bool = True
373
+ target_path: str | Path, content: bytes, backup: bool = True
327
374
  ) -> None:
328
375
  """
329
376
  Safely write binary content to a file atomically (async).
@@ -338,7 +385,7 @@ async def async_safe_write_bytes(
338
385
 
339
386
 
340
387
  async def async_safe_read_text(
341
- file_path: Union[str, Path], encoding: str = "utf-8", max_size_mb: float = 100.0
388
+ file_path: str | Path, encoding: str = "utf-8", max_size_mb: float = 100.0
342
389
  ) -> str:
343
390
  """
344
391
  Safely read text content from a file with size validation (async).
@@ -391,7 +438,7 @@ async def async_safe_read_text(
391
438
  raise FileOperationError(f"IOError reading file '{file_path}': {e}") from e
392
439
 
393
440
 
394
- async def async_safe_read_bytes(file_path: Union[str, Path], max_size_mb: float = 100.0) -> bytes:
441
+ async def async_safe_read_bytes(file_path: str | Path, max_size_mb: float = 100.0) -> bytes:
395
442
  """
396
443
  Safely read binary content from a file with size validation (async).
397
444
 
@@ -439,7 +486,7 @@ async def async_safe_read_bytes(file_path: Union[str, Path], max_size_mb: float
439
486
 
440
487
 
441
488
  async def async_safe_read_with_fallback(
442
- file_path: Union[str, Path],
489
+ file_path: str | Path,
443
490
  preferred_encoding: str = "utf-8",
444
491
  fallback_encodings: Optional[list[str]] = None,
445
492
  max_size_mb: float = 100.0,
@@ -462,7 +509,7 @@ async def async_safe_read_with_fallback(
462
509
  if fallback_encodings is None:
463
510
  fallback_encodings = ["latin1", "cp1252", "iso-8859-1"]
464
511
 
465
- # Try preferred encoding first
512
+ # Try encoding first
466
513
  try:
467
514
  return await async_safe_read_text(file_path, preferred_encoding, max_size_mb)
468
515
  except FileOperationError as e:
@@ -4,7 +4,7 @@
4
4
  Company: eXonware.com
5
5
  Author: Eng. Muhammad AlShehri
6
6
  Email: connect@exonware.com
7
- Version: 0.1.0.1
7
+ Version: 0.1.0.4
8
8
  Generation Date: 30-Oct-2025
9
9
 
10
10
  Base classes for stream operations.
@@ -39,4 +39,3 @@ class ACodecIO[T, R](ICodecIO[T, R], ABC):
39
39
  class APagedCodecIO[T, R](ACodecIO[T, R], IPagedCodecIO[T, R], ABC):
40
40
  """Abstract base for paged codec I/O."""
41
41
  pass
42
-
@@ -4,7 +4,7 @@
4
4
  Company: eXonware.com
5
5
  Author: Eng. Muhammad AlShehri
6
6
  Email: connect@exonware.com
7
- Version: 0.1.0.1
7
+ Version: 0.1.0.4
8
8
  Generation Date: 30-Oct-2025
9
9
 
10
10
  Codec-integrated I/O - THE KILLER FEATURE!
@@ -19,7 +19,7 @@ Priority 5 (Extensibility): Works with ANY codec + ANY data source
19
19
  """
20
20
 
21
21
  from pathlib import Path
22
- from typing import Union, Optional, Iterator, Any
22
+ from typing import Optional, Iterator, Any
23
23
 
24
24
  from ..contracts import ICodecIO, IPagedCodecIO, IDataSource, IPagedDataSource
25
25
 
@@ -165,7 +165,7 @@ class CodecIO[T, R](ICodecIO[T, R]):
165
165
  # Fallback: load full file, update in memory, save
166
166
  data = self.load(**opts)
167
167
 
168
- # Simple path update (subclasses should override for format-specific logic)
168
+ # Simple path update (subclasses override for format-specific logic)
169
169
  if isinstance(data, dict) and path.startswith('/'):
170
170
  from ..serialization.utils.path_ops import set_value_by_path
171
171
  set_value_by_path(data, path, value, create=opts.get('create', False))
@@ -213,7 +213,7 @@ class CodecIO[T, R](ICodecIO[T, R]):
213
213
  # Fallback: load full file, extract path
214
214
  data = self.load(**opts)
215
215
 
216
- # Simple path extraction (subclasses should override for format-specific logic)
216
+ # Simple path extraction (subclasses override for format-specific logic)
217
217
  if isinstance(data, dict) and path.startswith('/'):
218
218
  from ..serialization.utils.path_ops import get_value_by_path
219
219
  return get_value_by_path(data, path)
@@ -224,7 +224,7 @@ class CodecIO[T, R](ICodecIO[T, R]):
224
224
  )
225
225
 
226
226
  @staticmethod
227
- def from_file(path: Union[str, Path], mode: str = 'rb', encoding: Optional[str] = None):
227
+ def from_file(path: str | Path, mode: str = 'rb', encoding: Optional[str] = None):
228
228
  """
229
229
  Create CodecIO with auto-detected codec from file extension.
230
230
 
@@ -399,7 +399,7 @@ class PagedCodecIO[T, R](CodecIO[T, R], IPagedCodecIO[T, R]):
399
399
  self._source.write(combined, **opts)
400
400
 
401
401
  @staticmethod
402
- def from_file(path: Union[str, Path], mode: str = 'rb', encoding: Optional[str] = None):
402
+ def from_file(path: str | Path, mode: str = 'rb', encoding: Optional[str] = None):
403
403
  """
404
404
  Create PagedCodecIO with auto-detected codec from file extension.
405
405
 
@@ -431,4 +431,3 @@ class PagedCodecIO[T, R](CodecIO[T, R], IPagedCodecIO[T, R]):
431
431
  source = PagedFileSource(path, mode=mode, encoding=encoding)
432
432
 
433
433
  return PagedCodecIO(codec, source)
434
-
@@ -1,3 +1,4 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/ipc/__init__.py
1
2
  """
2
3
  Inter-Process Communication (IPC) Module
3
4
  ========================================
@@ -1,9 +1,10 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/ipc/async_fabric.py
1
2
  #exonware/xwsystem/ipc/async_fabric.py
2
3
  """
3
4
  Company: eXonware.com
4
5
  Author: Eng. Muhammad AlShehri
5
6
  Email: connect@exonware.com
6
- Version: 0.1.0.1
7
+ Version: 0.1.0.4
7
8
  Generation Date: 09-Nov-2025
8
9
 
9
10
  Async Process Fabric
@@ -39,7 +40,7 @@ from .shared_memory import SharedData, SharedMemoryManager
39
40
 
40
41
  logger = logging.getLogger("xwsystem.ipc.async_fabric")
41
42
 
42
- CallableRef = Union[str, Callable[..., Any]]
43
+ CallableRef = str | Callable[..., Any]
43
44
  TaskId = str
44
45
 
45
46
 
@@ -230,7 +231,7 @@ class AsyncProcessFabricSession:
230
231
 
231
232
  async def iter_results(
232
233
  self,
233
- task_ids: Union[TaskId, Sequence[TaskId]],
234
+ task_ids: TaskId | Sequence[TaskId],
234
235
  *,
235
236
  timeout: Optional[float] = None,
236
237
  ) -> AsyncIterator[Any]:
@@ -355,4 +356,3 @@ class AsyncProcessFabricSession:
355
356
  def active_tasks(self) -> Sequence[TaskId]:
356
357
  """Return snapshot of currently tracked task IDs."""
357
358
  return tuple(self._active_task_ids)
358
-
@@ -1,16 +1,17 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/ipc/base.py
1
2
  #exonware/xwsystem/ipc/base.py
2
3
  """
3
4
  Company: eXonware.com
4
5
  Author: Eng. Muhammad AlShehri
5
6
  Email: connect@exonware.com
6
- Version: 0.1.0.1
7
+ Version: 0.1.0.4
7
8
  Generation Date: September 04, 2025
8
9
 
9
10
  IPC module base classes - abstract classes for inter-process communication functionality.
10
11
  """
11
12
 
12
13
  from abc import ABC, abstractmethod
13
- from typing import Any, Optional, Union
14
+ from typing import Any, Optional
14
15
  from .contracts import MessageType, QueueType, ProcessState, SharedMemoryType
15
16
 
16
17
 
@@ -116,12 +117,12 @@ class APipeBase(ABC):
116
117
  pass
117
118
 
118
119
  @abstractmethod
119
- def write(self, data: Union[str, bytes]) -> int:
120
+ def write(self, data: str | bytes) -> int:
120
121
  """Write data to pipe."""
121
122
  pass
122
123
 
123
124
  @abstractmethod
124
- def read(self, size: Optional[int] = None) -> Union[str, bytes]:
125
+ def read(self, size: Optional[int] = None) -> str | bytes:
125
126
  """Read data from pipe."""
126
127
  pass
127
128
 
@@ -331,7 +332,7 @@ class AProcessPoolBase(ABC):
331
332
 
332
333
  class BaseIPC:
333
334
  """
334
- Base IPC class for backward compatibility.
335
+ Base IPC class.
335
336
 
336
337
  Provides a simple interface for IPC operations.
337
338
  """
@@ -1,15 +1,15 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/ipc/contracts.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.1.0.1
6
+ Version: 0.1.0.4
6
7
  Generation Date: September 04, 2025
7
8
 
8
9
  IPC module contracts - interfaces and enums for inter-process communication.
9
10
  """
10
11
 
11
- from abc import ABC, abstractmethod
12
- from typing import Any, Optional, Union, AsyncGenerator, Callable
12
+ from typing import Any, Optional, AsyncGenerator, Callable, Protocol, runtime_checkable
13
13
  from multiprocessing import Process
14
14
 
15
15
  # Import enums from types module
@@ -23,165 +23,140 @@ from .defs import (
23
23
  )
24
24
 
25
25
 
26
- class IMessageQueue(ABC):
26
+ @runtime_checkable
27
+ class IMessageQueue(Protocol):
27
28
  """Interface for message queue operations."""
28
29
 
29
- @abstractmethod
30
30
  async def put(self, message: Any, message_type: MessageType = MessageType.DATA) -> None:
31
31
  """Put message in queue."""
32
- pass
32
+ ...
33
33
 
34
- @abstractmethod
35
34
  async def get(self, timeout: Optional[float] = None) -> Any:
36
35
  """Get message from queue."""
37
- pass
36
+ ...
38
37
 
39
- @abstractmethod
40
38
  async def get_nowait(self) -> Any:
41
39
  """Get message without waiting."""
42
- pass
40
+ ...
43
41
 
44
- @abstractmethod
45
42
  def empty(self) -> bool:
46
43
  """Check if queue is empty."""
47
- pass
44
+ ...
48
45
 
49
- @abstractmethod
50
46
  def full(self) -> bool:
51
47
  """Check if queue is full."""
52
- pass
48
+ ...
53
49
 
54
- @abstractmethod
55
50
  def size(self) -> int:
56
51
  """Get queue size."""
57
- pass
52
+ ...
58
53
 
59
54
 
60
- class IPipe(ABC):
55
+ @runtime_checkable
56
+ class IPipe(Protocol):
61
57
  """Interface for pipe operations."""
62
58
 
63
- @abstractmethod
64
59
  async def send(self, data: Any) -> None:
65
60
  """Send data through pipe."""
66
- pass
61
+ ...
67
62
 
68
- @abstractmethod
69
63
  async def recv(self, timeout: Optional[float] = None) -> Any:
70
64
  """Receive data from pipe."""
71
- pass
65
+ ...
72
66
 
73
- @abstractmethod
74
67
  async def recv_nowait(self) -> Any:
75
68
  """Receive data without waiting."""
76
- pass
69
+ ...
77
70
 
78
- @abstractmethod
79
71
  def close(self) -> None:
80
72
  """Close pipe."""
81
- pass
73
+ ...
82
74
 
83
- @abstractmethod
84
75
  def closed(self) -> bool:
85
76
  """Check if pipe is closed."""
86
- pass
77
+ ...
87
78
 
88
79
 
89
- class ISharedMemory(ABC):
80
+ @runtime_checkable
81
+ class ISharedMemory(Protocol):
90
82
  """Interface for shared memory operations."""
91
83
 
92
- @abstractmethod
93
84
  def create(self, name: str, size: int) -> None:
94
85
  """Create shared memory segment."""
95
- pass
86
+ ...
96
87
 
97
- @abstractmethod
98
88
  def attach(self, name: str) -> None:
99
89
  """Attach to shared memory segment."""
100
- pass
90
+ ...
101
91
 
102
- @abstractmethod
103
92
  def detach(self) -> None:
104
93
  """Detach from shared memory segment."""
105
- pass
94
+ ...
106
95
 
107
- @abstractmethod
108
96
  def unlink(self) -> None:
109
97
  """Unlink shared memory segment."""
110
- pass
98
+ ...
111
99
 
112
- @abstractmethod
113
100
  def read(self, offset: int = 0, size: Optional[int] = None) -> bytes:
114
101
  """Read from shared memory."""
115
- pass
102
+ ...
116
103
 
117
- @abstractmethod
118
104
  def write(self, data: bytes, offset: int = 0) -> None:
119
105
  """Write to shared memory."""
120
- pass
106
+ ...
121
107
 
122
108
 
123
- class IProcessManager(ABC):
109
+ @runtime_checkable
110
+ class IProcessManager(Protocol):
124
111
  """Interface for process management."""
125
112
 
126
- @abstractmethod
127
113
  def create_process(self, target: Callable, args: tuple = (), kwargs: Optional[dict] = None) -> Process:
128
114
  """Create new process."""
129
- pass
115
+ ...
130
116
 
131
- @abstractmethod
132
117
  def start_process(self, process: Process) -> None:
133
118
  """Start process."""
134
- pass
119
+ ...
135
120
 
136
- @abstractmethod
137
121
  def stop_process(self, process: Process, timeout: Optional[float] = None) -> None:
138
122
  """Stop process."""
139
- pass
123
+ ...
140
124
 
141
- @abstractmethod
142
125
  def get_process_state(self, process: Process) -> ProcessState:
143
126
  """Get process state."""
144
- pass
127
+ ...
145
128
 
146
- @abstractmethod
147
129
  def is_process_alive(self, process: Process) -> bool:
148
130
  """Check if process is alive."""
149
- pass
131
+ ...
150
132
 
151
133
 
152
- class IProcessPool(ABC):
134
+ @runtime_checkable
135
+ class IProcessPool(Protocol):
153
136
  """Interface for process pool operations."""
154
137
 
155
- @abstractmethod
156
138
  def submit(self, func: Callable, *args, **kwargs) -> Any:
157
139
  """Submit task to pool."""
158
- pass
140
+ ...
159
141
 
160
- @abstractmethod
161
142
  async def submit_async(self, func: Callable, *args, **kwargs) -> Any:
162
143
  """Submit async task to pool."""
163
- pass
144
+ ...
164
145
 
165
- @abstractmethod
166
146
  def map(self, func: Callable, iterable: list[Any]) -> list[Any]:
167
147
  """Map function over iterable."""
168
- pass
148
+ ...
169
149
 
170
- @abstractmethod
171
150
  async def map_async(self, func: Callable, iterable: list[Any]) -> list[Any]:
172
151
  """Map function over iterable asynchronously."""
173
- pass
152
+ ...
174
153
 
175
- @abstractmethod
176
154
  def close(self) -> None:
177
155
  """Close process pool."""
178
- pass
156
+ ...
179
157
 
180
- @abstractmethod
181
158
  def join(self) -> None:
182
159
  """Join all processes."""
183
- pass
160
+ ...
184
161
 
185
162
 
186
- # Aliases for backward compatibility
187
- IPipeManager = IPipe
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python3
2
+ #exonware/xwsystem/src/exonware/xwsystem/ipc/defs.py
2
3
  #exonware/xwsystem/ipc/types.py
3
4
  """
4
5
  Company: eXonware.com
5
6
  Author: Eng. Muhammad AlShehri
6
7
  Email: connect@exonware.com
7
- Version: 0.1.0.1
8
+ Version: 0.1.0.4
8
9
  Generation Date: 07-Sep-2025
9
10
 
10
11
  IPC types and enums for XWSystem.
@@ -1,9 +1,10 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/ipc/errors.py
1
2
  #exonware/xwsystem/ipc/errors.py
2
3
  """
3
4
  Company: eXonware.com
4
5
  Author: Eng. Muhammad AlShehri
5
6
  Email: connect@exonware.com
6
- Version: 0.1.0.1
7
+ Version: 0.1.0.4
7
8
  Generation Date: September 04, 2025
8
9
 
9
10
  IPC module errors - exception classes for inter-process communication functionality.
@@ -1,3 +1,4 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/ipc/message_queue.py
1
2
  """
2
3
  Message Queue Utilities
3
4
  =======================
@@ -208,7 +209,8 @@ class MessageQueue[T]:
208
209
  while not self.empty():
209
210
  try:
210
211
  self.get_nowait()
211
- except:
212
+ except queue.Empty:
213
+ # Queue is empty, stop clearing
212
214
  break
213
215
 
214
216
  def get_stats(self) -> dict:
@@ -398,7 +400,8 @@ class AsyncMessageQueue[T]:
398
400
  while not self.empty():
399
401
  try:
400
402
  self.get_nowait()
401
- except:
403
+ except queue.Empty:
404
+ # Queue is empty, stop clearing
402
405
  break
403
406
 
404
407
  async def get_stats(self) -> dict: