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