exonware-xwsystem 0.0.1.411__py3-none-any.whl → 0.1.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- exonware/__init__.py +2 -1
- exonware/conf.py +2 -2
- exonware/xwsystem/__init__.py +115 -43
- exonware/xwsystem/base.py +30 -0
- exonware/xwsystem/caching/__init__.py +39 -13
- exonware/xwsystem/caching/base.py +24 -6
- exonware/xwsystem/caching/bloom_cache.py +2 -2
- exonware/xwsystem/caching/cache_manager.py +2 -1
- exonware/xwsystem/caching/conditional.py +2 -2
- exonware/xwsystem/caching/contracts.py +85 -139
- exonware/xwsystem/caching/decorators.py +6 -19
- exonware/xwsystem/caching/defs.py +2 -1
- exonware/xwsystem/caching/disk_cache.py +2 -1
- exonware/xwsystem/caching/distributed.py +2 -1
- exonware/xwsystem/caching/errors.py +2 -1
- exonware/xwsystem/caching/events.py +110 -27
- exonware/xwsystem/caching/eviction_strategies.py +2 -2
- exonware/xwsystem/caching/external_caching_python.py +701 -0
- exonware/xwsystem/caching/facade.py +253 -0
- exonware/xwsystem/caching/factory.py +300 -0
- exonware/xwsystem/caching/fluent.py +14 -12
- exonware/xwsystem/caching/integrity.py +21 -6
- exonware/xwsystem/caching/lfu_cache.py +2 -1
- exonware/xwsystem/caching/lfu_optimized.py +18 -6
- exonware/xwsystem/caching/lru_cache.py +7 -4
- exonware/xwsystem/caching/memory_bounded.py +2 -2
- exonware/xwsystem/caching/metrics_exporter.py +2 -2
- exonware/xwsystem/caching/observable_cache.py +2 -2
- exonware/xwsystem/caching/pluggable_cache.py +2 -2
- exonware/xwsystem/caching/rate_limiter.py +2 -2
- exonware/xwsystem/caching/read_through.py +2 -2
- exonware/xwsystem/caching/secure_cache.py +81 -28
- exonware/xwsystem/caching/serializable.py +9 -7
- exonware/xwsystem/caching/stats.py +2 -2
- exonware/xwsystem/caching/tagging.py +2 -2
- exonware/xwsystem/caching/ttl_cache.py +4 -3
- exonware/xwsystem/caching/two_tier_cache.py +6 -3
- exonware/xwsystem/caching/utils.py +30 -12
- exonware/xwsystem/caching/validation.py +2 -2
- exonware/xwsystem/caching/warming.py +6 -3
- exonware/xwsystem/caching/write_behind.py +15 -6
- exonware/xwsystem/config/__init__.py +11 -17
- exonware/xwsystem/config/base.py +5 -5
- exonware/xwsystem/config/contracts.py +93 -153
- exonware/xwsystem/config/defaults.py +3 -2
- exonware/xwsystem/config/defs.py +3 -2
- exonware/xwsystem/config/errors.py +2 -5
- exonware/xwsystem/config/logging.py +12 -8
- exonware/xwsystem/config/logging_setup.py +3 -2
- exonware/xwsystem/config/performance.py +73 -391
- exonware/xwsystem/config/performance_modes.py +9 -8
- exonware/xwsystem/config/version_manager.py +1 -0
- exonware/xwsystem/config.py +27 -0
- exonware/xwsystem/console/__init__.py +53 -0
- exonware/xwsystem/console/base.py +133 -0
- exonware/xwsystem/console/cli/__init__.py +61 -0
- exonware/xwsystem/{cli → console/cli}/args.py +27 -24
- exonware/xwsystem/{cli → console/cli}/base.py +18 -87
- exonware/xwsystem/{cli → console/cli}/colors.py +15 -13
- exonware/xwsystem/console/cli/console.py +98 -0
- exonware/xwsystem/{cli → console/cli}/contracts.py +51 -69
- exonware/xwsystem/console/cli/defs.py +87 -0
- exonware/xwsystem/console/cli/encoding.py +69 -0
- exonware/xwsystem/{cli → console/cli}/errors.py +8 -3
- exonware/xwsystem/console/cli/event_logger.py +166 -0
- exonware/xwsystem/{cli → console/cli}/progress.py +25 -21
- exonware/xwsystem/{cli → console/cli}/prompts.py +3 -2
- exonware/xwsystem/{cli → console/cli}/tables.py +27 -24
- exonware/xwsystem/console/contracts.py +113 -0
- exonware/xwsystem/console/defs.py +154 -0
- exonware/xwsystem/console/errors.py +34 -0
- exonware/xwsystem/console/event_logger.py +385 -0
- exonware/xwsystem/console/writer.py +132 -0
- exonware/xwsystem/contracts.py +28 -0
- exonware/xwsystem/data_structures/__init__.py +23 -0
- exonware/xwsystem/data_structures/trie.py +34 -0
- exonware/xwsystem/data_structures/union_find.py +144 -0
- exonware/xwsystem/defs.py +17 -0
- exonware/xwsystem/errors.py +23 -0
- exonware/xwsystem/facade.py +62 -0
- exonware/xwsystem/http_client/__init__.py +22 -1
- exonware/xwsystem/http_client/advanced_client.py +8 -5
- exonware/xwsystem/http_client/base.py +3 -2
- exonware/xwsystem/http_client/client.py +7 -4
- exonware/xwsystem/http_client/contracts.py +42 -56
- exonware/xwsystem/http_client/defs.py +2 -1
- exonware/xwsystem/http_client/errors.py +2 -1
- exonware/xwsystem/http_client/facade.py +156 -0
- exonware/xwsystem/io/__init__.py +22 -3
- exonware/xwsystem/io/archive/__init__.py +8 -2
- exonware/xwsystem/io/archive/archive.py +1 -1
- exonware/xwsystem/io/archive/archive_files.py +4 -7
- exonware/xwsystem/io/archive/archivers.py +120 -10
- exonware/xwsystem/io/archive/base.py +4 -5
- exonware/xwsystem/io/archive/codec_integration.py +1 -2
- exonware/xwsystem/io/archive/compression.py +1 -2
- exonware/xwsystem/io/archive/facade.py +263 -0
- exonware/xwsystem/io/archive/formats/__init__.py +2 -3
- exonware/xwsystem/io/archive/formats/brotli_format.py +20 -7
- exonware/xwsystem/io/archive/formats/lz4_format.py +20 -7
- exonware/xwsystem/io/archive/formats/rar.py +11 -5
- exonware/xwsystem/io/archive/formats/sevenzip.py +12 -6
- exonware/xwsystem/io/archive/formats/squashfs_format.py +1 -2
- exonware/xwsystem/io/archive/formats/tar.py +52 -7
- exonware/xwsystem/io/archive/formats/wim_format.py +11 -5
- exonware/xwsystem/io/archive/formats/zip.py +1 -2
- exonware/xwsystem/io/archive/formats/zpaq_format.py +1 -2
- exonware/xwsystem/io/archive/formats/zstandard.py +20 -7
- exonware/xwsystem/io/base.py +119 -115
- exonware/xwsystem/io/codec/__init__.py +4 -2
- exonware/xwsystem/io/codec/base.py +19 -13
- exonware/xwsystem/io/codec/contracts.py +59 -2
- exonware/xwsystem/io/codec/registry.py +67 -21
- exonware/xwsystem/io/common/__init__.py +1 -1
- exonware/xwsystem/io/common/atomic.py +29 -16
- exonware/xwsystem/io/common/base.py +11 -10
- exonware/xwsystem/io/common/lock.py +6 -5
- exonware/xwsystem/io/common/path_manager.py +2 -1
- exonware/xwsystem/io/common/watcher.py +1 -2
- exonware/xwsystem/io/contracts.py +301 -433
- exonware/xwsystem/io/contracts_1.py +1180 -0
- exonware/xwsystem/io/data_operations.py +279 -14
- exonware/xwsystem/io/defs.py +4 -3
- exonware/xwsystem/io/errors.py +3 -2
- exonware/xwsystem/io/facade.py +87 -61
- exonware/xwsystem/io/file/__init__.py +1 -1
- exonware/xwsystem/io/file/base.py +8 -9
- exonware/xwsystem/io/file/conversion.py +2 -3
- exonware/xwsystem/io/file/file.py +61 -18
- exonware/xwsystem/io/file/paged_source.py +8 -8
- exonware/xwsystem/io/file/paging/__init__.py +1 -2
- exonware/xwsystem/io/file/paging/byte_paging.py +4 -5
- exonware/xwsystem/io/file/paging/line_paging.py +2 -3
- exonware/xwsystem/io/file/paging/record_paging.py +2 -3
- exonware/xwsystem/io/file/paging/registry.py +1 -2
- exonware/xwsystem/io/file/source.py +13 -17
- exonware/xwsystem/io/filesystem/__init__.py +1 -1
- exonware/xwsystem/io/filesystem/base.py +1 -2
- exonware/xwsystem/io/filesystem/local.py +3 -4
- exonware/xwsystem/io/folder/__init__.py +1 -1
- exonware/xwsystem/io/folder/base.py +1 -2
- exonware/xwsystem/io/folder/folder.py +16 -7
- exonware/xwsystem/io/indexing/__init__.py +14 -0
- exonware/xwsystem/io/indexing/facade.py +443 -0
- exonware/xwsystem/io/path_parser.py +98 -0
- exonware/xwsystem/io/serialization/__init__.py +21 -3
- exonware/xwsystem/io/serialization/auto_serializer.py +146 -20
- exonware/xwsystem/io/serialization/base.py +84 -34
- exonware/xwsystem/io/serialization/contracts.py +50 -73
- exonware/xwsystem/io/serialization/defs.py +2 -1
- exonware/xwsystem/io/serialization/errors.py +2 -1
- exonware/xwsystem/io/serialization/flyweight.py +154 -7
- exonware/xwsystem/io/serialization/format_detector.py +15 -14
- exonware/xwsystem/io/serialization/formats/__init__.py +8 -5
- exonware/xwsystem/io/serialization/formats/binary/bson.py +15 -6
- exonware/xwsystem/io/serialization/formats/binary/cbor.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/marshal.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/msgpack.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/pickle.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/plistlib.py +5 -5
- exonware/xwsystem/io/serialization/formats/database/dbm.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/shelve.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/sqlite3.py +7 -7
- exonware/xwsystem/io/serialization/formats/tabular/__init__.py +27 -0
- exonware/xwsystem/io/serialization/formats/tabular/base.py +89 -0
- exonware/xwsystem/io/serialization/formats/tabular/csv.py +319 -0
- exonware/xwsystem/io/serialization/formats/tabular/df.py +249 -0
- exonware/xwsystem/io/serialization/formats/tabular/excel.py +291 -0
- exonware/xwsystem/io/serialization/formats/tabular/googlesheets.py +374 -0
- exonware/xwsystem/io/serialization/formats/text/__init__.py +1 -1
- exonware/xwsystem/io/serialization/formats/text/append_only_log.py +199 -0
- exonware/xwsystem/io/serialization/formats/text/configparser.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/csv.py +7 -5
- exonware/xwsystem/io/serialization/formats/text/formdata.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/json.py +65 -33
- exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
- exonware/xwsystem/io/serialization/formats/text/jsonlines.py +113 -25
- exonware/xwsystem/io/serialization/formats/text/multipart.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/toml.py +8 -6
- exonware/xwsystem/io/serialization/formats/text/xml.py +25 -20
- exonware/xwsystem/io/serialization/formats/text/yaml.py +8 -6
- exonware/xwsystem/io/serialization/parsers/__init__.py +16 -0
- exonware/xwsystem/io/serialization/parsers/base.py +60 -0
- exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +62 -0
- exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +48 -0
- exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +54 -0
- exonware/xwsystem/io/serialization/parsers/orjson_parser.py +62 -0
- exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +55 -0
- exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +53 -0
- exonware/xwsystem/io/serialization/parsers/registry.py +91 -0
- exonware/xwsystem/io/serialization/parsers/standard.py +44 -0
- exonware/xwsystem/io/serialization/parsers/ujson_parser.py +53 -0
- exonware/xwsystem/io/serialization/registry.py +4 -4
- exonware/xwsystem/io/serialization/serializer.py +168 -79
- exonware/xwsystem/io/serialization/universal_options.py +367 -0
- exonware/xwsystem/io/serialization/utils/__init__.py +1 -2
- exonware/xwsystem/io/serialization/utils/path_ops.py +5 -6
- exonware/xwsystem/io/source_reader.py +223 -0
- exonware/xwsystem/io/stream/__init__.py +1 -1
- exonware/xwsystem/io/stream/async_operations.py +61 -14
- exonware/xwsystem/io/stream/base.py +1 -2
- exonware/xwsystem/io/stream/codec_io.py +6 -7
- exonware/xwsystem/ipc/__init__.py +1 -0
- exonware/xwsystem/ipc/async_fabric.py +4 -4
- exonware/xwsystem/ipc/base.py +6 -5
- exonware/xwsystem/ipc/contracts.py +41 -66
- exonware/xwsystem/ipc/defs.py +2 -1
- exonware/xwsystem/ipc/errors.py +2 -1
- exonware/xwsystem/ipc/message_queue.py +5 -2
- exonware/xwsystem/ipc/pipes.py +70 -34
- exonware/xwsystem/ipc/process_manager.py +7 -5
- exonware/xwsystem/ipc/process_pool.py +6 -5
- exonware/xwsystem/ipc/shared_memory.py +64 -11
- exonware/xwsystem/monitoring/__init__.py +7 -0
- exonware/xwsystem/monitoring/base.py +11 -8
- exonware/xwsystem/monitoring/contracts.py +86 -144
- exonware/xwsystem/monitoring/defs.py +2 -1
- exonware/xwsystem/monitoring/error_recovery.py +16 -3
- exonware/xwsystem/monitoring/errors.py +2 -1
- exonware/xwsystem/monitoring/facade.py +183 -0
- exonware/xwsystem/monitoring/memory_monitor.py +1 -0
- exonware/xwsystem/monitoring/metrics.py +1 -0
- exonware/xwsystem/monitoring/performance_manager_generic.py +7 -7
- exonware/xwsystem/monitoring/performance_monitor.py +1 -0
- exonware/xwsystem/monitoring/performance_validator.py +1 -0
- exonware/xwsystem/monitoring/system_monitor.py +6 -5
- exonware/xwsystem/monitoring/tracing.py +18 -16
- exonware/xwsystem/monitoring/tracker.py +2 -1
- exonware/xwsystem/operations/__init__.py +5 -50
- exonware/xwsystem/operations/base.py +3 -44
- exonware/xwsystem/operations/contracts.py +25 -15
- exonware/xwsystem/operations/defs.py +1 -1
- exonware/xwsystem/operations/diff.py +5 -4
- exonware/xwsystem/operations/errors.py +1 -1
- exonware/xwsystem/operations/merge.py +6 -4
- exonware/xwsystem/operations/patch.py +5 -4
- exonware/xwsystem/patterns/__init__.py +1 -0
- exonware/xwsystem/patterns/base.py +2 -1
- exonware/xwsystem/patterns/context_manager.py +2 -1
- exonware/xwsystem/patterns/contracts.py +215 -256
- exonware/xwsystem/patterns/defs.py +2 -1
- exonware/xwsystem/patterns/dynamic_facade.py +1 -0
- exonware/xwsystem/patterns/errors.py +2 -4
- exonware/xwsystem/patterns/handler_factory.py +2 -3
- exonware/xwsystem/patterns/import_registry.py +1 -0
- exonware/xwsystem/patterns/object_pool.py +1 -0
- exonware/xwsystem/patterns/registry.py +4 -43
- exonware/xwsystem/plugins/__init__.py +2 -1
- exonware/xwsystem/plugins/base.py +6 -5
- exonware/xwsystem/plugins/contracts.py +94 -158
- exonware/xwsystem/plugins/defs.py +2 -1
- exonware/xwsystem/plugins/errors.py +2 -1
- exonware/xwsystem/py.typed +3 -0
- exonware/xwsystem/query/__init__.py +36 -0
- exonware/xwsystem/query/contracts.py +56 -0
- exonware/xwsystem/query/errors.py +22 -0
- exonware/xwsystem/query/registry.py +128 -0
- exonware/xwsystem/runtime/__init__.py +2 -1
- exonware/xwsystem/runtime/base.py +4 -3
- exonware/xwsystem/runtime/contracts.py +39 -60
- exonware/xwsystem/runtime/defs.py +2 -1
- exonware/xwsystem/runtime/env.py +11 -9
- exonware/xwsystem/runtime/errors.py +2 -1
- exonware/xwsystem/runtime/reflection.py +3 -2
- exonware/xwsystem/security/__init__.py +68 -11
- exonware/xwsystem/security/audit.py +167 -0
- exonware/xwsystem/security/base.py +121 -24
- exonware/xwsystem/security/contracts.py +91 -146
- exonware/xwsystem/security/crypto.py +17 -16
- exonware/xwsystem/security/defs.py +2 -1
- exonware/xwsystem/security/errors.py +2 -1
- exonware/xwsystem/security/facade.py +321 -0
- exonware/xwsystem/security/file_security.py +330 -0
- exonware/xwsystem/security/hazmat.py +11 -8
- exonware/xwsystem/security/monitor.py +372 -0
- exonware/xwsystem/security/path_validator.py +140 -18
- exonware/xwsystem/security/policy.py +357 -0
- exonware/xwsystem/security/resource_limits.py +1 -0
- exonware/xwsystem/security/validator.py +455 -0
- exonware/xwsystem/shared/__init__.py +14 -1
- exonware/xwsystem/shared/base.py +285 -2
- exonware/xwsystem/shared/contracts.py +415 -126
- exonware/xwsystem/shared/defs.py +2 -1
- exonware/xwsystem/shared/errors.py +2 -2
- exonware/xwsystem/shared/xwobject.py +316 -0
- exonware/xwsystem/structures/__init__.py +1 -0
- exonware/xwsystem/structures/base.py +3 -2
- exonware/xwsystem/structures/circular_detector.py +15 -14
- exonware/xwsystem/structures/contracts.py +53 -76
- exonware/xwsystem/structures/defs.py +2 -1
- exonware/xwsystem/structures/errors.py +2 -1
- exonware/xwsystem/structures/tree_walker.py +2 -1
- exonware/xwsystem/threading/__init__.py +21 -4
- exonware/xwsystem/threading/async_primitives.py +6 -5
- exonware/xwsystem/threading/base.py +3 -2
- exonware/xwsystem/threading/contracts.py +87 -143
- exonware/xwsystem/threading/defs.py +2 -1
- exonware/xwsystem/threading/errors.py +2 -1
- exonware/xwsystem/threading/facade.py +175 -0
- exonware/xwsystem/threading/locks.py +1 -0
- exonware/xwsystem/threading/safe_factory.py +1 -0
- exonware/xwsystem/utils/__init__.py +40 -0
- exonware/xwsystem/utils/base.py +22 -21
- exonware/xwsystem/utils/contracts.py +50 -73
- exonware/xwsystem/utils/dt/__init__.py +19 -3
- exonware/xwsystem/utils/dt/base.py +5 -4
- exonware/xwsystem/utils/dt/contracts.py +22 -29
- exonware/xwsystem/utils/dt/defs.py +2 -1
- exonware/xwsystem/utils/dt/errors.py +2 -5
- exonware/xwsystem/utils/dt/formatting.py +88 -2
- exonware/xwsystem/utils/dt/humanize.py +10 -9
- exonware/xwsystem/utils/dt/parsing.py +56 -5
- exonware/xwsystem/utils/dt/timezone_utils.py +2 -24
- exonware/xwsystem/utils/errors.py +2 -4
- exonware/xwsystem/utils/paths.py +1 -0
- exonware/xwsystem/utils/string.py +49 -0
- exonware/xwsystem/utils/test_runner.py +139 -480
- exonware/xwsystem/utils/utils_contracts.py +2 -1
- exonware/xwsystem/utils/web.py +110 -0
- exonware/xwsystem/validation/__init__.py +25 -1
- exonware/xwsystem/validation/base.py +6 -5
- exonware/xwsystem/validation/contracts.py +29 -41
- exonware/xwsystem/validation/data_validator.py +1 -0
- exonware/xwsystem/validation/declarative.py +11 -8
- exonware/xwsystem/validation/defs.py +2 -1
- exonware/xwsystem/validation/errors.py +2 -1
- exonware/xwsystem/validation/facade.py +198 -0
- exonware/xwsystem/validation/fluent_validator.py +22 -19
- exonware/xwsystem/validation/schema_discovery.py +210 -0
- exonware/xwsystem/validation/type_safety.py +2 -1
- exonware/xwsystem/version.py +4 -4
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/METADATA +71 -4
- exonware_xwsystem-0.1.0.3.dist-info/RECORD +337 -0
- exonware/xwsystem/caching/USAGE_GUIDE.md +0 -779
- exonware/xwsystem/cli/__init__.py +0 -43
- exonware/xwsystem/cli/console.py +0 -113
- exonware/xwsystem/cli/defs.py +0 -134
- exonware/xwsystem/conf.py +0 -44
- exonware/xwsystem/security/auth.py +0 -484
- exonware_xwsystem-0.0.1.411.dist-info/RECORD +0 -274
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/WHEEL +0 -0
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/monitoring/defs.py
|
|
2
3
|
#exonware/xwsystem/monitoring/types.py
|
|
3
4
|
"""
|
|
4
5
|
Company: eXonware.com
|
|
5
6
|
Author: Eng. Muhammad AlShehri
|
|
6
7
|
Email: connect@exonware.com
|
|
7
|
-
Version: 0.0.
|
|
8
|
+
Version: 0.1.0.3
|
|
8
9
|
Generation Date: 07-Sep-2025
|
|
9
10
|
|
|
10
11
|
Monitoring types and enums for XWSystem.
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/monitoring/error_recovery.py
|
|
1
2
|
"""
|
|
2
3
|
Error Recovery and Resilience Mechanisms for XWSystem Library.
|
|
3
4
|
|
|
@@ -10,7 +11,7 @@ import functools
|
|
|
10
11
|
import threading
|
|
11
12
|
import time
|
|
12
13
|
from dataclasses import dataclass, field
|
|
13
|
-
from typing import Any, Callable, Optional
|
|
14
|
+
from typing import Any, Callable, Optional
|
|
14
15
|
|
|
15
16
|
from .defs import CircuitState
|
|
16
17
|
|
|
@@ -241,6 +242,18 @@ class ErrorRecoveryManager:
|
|
|
241
242
|
|
|
242
243
|
return None
|
|
243
244
|
|
|
245
|
+
def register_degradation_strategy(self, error_type: str, strategy: Callable) -> None:
|
|
246
|
+
"""
|
|
247
|
+
Register a degradation strategy for a specific error type.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
error_type: Error type identifier (e.g., "security_errors", "memory")
|
|
251
|
+
strategy: Callable that handles the error (error, context) -> Any
|
|
252
|
+
"""
|
|
253
|
+
with self._lock:
|
|
254
|
+
self.degradation_strategies[error_type] = strategy
|
|
255
|
+
logger.info(f"📋 Registered degradation strategy for: {error_type}")
|
|
256
|
+
|
|
244
257
|
def add_circuit_breaker(self, name: str, config: CircuitBreakerConfig) -> None:
|
|
245
258
|
"""Add a circuit breaker."""
|
|
246
259
|
with self._lock:
|
|
@@ -307,7 +320,7 @@ class ErrorRecoveryManager:
|
|
|
307
320
|
# Calculate next delay
|
|
308
321
|
delay = min(delay * backoff_factor, max_delay)
|
|
309
322
|
|
|
310
|
-
#
|
|
323
|
+
# Unreachable code path
|
|
311
324
|
raise last_exception
|
|
312
325
|
|
|
313
326
|
async def async_retry_with_backoff(
|
|
@@ -344,7 +357,7 @@ class ErrorRecoveryManager:
|
|
|
344
357
|
await asyncio.sleep(delay)
|
|
345
358
|
delay = min(delay * backoff_factor, max_delay)
|
|
346
359
|
|
|
347
|
-
#
|
|
360
|
+
# Unreachable code path
|
|
348
361
|
raise last_exception
|
|
349
362
|
|
|
350
363
|
def graceful_degradation(
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/monitoring/errors.py
|
|
1
2
|
#exonware/xwsystem/monitoring/errors.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
|
Monitoring module errors - exception classes for monitoring functionality.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/monitoring/facade.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 2026
|
|
8
|
+
|
|
9
|
+
XWMonitor - Unified Monitoring Facade
|
|
10
|
+
|
|
11
|
+
Simplified API for monitoring operations:
|
|
12
|
+
- Performance monitoring
|
|
13
|
+
- Memory monitoring
|
|
14
|
+
- Circuit breakers
|
|
15
|
+
- System monitoring
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from typing import Any, Optional, Callable
|
|
19
|
+
from contextlib import contextmanager
|
|
20
|
+
from functools import wraps
|
|
21
|
+
|
|
22
|
+
from .performance_monitor import (
|
|
23
|
+
PerformanceMonitor,
|
|
24
|
+
performance_context,
|
|
25
|
+
create_performance_monitor,
|
|
26
|
+
)
|
|
27
|
+
from .memory_monitor import (
|
|
28
|
+
MemoryMonitor,
|
|
29
|
+
start_memory_monitoring,
|
|
30
|
+
stop_memory_monitoring,
|
|
31
|
+
get_memory_stats,
|
|
32
|
+
get_memory_monitor,
|
|
33
|
+
)
|
|
34
|
+
from .error_recovery import (
|
|
35
|
+
CircuitBreaker,
|
|
36
|
+
CircuitBreakerConfig,
|
|
37
|
+
circuit_breaker,
|
|
38
|
+
retry_with_backoff,
|
|
39
|
+
)
|
|
40
|
+
from .system_monitor import (
|
|
41
|
+
SystemMonitor,
|
|
42
|
+
get_cpu_usage,
|
|
43
|
+
get_memory_usage,
|
|
44
|
+
get_system_info,
|
|
45
|
+
)
|
|
46
|
+
from ..config.logging_setup import get_logger
|
|
47
|
+
|
|
48
|
+
logger = get_logger(__name__)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class XWMonitor:
|
|
52
|
+
"""
|
|
53
|
+
Unified monitoring facade - simple API for monitoring operations.
|
|
54
|
+
|
|
55
|
+
Examples:
|
|
56
|
+
>>> # Performance monitoring
|
|
57
|
+
>>> with XWMonitor.performance("operation"):
|
|
58
|
+
... result = expensive_operation()
|
|
59
|
+
|
|
60
|
+
>>> # Memory monitoring
|
|
61
|
+
>>> monitor = XWMonitor.memory(auto_cleanup=True)
|
|
62
|
+
>>> monitor.start()
|
|
63
|
+
|
|
64
|
+
>>> # Circuit breaker
|
|
65
|
+
>>> @XWMonitor.circuit_breaker(failures=5, timeout=60)
|
|
66
|
+
>>> def external_api_call():
|
|
67
|
+
... return requests.get("https://api.example.com")
|
|
68
|
+
|
|
69
|
+
>>> # System monitoring
|
|
70
|
+
>>> cpu = XWMonitor.cpu_usage()
|
|
71
|
+
>>> memory = XWMonitor.memory_usage()
|
|
72
|
+
>>> disk = XWMonitor.disk_usage()
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
@staticmethod
|
|
76
|
+
@contextmanager
|
|
77
|
+
def performance(operation_name: str):
|
|
78
|
+
"""
|
|
79
|
+
Context manager for performance monitoring.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
operation_name: Name of the operation being monitored
|
|
83
|
+
"""
|
|
84
|
+
monitor = create_performance_monitor()
|
|
85
|
+
with performance_context(monitor, operation_name):
|
|
86
|
+
yield
|
|
87
|
+
|
|
88
|
+
@staticmethod
|
|
89
|
+
def memory(auto_cleanup: bool = False) -> MemoryMonitor:
|
|
90
|
+
"""
|
|
91
|
+
Create memory monitor instance.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
auto_cleanup: Enable automatic memory cleanup
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
MemoryMonitor instance
|
|
98
|
+
"""
|
|
99
|
+
monitor = get_memory_monitor()
|
|
100
|
+
if auto_cleanup:
|
|
101
|
+
monitor.enable_auto_cleanup()
|
|
102
|
+
return monitor
|
|
103
|
+
|
|
104
|
+
@staticmethod
|
|
105
|
+
def start_memory_monitoring(auto_cleanup: bool = False) -> None:
|
|
106
|
+
"""Start memory monitoring."""
|
|
107
|
+
start_memory_monitoring(auto_cleanup=auto_cleanup)
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def stop_memory_monitoring() -> None:
|
|
111
|
+
"""Stop memory monitoring."""
|
|
112
|
+
stop_memory_monitoring()
|
|
113
|
+
|
|
114
|
+
@staticmethod
|
|
115
|
+
def get_memory_stats() -> dict:
|
|
116
|
+
"""Get current memory statistics."""
|
|
117
|
+
return get_memory_stats()
|
|
118
|
+
|
|
119
|
+
@staticmethod
|
|
120
|
+
def circuit_breaker(
|
|
121
|
+
failures: int = 5,
|
|
122
|
+
timeout: int = 60,
|
|
123
|
+
**kwargs
|
|
124
|
+
):
|
|
125
|
+
"""
|
|
126
|
+
Decorator for circuit breaker pattern.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
failures: Number of failures before opening circuit
|
|
130
|
+
timeout: Timeout in seconds before attempting recovery
|
|
131
|
+
**kwargs: Additional circuit breaker options
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Decorator function
|
|
135
|
+
"""
|
|
136
|
+
config = CircuitBreakerConfig(
|
|
137
|
+
failure_threshold=failures,
|
|
138
|
+
recovery_timeout=timeout,
|
|
139
|
+
**kwargs
|
|
140
|
+
)
|
|
141
|
+
return circuit_breaker(config=config)
|
|
142
|
+
|
|
143
|
+
@staticmethod
|
|
144
|
+
def retry(max_attempts: int = 3, backoff: float = 1.0, **kwargs):
|
|
145
|
+
"""
|
|
146
|
+
Decorator for retry logic.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
max_attempts: Maximum retry attempts
|
|
150
|
+
backoff: Backoff multiplier
|
|
151
|
+
**kwargs: Additional retry options
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Decorator function
|
|
155
|
+
"""
|
|
156
|
+
return retry_with_backoff(max_attempts=max_attempts, backoff=backoff, **kwargs)
|
|
157
|
+
|
|
158
|
+
@staticmethod
|
|
159
|
+
def cpu_usage() -> float:
|
|
160
|
+
"""Get current CPU usage percentage."""
|
|
161
|
+
return get_cpu_usage()
|
|
162
|
+
|
|
163
|
+
@staticmethod
|
|
164
|
+
def memory_usage() -> dict:
|
|
165
|
+
"""Get current memory usage statistics."""
|
|
166
|
+
return get_memory_usage()
|
|
167
|
+
|
|
168
|
+
@staticmethod
|
|
169
|
+
def disk_usage(path: str = "/") -> dict:
|
|
170
|
+
"""Get disk usage statistics."""
|
|
171
|
+
import shutil
|
|
172
|
+
usage = shutil.disk_usage(path)
|
|
173
|
+
return {
|
|
174
|
+
"total": usage.total,
|
|
175
|
+
"used": usage.used,
|
|
176
|
+
"free": usage.free,
|
|
177
|
+
"percent": (usage.used / usage.total) * 100
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
@staticmethod
|
|
181
|
+
def system_info() -> dict:
|
|
182
|
+
"""Get system information."""
|
|
183
|
+
return get_system_info()
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/monitoring/performance_manager_generic.py
|
|
2
3
|
#exonware/xwsystem/monitoring/performance_manager_generic.py
|
|
3
4
|
"""
|
|
4
5
|
Generic Performance Management for XSystem (Moved from performance/ module)
|
|
@@ -10,7 +11,7 @@ health monitoring, and recommendations without being tied to specific implementa
|
|
|
10
11
|
Company: eXonware.com
|
|
11
12
|
Author: Eng. Muhammad AlShehri
|
|
12
13
|
Email: connect@exonware.com
|
|
13
|
-
Version: 0.0.
|
|
14
|
+
Version: 0.1.0.3
|
|
14
15
|
Generation Date: November 04, 2025
|
|
15
16
|
"""
|
|
16
17
|
|
|
@@ -18,7 +19,7 @@ import threading
|
|
|
18
19
|
import time
|
|
19
20
|
from dataclasses import dataclass, field
|
|
20
21
|
from enum import Enum
|
|
21
|
-
from typing import Any, Optional
|
|
22
|
+
from typing import Any, Optional
|
|
22
23
|
|
|
23
24
|
from ..config.performance_modes import PerformanceMode
|
|
24
25
|
from ..config.logging_setup import get_logger
|
|
@@ -106,19 +107,19 @@ class GenericPerformanceManager:
|
|
|
106
107
|
"""Get the current performance mode (local or global)."""
|
|
107
108
|
if hasattr(self, "_local_mode") and self._local_mode is not None:
|
|
108
109
|
return self._local_mode
|
|
109
|
-
#
|
|
110
|
+
# Override in subclasses to get global mode
|
|
110
111
|
return PerformanceMode.FAST # Default fallback
|
|
111
112
|
|
|
112
113
|
def get_effective_config(self) -> Optional[Any]:
|
|
113
114
|
"""Get effective config (local or global)."""
|
|
114
115
|
if hasattr(self, "_local_config") and self._local_config is not None:
|
|
115
116
|
return self._local_config
|
|
116
|
-
#
|
|
117
|
+
# Override in subclasses to get global config
|
|
117
118
|
return None
|
|
118
119
|
|
|
119
120
|
def _create_local_config(self, mode: PerformanceMode) -> Any:
|
|
120
121
|
"""Create local configuration for the given mode."""
|
|
121
|
-
#
|
|
122
|
+
# Override in subclasses
|
|
122
123
|
return {"performance_mode": mode}
|
|
123
124
|
|
|
124
125
|
def get_mode_history(self) -> list[dict[str, Any]]:
|
|
@@ -262,7 +263,7 @@ class GenericPerformanceManager:
|
|
|
262
263
|
]:
|
|
263
264
|
self.set_performance_mode(PerformanceMode.ADAPTIVE)
|
|
264
265
|
elif memory_percent < 30 and cache_hit_rate > 0.8:
|
|
265
|
-
#
|
|
266
|
+
# Conditions allow fast mode
|
|
266
267
|
if current_mode != PerformanceMode.FAST:
|
|
267
268
|
self.set_performance_mode(PerformanceMode.FAST)
|
|
268
269
|
|
|
@@ -466,4 +467,3 @@ class GenericPerformanceManager:
|
|
|
466
467
|
def _apply_manual_overrides(self, config_overrides: dict[str, Any]) -> None:
|
|
467
468
|
"""Apply manual configuration overrides. Override in subclasses."""
|
|
468
469
|
pass
|
|
469
|
-
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/monitoring/system_monitor.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
|
System-wide monitoring and hardware introspection utilities.
|
|
@@ -12,7 +13,7 @@ import os
|
|
|
12
13
|
import platform
|
|
13
14
|
import time
|
|
14
15
|
from dataclasses import dataclass
|
|
15
|
-
from typing import Optional, Any
|
|
16
|
+
from typing import Optional, Any
|
|
16
17
|
from pathlib import Path
|
|
17
18
|
|
|
18
19
|
# Import psutil - lazy installation system will handle it if missing
|
|
@@ -142,7 +143,7 @@ class SystemMonitor:
|
|
|
142
143
|
|
|
143
144
|
def is_available(self) -> bool:
|
|
144
145
|
"""Check if full system monitoring is available."""
|
|
145
|
-
# Lazy installation system
|
|
146
|
+
# Lazy installation system provides psutil when available
|
|
146
147
|
return True
|
|
147
148
|
|
|
148
149
|
# =============================================================================
|
|
@@ -357,7 +358,7 @@ class SystemMonitor:
|
|
|
357
358
|
|
|
358
359
|
return SystemInfo(**system_info)
|
|
359
360
|
|
|
360
|
-
def get_cpu_usage(self, interval: float = 1.0, per_cpu: bool = False) ->
|
|
361
|
+
def get_cpu_usage(self, interval: float = 1.0, per_cpu: bool = False) -> float | list[float]:
|
|
361
362
|
"""
|
|
362
363
|
Get CPU usage percentage.
|
|
363
364
|
|
|
@@ -696,5 +697,5 @@ def get_hardware_info() -> dict[str, Any]:
|
|
|
696
697
|
|
|
697
698
|
def is_monitoring_available() -> bool:
|
|
698
699
|
"""Check if full system monitoring is available."""
|
|
699
|
-
# Lazy installation system
|
|
700
|
+
# Lazy installation system provides psutil when available
|
|
700
701
|
return True
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/monitoring/tracing.py
|
|
1
2
|
"""
|
|
2
3
|
Company: eXonware.com
|
|
3
4
|
Author: Eng. Muhammad AlShehri
|
|
4
5
|
Email: connect@exonware.com
|
|
5
|
-
Version: 0.0.
|
|
6
|
+
Version: 0.1.0.3
|
|
6
7
|
Generation Date: September 05, 2025
|
|
7
8
|
|
|
8
9
|
Distributed Tracing Integration for Enterprise Observability
|
|
@@ -19,7 +20,7 @@ import time
|
|
|
19
20
|
import uuid
|
|
20
21
|
from contextlib import asynccontextmanager, contextmanager
|
|
21
22
|
from dataclasses import dataclass, field
|
|
22
|
-
from typing import Any, AsyncContextManager, ContextManager, Optional
|
|
23
|
+
from typing import Any, AsyncContextManager, ContextManager, Optional
|
|
23
24
|
from .base import ATracingProvider
|
|
24
25
|
from .errors import TracingError
|
|
25
26
|
from .defs import SpanKind
|
|
@@ -92,25 +93,27 @@ class OpenTelemetryTracer(ATracingProvider):
|
|
|
92
93
|
|
|
93
94
|
def _setup_otlp_exporter(self, endpoint: str) -> None:
|
|
94
95
|
"""Set up OTLP exporter (modern standard, Python 3.8+ only, no legacy deps)."""
|
|
96
|
+
# Optional dependency: opentelemetry-exporter-otlp-proto-http
|
|
95
97
|
try:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
98
|
+
import importlib.util
|
|
99
|
+
_otlp_exporter_spec = importlib.util.find_spec('opentelemetry.exporter.otlp.proto.http.trace_exporter')
|
|
100
|
+
if _otlp_exporter_spec is not None:
|
|
101
|
+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
|
|
102
|
+
|
|
103
|
+
otlp_exporter = OTLPSpanExporter(endpoint=endpoint)
|
|
104
|
+
span_processor = BatchSpanProcessor(otlp_exporter)
|
|
105
|
+
trace.get_tracer_provider().add_span_processor(span_processor)
|
|
106
|
+
logger.info(f"OTLP exporter configured for endpoint: {endpoint}")
|
|
107
|
+
else:
|
|
108
|
+
logger.warning(
|
|
109
|
+
"OTLP exporter not available. Install with: pip install opentelemetry-exporter-otlp-proto-http"
|
|
110
|
+
)
|
|
108
111
|
except Exception as e:
|
|
109
112
|
logger.warning(f"Failed to setup OTLP exporter: {e}")
|
|
110
113
|
|
|
111
114
|
def _setup_zipkin_exporter(self, endpoint: str) -> None:
|
|
112
115
|
"""Set up Zipkin exporter."""
|
|
113
|
-
# Import is explicit - if missing,
|
|
116
|
+
# Import is explicit - if missing, install: pip install exonware-xwsystem[observability]
|
|
114
117
|
from opentelemetry.exporter.zipkin.json import ZipkinExporter
|
|
115
118
|
|
|
116
119
|
try:
|
|
@@ -424,4 +427,3 @@ class DistributedTracing:
|
|
|
424
427
|
def is_tracing_enabled(self) -> bool:
|
|
425
428
|
"""Check if tracing is enabled."""
|
|
426
429
|
return self.manager.is_tracing_enabled()
|
|
427
|
-
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/monitoring/tracker.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: October 26, 2025
|
|
8
9
|
|
|
9
10
|
Operation tracker for monitoring operations with context management.
|
|
@@ -1,70 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/operations/__init__.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: October 26, 2025
|
|
8
9
|
|
|
9
10
|
Universal operations library for data manipulation.
|
|
10
11
|
"""
|
|
11
12
|
|
|
12
|
-
from typing import Any, Optional, Union
|
|
13
|
-
from enum import Enum
|
|
14
|
-
from dataclasses import dataclass
|
|
15
13
|
from ..config.logging_setup import get_logger
|
|
16
14
|
|
|
17
15
|
logger = get_logger("xwsystem.operations")
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
class MergeStrategy(Enum):
|
|
21
|
-
"""Merge strategies for data operations."""
|
|
22
|
-
DEEP = "deep" # Recursive merge (default)
|
|
23
|
-
SHALLOW = "shallow" # Top-level only
|
|
24
|
-
OVERWRITE = "overwrite" # Replace entirely
|
|
25
|
-
APPEND = "append" # Append lists instead of replacing
|
|
26
|
-
UNIQUE = "unique" # Merge lists with uniqueness
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class DiffMode(Enum):
|
|
30
|
-
"""Diff operation modes."""
|
|
31
|
-
STRUCTURAL = "structural" # Compare structure only
|
|
32
|
-
CONTENT = "content" # Compare content only
|
|
33
|
-
FULL = "full" # Compare both structure and content
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class PatchOperation(Enum):
|
|
37
|
-
"""JSON Patch operation types."""
|
|
38
|
-
ADD = "add"
|
|
39
|
-
REMOVE = "remove"
|
|
40
|
-
REPLACE = "replace"
|
|
41
|
-
MOVE = "move"
|
|
42
|
-
COPY = "copy"
|
|
43
|
-
TEST = "test"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
@dataclass
|
|
47
|
-
class DiffResult:
|
|
48
|
-
"""Result of a diff operation."""
|
|
49
|
-
operations: list[dict[str, Any]]
|
|
50
|
-
mode: DiffMode
|
|
51
|
-
paths_changed: list[str]
|
|
52
|
-
total_changes: int
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
@dataclass
|
|
56
|
-
class PatchResult:
|
|
57
|
-
"""Result of a patch operation."""
|
|
58
|
-
success: bool
|
|
59
|
-
operations_applied: int
|
|
60
|
-
errors: list[str]
|
|
61
|
-
result: Any
|
|
62
|
-
|
|
63
|
-
|
|
64
17
|
# Import from submodules
|
|
65
18
|
from .defs import MergeStrategy, DiffMode, PatchOperation, DiffResult, PatchResult
|
|
66
19
|
from .base import (
|
|
67
|
-
OperationError, MergeError, DiffError, PatchError
|
|
20
|
+
OperationError, MergeError, DiffError, PatchError
|
|
21
|
+
)
|
|
22
|
+
from .contracts import (
|
|
68
23
|
IOperation, IMergeOperation, IDiffOperation, IPatchOperation
|
|
69
24
|
)
|
|
70
25
|
from .merge import MergeOperation, deep_merge
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/operations/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: October 26, 2025
|
|
8
9
|
|
|
9
10
|
Base classes and contracts for operations.
|
|
10
11
|
"""
|
|
11
12
|
|
|
12
|
-
from
|
|
13
|
-
from typing import Any, Optional, Union
|
|
14
|
-
from .defs import MergeStrategy, DiffMode, PatchOperation, DiffResult, PatchResult
|
|
13
|
+
from typing import Optional
|
|
15
14
|
|
|
16
15
|
|
|
17
16
|
class OperationError(Exception):
|
|
@@ -37,49 +36,9 @@ class PatchError(OperationError):
|
|
|
37
36
|
pass
|
|
38
37
|
|
|
39
38
|
|
|
40
|
-
class IOperation(ABC):
|
|
41
|
-
"""Interface for operations."""
|
|
42
|
-
|
|
43
|
-
@abstractmethod
|
|
44
|
-
def execute(self, *args, **kwargs) -> Any:
|
|
45
|
-
"""Execute the operation."""
|
|
46
|
-
pass
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
class IMergeOperation(IOperation):
|
|
50
|
-
"""Interface for merge operations."""
|
|
51
|
-
|
|
52
|
-
@abstractmethod
|
|
53
|
-
def merge(self, target: Any, source: Any, strategy: MergeStrategy = MergeStrategy.DEEP) -> Any:
|
|
54
|
-
"""Merge source into target."""
|
|
55
|
-
pass
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
class IDiffOperation(IOperation):
|
|
59
|
-
"""Interface for diff operations."""
|
|
60
|
-
|
|
61
|
-
@abstractmethod
|
|
62
|
-
def diff(self, original: Any, modified: Any, mode: DiffMode = DiffMode.FULL) -> DiffResult:
|
|
63
|
-
"""Generate diff between original and modified."""
|
|
64
|
-
pass
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
class IPatchOperation(IOperation):
|
|
68
|
-
"""Interface for patch operations."""
|
|
69
|
-
|
|
70
|
-
@abstractmethod
|
|
71
|
-
def apply_patch(self, data: Any, operations: list[dict[str, Any]]) -> PatchResult:
|
|
72
|
-
"""Apply patch operations to data."""
|
|
73
|
-
pass
|
|
74
|
-
|
|
75
|
-
|
|
76
39
|
__all__ = [
|
|
77
40
|
"OperationError",
|
|
78
41
|
"MergeError",
|
|
79
42
|
"DiffError",
|
|
80
43
|
"PatchError",
|
|
81
|
-
"IOperation",
|
|
82
|
-
"IMergeOperation",
|
|
83
|
-
"IDiffOperation",
|
|
84
|
-
"IPatchOperation",
|
|
85
44
|
]
|