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
@@ -1,8 +1,9 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/console/cli/colors.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 05, 2025
7
8
 
8
9
  Colored terminal output utilities with cross-platform support.
@@ -10,8 +11,9 @@ Colored terminal output utilities with cross-platform support.
10
11
 
11
12
  import os
12
13
  import sys
13
- from typing import Optional, Union
14
- from .defs import Colors, Style
14
+ from typing import Optional
15
+ # Import general console enums from console level (priority)
16
+ from ..defs import Colors, Style
15
17
 
16
18
  # Explicit import - colorama is a required dependency for CLI functionality
17
19
  # This ensures consistent cross-platform colored output
@@ -19,12 +21,12 @@ from .defs import Colors, Style
19
21
  import colorama
20
22
  colorama.init(autoreset=True)
21
23
 
22
- from ..config.logging_setup import get_logger
24
+ from ...config.logging_setup import get_logger
23
25
 
24
26
  logger = get_logger("xwsystem.cli.colors")
25
27
 
26
28
 
27
- class ColoredOutput:
29
+ class CliColoredOutput:
28
30
  """
29
31
  Cross-platform colored terminal output.
30
32
 
@@ -73,7 +75,7 @@ class ColoredOutput:
73
75
  if 'color' in term or term in ('xterm', 'xterm-256color', 'screen', 'tmux'):
74
76
  return True
75
77
 
76
- # Lazy installation ensures colorama is always available
78
+ # Lazy installation provides colorama when available
77
79
  # Works on all platforms
78
80
  return True
79
81
 
@@ -81,7 +83,7 @@ class ColoredOutput:
81
83
  """Check if colored output is supported."""
82
84
  return self._supports_color
83
85
 
84
- def colorize(self, text: str, color: Union[Colors, str], style: Optional[Union[Style, str]] = None) -> str:
86
+ def colorize(self, text: str, color: Colors | str, style: Optional[Style | str] = None) -> str:
85
87
  """
86
88
  Apply color and style to text.
87
89
 
@@ -114,8 +116,8 @@ class ColoredOutput:
114
116
  else:
115
117
  return f"{color_str}{text}"
116
118
 
