exonware-xwsystem 0.0.1.411__py3-none-any.whl → 0.1.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- exonware/__init__.py +2 -1
- exonware/conf.py +2 -2
- exonware/xwsystem/__init__.py +115 -43
- exonware/xwsystem/base.py +30 -0
- exonware/xwsystem/caching/__init__.py +39 -13
- exonware/xwsystem/caching/base.py +24 -6
- exonware/xwsystem/caching/bloom_cache.py +2 -2
- exonware/xwsystem/caching/cache_manager.py +2 -1
- exonware/xwsystem/caching/conditional.py +2 -2
- exonware/xwsystem/caching/contracts.py +85 -139
- exonware/xwsystem/caching/decorators.py +6 -19
- exonware/xwsystem/caching/defs.py +2 -1
- exonware/xwsystem/caching/disk_cache.py +2 -1
- exonware/xwsystem/caching/distributed.py +2 -1
- exonware/xwsystem/caching/errors.py +2 -1
- exonware/xwsystem/caching/events.py +110 -27
- exonware/xwsystem/caching/eviction_strategies.py +2 -2
- exonware/xwsystem/caching/external_caching_python.py +701 -0
- exonware/xwsystem/caching/facade.py +253 -0
- exonware/xwsystem/caching/factory.py +300 -0
- exonware/xwsystem/caching/fluent.py +14 -12
- exonware/xwsystem/caching/integrity.py +21 -6
- exonware/xwsystem/caching/lfu_cache.py +2 -1
- exonware/xwsystem/caching/lfu_optimized.py +18 -6
- exonware/xwsystem/caching/lru_cache.py +7 -4
- exonware/xwsystem/caching/memory_bounded.py +2 -2
- exonware/xwsystem/caching/metrics_exporter.py +2 -2
- exonware/xwsystem/caching/observable_cache.py +2 -2
- exonware/xwsystem/caching/pluggable_cache.py +2 -2
- exonware/xwsystem/caching/rate_limiter.py +2 -2
- exonware/xwsystem/caching/read_through.py +2 -2
- exonware/xwsystem/caching/secure_cache.py +81 -28
- exonware/xwsystem/caching/serializable.py +9 -7
- exonware/xwsystem/caching/stats.py +2 -2
- exonware/xwsystem/caching/tagging.py +2 -2
- exonware/xwsystem/caching/ttl_cache.py +4 -3
- exonware/xwsystem/caching/two_tier_cache.py +6 -3
- exonware/xwsystem/caching/utils.py +30 -12
- exonware/xwsystem/caching/validation.py +2 -2
- exonware/xwsystem/caching/warming.py +6 -3
- exonware/xwsystem/caching/write_behind.py +15 -6
- exonware/xwsystem/config/__init__.py +11 -17
- exonware/xwsystem/config/base.py +5 -5
- exonware/xwsystem/config/contracts.py +93 -153
- exonware/xwsystem/config/defaults.py +3 -2
- exonware/xwsystem/config/defs.py +3 -2
- exonware/xwsystem/config/errors.py +2 -5
- exonware/xwsystem/config/logging.py +12 -8
- exonware/xwsystem/config/logging_setup.py +3 -2
- exonware/xwsystem/config/performance.py +73 -391
- exonware/xwsystem/config/performance_modes.py +9 -8
- exonware/xwsystem/config/version_manager.py +1 -0
- exonware/xwsystem/config.py +27 -0
- exonware/xwsystem/console/__init__.py +53 -0
- exonware/xwsystem/console/base.py +133 -0
- exonware/xwsystem/console/cli/__init__.py +61 -0
- exonware/xwsystem/{cli → console/cli}/args.py +27 -24
- exonware/xwsystem/{cli → console/cli}/base.py +18 -87
- exonware/xwsystem/{cli → console/cli}/colors.py +15 -13
- exonware/xwsystem/console/cli/console.py +98 -0
- exonware/xwsystem/{cli → console/cli}/contracts.py +51 -69
- exonware/xwsystem/console/cli/defs.py +87 -0
- exonware/xwsystem/console/cli/encoding.py +69 -0
- exonware/xwsystem/{cli → console/cli}/errors.py +8 -3
- exonware/xwsystem/console/cli/event_logger.py +166 -0
- exonware/xwsystem/{cli → console/cli}/progress.py +25 -21
- exonware/xwsystem/{cli → console/cli}/prompts.py +3 -2
- exonware/xwsystem/{cli → console/cli}/tables.py +27 -24
- exonware/xwsystem/console/contracts.py +113 -0
- exonware/xwsystem/console/defs.py +154 -0
- exonware/xwsystem/console/errors.py +34 -0
- exonware/xwsystem/console/event_logger.py +385 -0
- exonware/xwsystem/console/writer.py +132 -0
- exonware/xwsystem/contracts.py +28 -0
- exonware/xwsystem/data_structures/__init__.py +23 -0
- exonware/xwsystem/data_structures/trie.py +34 -0
- exonware/xwsystem/data_structures/union_find.py +144 -0
- exonware/xwsystem/defs.py +17 -0
- exonware/xwsystem/errors.py +23 -0
- exonware/xwsystem/facade.py +62 -0
- exonware/xwsystem/http_client/__init__.py +22 -1
- exonware/xwsystem/http_client/advanced_client.py +8 -5
- exonware/xwsystem/http_client/base.py +3 -2
- exonware/xwsystem/http_client/client.py +7 -4
- exonware/xwsystem/http_client/contracts.py +42 -56
- exonware/xwsystem/http_client/defs.py +2 -1
- exonware/xwsystem/http_client/errors.py +2 -1
- exonware/xwsystem/http_client/facade.py +156 -0
- exonware/xwsystem/io/__init__.py +22 -3
- exonware/xwsystem/io/archive/__init__.py +8 -2
- exonware/xwsystem/io/archive/archive.py +1 -1
- exonware/xwsystem/io/archive/archive_files.py +4 -7
- exonware/xwsystem/io/archive/archivers.py +120 -10
- exonware/xwsystem/io/archive/base.py +4 -5
- exonware/xwsystem/io/archive/codec_integration.py +1 -2
- exonware/xwsystem/io/archive/compression.py +1 -2
- exonware/xwsystem/io/archive/facade.py +263 -0
- exonware/xwsystem/io/archive/formats/__init__.py +2 -3
- exonware/xwsystem/io/archive/formats/brotli_format.py +20 -7
- exonware/xwsystem/io/archive/formats/lz4_format.py +20 -7
- exonware/xwsystem/io/archive/formats/rar.py +11 -5
- exonware/xwsystem/io/archive/formats/sevenzip.py +12 -6
- exonware/xwsystem/io/archive/formats/squashfs_format.py +1 -2
- exonware/xwsystem/io/archive/formats/tar.py +52 -7
- exonware/xwsystem/io/archive/formats/wim_format.py +11 -5
- exonware/xwsystem/io/archive/formats/zip.py +1 -2
- exonware/xwsystem/io/archive/formats/zpaq_format.py +1 -2
- exonware/xwsystem/io/archive/formats/zstandard.py +20 -7
- exonware/xwsystem/io/base.py +119 -115
- exonware/xwsystem/io/codec/__init__.py +4 -2
- exonware/xwsystem/io/codec/base.py +19 -13
- exonware/xwsystem/io/codec/contracts.py +59 -2
- exonware/xwsystem/io/codec/registry.py +67 -21
- exonware/xwsystem/io/common/__init__.py +1 -1
- exonware/xwsystem/io/common/atomic.py +29 -16
- exonware/xwsystem/io/common/base.py +11 -10
- exonware/xwsystem/io/common/lock.py +6 -5
- exonware/xwsystem/io/common/path_manager.py +2 -1
- exonware/xwsystem/io/common/watcher.py +1 -2
- exonware/xwsystem/io/contracts.py +301 -433
- exonware/xwsystem/io/contracts_1.py +1180 -0
- exonware/xwsystem/io/data_operations.py +279 -14
- exonware/xwsystem/io/defs.py +4 -3
- exonware/xwsystem/io/errors.py +3 -2
- exonware/xwsystem/io/facade.py +87 -61
- exonware/xwsystem/io/file/__init__.py +1 -1
- exonware/xwsystem/io/file/base.py +8 -9
- exonware/xwsystem/io/file/conversion.py +2 -3
- exonware/xwsystem/io/file/file.py +61 -18
- exonware/xwsystem/io/file/paged_source.py +8 -8
- exonware/xwsystem/io/file/paging/__init__.py +1 -2
- exonware/xwsystem/io/file/paging/byte_paging.py +4 -5
- exonware/xwsystem/io/file/paging/line_paging.py +2 -3
- exonware/xwsystem/io/file/paging/record_paging.py +2 -3
- exonware/xwsystem/io/file/paging/registry.py +1 -2
- exonware/xwsystem/io/file/source.py +13 -17
- exonware/xwsystem/io/filesystem/__init__.py +1 -1
- exonware/xwsystem/io/filesystem/base.py +1 -2
- exonware/xwsystem/io/filesystem/local.py +3 -4
- exonware/xwsystem/io/folder/__init__.py +1 -1
- exonware/xwsystem/io/folder/base.py +1 -2
- exonware/xwsystem/io/folder/folder.py +16 -7
- exonware/xwsystem/io/indexing/__init__.py +14 -0
- exonware/xwsystem/io/indexing/facade.py +443 -0
- exonware/xwsystem/io/path_parser.py +98 -0
- exonware/xwsystem/io/serialization/__init__.py +21 -3
- exonware/xwsystem/io/serialization/auto_serializer.py +146 -20
- exonware/xwsystem/io/serialization/base.py +84 -34
- exonware/xwsystem/io/serialization/contracts.py +50 -73
- exonware/xwsystem/io/serialization/defs.py +2 -1
- exonware/xwsystem/io/serialization/errors.py +2 -1
- exonware/xwsystem/io/serialization/flyweight.py +154 -7
- exonware/xwsystem/io/serialization/format_detector.py +15 -14
- exonware/xwsystem/io/serialization/formats/__init__.py +8 -5
- exonware/xwsystem/io/serialization/formats/binary/bson.py +15 -6
- exonware/xwsystem/io/serialization/formats/binary/cbor.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/marshal.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/msgpack.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/pickle.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/plistlib.py +5 -5
- exonware/xwsystem/io/serialization/formats/database/dbm.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/shelve.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/sqlite3.py +7 -7
- exonware/xwsystem/io/serialization/formats/tabular/__init__.py +27 -0
- exonware/xwsystem/io/serialization/formats/tabular/base.py +89 -0
- exonware/xwsystem/io/serialization/formats/tabular/csv.py +319 -0
- exonware/xwsystem/io/serialization/formats/tabular/df.py +249 -0
- exonware/xwsystem/io/serialization/formats/tabular/excel.py +291 -0
- exonware/xwsystem/io/serialization/formats/tabular/googlesheets.py +374 -0
- exonware/xwsystem/io/serialization/formats/text/__init__.py +1 -1
- exonware/xwsystem/io/serialization/formats/text/append_only_log.py +199 -0
- exonware/xwsystem/io/serialization/formats/text/configparser.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/csv.py +7 -5
- exonware/xwsystem/io/serialization/formats/text/formdata.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/json.py +65 -33
- exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
- exonware/xwsystem/io/serialization/formats/text/jsonlines.py +113 -25
- exonware/xwsystem/io/serialization/formats/text/multipart.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/toml.py +8 -6
- exonware/xwsystem/io/serialization/formats/text/xml.py +25 -20
- exonware/xwsystem/io/serialization/formats/text/yaml.py +8 -6
- exonware/xwsystem/io/serialization/parsers/__init__.py +16 -0
- exonware/xwsystem/io/serialization/parsers/base.py +60 -0
- exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +62 -0
- exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +48 -0
- exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +54 -0
- exonware/xwsystem/io/serialization/parsers/orjson_parser.py +62 -0
- exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +55 -0
- exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +53 -0
- exonware/xwsystem/io/serialization/parsers/registry.py +91 -0
- exonware/xwsystem/io/serialization/parsers/standard.py +44 -0
- exonware/xwsystem/io/serialization/parsers/ujson_parser.py +53 -0
- exonware/xwsystem/io/serialization/registry.py +4 -4
- exonware/xwsystem/io/serialization/serializer.py +168 -79
- exonware/xwsystem/io/serialization/universal_options.py +367 -0
- exonware/xwsystem/io/serialization/utils/__init__.py +1 -2
- exonware/xwsystem/io/serialization/utils/path_ops.py +5 -6
- exonware/xwsystem/io/source_reader.py +223 -0
- exonware/xwsystem/io/stream/__init__.py +1 -1
- exonware/xwsystem/io/stream/async_operations.py +61 -14
- exonware/xwsystem/io/stream/base.py +1 -2
- exonware/xwsystem/io/stream/codec_io.py +6 -7
- exonware/xwsystem/ipc/__init__.py +1 -0
- exonware/xwsystem/ipc/async_fabric.py +4 -4
- exonware/xwsystem/ipc/base.py +6 -5
- exonware/xwsystem/ipc/contracts.py +41 -66
- exonware/xwsystem/ipc/defs.py +2 -1
- exonware/xwsystem/ipc/errors.py +2 -1
- exonware/xwsystem/ipc/message_queue.py +5 -2
- exonware/xwsystem/ipc/pipes.py +70 -34
- exonware/xwsystem/ipc/process_manager.py +7 -5
- exonware/xwsystem/ipc/process_pool.py +6 -5
- exonware/xwsystem/ipc/shared_memory.py +64 -11
- exonware/xwsystem/monitoring/__init__.py +7 -0
- exonware/xwsystem/monitoring/base.py +11 -8
- exonware/xwsystem/monitoring/contracts.py +86 -144
- exonware/xwsystem/monitoring/defs.py +2 -1
- exonware/xwsystem/monitoring/error_recovery.py +16 -3
- exonware/xwsystem/monitoring/errors.py +2 -1
- exonware/xwsystem/monitoring/facade.py +183 -0
- exonware/xwsystem/monitoring/memory_monitor.py +1 -0
- exonware/xwsystem/monitoring/metrics.py +1 -0
- exonware/xwsystem/monitoring/performance_manager_generic.py +7 -7
- exonware/xwsystem/monitoring/performance_monitor.py +1 -0
- exonware/xwsystem/monitoring/performance_validator.py +1 -0
- exonware/xwsystem/monitoring/system_monitor.py +6 -5
- exonware/xwsystem/monitoring/tracing.py +18 -16
- exonware/xwsystem/monitoring/tracker.py +2 -1
- exonware/xwsystem/operations/__init__.py +5 -50
- exonware/xwsystem/operations/base.py +3 -44
- exonware/xwsystem/operations/contracts.py +25 -15
- exonware/xwsystem/operations/defs.py +1 -1
- exonware/xwsystem/operations/diff.py +5 -4
- exonware/xwsystem/operations/errors.py +1 -1
- exonware/xwsystem/operations/merge.py +6 -4
- exonware/xwsystem/operations/patch.py +5 -4
- exonware/xwsystem/patterns/__init__.py +1 -0
- exonware/xwsystem/patterns/base.py +2 -1
- exonware/xwsystem/patterns/context_manager.py +2 -1
- exonware/xwsystem/patterns/contracts.py +215 -256
- exonware/xwsystem/patterns/defs.py +2 -1
- exonware/xwsystem/patterns/dynamic_facade.py +1 -0
- exonware/xwsystem/patterns/errors.py +2 -4
- exonware/xwsystem/patterns/handler_factory.py +2 -3
- exonware/xwsystem/patterns/import_registry.py +1 -0
- exonware/xwsystem/patterns/object_pool.py +1 -0
- exonware/xwsystem/patterns/registry.py +4 -43
- exonware/xwsystem/plugins/__init__.py +2 -1
- exonware/xwsystem/plugins/base.py +6 -5
- exonware/xwsystem/plugins/contracts.py +94 -158
- exonware/xwsystem/plugins/defs.py +2 -1
- exonware/xwsystem/plugins/errors.py +2 -1
- exonware/xwsystem/py.typed +3 -0
- exonware/xwsystem/query/__init__.py +36 -0
- exonware/xwsystem/query/contracts.py +56 -0
- exonware/xwsystem/query/errors.py +22 -0
- exonware/xwsystem/query/registry.py +128 -0
- exonware/xwsystem/runtime/__init__.py +2 -1
- exonware/xwsystem/runtime/base.py +4 -3
- exonware/xwsystem/runtime/contracts.py +39 -60
- exonware/xwsystem/runtime/defs.py +2 -1
- exonware/xwsystem/runtime/env.py +11 -9
- exonware/xwsystem/runtime/errors.py +2 -1
- exonware/xwsystem/runtime/reflection.py +3 -2
- exonware/xwsystem/security/__init__.py +68 -11
- exonware/xwsystem/security/audit.py +167 -0
- exonware/xwsystem/security/base.py +121 -24
- exonware/xwsystem/security/contracts.py +91 -146
- exonware/xwsystem/security/crypto.py +17 -16
- exonware/xwsystem/security/defs.py +2 -1
- exonware/xwsystem/security/errors.py +2 -1
- exonware/xwsystem/security/facade.py +321 -0
- exonware/xwsystem/security/file_security.py +330 -0
- exonware/xwsystem/security/hazmat.py +11 -8
- exonware/xwsystem/security/monitor.py +372 -0
- exonware/xwsystem/security/path_validator.py +140 -18
- exonware/xwsystem/security/policy.py +357 -0
- exonware/xwsystem/security/resource_limits.py +1 -0
- exonware/xwsystem/security/validator.py +455 -0
- exonware/xwsystem/shared/__init__.py +14 -1
- exonware/xwsystem/shared/base.py +285 -2
- exonware/xwsystem/shared/contracts.py +415 -126
- exonware/xwsystem/shared/defs.py +2 -1
- exonware/xwsystem/shared/errors.py +2 -2
- exonware/xwsystem/shared/xwobject.py +316 -0
- exonware/xwsystem/structures/__init__.py +1 -0
- exonware/xwsystem/structures/base.py +3 -2
- exonware/xwsystem/structures/circular_detector.py +15 -14
- exonware/xwsystem/structures/contracts.py +53 -76
- exonware/xwsystem/structures/defs.py +2 -1
- exonware/xwsystem/structures/errors.py +2 -1
- exonware/xwsystem/structures/tree_walker.py +2 -1
- exonware/xwsystem/threading/__init__.py +21 -4
- exonware/xwsystem/threading/async_primitives.py +6 -5
- exonware/xwsystem/threading/base.py +3 -2
- exonware/xwsystem/threading/contracts.py +87 -143
- exonware/xwsystem/threading/defs.py +2 -1
- exonware/xwsystem/threading/errors.py +2 -1
- exonware/xwsystem/threading/facade.py +175 -0
- exonware/xwsystem/threading/locks.py +1 -0
- exonware/xwsystem/threading/safe_factory.py +1 -0
- exonware/xwsystem/utils/__init__.py +40 -0
- exonware/xwsystem/utils/base.py +22 -21
- exonware/xwsystem/utils/contracts.py +50 -73
- exonware/xwsystem/utils/dt/__init__.py +19 -3
- exonware/xwsystem/utils/dt/base.py +5 -4
- exonware/xwsystem/utils/dt/contracts.py +22 -29
- exonware/xwsystem/utils/dt/defs.py +2 -1
- exonware/xwsystem/utils/dt/errors.py +2 -5
- exonware/xwsystem/utils/dt/formatting.py +88 -2
- exonware/xwsystem/utils/dt/humanize.py +10 -9
- exonware/xwsystem/utils/dt/parsing.py +56 -5
- exonware/xwsystem/utils/dt/timezone_utils.py +2 -24
- exonware/xwsystem/utils/errors.py +2 -4
- exonware/xwsystem/utils/paths.py +1 -0
- exonware/xwsystem/utils/string.py +49 -0
- exonware/xwsystem/utils/test_runner.py +139 -480
- exonware/xwsystem/utils/utils_contracts.py +2 -1
- exonware/xwsystem/utils/web.py +110 -0
- exonware/xwsystem/validation/__init__.py +25 -1
- exonware/xwsystem/validation/base.py +6 -5
- exonware/xwsystem/validation/contracts.py +29 -41
- exonware/xwsystem/validation/data_validator.py +1 -0
- exonware/xwsystem/validation/declarative.py +11 -8
- exonware/xwsystem/validation/defs.py +2 -1
- exonware/xwsystem/validation/errors.py +2 -1
- exonware/xwsystem/validation/facade.py +198 -0
- exonware/xwsystem/validation/fluent_validator.py +22 -19
- exonware/xwsystem/validation/schema_discovery.py +210 -0
- exonware/xwsystem/validation/type_safety.py +2 -1
- exonware/xwsystem/version.py +4 -4
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/METADATA +71 -4
- exonware_xwsystem-0.1.0.3.dist-info/RECORD +337 -0
- exonware/xwsystem/caching/USAGE_GUIDE.md +0 -779
- exonware/xwsystem/cli/__init__.py +0 -43
- exonware/xwsystem/cli/console.py +0 -113
- exonware/xwsystem/cli/defs.py +0 -134
- exonware/xwsystem/conf.py +0 -44
- exonware/xwsystem/security/auth.py +0 -484
- exonware_xwsystem-0.0.1.411.dist-info/RECORD +0 -274
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/WHEEL +0 -0
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/config/defaults.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
|
Default configuration constants for XSystem framework.
|
|
@@ -166,7 +167,7 @@ class DefaultConfig(AConfigBase):
|
|
|
166
167
|
|
|
167
168
|
def validate(self) -> bool:
|
|
168
169
|
"""Validate configuration."""
|
|
169
|
-
# Basic validation - all values
|
|
170
|
+
# Basic validation - all values are non-None
|
|
170
171
|
return all(value is not None for value in self._config.values())
|
|
171
172
|
|
|
172
173
|
def get_default(self, key: str) -> Any:
|
exonware/xwsystem/config/defs.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/config/defs.py
|
|
2
3
|
#exonware/xwsystem/config/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
|
Config types and enums for XWSystem.
|
|
@@ -78,4 +79,4 @@ class AdvancedPerformanceMode(Enum):
|
|
|
78
79
|
OPTIMIZED = "optimized" # Prioritize memory efficiency
|
|
79
80
|
MANUAL = "manual" # Use specific custom settings
|
|
80
81
|
ADAPTIVE = "adaptive" # Runtime adaptation based on performance monitoring
|
|
81
|
-
DUAL_ADAPTIVE = "dual_adaptive" #
|
|
82
|
+
DUAL_ADAPTIVE = "dual_adaptive" # Dual-phase: fast cruise + deep-dive
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/config/errors.py
|
|
1
2
|
#exonware/xwsystem/config/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
|
Configuration module errors - exception classes for configuration functionality.
|
|
@@ -74,7 +75,3 @@ class PerformanceConfigError(ConfigError):
|
|
|
74
75
|
"""Raised when performance configuration fails."""
|
|
75
76
|
pass
|
|
76
77
|
|
|
77
|
-
|
|
78
|
-
# Aliases for backward compatibility
|
|
79
|
-
PerformanceError = PerformanceConfigError
|
|
80
|
-
LoggingError = LoggingConfigError
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/config/logging.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
|
Logging configuration for XSystem.
|
|
@@ -12,7 +13,6 @@ Provides simple logging control functions and configuration management.
|
|
|
12
13
|
|
|
13
14
|
import logging
|
|
14
15
|
import os
|
|
15
|
-
from typing import Union
|
|
16
16
|
|
|
17
17
|
from .defaults import LOGGING_ENABLED, LOGGING_LEVEL
|
|
18
18
|
|
|
@@ -39,13 +39,17 @@ class LoggingConfig:
|
|
|
39
39
|
|
|
40
40
|
def set_level(self, level: str) -> None:
|
|
41
41
|
"""Set logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)."""
|
|
42
|
-
|
|
42
|
+
level_upper = level.upper()
|
|
43
|
+
# Validate level by trying to get it from logging module
|
|
44
|
+
# This will raise AttributeError for invalid levels
|
|
45
|
+
try:
|
|
46
|
+
logging_level = getattr(logging, level_upper)
|
|
47
|
+
except AttributeError:
|
|
48
|
+
raise AttributeError(f"Invalid logging level: {level}. Valid levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL")
|
|
49
|
+
|
|
50
|
+
self._level = level_upper
|
|
43
51
|
if self._enabled:
|
|
44
|
-
|
|
45
|
-
logging.getLogger().setLevel(getattr(logging, self._level))
|
|
46
|
-
except (AttributeError, TypeError):
|
|
47
|
-
# Handle cases where logging level comparison might fail
|
|
48
|
-
pass
|
|
52
|
+
logging.getLogger().setLevel(logging_level)
|
|
49
53
|
|
|
50
54
|
@property
|
|
51
55
|
def enabled(self) -> bool:
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/config/logging_setup.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
|
Logging configuration setup for XSystem.
|
|
@@ -41,7 +42,7 @@ def setup_logging(
|
|
|
41
42
|
return
|
|
42
43
|
|
|
43
44
|
# Try to check XSystem config if available
|
|
44
|
-
# Import is explicit - internal package import
|
|
45
|
+
# Import is explicit - internal package import
|
|
45
46
|
from .logging import logging_config
|
|
46
47
|
|
|
47
48
|
if not logging_config.enabled:
|
|
@@ -1,406 +1,88 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Author: Eng. Muhammad AlShehri
|
|
4
|
-
Email: connect@exonware.com
|
|
5
|
-
Version: 0.0.1.411
|
|
6
|
-
Generation Date: September 04, 2025
|
|
7
|
-
|
|
8
|
-
Performance Configuration Management
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/config/performance.py
|
|
2
|
+
"""Performance optimization configuration for xwsystem I/O operations.
|
|
9
3
|
|
|
10
|
-
|
|
4
|
+
This module provides configuration options to enable/disable performance
|
|
5
|
+
optimizations (parallel index building, append-only logs) with automatic
|
|
6
|
+
fallback to original implementations.
|
|
11
7
|
"""
|
|
12
8
|
|
|
13
|
-
from
|
|
14
|
-
from dataclasses import dataclass, field
|
|
15
|
-
import os
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
|
|
18
|
-
from ..config.logging_setup import get_logger
|
|
19
|
-
|
|
20
|
-
logger = get_logger(__name__)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@dataclass
|
|
24
|
-
class SerializationLimits:
|
|
25
|
-
"""Configuration limits for serialization operations."""
|
|
26
|
-
|
|
27
|
-
# Data size limits
|
|
28
|
-
max_size_mb: float = 50.0 # Maximum data size in MB
|
|
29
|
-
max_depth: int = 100 # Maximum nesting depth
|
|
30
|
-
max_string_length: int = 1_000_000 # Maximum string length
|
|
31
|
-
max_list_items: int = 100_000 # Maximum list/array items
|
|
32
|
-
max_dict_keys: int = 10_000 # Maximum dictionary keys
|
|
33
|
-
|
|
34
|
-
# File operation limits
|
|
35
|
-
max_file_size_mb: float = 100.0 # Maximum file size for operations
|
|
36
|
-
max_path_length: int = 4096 # Maximum file path length
|
|
37
|
-
|
|
38
|
-
# Performance settings
|
|
39
|
-
use_atomic_writes: bool = True # Use atomic file operations by default
|
|
40
|
-
validate_input: bool = True # Enable input validation by default
|
|
41
|
-
validate_paths: bool = True # Enable path validation by default
|
|
42
|
-
|
|
43
|
-
# Memory management
|
|
44
|
-
max_memory_mb: float = 200.0 # Maximum memory usage for operations
|
|
45
|
-
enable_compression: bool = False # Enable compression by default
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@dataclass
|
|
49
|
-
class NetworkLimits:
|
|
50
|
-
"""Configuration limits for network operations."""
|
|
51
|
-
|
|
52
|
-
# Timeout settings (seconds)
|
|
53
|
-
connect_timeout: float = 30.0 # Connection timeout
|
|
54
|
-
read_timeout: float = 60.0 # Read timeout
|
|
55
|
-
total_timeout: float = 300.0 # Total request timeout
|
|
56
|
-
|
|
57
|
-
# Retry settings
|
|
58
|
-
max_retries: int = 3 # Maximum retry attempts
|
|
59
|
-
retry_backoff_factor: float = 2.0 # Exponential backoff factor
|
|
60
|
-
retry_max_delay: float = 60.0 # Maximum retry delay
|
|
61
|
-
|
|
62
|
-
# Size limits
|
|
63
|
-
max_response_size_mb: float = 100.0 # Maximum response size
|
|
64
|
-
max_request_size_mb: float = 50.0 # Maximum request size
|
|
65
|
-
|
|
66
|
-
# Connection pool settings
|
|
67
|
-
max_connections: int = 100 # Maximum connections in pool
|
|
68
|
-
max_keepalive_connections: int = 20 # Maximum keep-alive connections
|
|
69
|
-
|
|
9
|
+
from __future__ import annotations
|
|
70
10
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
"""Configuration limits for security operations."""
|
|
74
|
-
|
|
75
|
-
# Path validation
|
|
76
|
-
allow_absolute_paths: bool = False # Allow absolute paths
|
|
77
|
-
allow_symlinks: bool = False # Allow symbolic links
|
|
78
|
-
blocked_extensions: tuple = field(default_factory=lambda: (
|
|
79
|
-
'.exe', '.bat', '.cmd', '.com', '.scr', '.dll', '.sys'
|
|
80
|
-
))
|
|
81
|
-
|
|
82
|
-
# Input validation
|
|
83
|
-
max_input_complexity: int = 1000 # Maximum input complexity score
|
|
84
|
-
enable_xss_protection: bool = True # Enable XSS protection
|
|
85
|
-
enable_injection_protection: bool = True # Enable injection protection
|
|
86
|
-
|
|
87
|
-
# Cryptography settings
|
|
88
|
-
min_key_size: int = 2048 # Minimum key size for RSA
|
|
89
|
-
hash_iterations: int = 100_000 # PBKDF2 iterations
|
|
90
|
-
salt_length: int = 32 # Salt length in bytes
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
import os
|
|
91
13
|
|
|
92
14
|
|
|
93
15
|
@dataclass
|
|
94
|
-
class PerformanceLimits:
|
|
95
|
-
"""Master configuration for all XSystem performance limits."""
|
|
96
|
-
|
|
97
|
-
# Component-specific limits
|
|
98
|
-
serialization: SerializationLimits = field(default_factory=SerializationLimits)
|
|
99
|
-
network: NetworkLimits = field(default_factory=NetworkLimits)
|
|
100
|
-
security: SecurityLimits = field(default_factory=SecurityLimits)
|
|
101
|
-
|
|
102
|
-
# Global settings
|
|
103
|
-
enable_monitoring: bool = True # Enable performance monitoring
|
|
104
|
-
enable_metrics: bool = True # Enable metrics collection
|
|
105
|
-
log_performance_warnings: bool = True # Log performance warnings
|
|
106
|
-
|
|
107
|
-
# Memory management
|
|
108
|
-
max_total_memory_mb: float = 500.0 # Maximum total memory usage
|
|
109
|
-
gc_threshold_mb: float = 100.0 # Garbage collection threshold
|
|
110
|
-
|
|
111
|
-
# Concurrency settings
|
|
112
|
-
max_threads: int = 50 # Maximum thread pool size
|
|
113
|
-
max_async_tasks: int = 100 # Maximum async tasks
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
# Default configuration instance
|
|
117
|
-
DEFAULT_LIMITS: Final[PerformanceLimits] = PerformanceLimits()
|
|
118
|
-
|
|
119
|
-
|
|
120
16
|
class PerformanceConfig:
|
|
121
|
-
"""
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if val := os.getenv('XSYSTEM_MIN_KEY_SIZE'):
|
|
173
|
-
self._limits.security.min_key_size = int(val)
|
|
174
|
-
|
|
175
|
-
# Global settings
|
|
176
|
-
if val := os.getenv('XSYSTEM_MAX_MEMORY_MB'):
|
|
177
|
-
self._limits.max_total_memory_mb = float(val)
|
|
178
|
-
|
|
179
|
-
if val := os.getenv('XSYSTEM_MAX_THREADS'):
|
|
180
|
-
self._limits.max_threads = int(val)
|
|
181
|
-
|
|
182
|
-
def _load_from_file(self, config_file: str) -> None:
|
|
183
|
-
"""
|
|
184
|
-
Load configuration from file.
|
|
185
|
-
|
|
186
|
-
Args:
|
|
187
|
-
config_file: Path to configuration file (JSON/YAML/TOML)
|
|
188
|
-
"""
|
|
189
|
-
try:
|
|
190
|
-
config_path = Path(config_file)
|
|
191
|
-
if not config_path.exists():
|
|
192
|
-
logger.warning(f"Configuration file not found: {config_file}")
|
|
193
|
-
return
|
|
194
|
-
|
|
195
|
-
# Import here to avoid circular imports
|
|
196
|
-
from ..io.serialization import JsonSerializer, YamlSerializer, TomlSerializer
|
|
197
|
-
|
|
198
|
-
# Determine format by extension
|
|
199
|
-
if config_path.suffix.lower() in ('.json',):
|
|
200
|
-
serializer = JsonSerializer(validate_paths=False)
|
|
201
|
-
elif config_path.suffix.lower() in ('.yaml', '.yml'):
|
|
202
|
-
serializer = YamlSerializer(validate_paths=False)
|
|
203
|
-
elif config_path.suffix.lower() in ('.toml',):
|
|
204
|
-
serializer = TomlSerializer(validate_paths=False)
|
|
205
|
-
else:
|
|
206
|
-
logger.warning(f"Unsupported config file format: {config_path.suffix}")
|
|
207
|
-
return
|
|
208
|
-
|
|
209
|
-
config_data = serializer.load_file(config_file)
|
|
210
|
-
self._apply_config_data(config_data)
|
|
211
|
-
|
|
212
|
-
logger.info(f"Loaded configuration from: {config_file}")
|
|
213
|
-
|
|
214
|
-
except Exception as e:
|
|
215
|
-
logger.error(f"Failed to load configuration file {config_file}: {e}")
|
|
216
|
-
|
|
217
|
-
def _apply_config_data(self, config_data: dict[str, Any]) -> None:
|
|
218
|
-
"""Apply configuration data to limits."""
|
|
219
|
-
|
|
220
|
-
if 'serialization' in config_data:
|
|
221
|
-
ser_config = config_data['serialization']
|
|
222
|
-
for key, value in ser_config.items():
|
|
223
|
-
if hasattr(self._limits.serialization, key):
|
|
224
|
-
setattr(self._limits.serialization, key, value)
|
|
225
|
-
|
|
226
|
-
if 'network' in config_data:
|
|
227
|
-
net_config = config_data['network']
|
|
228
|
-
for key, value in net_config.items():
|
|
229
|
-
if hasattr(self._limits.network, key):
|
|
230
|
-
setattr(self._limits.network, key, value)
|
|
231
|
-
|
|
232
|
-
if 'security' in config_data:
|
|
233
|
-
sec_config = config_data['security']
|
|
234
|
-
for key, value in sec_config.items():
|
|
235
|
-
if hasattr(self._limits.security, key):
|
|
236
|
-
setattr(self._limits.security, key, value)
|
|
237
|
-
|
|
238
|
-
# Global settings
|
|
239
|
-
for key in ['enable_monitoring', 'enable_metrics', 'max_total_memory_mb', 'max_threads']:
|
|
240
|
-
if key in config_data:
|
|
241
|
-
setattr(self._limits, key, config_data[key])
|
|
242
|
-
|
|
243
|
-
@property
|
|
244
|
-
def limits(self) -> PerformanceLimits:
|
|
245
|
-
"""Get current performance limits."""
|
|
246
|
-
return self._limits
|
|
247
|
-
|
|
248
|
-
def get_serialization_config(self) -> dict[str, Any]:
|
|
249
|
-
"""Get serialization configuration dictionary."""
|
|
250
|
-
return {
|
|
251
|
-
'max_size_mb': self._limits.serialization.max_size_mb,
|
|
252
|
-
'max_depth': self._limits.serialization.max_depth,
|
|
253
|
-
'max_file_size_mb': self._limits.serialization.max_file_size_mb,
|
|
254
|
-
'use_atomic_writes': self._limits.serialization.use_atomic_writes,
|
|
255
|
-
'validate_input': self._limits.serialization.validate_input,
|
|
256
|
-
'validate_paths': self._limits.serialization.validate_paths,
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
def get_network_config(self) -> dict[str, Any]:
|
|
260
|
-
"""Get network configuration dictionary."""
|
|
261
|
-
return {
|
|
262
|
-
'connect_timeout': self._limits.network.connect_timeout,
|
|
263
|
-
'read_timeout': self._limits.network.read_timeout,
|
|
264
|
-
'total_timeout': self._limits.network.total_timeout,
|
|
265
|
-
'max_retries': self._limits.network.max_retries,
|
|
266
|
-
'max_response_size_mb': self._limits.network.max_response_size_mb,
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
def get_security_config(self) -> dict[str, Any]:
|
|
270
|
-
"""Get security configuration dictionary."""
|
|
271
|
-
return {
|
|
272
|
-
'allow_absolute_paths': self._limits.security.allow_absolute_paths,
|
|
273
|
-
'allow_symlinks': self._limits.security.allow_symlinks,
|
|
274
|
-
'blocked_extensions': self._limits.security.blocked_extensions,
|
|
275
|
-
'min_key_size': self._limits.security.min_key_size,
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
def update_limits(self, **kwargs) -> None:
|
|
279
|
-
"""
|
|
280
|
-
Update performance limits at runtime.
|
|
281
|
-
|
|
282
|
-
Args:
|
|
283
|
-
**kwargs: Limit values to update
|
|
284
|
-
"""
|
|
285
|
-
for key, value in kwargs.items():
|
|
286
|
-
if '.' in key:
|
|
287
|
-
# Handle nested attributes like 'serialization.max_size_mb'
|
|
288
|
-
parts = key.split('.')
|
|
289
|
-
obj = self._limits
|
|
290
|
-
for part in parts[:-1]:
|
|
291
|
-
obj = getattr(obj, part)
|
|
292
|
-
setattr(obj, parts[-1], value)
|
|
293
|
-
else:
|
|
294
|
-
# Handle top-level attributes
|
|
295
|
-
if hasattr(self._limits, key):
|
|
296
|
-
setattr(self._limits, key, value)
|
|
297
|
-
|
|
298
|
-
logger.info(f"Updated performance limits: {kwargs}")
|
|
299
|
-
|
|
300
|
-
def set_mode(self, mode: str) -> None:
|
|
301
|
-
"""Set performance mode."""
|
|
302
|
-
self._mode = mode
|
|
303
|
-
logger.info(f"Performance mode set to: {mode}")
|
|
304
|
-
|
|
305
|
-
def get_mode(self) -> str:
|
|
306
|
-
"""Get current performance mode."""
|
|
307
|
-
return self._mode
|
|
308
|
-
|
|
309
|
-
def optimize(self) -> None:
|
|
310
|
-
"""Optimize performance settings based on current mode."""
|
|
311
|
-
if self._mode == "fast":
|
|
312
|
-
# Optimize for speed
|
|
313
|
-
self._limits.serialization.max_size_mb = 100.0
|
|
314
|
-
self._limits.serialization.max_depth = 200
|
|
315
|
-
elif self._mode == "memory_optimized":
|
|
316
|
-
# Optimize for memory
|
|
317
|
-
self._limits.serialization.max_size_mb = 25.0
|
|
318
|
-
self._limits.serialization.max_depth = 50
|
|
319
|
-
else: # balanced
|
|
320
|
-
# Balanced settings
|
|
321
|
-
self._limits.serialization.max_size_mb = 50.0
|
|
322
|
-
self._limits.serialization.max_depth = 100
|
|
323
|
-
|
|
324
|
-
logger.info(f"Performance optimized for mode: {self._mode}")
|
|
325
|
-
|
|
326
|
-
def export_config(self, format: str = 'json') -> dict[str, Any]:
|
|
327
|
-
"""
|
|
328
|
-
Export current configuration.
|
|
329
|
-
|
|
330
|
-
Args:
|
|
331
|
-
format: Export format ('json', 'yaml', 'toml')
|
|
332
|
-
|
|
333
|
-
Returns:
|
|
334
|
-
Configuration dictionary
|
|
335
|
-
"""
|
|
336
|
-
return {
|
|
337
|
-
'serialization': {
|
|
338
|
-
'max_size_mb': self._limits.serialization.max_size_mb,
|
|
339
|
-
'max_depth': self._limits.serialization.max_depth,
|
|
340
|
-
'max_file_size_mb': self._limits.serialization.max_file_size_mb,
|
|
341
|
-
'use_atomic_writes': self._limits.serialization.use_atomic_writes,
|
|
342
|
-
'validate_input': self._limits.serialization.validate_input,
|
|
343
|
-
'validate_paths': self._limits.serialization.validate_paths,
|
|
344
|
-
},
|
|
345
|
-
'network': {
|
|
346
|
-
'connect_timeout': self._limits.network.connect_timeout,
|
|
347
|
-
'read_timeout': self._limits.network.read_timeout,
|
|
348
|
-
'total_timeout': self._limits.network.total_timeout,
|
|
349
|
-
'max_retries': self._limits.network.max_retries,
|
|
350
|
-
'max_response_size_mb': self._limits.network.max_response_size_mb,
|
|
351
|
-
},
|
|
352
|
-
'security': {
|
|
353
|
-
'allow_absolute_paths': self._limits.security.allow_absolute_paths,
|
|
354
|
-
'allow_symlinks': self._limits.security.allow_symlinks,
|
|
355
|
-
'min_key_size': self._limits.security.min_key_size,
|
|
356
|
-
},
|
|
357
|
-
'global': {
|
|
358
|
-
'enable_monitoring': self._limits.enable_monitoring,
|
|
359
|
-
'enable_metrics': self._limits.enable_metrics,
|
|
360
|
-
'max_total_memory_mb': self._limits.max_total_memory_mb,
|
|
361
|
-
'max_threads': self._limits.max_threads,
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
# Global configuration instance
|
|
367
|
-
_global_config: Optional[PerformanceConfig] = None
|
|
17
|
+
"""Configuration for performance optimizations."""
|
|
18
|
+
|
|
19
|
+
# Parallel index building
|
|
20
|
+
enable_parallel_index: bool = True # Auto-enabled for large files
|
|
21
|
+
parallel_index_workers: int | None = None # None = auto (CPU count)
|
|
22
|
+
parallel_index_chunk_size_mb: int = 100 # 100MB chunks
|
|
23
|
+
parallel_index_threshold_mb: int = 200 # Use parallel for files >200MB
|
|
24
|
+
|
|
25
|
+
# Append-only log for atomic updates
|
|
26
|
+
enable_append_log: bool = True # Auto-enabled for large files
|
|
27
|
+
append_log_threshold_mb: int = 100 # Use append-only log for files >100MB
|
|
28
|
+
append_log_compaction_threshold_mb: int = 100 # Compact when log > 100MB
|
|
29
|
+
|
|
30
|
+
# Fallback behavior
|
|
31
|
+
fallback_on_error: bool = True # Fall back to original if optimization fails
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
def from_env(cls) -> PerformanceConfig:
|
|
35
|
+
"""Create config from environment variables."""
|
|
36
|
+
return cls(
|
|
37
|
+
enable_parallel_index=os.getenv("XWSYSTEM_PARALLEL_INDEX", "true").lower() == "true",
|
|
38
|
+
parallel_index_workers=int(os.getenv("XWSYSTEM_PARALLEL_WORKERS", "0")) or None,
|
|
39
|
+
parallel_index_chunk_size_mb=int(os.getenv("XWSYSTEM_CHUNK_SIZE_MB", "100")),
|
|
40
|
+
parallel_index_threshold_mb=int(os.getenv("XWSYSTEM_PARALLEL_THRESHOLD_MB", "200")),
|
|
41
|
+
enable_append_log=os.getenv("XWSYSTEM_APPEND_LOG", "true").lower() == "true",
|
|
42
|
+
append_log_threshold_mb=int(os.getenv("XWSYSTEM_APPEND_LOG_THRESHOLD_MB", "100")),
|
|
43
|
+
append_log_compaction_threshold_mb=int(os.getenv("XWSYSTEM_LOG_THRESHOLD_MB", "100")),
|
|
44
|
+
fallback_on_error=os.getenv("XWSYSTEM_FALLBACK", "true").lower() == "true",
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def conservative(cls) -> PerformanceConfig:
|
|
49
|
+
"""Conservative config (disable optimizations, use originals)."""
|
|
50
|
+
return cls(
|
|
51
|
+
enable_parallel_index=False,
|
|
52
|
+
enable_append_log=False,
|
|
53
|
+
fallback_on_error=True,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
@classmethod
|
|
57
|
+
def aggressive(cls) -> PerformanceConfig:
|
|
58
|
+
"""Aggressive config (enable all optimizations, no fallback)."""
|
|
59
|
+
return cls(
|
|
60
|
+
enable_parallel_index=True,
|
|
61
|
+
enable_append_log=True,
|
|
62
|
+
fallback_on_error=False,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# Global config instance
|
|
67
|
+
_config: PerformanceConfig | None = None
|
|
368
68
|
|
|
369
69
|
|
|
370
70
|
def get_performance_config() -> PerformanceConfig:
|
|
371
|
-
"""Get
|
|
372
|
-
global
|
|
373
|
-
if
|
|
374
|
-
|
|
375
|
-
return
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
def configure_performance(config_file: Optional[str] = None, **kwargs) -> None:
|
|
379
|
-
"""
|
|
380
|
-
Configure global performance settings.
|
|
381
|
-
|
|
382
|
-
Args:
|
|
383
|
-
config_file: Optional configuration file path
|
|
384
|
-
**kwargs: Performance limit overrides
|
|
385
|
-
"""
|
|
386
|
-
global _global_config
|
|
387
|
-
_global_config = PerformanceConfig(config_file)
|
|
388
|
-
|
|
389
|
-
if kwargs:
|
|
390
|
-
_global_config.update_limits(**kwargs)
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
# Convenience functions for getting specific limits
|
|
394
|
-
def get_serialization_limits() -> SerializationLimits:
|
|
395
|
-
"""Get current serialization limits."""
|
|
396
|
-
return get_performance_config().limits.serialization
|
|
71
|
+
"""Get global performance config."""
|
|
72
|
+
global _config
|
|
73
|
+
if _config is None:
|
|
74
|
+
_config = PerformanceConfig.from_env()
|
|
75
|
+
return _config
|
|
397
76
|
|
|
398
77
|
|
|
399
|
-
def
|
|
400
|
-
"""
|
|
401
|
-
|
|
78
|
+
def set_performance_config(config: PerformanceConfig) -> None:
|
|
79
|
+
"""Set global performance config."""
|
|
80
|
+
global _config
|
|
81
|
+
_config = config
|
|
402
82
|
|
|
403
83
|
|
|
404
|
-
|
|
405
|
-
""
|
|
406
|
-
|
|
84
|
+
__all__ = [
|
|
85
|
+
"PerformanceConfig",
|
|
86
|
+
"get_performance_config",
|
|
87
|
+
"set_performance_config",
|
|
88
|
+
]
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/config/performance_modes.py
|
|
1
2
|
"""
|
|
2
3
|
Performance mode definitions for XWSystem framework.
|
|
3
4
|
|
|
@@ -10,18 +11,18 @@ import statistics
|
|
|
10
11
|
import threading
|
|
11
12
|
import time
|
|
12
13
|
from dataclasses import dataclass, field
|
|
13
|
-
from typing import Any, Optional
|
|
14
|
+
from typing import Any, Optional
|
|
14
15
|
from .defs import AdvancedPerformanceMode
|
|
15
16
|
|
|
16
17
|
import psutil
|
|
17
18
|
|
|
18
19
|
|
|
19
|
-
# Use AdvancedPerformanceMode directly as PerformanceMode
|
|
20
|
+
# Use AdvancedPerformanceMode directly as PerformanceMode
|
|
20
21
|
PerformanceMode = AdvancedPerformanceMode
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
class PerformanceModes:
|
|
24
|
-
"""Performance mode constants
|
|
25
|
+
"""Performance mode constants."""
|
|
25
26
|
|
|
26
27
|
FAST = "fast"
|
|
27
28
|
BALANCED = "balanced"
|
|
@@ -54,7 +55,7 @@ class PerformanceProfile:
|
|
|
54
55
|
enable_thread_safety: bool
|
|
55
56
|
lock_timeout: float
|
|
56
57
|
|
|
57
|
-
# Security limits (
|
|
58
|
+
# Security limits (enforced)
|
|
58
59
|
max_depth: int
|
|
59
60
|
max_nodes: int
|
|
60
61
|
max_path_length: int
|
|
@@ -127,7 +128,7 @@ class DualAdaptiveProfile(PerformanceProfile):
|
|
|
127
128
|
deep_dive_sample_rate: int = 1 # Sample every operation in deep-dive
|
|
128
129
|
deep_dive_history_size: int = 1000 # Keep detailed history during deep-dive
|
|
129
130
|
|
|
130
|
-
#
|
|
131
|
+
# Adaptive triggers
|
|
131
132
|
memory_pressure_threshold: float = 0.8 # 80% memory usage triggers deep-dive
|
|
132
133
|
cpu_pressure_threshold: float = 0.7 # 70% CPU usage triggers deep-dive
|
|
133
134
|
performance_degradation_threshold: float = 0.2 # 20% degradation triggers deep-dive
|
|
@@ -343,7 +344,7 @@ class AdaptiveLearningEngine:
|
|
|
343
344
|
if not mode_scores:
|
|
344
345
|
return PerformanceMode.AUTO
|
|
345
346
|
|
|
346
|
-
# Return the
|
|
347
|
+
# Return the highest performing mode
|
|
347
348
|
best_mode_name = max(mode_scores.items(), key=lambda x: x[1])[0]
|
|
348
349
|
return PerformanceMode.from_string(best_mode_name)
|
|
349
350
|
|
|
@@ -590,7 +591,7 @@ class DualPhaseAdaptiveEngine:
|
|
|
590
591
|
if not mode_scores:
|
|
591
592
|
return PerformanceMode.OPTIMIZED
|
|
592
593
|
|
|
593
|
-
# Return the
|
|
594
|
+
# Return the highest performing mode
|
|
594
595
|
best_mode_name = max(mode_scores.items(), key=lambda x: x[1])[0]
|
|
595
596
|
return PerformanceMode.from_string(best_mode_name)
|
|
596
597
|
|
|
@@ -759,7 +760,7 @@ class PerformanceProfiles:
|
|
|
759
760
|
deep_dive_duration=200, # Deep-dive for 200 operations (was 500)
|
|
760
761
|
deep_dive_sample_rate=5, # Sample every 5th operation (was 1)
|
|
761
762
|
deep_dive_history_size=500, # Keep detailed history (was 1000)
|
|
762
|
-
#
|
|
763
|
+
# Adaptive triggers
|
|
763
764
|
memory_pressure_threshold=0.9, # 90% memory usage triggers deep-dive (was 0.8)
|
|
764
765
|
cpu_pressure_threshold=0.8, # 80% CPU usage triggers deep-dive (was 0.7)
|
|
765
766
|
performance_degradation_threshold=0.3, # 30% degradation triggers deep-dive (was 0.2)
|