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
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/config.py
|
|
3
|
+
|
|
4
|
+
Package-level configuration entry points for xwsystem.
|
|
5
|
+
|
|
6
|
+
Company: eXonware.com
|
|
7
|
+
Author: Eng. Muhammad AlShehri
|
|
8
|
+
Email: connect@exonware.com
|
|
9
|
+
Version: 0.1.0.3
|
|
10
|
+
Last Updated: 29-Jan-2026
|
|
11
|
+
|
|
12
|
+
This module exists to satisfy the canonical structure in GUIDE_31_DEV.md:
|
|
13
|
+
- `config.py` at package root for configuration surfaces.
|
|
14
|
+
|
|
15
|
+
The concrete configuration system lives under `exonware.xwsystem.config`.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from .config.logging_setup import get_logger, setup_logging
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
"get_logger",
|
|
25
|
+
"setup_logging",
|
|
26
|
+
]
|
|
27
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/console/__init__.py
|
|
3
|
+
#exonware/xwsystem/console/__init__.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 for structured logging and user interaction.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from .defs import (
|
|
15
|
+
LogLevel,
|
|
16
|
+
ConsoleEventType,
|
|
17
|
+
ConsoleEvent,
|
|
18
|
+
)
|
|
19
|
+
from .contracts import (
|
|
20
|
+
IEventLogger,
|
|
21
|
+
IConsoleWriter,
|
|
22
|
+
)
|
|
23
|
+
from .base import (
|
|
24
|
+
AEventLogger,
|
|
25
|
+
AConsoleWriter,
|
|
26
|
+
)
|
|
27
|
+
from .event_logger import ConsoleEventLogger
|
|
28
|
+
from .writer import ConsoleWriter
|
|
29
|
+
from .errors import (
|
|
30
|
+
ConsoleError,
|
|
31
|
+
EventLoggerError,
|
|
32
|
+
ConsoleWriterError,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
# Type definitions
|
|
37
|
+
'LogLevel',
|
|
38
|
+
'ConsoleEventType',
|
|
39
|
+
'ConsoleEvent',
|
|
40
|
+
# Interfaces
|
|
41
|
+
'IEventLogger',
|
|
42
|
+
'IConsoleWriter',
|
|
43
|
+
# Abstract base classes
|
|
44
|
+
'AEventLogger',
|
|
45
|
+
'AConsoleWriter',
|
|
46
|
+
# Implementations
|
|
47
|
+
'ConsoleEventLogger',
|
|
48
|
+
'ConsoleWriter',
|
|
49
|
+
# Errors
|
|
50
|
+
'ConsoleError',
|
|
51
|
+
'EventLoggerError',
|
|
52
|
+
'ConsoleWriterError',
|
|
53
|
+
]
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/console/base.py
|
|
3
|
+
#exonware/xwsystem/console/base.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 base classes - abstract base classes for console functionality.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from abc import ABC, abstractmethod
|
|
15
|
+
from typing import Optional, Any
|
|
16
|
+
from .contracts import IEventLogger, IConsoleWriter
|
|
17
|
+
from .defs import LogLevel, ConsoleEventType, ConsoleEvent
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class AEventLogger(ABC, IEventLogger):
|
|
21
|
+
"""
|
|
22
|
+
Abstract base class for event logging.
|
|
23
|
+
|
|
24
|
+
All event loggers should extend this class.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
@abstractmethod
|
|
28
|
+
def log(
|
|
29
|
+
self,
|
|
30
|
+
msg: str,
|
|
31
|
+
source: Optional[str] = None,
|
|
32
|
+
data: Optional[Any] = None,
|
|
33
|
+
color: Optional[str] = None,
|
|
34
|
+
label: Optional[str] = None
|
|
35
|
+
) -> ConsoleEvent:
|
|
36
|
+
"""Log a general message."""
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
@abstractmethod
|
|
40
|
+
def info(
|
|
41
|
+
self,
|
|
42
|
+
msg: str,
|
|
43
|
+
source: Optional[str] = None,
|
|
44
|
+
data: Optional[Any] = None
|
|
45
|
+
) -> ConsoleEvent:
|
|
46
|
+
"""Log an info message."""
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
@abstractmethod
|
|
50
|
+
def warn(
|
|
51
|
+
self,
|
|
52
|
+
msg: str,
|
|
53
|
+
source: Optional[str] = None,
|
|
54
|
+
data: Optional[Any] = None
|
|
55
|
+
) -> ConsoleEvent:
|
|
56
|
+
"""Log a warning message."""
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def error(
|
|
61
|
+
self,
|
|
62
|
+
msg: str,
|
|
63
|
+
source: Optional[str] = None,
|
|
64
|
+
data: Optional[Any] = None,
|
|
65
|
+
stack: Optional[str] = None
|
|
66
|
+
) -> ConsoleEvent:
|
|
67
|
+
"""Log an error message."""
|
|
68
|
+
pass
|
|
69
|
+
|
|
70
|
+
@abstractmethod
|
|
71
|
+
def debug(
|
|
72
|
+
self,
|
|
73
|
+
msg: str,
|
|
74
|
+
source: Optional[str] = None,
|
|
75
|
+
data: Optional[Any] = None
|
|
76
|
+
) -> ConsoleEvent:
|
|
77
|
+
"""Log a debug message."""
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
@abstractmethod
|
|
81
|
+
def get_events(
|
|
82
|
+
self,
|
|
83
|
+
event_type: Optional[ConsoleEventType] = None,
|
|
84
|
+
level: Optional[LogLevel] = None,
|
|
85
|
+
source: Optional[str] = None,
|
|
86
|
+
limit: Optional[int] = None
|
|
87
|
+
) -> list[dict]:
|
|
88
|
+
"""Get logged events as dictionaries."""
|
|
89
|
+
pass
|
|
90
|
+
|
|
91
|
+
@abstractmethod
|
|
92
|
+
def clear(self) -> None:
|
|
93
|
+
"""Clear all logged events."""
|
|
94
|
+
pass
|
|
95
|
+
|
|
96
|
+
@abstractmethod
|
|
97
|
+
def count(self) -> int:
|
|
98
|
+
"""Get the number of logged events."""
|
|
99
|
+
pass
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class AConsoleWriter(ABC, IConsoleWriter):
|
|
103
|
+
"""
|
|
104
|
+
Abstract base class for console writing (user interaction, not logging).
|
|
105
|
+
|
|
106
|
+
Can be used as a base class for bots and other user interaction systems.
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
@abstractmethod
|
|
110
|
+
def write(self, text: str, **kwargs) -> None:
|
|
111
|
+
"""Write text to console."""
|
|
112
|
+
pass
|
|
113
|
+
|
|
114
|
+
@abstractmethod
|
|
115
|
+
def write_line(self, text: str = "", **kwargs) -> None:
|
|
116
|
+
"""Write a line to console."""
|
|
117
|
+
pass
|
|
118
|
+
|
|
119
|
+
@abstractmethod
|
|
120
|
+
def read(self, prompt: str = "") -> str:
|
|
121
|
+
"""Read input from console."""
|
|
122
|
+
pass
|
|
123
|
+
|
|
124
|
+
@abstractmethod
|
|
125
|
+
def clear(self) -> None:
|
|
126
|
+
"""Clear console screen."""
|
|
127
|
+
pass
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
__all__ = [
|
|
131
|
+
'AEventLogger',
|
|
132
|
+
'AConsoleWriter',
|
|
133
|
+
]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/console/cli/__init__.py
|
|
2
|
+
"""
|
|
3
|
+
Command Line Interface (CLI) Utilities
|
|
4
|
+
======================================
|
|
5
|
+
|
|
6
|
+
Production-grade CLI utilities for XSystem.
|
|
7
|
+
|
|
8
|
+
Company: eXonware.com
|
|
9
|
+
Author: Eng. Muhammad AlShehri
|
|
10
|
+
Email: connect@exonware.com
|
|
11
|
+
Version: 0.1.0.3
|
|
12
|
+
Generated: 2025-01-27
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
# Import general console enums from console level (priority)
|
|
16
|
+
from ..defs import Colors, Style, Alignment, BorderStyle
|
|
17
|
+
from .colors import colorize, CliColoredOutput
|
|
18
|
+
from .args import CliArgumentParser, CliArgument, CliCommand, ArgumentType
|
|
19
|
+
from .progress import CliProgressBar, CliSpinnerProgress, CliMultiProgress, CliProgressConfig
|
|
20
|
+
from .tables import CliTable, CliTableFormatter, CliColumn
|
|
21
|
+
from .console import CliConsole
|
|
22
|
+
from .event_logger import CliEventLogger
|
|
23
|
+
from .encoding import ensure_utf8_console
|
|
24
|
+
|
|
25
|
+
__all__ = [
|
|
26
|
+
# General console enums (from console level)
|
|
27
|
+
'Colors',
|
|
28
|
+
'Style',
|
|
29
|
+
'Alignment',
|
|
30
|
+
'BorderStyle',
|
|
31
|
+
|
|
32
|
+
# Colors
|
|
33
|
+
'colorize',
|
|
34
|
+
'CliColoredOutput',
|
|
35
|
+
|
|
36
|
+
# Arguments
|
|
37
|
+
'CliArgumentParser',
|
|
38
|
+
'CliArgument',
|
|
39
|
+
'CliCommand',
|
|
40
|
+
'ArgumentType',
|
|
41
|
+
|
|
42
|
+
# Progress
|
|
43
|
+
'CliProgressBar',
|
|
44
|
+
'CliSpinnerProgress',
|
|
45
|
+
'CliMultiProgress',
|
|
46
|
+
'CliProgressConfig',
|
|
47
|
+
|
|
48
|
+
# Tables
|
|
49
|
+
'CliTable',
|
|
50
|
+
'CliTableFormatter',
|
|
51
|
+
'CliColumn',
|
|
52
|
+
|
|
53
|
+
# Console (extends ConsoleWriter from console level)
|
|
54
|
+
'CliConsole',
|
|
55
|
+
|
|
56
|
+
# Event Logger (extends logging.Logger)
|
|
57
|
+
'CliEventLogger',
|
|
58
|
+
|
|
59
|
+
# Encoding
|
|
60
|
+
'ensure_utf8_console',
|
|
61
|
+
]
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/console/cli/args.py
|
|
1
2
|
"""
|
|
2
3
|
Argument Parsing Utilities
|
|
3
4
|
=========================
|
|
@@ -7,13 +8,15 @@ Production-grade CLI argument parsing for XWSystem.
|
|
|
7
8
|
Company: eXonware.com
|
|
8
9
|
Author: Eng. Muhammad AlShehri
|
|
9
10
|
Email: connect@exonware.com
|
|
10
|
-
Version: 0.0.
|
|
11
|
+
Version: 0.1.0.3
|
|
11
12
|
Generated: 2025-01-27
|
|
12
13
|
"""
|
|
13
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import argparse
|
|
15
18
|
import sys
|
|
16
|
-
from typing import Any, Optional, Callable
|
|
19
|
+
from typing import Any, Optional, Callable
|
|
17
20
|
from dataclasses import dataclass
|
|
18
21
|
import logging
|
|
19
22
|
from .defs import ArgumentType
|
|
@@ -22,7 +25,7 @@ logger = logging.getLogger(__name__)
|
|
|
22
25
|
|
|
23
26
|
|
|
24
27
|
@dataclass
|
|
25
|
-
class
|
|
28
|
+
class CliArgument:
|
|
26
29
|
"""
|
|
27
30
|
Definition of a command-line argument.
|
|
28
31
|
|
|
@@ -43,7 +46,7 @@ class Argument:
|
|
|
43
46
|
choices: Optional[list[str]] = None
|
|
44
47
|
validator: Optional[Callable[[Any], bool]] = None
|
|
45
48
|
action: str = "store" # store, store_true, store_false, append, count
|
|
46
|
-
nargs: Optional[
|
|
49
|
+
nargs: Optional[int | str] = None # Number of arguments
|
|
47
50
|
|
|
48
51
|
def __post_init__(self):
|
|
49
52
|
"""Validate argument configuration."""
|
|
@@ -58,7 +61,7 @@ class Argument:
|
|
|
58
61
|
|
|
59
62
|
|
|
60
63
|
@dataclass
|
|
61
|
-
class
|
|
64
|
+
class CliCommand:
|
|
62
65
|
"""
|
|
63
66
|
Definition of a CLI command.
|
|
64
67
|
|
|
@@ -72,8 +75,8 @@ class Command:
|
|
|
72
75
|
name: str
|
|
73
76
|
handler: Callable
|
|
74
77
|
description: str = ""
|
|
75
|
-
arguments: list[
|
|
76
|
-
subcommands: list[
|
|
78
|
+
arguments: list[CliArgument] = None
|
|
79
|
+
subcommands: list[CliCommand] = None
|
|
77
80
|
examples: list[str] = None
|
|
78
81
|
|
|
79
82
|
def __post_init__(self):
|
|
@@ -86,7 +89,7 @@ class Command:
|
|
|
86
89
|
self.examples = []
|
|
87
90
|
|
|
88
91
|
|
|
89
|
-
class
|
|
92
|
+
class CliArgumentParser:
|
|
90
93
|
"""
|
|
91
94
|
Production-grade argument parser built on argparse.
|
|
92
95
|
|
|
@@ -134,11 +137,11 @@ class ArgumentParser:
|
|
|
134
137
|
)
|
|
135
138
|
|
|
136
139
|
# Command registry
|
|
137
|
-
self._commands: dict[str,
|
|
140
|
+
self._commands: dict[str, CliCommand] = {}
|
|
138
141
|
self._subparsers = None
|
|
139
|
-
self._global_arguments: list[
|
|
142
|
+
self._global_arguments: list[CliArgument] = []
|
|
140
143
|
|
|
141
|
-
def add_argument(self, argument:
|
|
144
|
+
def add_argument(self, argument: CliArgument) -> CliArgumentParser:
|
|
142
145
|
"""
|
|
143
146
|
Add a global argument to the parser.
|
|
144
147
|
|
|
@@ -152,7 +155,7 @@ class ArgumentParser:
|
|
|
152
155
|
self._add_argument_to_parser(self._parser, argument)
|
|
153
156
|
return self
|
|
154
157
|
|
|
155
|
-
def add_command(self, command:
|
|
158
|
+
def add_command(self, command: CliCommand) -> CliArgumentParser:
|
|
156
159
|
"""
|
|
157
160
|
Add a command to the parser.
|
|
158
161
|
|
|
@@ -201,7 +204,7 @@ class ArgumentParser:
|
|
|
201
204
|
|
|
202
205
|
return self
|
|
203
206
|
|
|
204
|
-
def _add_subcommand(self, subparsers, command:
|
|
207
|
+
def _add_subcommand(self, subparsers, command: CliCommand, parent_name: str):
|
|
205
208
|
"""Add a subcommand to a subparser."""
|
|
206
209
|
subcmd_parser = subparsers.add_parser(
|
|
207
210
|
command.name,
|
|
@@ -216,7 +219,7 @@ class ArgumentParser:
|
|
|
216
219
|
full_name = f"{parent_name}.{command.name}"
|
|
217
220
|
self._commands[full_name] = command
|
|
218
221
|
|
|
219
|
-
def _add_argument_to_parser(self, parser: argparse.ArgumentParser, argument:
|
|
222
|
+
def _add_argument_to_parser(self, parser: argparse.ArgumentParser, argument: CliArgument):
|
|
220
223
|
"""Add an argument to an argparse parser."""
|
|
221
224
|
kwargs = {
|
|
222
225
|
'help': argument.help_text,
|
|
@@ -340,9 +343,9 @@ class ArgumentParser:
|
|
|
340
343
|
|
|
341
344
|
|
|
342
345
|
# Utility functions for common argument types
|
|
343
|
-
def create_file_argument(name: str, required: bool = False, help_text: str = "") ->
|
|
346
|
+
def create_file_argument(name: str, required: bool = False, help_text: str = "") -> CliArgument:
|
|
344
347
|
"""Create a file input argument."""
|
|
345
|
-
return
|
|
348
|
+
return CliArgument(
|
|
346
349
|
name=name,
|
|
347
350
|
arg_type=ArgumentType.FILE,
|
|
348
351
|
required=required,
|
|
@@ -350,18 +353,18 @@ def create_file_argument(name: str, required: bool = False, help_text: str = "")
|
|
|
350
353
|
)
|
|
351
354
|
|
|
352
355
|
|
|
353
|
-
def create_output_argument(name: str = "output", help_text: str = "") ->
|
|
356
|
+
def create_output_argument(name: str = "output", help_text: str = "") -> CliArgument:
|
|
354
357
|
"""Create an output file argument."""
|
|
355
|
-
return
|
|
358
|
+
return CliArgument(
|
|
356
359
|
name=name,
|
|
357
360
|
arg_type=ArgumentType.STRING,
|
|
358
361
|
help_text=help_text or "Output file path"
|
|
359
362
|
)
|
|
360
363
|
|
|
361
364
|
|
|
362
|
-
def create_verbose_argument() ->
|
|
365
|
+
def create_verbose_argument() -> CliArgument:
|
|
363
366
|
"""Create a verbose flag argument."""
|
|
364
|
-
return
|
|
367
|
+
return CliArgument(
|
|
365
368
|
name="verbose",
|
|
366
369
|
short_name="-v",
|
|
367
370
|
action="store_true",
|
|
@@ -369,9 +372,9 @@ def create_verbose_argument() -> Argument:
|
|
|
369
372
|
)
|
|
370
373
|
|
|
371
374
|
|
|
372
|
-
def create_quiet_argument() ->
|
|
375
|
+
def create_quiet_argument() -> CliArgument:
|
|
373
376
|
"""Create a quiet flag argument."""
|
|
374
|
-
return
|
|
377
|
+
return CliArgument(
|
|
375
378
|
name="quiet",
|
|
376
379
|
short_name="-q",
|
|
377
380
|
action="store_true",
|
|
@@ -379,9 +382,9 @@ def create_quiet_argument() -> Argument:
|
|
|
379
382
|
)
|
|
380
383
|
|
|
381
384
|
|
|
382
|
-
def create_config_argument() ->
|
|
385
|
+
def create_config_argument() -> CliArgument:
|
|
383
386
|
"""Create a configuration file argument."""
|
|
384
|
-
return
|
|
387
|
+
return CliArgument(
|
|
385
388
|
name="config",
|
|
386
389
|
short_name="-c",
|
|
387
390
|
arg_type=ArgumentType.FILE,
|
|
@@ -1,50 +1,41 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/console/cli/base.py
|
|
1
2
|
#exonware/xwsystem/cli/base.py
|
|
2
3
|
"""
|
|
3
4
|
Company: eXonware.com
|
|
4
5
|
Author: Eng. Muhammad AlShehri
|
|
5
6
|
Email: connect@exonware.com
|
|
6
|
-
Version: 0.0.
|
|
7
|
+
Version: 0.1.0.3
|
|
7
8
|
Generation Date: September 04, 2025
|
|
8
9
|
|
|
9
10
|
CLI module base classes - abstract classes for command-line interface functionality.
|
|
10
11
|
"""
|
|
11
12
|
|
|
12
13
|
from abc import ABC, abstractmethod
|
|
13
|
-
from typing import Any, Optional
|
|
14
|
+
from typing import Any, Optional
|
|
14
15
|
from .contracts import ColorType, ProgressStyle, TableStyle, PromptType, ICLI
|
|
15
|
-
from ..
|
|
16
|
+
from ..base import AConsoleWriter
|
|
17
|
+
from exonware.xwsystem.version import __version__
|
|
16
18
|
|
|
17
19
|
|
|
18
|
-
class AConsoleBase(
|
|
19
|
-
"""
|
|
20
|
+
class AConsoleBase(AConsoleWriter):
|
|
21
|
+
"""
|
|
22
|
+
Abstract base class for console operations (CLI-specific).
|
|
20
23
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"""Print text to console."""
|
|
24
|
-
pass
|
|
24
|
+
Extends AConsoleWriter from console level to add CLI-specific methods.
|
|
25
|
+
"""
|
|
25
26
|
|
|
26
27
|
@abstractmethod
|
|
27
|
-
def
|
|
28
|
-
"""
|
|
29
|
-
pass
|
|
30
|
-
|
|
31
|
-
@abstractmethod
|
|
32
|
-
def clear(self) -> None:
|
|
33
|
-
"""Clear console screen."""
|
|
28
|
+
def print(self, text: str, color: Optional[ColorType] = None, **kwargs) -> None:
|
|
29
|
+
"""Print text to console with optional color."""
|
|
34
30
|
pass
|
|
35
31
|
|
|
36
32
|
@abstractmethod
|
|
37
33
|
def get_size(self) -> tuple[int, int]:
|
|
38
34
|
"""Get console size."""
|
|
39
35
|
pass
|
|
40
|
-
|
|
41
|
-
@abstractmethod
|
|
42
|
-
def is_interactive(self) -> bool:
|
|
43
|
-
"""Check if console is interactive."""
|
|
44
|
-
pass
|
|
45
36
|
|
|
46
37
|
|
|
47
|
-
class
|
|
38
|
+
class CliAProgressBarBase(ABC):
|
|
48
39
|
"""Abstract base class for progress bar operations."""
|
|
49
40
|
|
|
50
41
|
def __init__(self, total: int, description: str = "", style: ProgressStyle = ProgressStyle.BAR):
|
|
@@ -82,7 +73,7 @@ class AProgressBarBase(ABC):
|
|
|
82
73
|
pass
|
|
83
74
|
|
|
84
75
|
|
|
85
|
-
class
|
|
76
|
+
class CliATableBase(ABC):
|
|
86
77
|
"""Abstract base class for table operations."""
|
|
87
78
|
|
|
88
79
|
def __init__(self, headers: list[str], style: TableStyle = TableStyle.SIMPLE):
|
|
@@ -118,7 +109,7 @@ class ATableBase(ABC):
|
|
|
118
109
|
pass
|
|
119
110
|
|
|
120
111
|
|
|
121
|
-
class
|
|
112
|
+
class CliAPromptBase(ABC):
|
|
122
113
|
"""Abstract base class for user prompts."""
|
|
123
114
|
|
|
124
115
|
@abstractmethod
|
|
@@ -142,7 +133,7 @@ class APromptBase(ABC):
|
|
|
142
133
|
pass
|
|
143
134
|
|
|
144
135
|
|
|
145
|
-
class
|
|
136
|
+
class CliAArgumentParserBase(ABC):
|
|
146
137
|
"""Abstract base class for argument parsing."""
|
|
147
138
|
|
|
148
139
|
def __init__(self, description: str = ""):
|
|
@@ -176,7 +167,7 @@ class AArgumentParserBase(ABC):
|
|
|
176
167
|
pass
|
|
177
168
|
|
|
178
169
|
|
|
179
|
-
class
|
|
170
|
+
class CliAColorBase(ABC):
|
|
180
171
|
"""Abstract base class for color operations."""
|
|
181
172
|
|
|
182
173
|
@abstractmethod
|
|
@@ -195,69 +186,9 @@ class AColorBase(ABC):
|
|
|
195
186
|
pass
|
|
196
187
|
|
|
197
188
|
|
|
198
|
-
class
|
|
189
|
+
class CliBase(ICLI):
|
|
199
190
|
"""Base CLI implementation."""
|
|
200
191
|
|
|
201
|
-
def __init__(self, name: str = "xwsystem", version: str = None):
|
|
202
|
-
"""Initialize the CLI.
|
|
203
|
-
|
|
204
|
-
Args:
|
|
205
|
-
name: CLI name
|
|
206
|
-
version: CLI version (defaults to package version)
|
|
207
|
-
"""
|
|
208
|
-
self._name = name
|
|
209
|
-
self._version = version or __version__
|
|
210
|
-
self._commands: dict[str, Any] = {}
|
|
211
|
-
self._options: dict[str, Any] = {}
|
|
212
|
-
|
|
213
|
-
@property
|
|
214
|
-
def name(self) -> str:
|
|
215
|
-
"""Get CLI name."""
|
|
216
|
-
return self._name
|
|
217
|
-
|
|
218
|
-
@property
|
|
219
|
-
def version(self) -> str:
|
|
220
|
-
"""Get CLI version."""
|
|
221
|
-
return self._version
|
|
222
|
-
|
|
223
|
-
def add_command(self, name: str, command: Any) -> None:
|
|
224
|
-
"""Add a command to the CLI.
|
|
225
|
-
|
|
226
|
-
Args:
|
|
227
|
-
name: Command name
|
|
228
|
-
command: Command implementation
|
|
229
|
-
"""
|
|
230
|
-
self._commands[name] = command
|
|
231
|
-
|
|
232
|
-
def add_option(self, name: str, option: Any) -> None:
|
|
233
|
-
"""Add an option to the CLI.
|
|
234
|
-
|
|
235
|
-
Args:
|
|
236
|
-
name: Option name
|
|
237
|
-
option: Option implementation
|
|
238
|
-
"""
|
|
239
|
-
self._options[name] = option
|
|
240
|
-
|
|
241
|
-
def run(self, args: Optional[list[str]] = None) -> int:
|
|
242
|
-
"""Run the CLI.
|
|
243
|
-
|
|
244
|
-
Args:
|
|
245
|
-
args: Command line arguments
|
|
246
|
-
|
|
247
|
-
Returns:
|
|
248
|
-
Exit code
|
|
249
|
-
"""
|
|
250
|
-
# Basic implementation - can be overridden
|
|
251
|
-
return 0
|
|
252
|
-
|
|
253
|
-
def get_help(self) -> str:
|
|
254
|
-
"""Get help text."""
|
|
255
|
-
return f"{self._name} v{self._version} - XWSystem CLI"
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
class BaseCLI(ICLI):
|
|
259
|
-
"""Base CLI implementation for backward compatibility."""
|
|
260
|
-
|
|
261
192
|
def __init__(self, name: str = "xwsystem", version: str = None):
|
|
262
193
|
"""Initialize base CLI."""
|
|
263
194
|
self._name = name
|