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.
- exonware/__init__.py +2 -1
- exonware/conf.py +2 -2
- exonware/xwsystem/__init__.py +115 -43
- exonware/xwsystem/base.py +30 -0
- exonware/xwsystem/caching/__init__.py +39 -13
- exonware/xwsystem/caching/base.py +24 -6
- exonware/xwsystem/caching/bloom_cache.py +2 -2
- exonware/xwsystem/caching/cache_manager.py +2 -1
- exonware/xwsystem/caching/conditional.py +2 -2
- exonware/xwsystem/caching/contracts.py +85 -139
- exonware/xwsystem/caching/decorators.py +6 -19
- exonware/xwsystem/caching/defs.py +2 -1
- exonware/xwsystem/caching/disk_cache.py +2 -1
- exonware/xwsystem/caching/distributed.py +2 -1
- exonware/xwsystem/caching/errors.py +2 -1
- exonware/xwsystem/caching/events.py +110 -27
- exonware/xwsystem/caching/eviction_strategies.py +2 -2
- exonware/xwsystem/caching/external_caching_python.py +701 -0
- exonware/xwsystem/caching/facade.py +253 -0
- exonware/xwsystem/caching/factory.py +300 -0
- exonware/xwsystem/caching/fluent.py +14 -12
- exonware/xwsystem/caching/integrity.py +21 -6
- exonware/xwsystem/caching/lfu_cache.py +2 -1
- exonware/xwsystem/caching/lfu_optimized.py +18 -6
- exonware/xwsystem/caching/lru_cache.py +7 -4
- exonware/xwsystem/caching/memory_bounded.py +2 -2
- exonware/xwsystem/caching/metrics_exporter.py +2 -2
- exonware/xwsystem/caching/observable_cache.py +2 -2
- exonware/xwsystem/caching/pluggable_cache.py +2 -2
- exonware/xwsystem/caching/rate_limiter.py +2 -2
- exonware/xwsystem/caching/read_through.py +2 -2
- exonware/xwsystem/caching/secure_cache.py +81 -28
- exonware/xwsystem/caching/serializable.py +9 -7
- exonware/xwsystem/caching/stats.py +2 -2
- exonware/xwsystem/caching/tagging.py +2 -2
- exonware/xwsystem/caching/ttl_cache.py +4 -3
- exonware/xwsystem/caching/two_tier_cache.py +6 -3
- exonware/xwsystem/caching/utils.py +30 -12
- exonware/xwsystem/caching/validation.py +2 -2
- exonware/xwsystem/caching/warming.py +6 -3
- exonware/xwsystem/caching/write_behind.py +15 -6
- exonware/xwsystem/config/__init__.py +11 -17
- exonware/xwsystem/config/base.py +5 -5
- exonware/xwsystem/config/contracts.py +93 -153
- exonware/xwsystem/config/defaults.py +3 -2
- exonware/xwsystem/config/defs.py +3 -2
- exonware/xwsystem/config/errors.py +2 -5
- exonware/xwsystem/config/logging.py +12 -8
- exonware/xwsystem/config/logging_setup.py +3 -2
- exonware/xwsystem/config/performance.py +73 -391
- exonware/xwsystem/config/performance_modes.py +9 -8
- exonware/xwsystem/config/version_manager.py +1 -0
- exonware/xwsystem/config.py +27 -0
- exonware/xwsystem/console/__init__.py +53 -0
- exonware/xwsystem/console/base.py +133 -0
- exonware/xwsystem/console/cli/__init__.py +61 -0
- exonware/xwsystem/{cli → console/cli}/args.py +27 -24
- exonware/xwsystem/{cli → console/cli}/base.py +18 -87
- exonware/xwsystem/{cli → console/cli}/colors.py +15 -13
- exonware/xwsystem/console/cli/console.py +98 -0
- exonware/xwsystem/{cli → console/cli}/contracts.py +51 -69
- exonware/xwsystem/console/cli/defs.py +87 -0
- exonware/xwsystem/console/cli/encoding.py +69 -0
- exonware/xwsystem/{cli → console/cli}/errors.py +8 -3
- exonware/xwsystem/console/cli/event_logger.py +166 -0
- exonware/xwsystem/{cli → console/cli}/progress.py +25 -21
- exonware/xwsystem/{cli → console/cli}/prompts.py +3 -2
- exonware/xwsystem/{cli → console/cli}/tables.py +27 -24
- exonware/xwsystem/console/contracts.py +113 -0
- exonware/xwsystem/console/defs.py +154 -0
- exonware/xwsystem/console/errors.py +34 -0
- exonware/xwsystem/console/event_logger.py +385 -0
- exonware/xwsystem/console/writer.py +132 -0
- exonware/xwsystem/contracts.py +28 -0
- exonware/xwsystem/data_structures/__init__.py +23 -0
- exonware/xwsystem/data_structures/trie.py +34 -0
- exonware/xwsystem/data_structures/union_find.py +144 -0
- exonware/xwsystem/defs.py +17 -0
- exonware/xwsystem/errors.py +23 -0
- exonware/xwsystem/facade.py +62 -0
- exonware/xwsystem/http_client/__init__.py +22 -1
- exonware/xwsystem/http_client/advanced_client.py +8 -5
- exonware/xwsystem/http_client/base.py +3 -2
- exonware/xwsystem/http_client/client.py +7 -4
- exonware/xwsystem/http_client/contracts.py +42 -56
- exonware/xwsystem/http_client/defs.py +2 -1
- exonware/xwsystem/http_client/errors.py +2 -1
- exonware/xwsystem/http_client/facade.py +156 -0
- exonware/xwsystem/io/__init__.py +22 -3
- exonware/xwsystem/io/archive/__init__.py +8 -2
- exonware/xwsystem/io/archive/archive.py +1 -1
- exonware/xwsystem/io/archive/archive_files.py +4 -7
- exonware/xwsystem/io/archive/archivers.py +120 -10
- exonware/xwsystem/io/archive/base.py +4 -5
- exonware/xwsystem/io/archive/codec_integration.py +1 -2
- exonware/xwsystem/io/archive/compression.py +1 -2
- exonware/xwsystem/io/archive/facade.py +263 -0
- exonware/xwsystem/io/archive/formats/__init__.py +2 -3
- exonware/xwsystem/io/archive/formats/brotli_format.py +20 -7
- exonware/xwsystem/io/archive/formats/lz4_format.py +20 -7
- exonware/xwsystem/io/archive/formats/rar.py +11 -5
- exonware/xwsystem/io/archive/formats/sevenzip.py +12 -6
- exonware/xwsystem/io/archive/formats/squashfs_format.py +1 -2
- exonware/xwsystem/io/archive/formats/tar.py +52 -7
- exonware/xwsystem/io/archive/formats/wim_format.py +11 -5
- exonware/xwsystem/io/archive/formats/zip.py +1 -2
- exonware/xwsystem/io/archive/formats/zpaq_format.py +1 -2
- exonware/xwsystem/io/archive/formats/zstandard.py +20 -7
- exonware/xwsystem/io/base.py +119 -115
- exonware/xwsystem/io/codec/__init__.py +4 -2
- exonware/xwsystem/io/codec/base.py +19 -13
- exonware/xwsystem/io/codec/contracts.py +59 -2
- exonware/xwsystem/io/codec/registry.py +67 -21
- exonware/xwsystem/io/common/__init__.py +1 -1
- exonware/xwsystem/io/common/atomic.py +29 -16
- exonware/xwsystem/io/common/base.py +11 -10
- exonware/xwsystem/io/common/lock.py +6 -5
- exonware/xwsystem/io/common/path_manager.py +2 -1
- exonware/xwsystem/io/common/watcher.py +1 -2
- exonware/xwsystem/io/contracts.py +301 -433
- exonware/xwsystem/io/contracts_1.py +1180 -0
- exonware/xwsystem/io/data_operations.py +279 -14
- exonware/xwsystem/io/defs.py +4 -3
- exonware/xwsystem/io/errors.py +3 -2
- exonware/xwsystem/io/facade.py +87 -61
- exonware/xwsystem/io/file/__init__.py +1 -1
- exonware/xwsystem/io/file/base.py +8 -9
- exonware/xwsystem/io/file/conversion.py +2 -3
- exonware/xwsystem/io/file/file.py +61 -18
- exonware/xwsystem/io/file/paged_source.py +8 -8
- exonware/xwsystem/io/file/paging/__init__.py +1 -2
- exonware/xwsystem/io/file/paging/byte_paging.py +4 -5
- exonware/xwsystem/io/file/paging/line_paging.py +2 -3
- exonware/xwsystem/io/file/paging/record_paging.py +2 -3
- exonware/xwsystem/io/file/paging/registry.py +1 -2
- exonware/xwsystem/io/file/source.py +13 -17
- exonware/xwsystem/io/filesystem/__init__.py +1 -1
- exonware/xwsystem/io/filesystem/base.py +1 -2
- exonware/xwsystem/io/filesystem/local.py +3 -4
- exonware/xwsystem/io/folder/__init__.py +1 -1
- exonware/xwsystem/io/folder/base.py +1 -2
- exonware/xwsystem/io/folder/folder.py +16 -7
- exonware/xwsystem/io/indexing/__init__.py +14 -0
- exonware/xwsystem/io/indexing/facade.py +443 -0
- exonware/xwsystem/io/path_parser.py +98 -0
- exonware/xwsystem/io/serialization/__init__.py +21 -3
- exonware/xwsystem/io/serialization/auto_serializer.py +146 -20
- exonware/xwsystem/io/serialization/base.py +84 -34
- exonware/xwsystem/io/serialization/contracts.py +50 -73
- exonware/xwsystem/io/serialization/defs.py +2 -1
- exonware/xwsystem/io/serialization/errors.py +2 -1
- exonware/xwsystem/io/serialization/flyweight.py +154 -7
- exonware/xwsystem/io/serialization/format_detector.py +15 -14
- exonware/xwsystem/io/serialization/formats/__init__.py +8 -5
- exonware/xwsystem/io/serialization/formats/binary/bson.py +15 -6
- exonware/xwsystem/io/serialization/formats/binary/cbor.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/marshal.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/msgpack.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/pickle.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/plistlib.py +5 -5
- exonware/xwsystem/io/serialization/formats/database/dbm.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/shelve.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/sqlite3.py +7 -7
- exonware/xwsystem/io/serialization/formats/tabular/__init__.py +27 -0
- exonware/xwsystem/io/serialization/formats/tabular/base.py +89 -0
- exonware/xwsystem/io/serialization/formats/tabular/csv.py +319 -0
- exonware/xwsystem/io/serialization/formats/tabular/df.py +249 -0
- exonware/xwsystem/io/serialization/formats/tabular/excel.py +291 -0
- exonware/xwsystem/io/serialization/formats/tabular/googlesheets.py +374 -0
- exonware/xwsystem/io/serialization/formats/text/__init__.py +1 -1
- exonware/xwsystem/io/serialization/formats/text/append_only_log.py +199 -0
- exonware/xwsystem/io/serialization/formats/text/configparser.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/csv.py +7 -5
- exonware/xwsystem/io/serialization/formats/text/formdata.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/json.py +65 -33
- exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
- exonware/xwsystem/io/serialization/formats/text/jsonlines.py +113 -25
- exonware/xwsystem/io/serialization/formats/text/multipart.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/toml.py +8 -6
- exonware/xwsystem/io/serialization/formats/text/xml.py +25 -20
- exonware/xwsystem/io/serialization/formats/text/yaml.py +8 -6
- exonware/xwsystem/io/serialization/parsers/__init__.py +16 -0
- exonware/xwsystem/io/serialization/parsers/base.py +60 -0
- exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +62 -0
- exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +48 -0
- exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +54 -0
- exonware/xwsystem/io/serialization/parsers/orjson_parser.py +62 -0
- exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +55 -0
- exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +53 -0
- exonware/xwsystem/io/serialization/parsers/registry.py +91 -0
- exonware/xwsystem/io/serialization/parsers/standard.py +44 -0
- exonware/xwsystem/io/serialization/parsers/ujson_parser.py +53 -0
- exonware/xwsystem/io/serialization/registry.py +4 -4
- exonware/xwsystem/io/serialization/serializer.py +168 -79
- exonware/xwsystem/io/serialization/universal_options.py +367 -0
- exonware/xwsystem/io/serialization/utils/__init__.py +1 -2
- exonware/xwsystem/io/serialization/utils/path_ops.py +5 -6
- exonware/xwsystem/io/source_reader.py +223 -0
- exonware/xwsystem/io/stream/__init__.py +1 -1
- exonware/xwsystem/io/stream/async_operations.py +61 -14
- exonware/xwsystem/io/stream/base.py +1 -2
- exonware/xwsystem/io/stream/codec_io.py +6 -7
- exonware/xwsystem/ipc/__init__.py +1 -0
- exonware/xwsystem/ipc/async_fabric.py +4 -4
- exonware/xwsystem/ipc/base.py +6 -5
- exonware/xwsystem/ipc/contracts.py +41 -66
- exonware/xwsystem/ipc/defs.py +2 -1
- exonware/xwsystem/ipc/errors.py +2 -1
- exonware/xwsystem/ipc/message_queue.py +5 -2
- exonware/xwsystem/ipc/pipes.py +70 -34
- exonware/xwsystem/ipc/process_manager.py +7 -5
- exonware/xwsystem/ipc/process_pool.py +6 -5
- exonware/xwsystem/ipc/shared_memory.py +64 -11
- exonware/xwsystem/monitoring/__init__.py +7 -0
- exonware/xwsystem/monitoring/base.py +11 -8
- exonware/xwsystem/monitoring/contracts.py +86 -144
- exonware/xwsystem/monitoring/defs.py +2 -1
- exonware/xwsystem/monitoring/error_recovery.py +16 -3
- exonware/xwsystem/monitoring/errors.py +2 -1
- exonware/xwsystem/monitoring/facade.py +183 -0
- exonware/xwsystem/monitoring/memory_monitor.py +1 -0
- exonware/xwsystem/monitoring/metrics.py +1 -0
- exonware/xwsystem/monitoring/performance_manager_generic.py +7 -7
- exonware/xwsystem/monitoring/performance_monitor.py +1 -0
- exonware/xwsystem/monitoring/performance_validator.py +1 -0
- exonware/xwsystem/monitoring/system_monitor.py +6 -5
- exonware/xwsystem/monitoring/tracing.py +18 -16
- exonware/xwsystem/monitoring/tracker.py +2 -1
- exonware/xwsystem/operations/__init__.py +5 -50
- exonware/xwsystem/operations/base.py +3 -44
- exonware/xwsystem/operations/contracts.py +25 -15
- exonware/xwsystem/operations/defs.py +1 -1
- exonware/xwsystem/operations/diff.py +5 -4
- exonware/xwsystem/operations/errors.py +1 -1
- exonware/xwsystem/operations/merge.py +6 -4
- exonware/xwsystem/operations/patch.py +5 -4
- exonware/xwsystem/patterns/__init__.py +1 -0
- exonware/xwsystem/patterns/base.py +2 -1
- exonware/xwsystem/patterns/context_manager.py +2 -1
- exonware/xwsystem/patterns/contracts.py +215 -256
- exonware/xwsystem/patterns/defs.py +2 -1
- exonware/xwsystem/patterns/dynamic_facade.py +1 -0
- exonware/xwsystem/patterns/errors.py +2 -4
- exonware/xwsystem/patterns/handler_factory.py +2 -3
- exonware/xwsystem/patterns/import_registry.py +1 -0
- exonware/xwsystem/patterns/object_pool.py +1 -0
- exonware/xwsystem/patterns/registry.py +4 -43
- exonware/xwsystem/plugins/__init__.py +2 -1
- exonware/xwsystem/plugins/base.py +6 -5
- exonware/xwsystem/plugins/contracts.py +94 -158
- exonware/xwsystem/plugins/defs.py +2 -1
- exonware/xwsystem/plugins/errors.py +2 -1
- exonware/xwsystem/py.typed +3 -0
- exonware/xwsystem/query/__init__.py +36 -0
- exonware/xwsystem/query/contracts.py +56 -0
- exonware/xwsystem/query/errors.py +22 -0
- exonware/xwsystem/query/registry.py +128 -0
- exonware/xwsystem/runtime/__init__.py +2 -1
- exonware/xwsystem/runtime/base.py +4 -3
- exonware/xwsystem/runtime/contracts.py +39 -60
- exonware/xwsystem/runtime/defs.py +2 -1
- exonware/xwsystem/runtime/env.py +11 -9
- exonware/xwsystem/runtime/errors.py +2 -1
- exonware/xwsystem/runtime/reflection.py +3 -2
- exonware/xwsystem/security/__init__.py +68 -11
- exonware/xwsystem/security/audit.py +167 -0
- exonware/xwsystem/security/base.py +121 -24
- exonware/xwsystem/security/contracts.py +91 -146
- exonware/xwsystem/security/crypto.py +17 -16
- exonware/xwsystem/security/defs.py +2 -1
- exonware/xwsystem/security/errors.py +2 -1
- exonware/xwsystem/security/facade.py +321 -0
- exonware/xwsystem/security/file_security.py +330 -0
- exonware/xwsystem/security/hazmat.py +11 -8
- exonware/xwsystem/security/monitor.py +372 -0
- exonware/xwsystem/security/path_validator.py +140 -18
- exonware/xwsystem/security/policy.py +357 -0
- exonware/xwsystem/security/resource_limits.py +1 -0
- exonware/xwsystem/security/validator.py +455 -0
- exonware/xwsystem/shared/__init__.py +14 -1
- exonware/xwsystem/shared/base.py +285 -2
- exonware/xwsystem/shared/contracts.py +415 -126
- exonware/xwsystem/shared/defs.py +2 -1
- exonware/xwsystem/shared/errors.py +2 -2
- exonware/xwsystem/shared/xwobject.py +316 -0
- exonware/xwsystem/structures/__init__.py +1 -0
- exonware/xwsystem/structures/base.py +3 -2
- exonware/xwsystem/structures/circular_detector.py +15 -14
- exonware/xwsystem/structures/contracts.py +53 -76
- exonware/xwsystem/structures/defs.py +2 -1
- exonware/xwsystem/structures/errors.py +2 -1
- exonware/xwsystem/structures/tree_walker.py +2 -1
- exonware/xwsystem/threading/__init__.py +21 -4
- exonware/xwsystem/threading/async_primitives.py +6 -5
- exonware/xwsystem/threading/base.py +3 -2
- exonware/xwsystem/threading/contracts.py +87 -143
- exonware/xwsystem/threading/defs.py +2 -1
- exonware/xwsystem/threading/errors.py +2 -1
- exonware/xwsystem/threading/facade.py +175 -0
- exonware/xwsystem/threading/locks.py +1 -0
- exonware/xwsystem/threading/safe_factory.py +1 -0
- exonware/xwsystem/utils/__init__.py +40 -0
- exonware/xwsystem/utils/base.py +22 -21
- exonware/xwsystem/utils/contracts.py +50 -73
- exonware/xwsystem/utils/dt/__init__.py +19 -3
- exonware/xwsystem/utils/dt/base.py +5 -4
- exonware/xwsystem/utils/dt/contracts.py +22 -29
- exonware/xwsystem/utils/dt/defs.py +2 -1
- exonware/xwsystem/utils/dt/errors.py +2 -5
- exonware/xwsystem/utils/dt/formatting.py +88 -2
- exonware/xwsystem/utils/dt/humanize.py +10 -9
- exonware/xwsystem/utils/dt/parsing.py +56 -5
- exonware/xwsystem/utils/dt/timezone_utils.py +2 -24
- exonware/xwsystem/utils/errors.py +2 -4
- exonware/xwsystem/utils/paths.py +1 -0
- exonware/xwsystem/utils/string.py +49 -0
- exonware/xwsystem/utils/test_runner.py +139 -480
- exonware/xwsystem/utils/utils_contracts.py +2 -1
- exonware/xwsystem/utils/web.py +110 -0
- exonware/xwsystem/validation/__init__.py +25 -1
- exonware/xwsystem/validation/base.py +6 -5
- exonware/xwsystem/validation/contracts.py +29 -41
- exonware/xwsystem/validation/data_validator.py +1 -0
- exonware/xwsystem/validation/declarative.py +11 -8
- exonware/xwsystem/validation/defs.py +2 -1
- exonware/xwsystem/validation/errors.py +2 -1
- exonware/xwsystem/validation/facade.py +198 -0
- exonware/xwsystem/validation/fluent_validator.py +22 -19
- exonware/xwsystem/validation/schema_discovery.py +210 -0
- exonware/xwsystem/validation/type_safety.py +2 -1
- exonware/xwsystem/version.py +4 -4
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/METADATA +71 -4
- exonware_xwsystem-0.1.0.3.dist-info/RECORD +337 -0
- exonware/xwsystem/caching/USAGE_GUIDE.md +0 -779
- exonware/xwsystem/cli/__init__.py +0 -43
- exonware/xwsystem/cli/console.py +0 -113
- exonware/xwsystem/cli/defs.py +0 -134
- exonware/xwsystem/conf.py +0 -44
- exonware/xwsystem/security/auth.py +0 -484
- exonware_xwsystem-0.0.1.411.dist-info/RECORD +0 -274
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/WHEEL +0 -0
- {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.
|
|
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
|
|
14
|
-
from
|
|
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
|
|
24
|
+
from ...config.logging_setup import get_logger
|
|
23
25
|
|
|
24
26
|
logger = get_logger("xwsystem.cli.colors")
|
|
25
27
|
|
|
26
28
|
|
|
27
|
-
class
|
|
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
|
|
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:
|
|
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:
|
|
118
|
-
style: Optional[
|
|
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 =
|
|
233
|
+
_colored_output = CliColoredOutput()
|
|
232
234
|
|
|
233
235
|
# Convenience functions
|
|
234
|
-
def colorize(text: str, color:
|
|
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:
|
|
239
|
-
style: Optional[
|
|
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.
|
|
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
|
|
12
|
-
from typing import Any, Optional
|
|
12
|
+
from typing import Protocol, runtime_checkable
|
|
13
|
+
from typing import Any, Optional
|
|
13
14
|
|
|
14
|
-
# Import enums from
|
|
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
|
-
|
|
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
|
-
|
|
33
|
+
...
|
|
35
34
|
|
|
36
|
-
@abstractmethod
|
|
37
35
|
def input(self, prompt: str, **kwargs) -> str:
|
|
38
36
|
"""Get input from user."""
|
|
39
|
-
|
|
37
|
+
...
|
|
40
38
|
|
|
41
|
-
@abstractmethod
|
|
42
39
|
def clear(self) -> None:
|
|
43
40
|
"""Clear console screen."""
|
|
44
|
-
|
|
41
|
+
...
|
|
45
42
|
|
|
46
43
|
|
|
47
|
-
|
|
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
|
-
|
|
50
|
+
...
|
|
54
51
|
|
|
55
|
-
@abstractmethod
|
|
56
52
|
def update(self, increment: int = 1) -> None:
|
|
57
53
|
"""Update progress."""
|
|
58
|
-
|
|
54
|
+
...
|
|
59
55
|
|
|
60
|
-
@abstractmethod
|
|
61
56
|
def finish(self) -> None:
|
|
62
57
|
"""Finish progress bar."""
|
|
63
|
-
|
|
58
|
+
...
|
|
64
59
|
|
|
65
60
|
|
|
66
|
-
|
|
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
|
-
|
|
67
|
+
...
|
|
73
68
|
|
|
74
|
-
@abstractmethod
|
|
75
69
|
def render(self) -> str:
|
|
76
70
|
"""Render table as string."""
|
|
77
|
-
|
|
71
|
+
...
|
|
78
72
|
|
|
79
73
|
|
|
80
|
-
|
|
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
|
-
|
|
80
|
+
...
|
|
87
81
|
|
|
88
82
|
|
|
89
|
-
|
|
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
|
-
|
|
89
|
+
...
|
|
96
90
|
|
|
97
|
-
@abstractmethod
|
|
98
91
|
def parse_args(self, args: Optional[list[str]] = None) -> Any:
|
|
99
92
|
"""Parse command line arguments."""
|
|
100
|
-
|
|
93
|
+
...
|
|
101
94
|
|
|
102
95
|
|
|
103
|
-
|
|
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
|
-
|
|
103
|
+
...
|
|
111
104
|
|
|
112
105
|
@property
|
|
113
|
-
@abstractmethod
|
|
114
106
|
def version(self) -> str:
|
|
115
107
|
"""Get CLI version."""
|
|
116
|
-
|
|
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
|
-
|
|
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
|
-
|
|
116
|
+
...
|
|
127
117
|
|
|
128
|
-
@abstractmethod
|
|
129
118
|
def run(self, args: Optional[list[str]] = None) -> int:
|
|
130
119
|
"""Run the CLI."""
|
|
131
|
-
|
|
120
|
+
...
|
|
132
121
|
|
|
133
|
-
@abstractmethod
|
|
134
122
|
def get_help(self) -> str:
|
|
135
123
|
"""Get help text."""
|
|
136
|
-
|
|
124
|
+
...
|
|
137
125
|
|
|
138
126
|
|
|
139
|
-
|
|
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
|
-
|
|
133
|
+
...
|
|
146
134
|
|
|
147
|
-
@abstractmethod
|
|
148
135
|
def update(self, increment: int = 1) -> None:
|
|
149
136
|
"""Update progress."""
|
|
150
|
-
|
|
137
|
+
...
|
|
151
138
|
|
|
152
|
-
@abstractmethod
|
|
153
139
|
def finish(self) -> None:
|
|
154
140
|
"""Finish progress tracking."""
|
|
155
|
-
|
|
141
|
+
...
|
|
156
142
|
|
|
157
143
|
|
|
158
|
-
|
|
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
|
-
|
|
150
|
+
...
|
|
165
151
|
|
|
166
|
-
@abstractmethod
|
|
167
152
|
def confirm(self, message: str, default: bool = False) -> bool:
|
|
168
153
|
"""Ask for confirmation."""
|
|
169
|
-
|
|
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
|
-
|
|
158
|
+
...
|
|
175
159
|
|
|
176
160
|
|
|
177
|
-
|
|
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
|
-
|
|
167
|
+
...
|
|
184
168
|
|
|
185
|
-
@abstractmethod
|
|
186
169
|
def render(self) -> str:
|
|
187
170
|
"""Render table as string."""
|
|
188
|
-
|
|
171
|
+
...
|
|
189
172
|
|
|
190
|
-
@abstractmethod
|
|
191
173
|
def clear(self) -> None:
|
|
192
174
|
"""Clear all rows."""
|
|
193
|
-
|
|
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.
|
|
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
|
-
|
|
28
|
-
|
|
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
|
|