117
- def print_colored(self, text: str, color: Union[Colors, str],
118
- style: Optional[Union[Style, str]] = None, **kwargs) -> None:
119
+ def print_colored(self, text: str, color: Colors | str,
120
+ style: Optional[Style | str] = None, **kwargs) -> None:
119
121
  """
120
122
  Print colored text.
121
123
 
@@ -228,15 +230,15 @@ class ColoredOutput:
228
230
 
229
231
 
230
232
  # Global colored output instance
231
- _colored_output = ColoredOutput()
233
+ _colored_output = CliColoredOutput()
232
234
 
233
235
  # Convenience functions
234
- def colorize(text: str, color: Union[Colors, str], style: Optional[Union[Style, str]] = None) -> str:
236
+ def colorize(text: str, color: Colors | str, style: Optional[Style | str] = None) -> str:
235
237
  """Colorize text using global instance."""
236
238
  return _colored_output.colorize(text, color, style)
237
239
 
238
- def print_colored(text: str, color: Union[Colors, str],
239
- style: Optional[Union[Style, str]] = None, **kwargs) -> None:
240
+ def print_colored(text: str, color: Colors | str,
241
+ style: Optional[Style | str] = None, **kwargs) -> None:
240
242
  """Print colored text using global instance."""
241
243
  _colored_output.print_colored(text, color, style, **kwargs)
242
244
 
@@ -0,0 +1,98 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/console/cli/console.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: September 04, 2025
8
+
9
+ Console utilities for CLI operations.
10
+ """
11
+
12
+ import os
13
+ from typing import Optional
14
+ from .contracts import IConsole, ColorType
15
+ from .errors import ConsoleError
16
+ # Import ConsoleWriter from console level (priority)
17
+ from ..writer import ConsoleWriter
18
+
19
+
20
+ class CliConsole(ConsoleWriter, IConsole):
21
+ """
22
+ Console implementation for CLI operations.
23
+
24
+ Extends ConsoleWriter from console level and adds CLI-specific features
25
+ like color support and IConsole interface compliance.
26
+ """
27
+
28
+ def print(self, text: str, color: Optional[ColorType] = None, **kwargs) -> None:
29
+ """
30
+ Print text to console with optional color.
31
+
32
+ Args:
33
+ text: Text to print
34
+ color: Optional color type to apply
35
+ **kwargs: Additional arguments passed to print()
36
+ """
37
+ try:
38
+ if color and self.supports_color():
39
+ text = self._apply_color(text, color)
40
+
41
+ # Use parent's write_line method
42
+ self.write_line(text, **kwargs)
43
+ except Exception as e:
44
+ raise ConsoleError(f"Failed to print to console: {e}")
45
+
46
+ def input(self, prompt: str, **kwargs) -> str:
47
+ """
48
+ Get input from user.
49
+
50
+ Args:
51
+ prompt: Prompt text
52
+ **kwargs: Additional arguments (for compatibility)
53
+
54
+ Returns:
55
+ User input string
56
+ """
57
+ try:
58
+ # Use parent's read method
59
+ return self.read(prompt)
60
+ except Exception as e:
61
+ raise ConsoleError(f"Failed to get input: {e}")
62
+
63
+ def _apply_color(self, text: str, color: ColorType) -> str:
64
+ """Apply color to text."""
65
+ color_codes = {
66
+ ColorType.RESET: '\033[0m',
67
+ ColorType.BOLD: '\033[1m',
68
+ ColorType.DIM: '\033[2m',
69
+ ColorType.UNDERLINE: '\033[4m',
70
+ ColorType.RED: '\033[31m',
71
+ ColorType.GREEN: '\033[32m',
72
+ ColorType.YELLOW: '\033[33m',
73
+ ColorType.BLUE: '\033[34m',
74
+ ColorType.MAGENTA: '\033[35m',
75
+ ColorType.CYAN: '\033[36m',
76
+ ColorType.WHITE: '\033[37m',
77
+ ColorType.GRAY: '\033[90m',
78
+ }
79
+
80
+ code = color_codes.get(color, '')
81
+ return f"{code}{text}\033[0m" if code else text
82
+
83
+ def get_size(self) -> tuple[int, int]:
84
+ """
85
+ Get console size.
86
+
87
+ Returns:
88
+ Tuple of (columns, lines)
89
+ """
90
+ try:
91
+ if hasattr(os, 'get_terminal_size'):
92
+ size = os.get_terminal_size()
93
+ return (size.columns, size.lines)
94
+ else:
95
+ return (80, 24) # Default size
96
+ except (OSError, AttributeError, RuntimeError):
97
+ # Catch specific exceptions - terminal size may not be available
98
+ return (80, 24)
@@ -1,193 +1,175 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/console/cli/contracts.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
  CLI module contracts - interfaces and enums for command-line interface functionality.
