exonware-xwsystem 0.1.0.1__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 +1 -46
- 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 +19 -20
- 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 +5 -7
- 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 +27 -18
- exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
- exonware/xwsystem/io/serialization/formats/text/jsonlines.py +18 -14
- 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 +3 -2
- exonware/xwsystem/io/serialization/parsers/base.py +6 -5
- exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +7 -6
- exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +10 -7
- exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +7 -6
- exonware/xwsystem/io/serialization/parsers/orjson_parser.py +11 -8
- exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +13 -9
- exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +10 -7
- exonware/xwsystem/io/serialization/parsers/registry.py +11 -10
- exonware/xwsystem/io/serialization/parsers/standard.py +7 -6
- exonware/xwsystem/io/serialization/parsers/ujson_parser.py +10 -7
- 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 +185 -0
- 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 +2 -2
- {exonware_xwsystem-0.1.0.1.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/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.1.0.1.dist-info/RECORD +0 -284
- {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/WHEEL +0 -0
- {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -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.1.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.1.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
|
|
@@ -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.1.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)
|