exonware-xwsystem 0.0.1.411__py3-none-any.whl → 0.1.0.3__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 (342) 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 +73 -391
  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 +279 -14
  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 +199 -0
  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 +65 -33
  176. exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
  177. exonware/xwsystem/io/serialization/formats/text/jsonlines.py +113 -25
  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 +16 -0
  183. exonware/xwsystem/io/serialization/parsers/base.py +60 -0
  184. exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +62 -0
  185. exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +48 -0
  186. exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +54 -0
  187. exonware/xwsystem/io/serialization/parsers/orjson_parser.py +62 -0
  188. exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +55 -0
  189. exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +53 -0
  190. exonware/xwsystem/io/serialization/parsers/registry.py +91 -0
  191. exonware/xwsystem/io/serialization/parsers/standard.py +44 -0
  192. exonware/xwsystem/io/serialization/parsers/ujson_parser.py +53 -0
  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 +139 -480
  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 +4 -4
  332. {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/METADATA +71 -4
  333. exonware_xwsystem-0.1.0.3.dist-info/RECORD +337 -0
  334. exonware/xwsystem/caching/USAGE_GUIDE.md +0 -779
  335. exonware/xwsystem/cli/__init__.py +0 -43
  336. exonware/xwsystem/cli/console.py +0 -113
  337. exonware/xwsystem/cli/defs.py +0 -134
  338. exonware/xwsystem/conf.py +0 -44
  339. exonware/xwsystem/security/auth.py +0 -484
  340. exonware_xwsystem-0.0.1.411.dist-info/RECORD +0 -274
  341. {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/WHEEL +0 -0
  342. {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,166 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/console/cli/event_logger.py
2
+ """
3
+ Company: eXonware.com
4
+ Author: Eng. Muhammad AlShehri
5
+ Email: connect@exonware.com
6
+ Version: 0.1.0.3
7
+ Generation Date: January 2025
8
+
9
+ CLI Event Logger - Extends Python's logging.Logger with event logging capabilities.
10
+ """
11
+
12
+ import logging
13
+ from typing import Optional, Any
14
+ from ..event_logger import ConsoleEventLogger
15
+ from ..contracts import IEventLogger
16
+ from ..defs import LogLevel, ConsoleEventType, ConsoleEvent
17
+
18
+
19
+ class CliEventLogger(logging.Logger):
20
+ """
21
+ CLI Event Logger that extends Python's logging.Logger.
22
+
23
+ Combines Python's standard logging.Logger with structured event logging
24
+ from ConsoleEventLogger. All standard logging.Logger methods work as expected,
25
+ and additional event logging methods are available.
26
+ """
27
+
28
+ def __init__(self, name: str, level: int = logging.NOTSET):
29
+ """
30
+ Initialize CLI Event Logger.
31
+
32
+ Args:
33
+ name: Logger name
34
+ level: Logging level
35
+ """
36
+ # Initialize Python's Logger
37
+ super().__init__(name, level)
38
+
39
+ # Initialize internal event logger for structured logging
40
+ self._event_logger = ConsoleEventLogger(
41
+ max_entries=1000,
42
+ use_milliseconds=True,
43
+ default_source=name
44
+ )
45
+
46
+ # Event logging methods (from IEventLogger)
47
+
48
+ def log_event(
49
+ self,
50
+ msg: str,
51
+ source: Optional[str] = None,
52
+ data: Optional[Any] = None,
53
+ color: Optional[str] = None,
54
+ label: Optional[str] = None
55
+ ) -> ConsoleEvent:
56
+ """Log a general event message."""
57
+ event = self._event_logger.log(msg, source=source, data=data, color=color, label=label)
58
+ # Also log using standard logger
59
+ super().info(msg)
60
+ return event
61
+
62
+ def info_event(
63
+ self,
64
+ msg: str,
65
+ source: Optional[str] = None,
66
+ data: Optional[Any] = None
67
+ ) -> ConsoleEvent:
68
+ """Log an info event."""
69
+ event = self._event_logger.info(msg, source=source, data=data)
70
+ super().info(msg)
71
+ return event
72
+
73
+ def warn_event(
74
+ self,
75
+ msg: str,
76
+ source: Optional[str] = None,
77
+ data: Optional[Any] = None
78
+ ) -> ConsoleEvent:
79
+ """Log a warning event."""
80
+ event = self._event_logger.warn(msg, source=source, data=data)
81
+ super().warning(msg)
82
+ return event
83
+
84
+ def error_event(
85
+ self,
86
+ msg: str,
87
+ source: Optional[str] = None,
88
+ data: Optional[Any] = None,
89
+ stack: Optional[str] = None
90
+ ) -> ConsoleEvent:
91
+ """Log an error event."""
92
+ event = self._event_logger.error(msg, source=source, data=data, stack=stack)
93
+ super().error(msg, exc_info=stack is not None)
94
+ return event
95
+
96
+ def debug_event(
97
+ self,
98
+ msg: str,
99
+ source: Optional[str] = None,
100
+ data: Optional[Any] = None
101
+ ) -> ConsoleEvent:
102
+ """Log a debug event."""
103
+ event = self._event_logger.debug(msg, source=source, data=data)
104
+ super().debug(msg)
105
+ return event
106
+
107
+ # Override standard logging methods to also log events
108
+ def info(self, msg: object, *args, **kwargs) -> None:
109
+ """Log info message (standard logger + event logger)."""
110
+ msg_str = str(msg) % args if args else str(msg)
111
+ self._event_logger.info(msg_str, source=self.name)
112
+ super().info(msg, *args, **kwargs)
113
+
114
+ def warning(self, msg: object, *args, **kwargs) -> None:
115
+ """Log warning message (standard logger + event logger)."""
116
+ msg_str = str(msg) % args if args else str(msg)
117
+ self._event_logger.warn(msg_str, source=self.name)
118
+ super().warning(msg, *args, **kwargs)
119
+
120
+ def error(self, msg: object, *args, **kwargs) -> None:
121
+ """Log error message (standard logger + event logger)."""
122
+ msg_str = str(msg) % args if args else str(msg)
123
+ self._event_logger.error(msg_str, source=self.name)
124
+ super().error(msg, *args, **kwargs)
125
+
126
+ def debug(self, msg: object, *args, **kwargs) -> None:
127
+ """Log debug message (standard logger + event logger)."""
128
+ msg_str = str(msg) % args if args else str(msg)
129
+ self._event_logger.debug(msg_str, source=self.name)
130
+ super().debug(msg, *args, **kwargs)
131
+
132
+ def critical(self, msg: object, *args, **kwargs) -> None:
133
+ """Log critical message (standard logger + event logger)."""
134
+ msg_str = str(msg) % args if args else str(msg)
135
+ self._event_logger.error(msg_str, source=self.name)
136
+ super().critical(msg, *args, **kwargs)
137
+
138
+ # Event logger methods (delegate to internal event logger)
139
+
140
+ def get_events(
141
+ self,
142
+ event_type: Optional[ConsoleEventType] = None,
143
+ level: Optional[LogLevel] = None,
144
+ source: Optional[str] = None,
145
+ limit: Optional[int] = None
146
+ ) -> list[dict]:
147
+ """Get logged events as dictionaries."""
148
+ return self._event_logger.get_events(event_type=event_type, level=level, source=source, limit=limit)
149
+
150
+ def clear_events(self) -> None:
151
+ """Clear all logged events."""
152
+ self._event_logger.clear()
153
+
154
+ def count_events(self) -> int:
155
+ """Get the number of logged events."""
156
+ return self._event_logger.count()
157
+
158
+ @property
159
+ def event_logger(self) -> ConsoleEventLogger:
160
+ """Get the internal event logger instance."""
161
+ return self._event_logger
162
+
163
+
164
+ __all__ = [
165
+ 'CliEventLogger',
166
+ ]
@@ -1,3 +1,4 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/console/cli/progress.py
1
2
  """
2
3
  Progress Bar Utilities
3
4
  =====================
@@ -7,24 +8,27 @@ Production-grade progress indicators for XSystem.
7
8
  Company: eXonware.com
8
9
  Author: Eng. Muhammad AlShehri
9
10
  Email: connect@exonware.com
10
- Version: 0.0.1.411
11
+ Version: 0.1.0.3
11
12
  Generation Date: September 05, 2025
12
13
  """
13
14
 
15
+ from __future__ import annotations
16
+
14
17
  import sys
15
18
  import time
16
19
  import threading
17
- from typing import Optional, TextIO, Union
20
+ from typing import Optional, TextIO
18
21
  from dataclasses import dataclass
19
22
  import math
20
23
 
21
- # Import colors from our existing color module
22
- # Explicit import - colors module is part of the same package
23
- from .colors import colorize, Colors, Style
24
+ # Import general console enums from console level (priority)
25
+ from ..defs import Colors, Style
26
+ # Import CLI-specific color utilities
27
+ from .colors import colorize
24
28
 
25
29
 
26
30
  @dataclass
27
- class ProgressConfig:
31
+ class CliProgressConfig:
28
32
  """Configuration for progress indicators."""
29
33
  width: int = 50
30
34
  show_percentage: bool = True
@@ -36,7 +40,7 @@ class ProgressConfig:
36
40
  style: str = Style.BOLD
37
41
 
38
42
 
39
- class ProgressBar:
43
+ class CliProgressBar:
40
44
  """
41
45
  Production-grade progress bar with ETA and rate calculation.
42
46
 
@@ -52,7 +56,7 @@ class ProgressBar:
52
56
  def __init__(self,
53
57
  total: int,
54
58
  description: str = "",
55
- config: ProgressConfig = None,
59
+ config: CliProgressConfig = None,
56
60
  file: TextIO = None):
57
61
  """
58
62
  Initialize progress bar.
@@ -65,7 +69,7 @@ class ProgressBar:
65
69
  """
66
70
  self.total = total
67
71
  self.description = description
68
- self.config = config or ProgressConfig()
72
+ self.config = config or CliProgressConfig()
69
73
  self.file = file or sys.stderr
70
74
 
71
75
  # Progress tracking
@@ -100,7 +104,7 @@ class ProgressBar:
100
104
  self._update_rate(current_time)
101
105
  self._last_rate_update = current_time
102
106
 
103
- # Check if we should refresh display
107
+ # Check if to refresh display
104
108
  if (current_time - self.last_update >= self.config.refresh_rate or
105
109
  self.current >= self.total):
106
110
  self._refresh_display()
@@ -240,7 +244,7 @@ class ProgressBar:
240
244
  self.close()
241
245
 
242
246
 
243
- class SpinnerProgress:
247
+ class CliSpinnerProgress:
244
248
  """
245
249
  Spinning progress indicator for indeterminate tasks.
246
250
 
@@ -283,7 +287,7 @@ class SpinnerProgress:
283
287
  self._frame_index = 0
284
288
  self._lock = threading.Lock()
285
289
 
286
- def start(self) -> 'SpinnerProgress':
290
+ def start(self) -> CliSpinnerProgress:
287
291
  """Start the spinner animation."""
288
292
  with self._lock:
289
293
  if not self._running:
@@ -330,7 +334,7 @@ class SpinnerProgress:
330
334
  self.stop()
331
335
 
332
336
 
333
- class MultiProgress:
337
+ class CliMultiProgress:
334
338
  """
335
339
  Multiple progress bars manager.
336
340
 
@@ -357,7 +361,7 @@ class MultiProgress:
357
361
  bar_id: str,
358
362
  total: int,
359
363
  description: str = "",
360
- config: ProgressConfig = None) -> ProgressBar:
364
+ config: CliProgressConfig = None) -> CliProgressBar:
361
365
  """
362
366
  Add a new progress bar.
363
367
 
@@ -375,7 +379,7 @@ class MultiProgress:
375
379
  raise ValueError(f"Progress bar '{bar_id}' already exists")
376
380
 
377
381
  # Create progress bar with custom file to prevent direct output
378
- bar = ProgressBar(total, description, config, file=self)
382
+ bar = CliProgressBar(total, description, config, file=self)
379
383
  self._bars[bar_id] = bar
380
384
  self._active = True
381
385
  return bar
@@ -436,14 +440,14 @@ class MultiProgress:
436
440
 
437
441
 
438
442
  # Utility functions
439
- def create_progress_bar(total: int, description: str = "") -> ProgressBar:
443
+ def create_progress_bar(total: int, description: str = "") -> CliProgressBar:
440
444
  """Create a simple progress bar."""
441
- return ProgressBar(total, description)
445
+ return CliProgressBar(total, description)
442
446
 
443
447
 
444
- def create_spinner(message: str = "Processing...") -> SpinnerProgress:
448
+ def create_spinner(message: str = "Processing...") -> CliSpinnerProgress:
445
449
  """Create a simple spinner."""
446
- return SpinnerProgress(message)
450
+ return CliSpinnerProgress(message)
447
451
 
448
452
 
449
453
  def progress_range(iterable, description: str = ""):
@@ -451,12 +455,12 @@ def progress_range(iterable, description: str = ""):
451
455
  total = len(iterable) if hasattr(iterable, '__len__') else None
452
456
 
453
457
  if total is not None:
454
- with ProgressBar(total, description) as pbar:
458
+ with CliProgressBar(total, description) as pbar:
455
459
  for item in iterable:
456
460
  yield item
457
461
  pbar.update(1)
458
462
  else:
459
463
  # Use spinner for unknown length iterables
460
- with SpinnerProgress(description) as spinner:
464
+ with CliSpinnerProgress(description) as spinner:
461
465
  for item in iterable:
462
466
  yield item
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/console/cli/prompts.py
1
2
  """
2
3
  Company: eXonware.com
3
4
  Author: Eng. Muhammad AlShehri
4
5
  Email: connect@exonware.com
5
- Version: 0.0.1.411
6
+ Version: 0.1.0.3
6
7
  Generation Date: September 04, 2025
7
8
 
8
9
  Interactive prompts - Placeholder.
@@ -21,7 +22,7 @@ def multiselect(message, choices):
21
22
  return choices
22
23
 
23
24
 
24
- class Prompts:
25
+ class CliPrompts:
25
26
  """Interactive prompts manager for CLI operations."""
26
27
 
27
28
  def __init__(self):
@@ -1,3 +1,4 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/console/cli/tables.py
1
2
  """
2
3
  Table Formatting Utilities
3
4
  ==========================
@@ -7,21 +8,23 @@ Production-grade table formatting for XWSystem.
7
8
  Company: eXonware.com
8
9
  Author: Eng. Muhammad AlShehri
9
10
  Email: connect@exonware.com
10
- Version: 0.0.1.411
11
+ Version: 0.1.0.3
11
12
  Generation Date: September 05, 2025
12
13
  """
13
14
 
15
+ from __future__ import annotations
16
+
14
17
  import sys
15
- from typing import Any, Optional, Union, TextIO, Callable
18
+ from typing import Any, Optional, TextIO, Callable
16
19
  from dataclasses import dataclass
17
- # Import colors from our existing color module
18
- # Explicit import - colors module is part of the same package
19
- from .colors import colorize, Colors, Style
20
- from .defs import Alignment, BorderStyle
20
+ # Import general console enums from console level (priority)
21
+ from ..defs import Alignment, BorderStyle, Colors, Style
22
+ # Import CLI-specific color utilities
23
+ from .colors import colorize
21
24
 
22
25
 
23
26
  @dataclass
24
- class Column:
27
+ class CliColumn:
25
28
  """
26
29
  Table column definition.
27
30
 
@@ -51,7 +54,7 @@ class Column:
51
54
  self.width = min(self.width, self.max_width)
52
55
 
53
56
 
54
- class TableFormatter:
57
+ class CliTableFormatter:
55
58
  """
56
59
  Production-grade table formatter.
57
60
 
@@ -90,7 +93,7 @@ class TableFormatter:
90
93
  self.padding = padding
91
94
  self.border_chars = self.BORDER_CHARS.get(border_style, self.BORDER_CHARS[BorderStyle.ROUNDED])
92
95
 
93
- def format_cell(self, value: Any, column: Column, width: int) -> str:
96
+ def format_cell(self, value: Any, column: CliColumn, width: int) -> str:
94
97
  """Format a cell value according to column specifications."""
95
98
  # Apply custom formatter if provided
96
99
  if column.formatter:
@@ -116,7 +119,7 @@ class TableFormatter:
116
119
 
117
120
  return text
118
121
 
119
- def calculate_widths(self, columns: list[Column], data: list[list[Any]]) -> list[int]:
122
+ def calculate_widths(self, columns: list[CliColumn], data: list[list[Any]]) -> list[int]:
120
123
  """Calculate optimal column widths."""
121
124
  widths = []
122
125
 
@@ -138,7 +141,7 @@ class TableFormatter:
138
141
  return widths
139
142
 
140
143
 
141
- class Table:
144
+ class CliTable:
142
145
  """
143
146
  Production-grade table with advanced formatting capabilities.
144
147
 
@@ -150,39 +153,39 @@ class Table:
150
153
  """
151
154
 
152
155
  def __init__(self,
153
- columns: list[Union[str, Column]] = None,
154
- formatter: TableFormatter = None,
156
+ columns: list[str | CliColumn] = None,
157
+ formatter: CliTableFormatter = None,
155
158
  title: str = ""):
156
159
  """Initialize table."""
157
160
  self.title = title
158
- self.formatter = formatter or TableFormatter()
161
+ self.formatter = formatter or CliTableFormatter()
159
162
 
160
163
  # Process columns
161
164
  self.columns = []
162
165
  if columns:
163
166
  for col in columns:
164
167
  if isinstance(col, str):
165
- self.columns.append(Column(header=col))
168
+ self.columns.append(CliColumn(header=col))
166
169
  else:
167
170
  self.columns.append(col)
168
171
 
169
172
  # Data storage
170
173
  self.rows = []
171
174
 
172
- def add_column(self, column: Union[str, Column]) -> 'Table':
175
+ def add_column(self, column: str | CliColumn) -> CliTable:
173
176
  """Add a column to the table."""
174
177
  if isinstance(column, str):
175
- self.columns.append(Column(header=column))
178
+ self.columns.append(CliColumn(header=column))
176
179
  else:
177
180
  self.columns.append(column)
178
181
  return self
179
182
 
180
- def add_row(self, *values) -> 'Table':
183
+ def add_row(self, *values) -> CliTable:
181
184
  """Add a row to the table."""
182
185
  self.rows.append(list(values))
183
186
  return self
184
187
 
185
- def add_rows(self, rows: list[list[Any]]) -> 'Table':
188
+ def add_rows(self, rows: list[list[Any]]) -> CliTable:
186
189
  """Add multiple rows to the table."""
187
190
  self.rows.extend(rows)
188
191
  return self
@@ -236,18 +239,18 @@ class Table:
236
239
 
237
240
 
238
241
  # Utility functions
239
- def create_simple_table(headers: list[str], rows: list[list[Any]]) -> Table:
242
+ def create_simple_table(headers: list[str], rows: list[list[Any]]) -> CliTable:
240
243
  """Create a simple table with basic formatting."""
241
- table = Table(headers)
244
+ table = CliTable(headers)
242
245
  table.add_rows(rows)
243
246
  return table
244
247
 
245
248
 
246
249
  def print_key_value_table(data: dict[str, Any], title: str = ""):
247
250
  """Print a key-value table."""
248
- table = Table([
249
- Column("Property", header_color=Colors.BLUE, header_style=Style.BOLD),
250
- Column("Value", header_color=Colors.GREEN, header_style=Style.BOLD)
251
+ table = CliTable([
252
+ CliColumn("Property", header_color=Colors.BLUE, header_style=Style.BOLD),
253
+ CliColumn("Value", header_color=Colors.GREEN, header_style=Style.BOLD)
251
254
  ], title=title)
252
255
 
253
256
  for key, value in data.items():
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env python3
2
+ #exonware/xwsystem/src/exonware/xwsystem/console/contracts.py
3
+ #exonware/xwsystem/console/contracts.py
4
+ """
5
+ Company: eXonware.com
6
+ Author: Eng. Muhammad AlShehri
7
+ Email: connect@exonware.com
8
+ Version: 0.1.0.3
9
+ Generation Date: 2025-01-27
10
+
11
+ Console module contracts - interfaces for console functionality.
12
+ """
13
+
14
+ from typing import Protocol, runtime_checkable, Optional, Any
15
+ from .defs import LogLevel, ConsoleEventType, ConsoleEvent
16
+
17
+
18
+ @runtime_checkable
19
+ class IEventLogger(Protocol):
20
+ """Interface for event logging operations."""
21
+
22
+ def log(
23
+ self,
24
+ msg: str,
25
+ source: Optional[str] = None,
26
+ data: Optional[Any] = None,
27
+ color: Optional[str] = None,
28
+ label: Optional[str] = None
29
+ ) -> ConsoleEvent:
30
+ """Log a general message."""
31
+ ...
32
+
33
+ def info(
34
+ self,
35
+ msg: str,
36
+ source: Optional[str] = None,
37
+ data: Optional[Any] = None
38
+ ) -> ConsoleEvent:
39
+ """Log an info message."""
40
+ ...
41
+
42
+ def warn(
43
+ self,
44
+ msg: str,
45
+ source: Optional[str] = None,
46
+ data: Optional[Any] = None
47
+ ) -> ConsoleEvent:
48
+ """Log a warning message."""
49
+ ...
50
+
51
+ def error(
52
+ self,
53
+ msg: str,
54
+ source: Optional[str] = None,
55
+ data: Optional[Any] = None,
56
+ stack: Optional[str] = None
57
+ ) -> ConsoleEvent:
58
+ """Log an error message."""
59
+ ...
60
+
61
+ def debug(
62
+ self,
63
+ msg: str,
64
+ source: Optional[str] = None,
65
+ data: Optional[Any] = None
66
+ ) -> ConsoleEvent:
67
+ """Log a debug message."""
68
+ ...
69
+
70
+ def get_events(
71
+ self,
72
+ event_type: Optional[ConsoleEventType] = None,
73
+ level: Optional[LogLevel] = None,
74
+ source: Optional[str] = None,
75
+ limit: Optional[int] = None
76
+ ) -> list[dict]:
77
+ """Get logged events as dictionaries."""
78
+ ...
79
+
80
+ def clear(self) -> None:
81
+ """Clear all logged events."""
82
+ ...
83
+
84
+ def count(self) -> int:
85
+ """Get the number of logged events."""
86
+ ...
87
+
88
+
89
+ @runtime_checkable
90
+ class IConsoleWriter(Protocol):
91
+ """Interface for console writing operations (user interaction, not logging)."""
92
+
93
+ def write(self, text: str, **kwargs) -> None:
94
+ """Write text to console."""
95
+ ...
96
+
97
+ def write_line(self, text: str = "", **kwargs) -> None:
98
+ """Write a line to console."""
99
+ ...
100
+
101
+ def read(self, prompt: str = "") -> str:
102
+ """Read input from console."""
103
+ ...
104
+
105
+ def clear(self) -> None:
106
+ """Clear console screen."""
107
+ ...
108
+
109
+
110
+ __all__ = [
111
+ 'IEventLogger',
112
+ 'IConsoleWriter',
113
+ ]