9
10
  """
10
11
 
11
- from abc import ABC, abstractmethod
12
- from typing import Any, Optional, Union
12
+ from typing import Protocol, runtime_checkable
13
+ from typing import Any, Optional
13
14
 
14
- # Import enums from types module
15
+ # Import general console enums from console level (priority)
16
+ from ..defs import Alignment, BorderStyle, Colors, Style
17
+ # Import CLI-specific enums from defs
15
18
  from .defs import (
16
19
  ColorType,
17
20
  ProgressStyle,
18
21
  TableStyle,
19
22
  PromptType,
20
- Alignment,
21
- BorderStyle,
22
- Colors,
23
- Style,
24
23
  ArgumentType
25
24
  )
26
25
 
27
26
 
28
- class IConsole(ABC):
27
+ @runtime_checkable
28
+ class IConsole(Protocol):
29
29
  """Interface for console operations."""
30
30
 
31
- @abstractmethod
32
31
  def print(self, text: str, color: Optional[ColorType] = None, **kwargs) -> None:
33
32
  """Print text to console."""
34
- pass
33
+ ...
35
34
 
36
- @abstractmethod
37
35
  def input(self, prompt: str, **kwargs) -> str:
38
36
  """Get input from user."""
39
- pass
37
+ ...
40
38
 
41
- @abstractmethod
42
39
  def clear(self) -> None:
43
40
  """Clear console screen."""
44
- pass
41
+ ...
45
42
 
46
43
 
47
- class IProgressBar(ABC):
44
+ @runtime_checkable
45
+ class IProgressBar(Protocol):
48
46
  """Interface for progress bar operations."""
49
47
 
50
- @abstractmethod
51
48
  def start(self, total: int, description: str = "") -> None:
52
49
  """Start progress bar."""
53
- pass
50
+ ...
54
51
 
55
- @abstractmethod
56
52
  def update(self, increment: int = 1) -> None:
57
53
  """Update progress."""
58
- pass
54
+ ...
59
55
 
60
- @abstractmethod
61
56
  def finish(self) -> None:
62
57
  """Finish progress bar."""
63
- pass
58
+ ...
64
59
 
65
60
 
66
- class ITable(ABC):
61
+ @runtime_checkable
62
+ class ITable(Protocol):
67
63
  """Interface for table operations."""
68
64
 
69
- @abstractmethod
70
65
  def add_row(self, *values: Any) -> None:
71
66
  """Add row to table."""
72
- pass
67
+ ...
73
68
 
74
- @abstractmethod
75
69
  def render(self) -> str:
76
70
  """Render table as string."""
77
- pass
71
+ ...
78
72
 
79
73
 
80
- class IPrompt(ABC):
74
+ @runtime_checkable
75
+ class IPrompt(Protocol):
81
76
  """Interface for user prompts."""
82
77
 
83
- @abstractmethod
84
78
  def ask(self, question: str, **kwargs) -> Any:
85
79
  """Ask user a question."""
86
- pass
80
+ ...
87
81
 
88
82
 
89
- class IArgumentParser(ABC):
83
+ @runtime_checkable
84
+ class IArgumentParser(Protocol):
90
85
  """Interface for argument parsing."""
91
86
 
92
- @abstractmethod
93
87
  def add_argument(self, *args, **kwargs) -> None:
94
88
  """Add argument to parser."""
95
- pass
89
+ ...
96
90
 
97
- @abstractmethod
98
91
  def parse_args(self, args: Optional[list[str]] = None) -> Any:
99
92
  """Parse command line arguments."""
100
- pass
93
+ ...
101
94
 
102
95
 
103
- class ICLI(ABC):
96
+ @runtime_checkable
97
+ class ICLI(Protocol):
104
98
  """Interface for CLI operations."""
105
99
 
106
100
  @property
107
- @abstractmethod
108
101
  def name(self) -> str:
109
102
  """Get CLI name."""
110
- pass
103
+ ...
111
104
 
112
105
  @property
113
- @abstractmethod
114
106
  def version(self) -> str:
115
107
  """Get CLI version."""
116
- pass
108
+ ...
117
109
 
118
- @abstractmethod
119
110
  def add_command(self, name: str, command: Any) -> None:
120
111
  """Add a command to the CLI."""
121
- pass
112
+ ...
122
113
 
123
- @abstractmethod
124
114
  def add_option(self, name: str, option: Any) -> None:
125
115
  """Add an option to the CLI."""
126
- pass
116
+ ...
127
117
 
128
- @abstractmethod
129
118
  def run(self, args: Optional[list[str]] = None) -> int:
130
119
  """Run the CLI."""
131
- pass
120
+ ...
132
121
 
133
- @abstractmethod
134
122
  def get_help(self) -> str:
135
123
  """Get help text."""
136
- pass
124
+ ...
137
125
 
138
126
 
139
- class IProgress(ABC):
127
+ @runtime_checkable
128
+ class IProgress(Protocol):
140
129
  """Interface for progress operations."""
141
130
 
142
- @abstractmethod
143
131
  def start(self, total: int, description: str = "") -> None:
144
132
  """Start progress tracking."""
145
- pass
133
+ ...
146
134
 
147
- @abstractmethod
148
135
  def update(self, increment: int = 1) -> None:
149
136
  """Update progress."""
150
- pass
137
+ ...
151
138
 
152
- @abstractmethod
153
139
  def finish(self) -> None:
154
140
  """Finish progress tracking."""
155
- pass
141
+ ...
156
142
 
157
143
 
158
- class IPrompts(ABC):
144
+ @runtime_checkable
145
+ class IPrompts(Protocol):
159
146
  """Interface for user prompts."""
160
147
 
161
- @abstractmethod
162
148
  def ask(self, question: str, **kwargs) -> Any:
163
149
  """Ask user a question."""
164
- pass
150
+ ...
165
151
 
166
- @abstractmethod
167
152
  def confirm(self, message: str, default: bool = False) -> bool:
168
153
  """Ask for confirmation."""
169
- pass
154
+ ...
170
155
 
171
- @abstractmethod
172
156
  def select(self, message: str, choices: list[str], default: Optional[str] = None) -> str:
173
157
  """Ask user to select from choices."""
174
- pass
158
+ ...
175
159
 
176
160
 
177
- class ITableFormatter(ABC):
161
+ @runtime_checkable
162
+ class ITableFormatter(Protocol):
178
163
  """Interface for table formatting."""
179
164
 
180
- @abstractmethod
181
165
  def add_row(self, *values: Any) -> None:
182
166
  """Add row to table."""
183
- pass
167
+ ...
184
168
 
185
- @abstractmethod
186
169
  def render(self) -> str:
187
170
  """Render table as string."""
188
- pass
171
+ ...
189
172
 
190
- @abstractmethod
191
173
  def clear(self) -> None:
192
174
  """Clear all rows."""
193
- pass
175
+ ...
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env python3
2
+ #exonware/xwsystem/src/exonware/xwsystem/console/cli/defs.py
3
+ #exonware/xwsystem/console/cli/cli_defs.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: 07-Sep-2025
10
+
11
+ CLI-specific types and enums for XWSystem.
12
+ """
13
+
14
+ from enum import Enum
15
+ # Import general console enums from console level (priority)
16
+ from ..defs import Alignment, BorderStyle, Colors, Style
17
+
18
+
19
+ # ============================================================================
20
+ # CLI-SPECIFIC ENUMS
21
+ # ============================================================================
22
+
23
+ class ColorType(Enum):
24
+ """Color types for CLI output."""
25
+ RESET = "reset"
26
+ BOLD = "bold"
27
+ DIM = "dim"
28
+ UNDERLINE = "underline"
29
+ RED = "red"
30
+ GREEN = "green"
31
+ YELLOW = "yellow"
32
+ BLUE = "blue"
33
+ MAGENTA = "magenta"
34
+ CYAN = "cyan"
35
+ WHITE = "white"
36
+ GRAY = "gray"
37
+
38
+
39
+ class ProgressStyle(Enum):
40
+ """Progress bar styles."""
41
+ BAR = "bar"
42
+ SPINNER = "spinner"
43
+ PERCENTAGE = "percentage"
44
+ COUNTER = "counter"
45
+
46
+
47
+ class TableStyle(Enum):
48
+ """Table display styles."""
49
+ SIMPLE = "simple"
50
+ GRID = "grid"
51
+ FANCY = "fancy"
52
+ MINIMAL = "minimal"
53
+
54
+
55
+ class PromptType(Enum):
56
+ """Prompt input types."""
57
+ TEXT = "text"
58
+ PASSWORD = "password"
59
+ CONFIRM = "confirm"
60
+ SELECT = "select"
61
+ MULTISELECT = "multiselect"
62
+
63
+
64
+ class ArgumentType(Enum):
65
+ """Types of command-line arguments."""
66
+ STRING = "string"
67
+ INTEGER = "int"
68
+ FLOAT = "float"
69
+ BOOLEAN = "bool"
70
+ FILE = "file"
71
+ DIRECTORY = "dir"
72
+ CHOICE = "choice"
73
+
74
+
75
+ __all__ = [
76
+ # Re-export general console enums
77
+ 'Alignment',
78
+ 'BorderStyle',
79
+ 'Colors',
80
+ 'Style',
81
+ # CLI-specific enums
82
+ 'ColorType',
83
+ 'ProgressStyle',
84
+ 'TableStyle',
85
+ 'PromptType',
86
+ 'ArgumentType',
87
+ ]
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env python3
2
+ #exonware/xwsystem/src/exonware/xwsystem/console/cli/encoding.py
3
+ """
4
+ Console encoding utilities.
5
+
6
+ Best-effort UTF-8 configuration for Windows consoles (safe for uvicorn logging).
7
+ No-op on non-Windows platforms.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import io
13
+ import sys
14
+
15
+
16
+ def ensure_utf8_console() -> None:
17
+ """
18
+ Configure UTF-8 encoding for Windows console output streams.
19
+
20
+ - No-op on non-Windows platforms.
21
+ - Best-effort: never raises.
22
+ """
23
+ if sys.platform != "win32":
24
+ return
25
+
26
+ try:
27
+ # Prefer reconfigure when available (Python 3.7+)
28
+ if hasattr(sys.stdout, "reconfigure"):
29
+ try:
30
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace")
31
+ sys.stderr.reconfigure(encoding="utf-8", errors="replace")
32
+ return
33
+ except (AttributeError, OSError):
34
+ # Fall back to wrapper below
35
+ pass
36
+
37
+ class _UTF8Wrapper(io.TextIOWrapper):
38
+ """Wrapper that delegates key methods to the original stream."""
39
+
40
+ def __init__(self, buffer, **kwargs):
41
+ super().__init__(buffer, **kwargs)
42
+ self._original = buffer
43
+
44
+ def isatty(self):
45
+ return getattr(self._original, "isatty", lambda: False)()
46
+
47
+ def fileno(self):
48
+ return getattr(self._original, "fileno", lambda: -1)()
49
+
50
+ sys.stdout = _UTF8Wrapper(
51
+ sys.stdout.buffer,
52
+ encoding="utf-8",
53
+ errors="replace",
54
+ line_buffering=True,
55
+ )
56
+ sys.stderr = _UTF8Wrapper(
57
+ sys.stderr.buffer,
58
+ encoding="utf-8",
59
+ errors="replace",
60
+ line_buffering=True,
61
+ )
62
+ except Exception:
63
+ # Fallback on error
64
+ pass
65
+
66
+
67
+ __all__ = [
68
+ "ensure_utf8_console",
69
+ ]
@@ -1,13 +1,17 @@
1
+ #exonware/xwsystem/src/exonware/xwsystem/console/cli/errors.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
  CLI module errors - exception classes for command-line interface functionality.
9
10
  """
10
11
 
12
+ # Import base console errors from console level (priority)
13
+ from ..errors import ConsoleError as BaseConsoleError
14
+
11
15
 
12
16
  class CLIError(Exception):
13
17
  """Base exception for CLI errors."""
@@ -24,8 +28,9 @@ class CommandError(CLIError):
24
28
  pass
25
29
 
26
30
 
27
- class ConsoleError(CLIError):
28
- """Raised when console operation fails."""
31
+ # ConsoleError extends base ConsoleError from console level
32
+ class ConsoleError(BaseConsoleError):
33
+ """Raised when console operation fails (CLI-specific)."""
29
34
  pass
30
35
 
31
36