exonware-xwsystem 0.1.0.1__py3-none-any.whl → 0.1.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- exonware/__init__.py +2 -1
- exonware/conf.py +2 -2
- exonware/xwsystem/__init__.py +115 -43
- exonware/xwsystem/base.py +30 -0
- exonware/xwsystem/caching/__init__.py +39 -13
- exonware/xwsystem/caching/base.py +24 -6
- exonware/xwsystem/caching/bloom_cache.py +2 -2
- exonware/xwsystem/caching/cache_manager.py +2 -1
- exonware/xwsystem/caching/conditional.py +2 -2
- exonware/xwsystem/caching/contracts.py +85 -139
- exonware/xwsystem/caching/decorators.py +6 -19
- exonware/xwsystem/caching/defs.py +2 -1
- exonware/xwsystem/caching/disk_cache.py +2 -1
- exonware/xwsystem/caching/distributed.py +2 -1
- exonware/xwsystem/caching/errors.py +2 -1
- exonware/xwsystem/caching/events.py +110 -27
- exonware/xwsystem/caching/eviction_strategies.py +2 -2
- exonware/xwsystem/caching/external_caching_python.py +701 -0
- exonware/xwsystem/caching/facade.py +253 -0
- exonware/xwsystem/caching/factory.py +300 -0
- exonware/xwsystem/caching/fluent.py +14 -12
- exonware/xwsystem/caching/integrity.py +21 -6
- exonware/xwsystem/caching/lfu_cache.py +2 -1
- exonware/xwsystem/caching/lfu_optimized.py +18 -6
- exonware/xwsystem/caching/lru_cache.py +7 -4
- exonware/xwsystem/caching/memory_bounded.py +2 -2
- exonware/xwsystem/caching/metrics_exporter.py +2 -2
- exonware/xwsystem/caching/observable_cache.py +2 -2
- exonware/xwsystem/caching/pluggable_cache.py +2 -2
- exonware/xwsystem/caching/rate_limiter.py +2 -2
- exonware/xwsystem/caching/read_through.py +2 -2
- exonware/xwsystem/caching/secure_cache.py +81 -28
- exonware/xwsystem/caching/serializable.py +9 -7
- exonware/xwsystem/caching/stats.py +2 -2
- exonware/xwsystem/caching/tagging.py +2 -2
- exonware/xwsystem/caching/ttl_cache.py +4 -3
- exonware/xwsystem/caching/two_tier_cache.py +6 -3
- exonware/xwsystem/caching/utils.py +30 -12
- exonware/xwsystem/caching/validation.py +2 -2
- exonware/xwsystem/caching/warming.py +6 -3
- exonware/xwsystem/caching/write_behind.py +15 -6
- exonware/xwsystem/config/__init__.py +11 -17
- exonware/xwsystem/config/base.py +5 -5
- exonware/xwsystem/config/contracts.py +93 -153
- exonware/xwsystem/config/defaults.py +3 -2
- exonware/xwsystem/config/defs.py +3 -2
- exonware/xwsystem/config/errors.py +2 -5
- exonware/xwsystem/config/logging.py +12 -8
- exonware/xwsystem/config/logging_setup.py +3 -2
- exonware/xwsystem/config/performance.py +1 -46
- exonware/xwsystem/config/performance_modes.py +9 -8
- exonware/xwsystem/config/version_manager.py +1 -0
- exonware/xwsystem/config.py +27 -0
- exonware/xwsystem/console/__init__.py +53 -0
- exonware/xwsystem/console/base.py +133 -0
- exonware/xwsystem/console/cli/__init__.py +61 -0
- exonware/xwsystem/{cli → console/cli}/args.py +27 -24
- exonware/xwsystem/{cli → console/cli}/base.py +18 -87
- exonware/xwsystem/{cli → console/cli}/colors.py +15 -13
- exonware/xwsystem/console/cli/console.py +98 -0
- exonware/xwsystem/{cli → console/cli}/contracts.py +51 -69
- exonware/xwsystem/console/cli/defs.py +87 -0
- exonware/xwsystem/console/cli/encoding.py +69 -0
- exonware/xwsystem/{cli → console/cli}/errors.py +8 -3
- exonware/xwsystem/console/cli/event_logger.py +166 -0
- exonware/xwsystem/{cli → console/cli}/progress.py +25 -21
- exonware/xwsystem/{cli → console/cli}/prompts.py +3 -2
- exonware/xwsystem/{cli → console/cli}/tables.py +27 -24
- exonware/xwsystem/console/contracts.py +113 -0
- exonware/xwsystem/console/defs.py +154 -0
- exonware/xwsystem/console/errors.py +34 -0
- exonware/xwsystem/console/event_logger.py +385 -0
- exonware/xwsystem/console/writer.py +132 -0
- exonware/xwsystem/contracts.py +28 -0
- exonware/xwsystem/data_structures/__init__.py +23 -0
- exonware/xwsystem/data_structures/trie.py +34 -0
- exonware/xwsystem/data_structures/union_find.py +144 -0
- exonware/xwsystem/defs.py +17 -0
- exonware/xwsystem/errors.py +23 -0
- exonware/xwsystem/facade.py +62 -0
- exonware/xwsystem/http_client/__init__.py +22 -1
- exonware/xwsystem/http_client/advanced_client.py +8 -5
- exonware/xwsystem/http_client/base.py +3 -2
- exonware/xwsystem/http_client/client.py +7 -4
- exonware/xwsystem/http_client/contracts.py +42 -56
- exonware/xwsystem/http_client/defs.py +2 -1
- exonware/xwsystem/http_client/errors.py +2 -1
- exonware/xwsystem/http_client/facade.py +156 -0
- exonware/xwsystem/io/__init__.py +22 -3
- exonware/xwsystem/io/archive/__init__.py +8 -2
- exonware/xwsystem/io/archive/archive.py +1 -1
- exonware/xwsystem/io/archive/archive_files.py +4 -7
- exonware/xwsystem/io/archive/archivers.py +120 -10
- exonware/xwsystem/io/archive/base.py +4 -5
- exonware/xwsystem/io/archive/codec_integration.py +1 -2
- exonware/xwsystem/io/archive/compression.py +1 -2
- exonware/xwsystem/io/archive/facade.py +263 -0
- exonware/xwsystem/io/archive/formats/__init__.py +2 -3
- exonware/xwsystem/io/archive/formats/brotli_format.py +20 -7
- exonware/xwsystem/io/archive/formats/lz4_format.py +20 -7
- exonware/xwsystem/io/archive/formats/rar.py +11 -5
- exonware/xwsystem/io/archive/formats/sevenzip.py +12 -6
- exonware/xwsystem/io/archive/formats/squashfs_format.py +1 -2
- exonware/xwsystem/io/archive/formats/tar.py +52 -7
- exonware/xwsystem/io/archive/formats/wim_format.py +11 -5
- exonware/xwsystem/io/archive/formats/zip.py +1 -2
- exonware/xwsystem/io/archive/formats/zpaq_format.py +1 -2
- exonware/xwsystem/io/archive/formats/zstandard.py +20 -7
- exonware/xwsystem/io/base.py +119 -115
- exonware/xwsystem/io/codec/__init__.py +4 -2
- exonware/xwsystem/io/codec/base.py +19 -13
- exonware/xwsystem/io/codec/contracts.py +59 -2
- exonware/xwsystem/io/codec/registry.py +67 -21
- exonware/xwsystem/io/common/__init__.py +1 -1
- exonware/xwsystem/io/common/atomic.py +29 -16
- exonware/xwsystem/io/common/base.py +11 -10
- exonware/xwsystem/io/common/lock.py +6 -5
- exonware/xwsystem/io/common/path_manager.py +2 -1
- exonware/xwsystem/io/common/watcher.py +1 -2
- exonware/xwsystem/io/contracts.py +301 -433
- exonware/xwsystem/io/contracts_1.py +1180 -0
- exonware/xwsystem/io/data_operations.py +19 -20
- exonware/xwsystem/io/defs.py +4 -3
- exonware/xwsystem/io/errors.py +3 -2
- exonware/xwsystem/io/facade.py +87 -61
- exonware/xwsystem/io/file/__init__.py +1 -1
- exonware/xwsystem/io/file/base.py +8 -9
- exonware/xwsystem/io/file/conversion.py +2 -3
- exonware/xwsystem/io/file/file.py +61 -18
- exonware/xwsystem/io/file/paged_source.py +8 -8
- exonware/xwsystem/io/file/paging/__init__.py +1 -2
- exonware/xwsystem/io/file/paging/byte_paging.py +4 -5
- exonware/xwsystem/io/file/paging/line_paging.py +2 -3
- exonware/xwsystem/io/file/paging/record_paging.py +2 -3
- exonware/xwsystem/io/file/paging/registry.py +1 -2
- exonware/xwsystem/io/file/source.py +13 -17
- exonware/xwsystem/io/filesystem/__init__.py +1 -1
- exonware/xwsystem/io/filesystem/base.py +1 -2
- exonware/xwsystem/io/filesystem/local.py +3 -4
- exonware/xwsystem/io/folder/__init__.py +1 -1
- exonware/xwsystem/io/folder/base.py +1 -2
- exonware/xwsystem/io/folder/folder.py +16 -7
- exonware/xwsystem/io/indexing/__init__.py +14 -0
- exonware/xwsystem/io/indexing/facade.py +443 -0
- exonware/xwsystem/io/path_parser.py +98 -0
- exonware/xwsystem/io/serialization/__init__.py +21 -3
- exonware/xwsystem/io/serialization/auto_serializer.py +146 -20
- exonware/xwsystem/io/serialization/base.py +84 -34
- exonware/xwsystem/io/serialization/contracts.py +50 -73
- exonware/xwsystem/io/serialization/defs.py +2 -1
- exonware/xwsystem/io/serialization/errors.py +2 -1
- exonware/xwsystem/io/serialization/flyweight.py +154 -7
- exonware/xwsystem/io/serialization/format_detector.py +15 -14
- exonware/xwsystem/io/serialization/formats/__init__.py +8 -5
- exonware/xwsystem/io/serialization/formats/binary/bson.py +15 -6
- exonware/xwsystem/io/serialization/formats/binary/cbor.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/marshal.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/msgpack.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/pickle.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/plistlib.py +5 -5
- exonware/xwsystem/io/serialization/formats/database/dbm.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/shelve.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/sqlite3.py +7 -7
- exonware/xwsystem/io/serialization/formats/tabular/__init__.py +27 -0
- exonware/xwsystem/io/serialization/formats/tabular/base.py +89 -0
- exonware/xwsystem/io/serialization/formats/tabular/csv.py +319 -0
- exonware/xwsystem/io/serialization/formats/tabular/df.py +249 -0
- exonware/xwsystem/io/serialization/formats/tabular/excel.py +291 -0
- exonware/xwsystem/io/serialization/formats/tabular/googlesheets.py +374 -0
- exonware/xwsystem/io/serialization/formats/text/__init__.py +1 -1
- exonware/xwsystem/io/serialization/formats/text/append_only_log.py +5 -7
- exonware/xwsystem/io/serialization/formats/text/configparser.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/csv.py +7 -5
- exonware/xwsystem/io/serialization/formats/text/formdata.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/json.py +27 -18
- exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
- exonware/xwsystem/io/serialization/formats/text/jsonlines.py +18 -14
- exonware/xwsystem/io/serialization/formats/text/multipart.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/toml.py +8 -6
- exonware/xwsystem/io/serialization/formats/text/xml.py +25 -20
- exonware/xwsystem/io/serialization/formats/text/yaml.py +8 -6
- exonware/xwsystem/io/serialization/parsers/__init__.py +3 -2
- exonware/xwsystem/io/serialization/parsers/base.py +6 -5
- exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +7 -6
- exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +10 -7
- exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +7 -6
- exonware/xwsystem/io/serialization/parsers/orjson_parser.py +11 -8
- exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +13 -9
- exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +10 -7
- exonware/xwsystem/io/serialization/parsers/registry.py +11 -10
- exonware/xwsystem/io/serialization/parsers/standard.py +7 -6
- exonware/xwsystem/io/serialization/parsers/ujson_parser.py +10 -7
- exonware/xwsystem/io/serialization/registry.py +4 -4
- exonware/xwsystem/io/serialization/serializer.py +168 -79
- exonware/xwsystem/io/serialization/universal_options.py +367 -0
- exonware/xwsystem/io/serialization/utils/__init__.py +1 -2
- exonware/xwsystem/io/serialization/utils/path_ops.py +5 -6
- exonware/xwsystem/io/source_reader.py +223 -0
- exonware/xwsystem/io/stream/__init__.py +1 -1
- exonware/xwsystem/io/stream/async_operations.py +61 -14
- exonware/xwsystem/io/stream/base.py +1 -2
- exonware/xwsystem/io/stream/codec_io.py +6 -7
- exonware/xwsystem/ipc/__init__.py +1 -0
- exonware/xwsystem/ipc/async_fabric.py +4 -4
- exonware/xwsystem/ipc/base.py +6 -5
- exonware/xwsystem/ipc/contracts.py +41 -66
- exonware/xwsystem/ipc/defs.py +2 -1
- exonware/xwsystem/ipc/errors.py +2 -1
- exonware/xwsystem/ipc/message_queue.py +5 -2
- exonware/xwsystem/ipc/pipes.py +70 -34
- exonware/xwsystem/ipc/process_manager.py +7 -5
- exonware/xwsystem/ipc/process_pool.py +6 -5
- exonware/xwsystem/ipc/shared_memory.py +64 -11
- exonware/xwsystem/monitoring/__init__.py +7 -0
- exonware/xwsystem/monitoring/base.py +11 -8
- exonware/xwsystem/monitoring/contracts.py +86 -144
- exonware/xwsystem/monitoring/defs.py +2 -1
- exonware/xwsystem/monitoring/error_recovery.py +16 -3
- exonware/xwsystem/monitoring/errors.py +2 -1
- exonware/xwsystem/monitoring/facade.py +183 -0
- exonware/xwsystem/monitoring/memory_monitor.py +1 -0
- exonware/xwsystem/monitoring/metrics.py +1 -0
- exonware/xwsystem/monitoring/performance_manager_generic.py +7 -7
- exonware/xwsystem/monitoring/performance_monitor.py +1 -0
- exonware/xwsystem/monitoring/performance_validator.py +1 -0
- exonware/xwsystem/monitoring/system_monitor.py +6 -5
- exonware/xwsystem/monitoring/tracing.py +18 -16
- exonware/xwsystem/monitoring/tracker.py +2 -1
- exonware/xwsystem/operations/__init__.py +5 -50
- exonware/xwsystem/operations/base.py +3 -44
- exonware/xwsystem/operations/contracts.py +25 -15
- exonware/xwsystem/operations/defs.py +1 -1
- exonware/xwsystem/operations/diff.py +5 -4
- exonware/xwsystem/operations/errors.py +1 -1
- exonware/xwsystem/operations/merge.py +6 -4
- exonware/xwsystem/operations/patch.py +5 -4
- exonware/xwsystem/patterns/__init__.py +1 -0
- exonware/xwsystem/patterns/base.py +2 -1
- exonware/xwsystem/patterns/context_manager.py +2 -1
- exonware/xwsystem/patterns/contracts.py +215 -256
- exonware/xwsystem/patterns/defs.py +2 -1
- exonware/xwsystem/patterns/dynamic_facade.py +1 -0
- exonware/xwsystem/patterns/errors.py +2 -4
- exonware/xwsystem/patterns/handler_factory.py +2 -3
- exonware/xwsystem/patterns/import_registry.py +1 -0
- exonware/xwsystem/patterns/object_pool.py +1 -0
- exonware/xwsystem/patterns/registry.py +4 -43
- exonware/xwsystem/plugins/__init__.py +2 -1
- exonware/xwsystem/plugins/base.py +6 -5
- exonware/xwsystem/plugins/contracts.py +94 -158
- exonware/xwsystem/plugins/defs.py +2 -1
- exonware/xwsystem/plugins/errors.py +2 -1
- exonware/xwsystem/py.typed +3 -0
- exonware/xwsystem/query/__init__.py +36 -0
- exonware/xwsystem/query/contracts.py +56 -0
- exonware/xwsystem/query/errors.py +22 -0
- exonware/xwsystem/query/registry.py +128 -0
- exonware/xwsystem/runtime/__init__.py +2 -1
- exonware/xwsystem/runtime/base.py +4 -3
- exonware/xwsystem/runtime/contracts.py +39 -60
- exonware/xwsystem/runtime/defs.py +2 -1
- exonware/xwsystem/runtime/env.py +11 -9
- exonware/xwsystem/runtime/errors.py +2 -1
- exonware/xwsystem/runtime/reflection.py +3 -2
- exonware/xwsystem/security/__init__.py +68 -11
- exonware/xwsystem/security/audit.py +167 -0
- exonware/xwsystem/security/base.py +121 -24
- exonware/xwsystem/security/contracts.py +91 -146
- exonware/xwsystem/security/crypto.py +17 -16
- exonware/xwsystem/security/defs.py +2 -1
- exonware/xwsystem/security/errors.py +2 -1
- exonware/xwsystem/security/facade.py +321 -0
- exonware/xwsystem/security/file_security.py +330 -0
- exonware/xwsystem/security/hazmat.py +11 -8
- exonware/xwsystem/security/monitor.py +372 -0
- exonware/xwsystem/security/path_validator.py +140 -18
- exonware/xwsystem/security/policy.py +357 -0
- exonware/xwsystem/security/resource_limits.py +1 -0
- exonware/xwsystem/security/validator.py +455 -0
- exonware/xwsystem/shared/__init__.py +14 -1
- exonware/xwsystem/shared/base.py +285 -2
- exonware/xwsystem/shared/contracts.py +415 -126
- exonware/xwsystem/shared/defs.py +2 -1
- exonware/xwsystem/shared/errors.py +2 -2
- exonware/xwsystem/shared/xwobject.py +316 -0
- exonware/xwsystem/structures/__init__.py +1 -0
- exonware/xwsystem/structures/base.py +3 -2
- exonware/xwsystem/structures/circular_detector.py +15 -14
- exonware/xwsystem/structures/contracts.py +53 -76
- exonware/xwsystem/structures/defs.py +2 -1
- exonware/xwsystem/structures/errors.py +2 -1
- exonware/xwsystem/structures/tree_walker.py +2 -1
- exonware/xwsystem/threading/__init__.py +21 -4
- exonware/xwsystem/threading/async_primitives.py +6 -5
- exonware/xwsystem/threading/base.py +3 -2
- exonware/xwsystem/threading/contracts.py +87 -143
- exonware/xwsystem/threading/defs.py +2 -1
- exonware/xwsystem/threading/errors.py +2 -1
- exonware/xwsystem/threading/facade.py +175 -0
- exonware/xwsystem/threading/locks.py +1 -0
- exonware/xwsystem/threading/safe_factory.py +1 -0
- exonware/xwsystem/utils/__init__.py +40 -0
- exonware/xwsystem/utils/base.py +22 -21
- exonware/xwsystem/utils/contracts.py +50 -73
- exonware/xwsystem/utils/dt/__init__.py +19 -3
- exonware/xwsystem/utils/dt/base.py +5 -4
- exonware/xwsystem/utils/dt/contracts.py +22 -29
- exonware/xwsystem/utils/dt/defs.py +2 -1
- exonware/xwsystem/utils/dt/errors.py +2 -5
- exonware/xwsystem/utils/dt/formatting.py +88 -2
- exonware/xwsystem/utils/dt/humanize.py +10 -9
- exonware/xwsystem/utils/dt/parsing.py +56 -5
- exonware/xwsystem/utils/dt/timezone_utils.py +2 -24
- exonware/xwsystem/utils/errors.py +2 -4
- exonware/xwsystem/utils/paths.py +1 -0
- exonware/xwsystem/utils/string.py +49 -0
- exonware/xwsystem/utils/test_runner.py +185 -0
- exonware/xwsystem/utils/utils_contracts.py +2 -1
- exonware/xwsystem/utils/web.py +110 -0
- exonware/xwsystem/validation/__init__.py +25 -1
- exonware/xwsystem/validation/base.py +6 -5
- exonware/xwsystem/validation/contracts.py +29 -41
- exonware/xwsystem/validation/data_validator.py +1 -0
- exonware/xwsystem/validation/declarative.py +11 -8
- exonware/xwsystem/validation/defs.py +2 -1
- exonware/xwsystem/validation/errors.py +2 -1
- exonware/xwsystem/validation/facade.py +198 -0
- exonware/xwsystem/validation/fluent_validator.py +22 -19
- exonware/xwsystem/validation/schema_discovery.py +210 -0
- exonware/xwsystem/validation/type_safety.py +2 -1
- exonware/xwsystem/version.py +2 -2
- {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/METADATA +71 -4
- exonware_xwsystem-0.1.0.3.dist-info/RECORD +337 -0
- exonware/xwsystem/cli/__init__.py +0 -43
- exonware/xwsystem/cli/console.py +0 -113
- exonware/xwsystem/cli/defs.py +0 -134
- exonware/xwsystem/conf.py +0 -44
- exonware/xwsystem/security/auth.py +0 -484
- exonware_xwsystem-0.1.0.1.dist-info/RECORD +0 -284
- {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/WHEEL +0 -0
- {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/threading/defs.py
|
|
2
3
|
#exonware/xwsystem/threading/types.py
|
|
3
4
|
"""
|
|
4
5
|
Company: eXonware.com
|
|
5
6
|
Author: Eng. Muhammad AlShehri
|
|
6
7
|
Email: connect@exonware.com
|
|
7
|
-
Version: 0.1.0.
|
|
8
|
+
Version: 0.1.0.3
|
|
8
9
|
Generation Date: 07-Sep-2025
|
|
9
10
|
|
|
10
11
|
Threading types and enums for XWSystem.
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/threading/errors.py
|
|
1
2
|
#exonware/xwsystem/threading/errors.py
|
|
2
3
|
"""
|
|
3
4
|
Company: eXonware.com
|
|
4
5
|
Author: Eng. Muhammad AlShehri
|
|
5
6
|
Email: connect@exonware.com
|
|
6
|
-
Version: 0.1.0.
|
|
7
|
+
Version: 0.1.0.3
|
|
7
8
|
Generation Date: September 04, 2025
|
|
8
9
|
|
|
9
10
|
Threading module errors - exception classes for threading functionality.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/threading/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
|
+
XWConcurrency - Unified Concurrency Facade
|
|
10
|
+
|
|
11
|
+
Simplified API for threading and concurrency:
|
|
12
|
+
- Thread-safe factories
|
|
13
|
+
- Async primitives
|
|
14
|
+
- Thread pools
|
|
15
|
+
- Process pools
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from typing import Any, Optional, Callable, List
|
|
19
|
+
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
|
|
20
|
+
|
|
21
|
+
from .safe_factory import ThreadSafeFactory, MethodGenerator
|
|
22
|
+
from .async_primitives import (
|
|
23
|
+
AsyncLock,
|
|
24
|
+
AsyncSemaphore,
|
|
25
|
+
AsyncEvent,
|
|
26
|
+
AsyncQueue,
|
|
27
|
+
AsyncCondition,
|
|
28
|
+
AsyncResourcePool,
|
|
29
|
+
)
|
|
30
|
+
from ..config.logging_setup import get_logger
|
|
31
|
+
|
|
32
|
+
logger = get_logger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class XWConcurrency:
|
|
36
|
+
"""
|
|
37
|
+
Unified concurrency facade - simple API for threading operations.
|
|
38
|
+
|
|
39
|
+
Examples:
|
|
40
|
+
>>> # Thread-safe factory
|
|
41
|
+
>>> factory = XWConcurrency.Factory()
|
|
42
|
+
>>> factory.register("handler", MyHandler, thread_safe=True)
|
|
43
|
+
|
|
44
|
+
>>> # Async primitives
|
|
45
|
+
>>> lock = XWConcurrency.Lock()
|
|
46
|
+
>>> queue = XWConcurrency.Queue()
|
|
47
|
+
>>> semaphore = XWConcurrency.Semaphore(5)
|
|
48
|
+
|
|
49
|
+
>>> # Thread pool
|
|
50
|
+
>>> with XWConcurrency.Pool(workers=4) as pool:
|
|
51
|
+
... results = pool.map(process_item, items)
|
|
52
|
+
|
|
53
|
+
>>> # Process pool
|
|
54
|
+
>>> with XWConcurrency.ProcessPool(workers=4) as pool:
|
|
55
|
+
... results = pool.map(cpu_intensive_task, items)
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
class Factory:
|
|
59
|
+
"""Thread-safe factory."""
|
|
60
|
+
|
|
61
|
+
def __init__(self):
|
|
62
|
+
self._factory = ThreadSafeFactory()
|
|
63
|
+
|
|
64
|
+
def register(self, name: str, handler_class: type, thread_safe: bool = True) -> None:
|
|
65
|
+
"""Register handler with factory."""
|
|
66
|
+
# ThreadSafeFactory.register doesn't take thread_safe parameter
|
|
67
|
+
self._factory.register(name, handler_class)
|
|
68
|
+
|
|
69
|
+
def get(self, name: str, *args, **kwargs) -> Any:
|
|
70
|
+
"""Get handler instance."""
|
|
71
|
+
# ThreadSafeFactory uses create() method, not get()
|
|
72
|
+
handler_class = self._factory.get_handler(name)
|
|
73
|
+
if handler_class:
|
|
74
|
+
return handler_class(*args, **kwargs)
|
|
75
|
+
return None
|
|
76
|
+
|
|
77
|
+
@staticmethod
|
|
78
|
+
def Lock() -> AsyncLock:
|
|
79
|
+
"""Create async lock."""
|
|
80
|
+
return AsyncLock()
|
|
81
|
+
|
|
82
|
+
@staticmethod
|
|
83
|
+
def Semaphore(value: int = 1) -> AsyncSemaphore:
|
|
84
|
+
"""Create async semaphore."""
|
|
85
|
+
return AsyncSemaphore(value)
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def Event() -> AsyncEvent:
|
|
89
|
+
"""Create async event."""
|
|
90
|
+
return AsyncEvent()
|
|
91
|
+
|
|
92
|
+
@staticmethod
|
|
93
|
+
def Queue(maxsize: int = 0) -> AsyncQueue:
|
|
94
|
+
"""Create async queue."""
|
|
95
|
+
return AsyncQueue(maxsize)
|
|
96
|
+
|
|
97
|
+
@staticmethod
|
|
98
|
+
def Condition(lock: Optional[AsyncLock] = None) -> AsyncCondition:
|
|
99
|
+
"""Create async condition."""
|
|
100
|
+
return AsyncCondition(lock)
|
|
101
|
+
|
|
102
|
+
@staticmethod
|
|
103
|
+
def ResourcePool(factory: Callable, max_size: int = 10) -> AsyncResourcePool:
|
|
104
|
+
"""Create async resource pool."""
|
|
105
|
+
return AsyncResourcePool(factory, max_size)
|
|
106
|
+
|
|
107
|
+
class Pool:
|
|
108
|
+
"""Thread pool executor."""
|
|
109
|
+
|
|
110
|
+
def __init__(self, workers: int = 4):
|
|
111
|
+
"""
|
|
112
|
+
Initialize thread pool.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
workers: Number of worker threads
|
|
116
|
+
"""
|
|
117
|
+
self.workers = workers
|
|
118
|
+
self._pool: Optional[ThreadPoolExecutor] = None
|
|
119
|
+
|
|
120
|
+
def __enter__(self):
|
|
121
|
+
"""Context manager entry."""
|
|
122
|
+
self._pool = ThreadPoolExecutor(max_workers=self.workers)
|
|
123
|
+
return self
|
|
124
|
+
|
|
125
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
126
|
+
"""Context manager exit."""
|
|
127
|
+
if self._pool:
|
|
128
|
+
self._pool.shutdown(wait=True)
|
|
129
|
+
|
|
130
|
+
def map(self, func: Callable, items: List[Any]) -> List[Any]:
|
|
131
|
+
"""Map function over items using thread pool."""
|
|
132
|
+
if not self._pool:
|
|
133
|
+
raise RuntimeError("Pool not started. Use as context manager.")
|
|
134
|
+
return list(self._pool.map(func, items))
|
|
135
|
+
|
|
136
|
+
def submit(self, func: Callable, *args, **kwargs):
|
|
137
|
+
"""Submit task to thread pool."""
|
|
138
|
+
if not self._pool:
|
|
139
|
+
raise RuntimeError("Pool not started. Use as context manager.")
|
|
140
|
+
return self._pool.submit(func, *args, **kwargs)
|
|
141
|
+
|
|
142
|
+
class ProcessPool:
|
|
143
|
+
"""Process pool executor."""
|
|
144
|
+
|
|
145
|
+
def __init__(self, workers: int = 4):
|
|
146
|
+
"""
|
|
147
|
+
Initialize process pool.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
workers: Number of worker processes
|
|
151
|
+
"""
|
|
152
|
+
self.workers = workers
|
|
153
|
+
self._pool: Optional[ProcessPoolExecutor] = None
|
|
154
|
+
|
|
155
|
+
def __enter__(self):
|
|
156
|
+
"""Context manager entry."""
|
|
157
|
+
self._pool = ProcessPoolExecutor(max_workers=self.workers)
|
|
158
|
+
return self
|
|
159
|
+
|
|
160
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
161
|
+
"""Context manager exit."""
|
|
162
|
+
if self._pool:
|
|
163
|
+
self._pool.shutdown(wait=True)
|
|
164
|
+
|
|
165
|
+
def map(self, func: Callable, items: List[Any]) -> List[Any]:
|
|
166
|
+
"""Map function over items using process pool."""
|
|
167
|
+
if not self._pool:
|
|
168
|
+
raise RuntimeError("Pool not started. Use as context manager.")
|
|
169
|
+
return list(self._pool.map(func, items))
|
|
170
|
+
|
|
171
|
+
def submit(self, func: Callable, *args, **kwargs):
|
|
172
|
+
"""Submit task to process pool."""
|
|
173
|
+
if not self._pool:
|
|
174
|
+
raise RuntimeError("Pool not started. Use as context manager.")
|
|
175
|
+
return self._pool.submit(func, *args, **kwargs)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
#exonware/xwsystem/src/exonware/xwsystem/utils/__init__.py
|
|
4
|
+
|
|
5
|
+
Utilities package for xwsystem.
|
|
6
|
+
|
|
7
|
+
Company: eXonware.com
|
|
8
|
+
Author: Eng. Muhammad AlShehri
|
|
9
|
+
Email: connect@exonware.com
|
|
10
|
+
Version: 0.1.0.3
|
|
11
|
+
Generation Date: 28-Dec-2025
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# String utilities
|
|
15
|
+
from .string import find_nth_occurrence
|
|
16
|
+
|
|
17
|
+
# Web utilities
|
|
18
|
+
from .web import validate_url_accessible, extract_webpage_text
|
|
19
|
+
|
|
20
|
+
# DateTime utilities (re-export from dt submodule)
|
|
21
|
+
from .dt import (
|
|
22
|
+
get_datetime, get_date, get_date_from_to_month, calculate_duration_days,
|
|
23
|
+
parse_timestamp_milliseconds
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
# String utilities
|
|
28
|
+
'find_nth_occurrence',
|
|
29
|
+
|
|
30
|
+
# Web utilities
|
|
31
|
+
'validate_url_accessible',
|
|
32
|
+
'extract_webpage_text',
|
|
33
|
+
|
|
34
|
+
# DateTime utilities
|
|
35
|
+
'get_datetime',
|
|
36
|
+
'get_date',
|
|
37
|
+
'get_date_from_to_month',
|
|
38
|
+
'calculate_duration_days',
|
|
39
|
+
'parse_timestamp_milliseconds',
|
|
40
|
+
]
|
exonware/xwsystem/utils/base.py
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/utils/base.py
|
|
1
2
|
#exonware/xwsystem/utils/base.py
|
|
2
3
|
"""
|
|
3
4
|
Company: eXonware.com
|
|
4
5
|
Author: Eng. Muhammad AlShehri
|
|
5
6
|
Email: connect@exonware.com
|
|
6
|
-
Version: 0.1.0.
|
|
7
|
+
Version: 0.1.0.3
|
|
7
8
|
Generation Date: September 04, 2025
|
|
8
9
|
|
|
9
10
|
Utils module base classes - abstract classes for utility functionality.
|
|
10
11
|
"""
|
|
11
12
|
|
|
12
13
|
from abc import ABC, abstractmethod
|
|
13
|
-
from typing import Any, Optional,
|
|
14
|
+
from typing import Any, Optional, Callable
|
|
14
15
|
# Root cause: Migrating to Python 3.12 built-in generic syntax for consistency
|
|
15
16
|
# Priority #3: Maintainability - Modern type annotations improve code clarity
|
|
16
17
|
from pathlib import Path
|
|
@@ -93,92 +94,92 @@ class APathUtilsBase(ABC):
|
|
|
93
94
|
self._normalized_paths: dict[str, str] = {}
|
|
94
95
|
|
|
95
96
|
@abstractmethod
|
|
96
|
-
def normalize_path(self, path:
|
|
97
|
+
def normalize_path(self, path: str | Path) -> Path:
|
|
97
98
|
"""Normalize file path."""
|
|
98
99
|
pass
|
|
99
100
|
|
|
100
101
|
@abstractmethod
|
|
101
|
-
def resolve_path(self, path:
|
|
102
|
+
def resolve_path(self, path: str | Path) -> Path:
|
|
102
103
|
"""Resolve file path."""
|
|
103
104
|
pass
|
|
104
105
|
|
|
105
106
|
@abstractmethod
|
|
106
|
-
def absolute_path(self, path:
|
|
107
|
+
def absolute_path(self, path: str | Path) -> Path:
|
|
107
108
|
"""Get absolute path."""
|
|
108
109
|
pass
|
|
109
110
|
|
|
110
111
|
@abstractmethod
|
|
111
|
-
def relative_path(self, path:
|
|
112
|
+
def relative_path(self, path: str | Path, start: Optional[str | Path] = None) -> Path:
|
|
112
113
|
"""Get relative path."""
|
|
113
114
|
pass
|
|
114
115
|
|
|
115
116
|
@abstractmethod
|
|
116
|
-
def join_paths(self, *paths:
|
|
117
|
+
def join_paths(self, *paths: str | Path) -> Path:
|
|
117
118
|
"""Join multiple paths."""
|
|
118
119
|
pass
|
|
119
120
|
|
|
120
121
|
@abstractmethod
|
|
121
|
-
def split_path(self, path:
|
|
122
|
+
def split_path(self, path: str | Path) -> tuple[Path, str]:
|
|
122
123
|
"""Split path into directory and filename."""
|
|
123
124
|
pass
|
|
124
125
|
|
|
125
126
|
@abstractmethod
|
|
126
|
-
def get_extension(self, path:
|
|
127
|
+
def get_extension(self, path: str | Path) -> str:
|
|
127
128
|
"""Get file extension."""
|
|
128
129
|
pass
|
|
129
130
|
|
|
130
131
|
@abstractmethod
|
|
131
|
-
def get_stem(self, path:
|
|
132
|
+
def get_stem(self, path: str | Path) -> str:
|
|
132
133
|
"""Get file stem."""
|
|
133
134
|
pass
|
|
134
135
|
|
|
135
136
|
@abstractmethod
|
|
136
|
-
def get_name(self, path:
|
|
137
|
+
def get_name(self, path: str | Path) -> str:
|
|
137
138
|
"""Get file/directory name."""
|
|
138
139
|
pass
|
|
139
140
|
|
|
140
141
|
@abstractmethod
|
|
141
|
-
def get_parent(self, path:
|
|
142
|
+
def get_parent(self, path: str | Path) -> Path:
|
|
142
143
|
"""Get parent directory."""
|
|
143
144
|
pass
|
|
144
145
|
|
|
145
146
|
@abstractmethod
|
|
146
|
-
def is_absolute(self, path:
|
|
147
|
+
def is_absolute(self, path: str | Path) -> bool:
|
|
147
148
|
"""Check if path is absolute."""
|
|
148
149
|
pass
|
|
149
150
|
|
|
150
151
|
@abstractmethod
|
|
151
|
-
def is_relative(self, path:
|
|
152
|
+
def is_relative(self, path: str | Path) -> bool:
|
|
152
153
|
"""Check if path is relative."""
|
|
153
154
|
pass
|
|
154
155
|
|
|
155
156
|
@abstractmethod
|
|
156
|
-
def exists(self, path:
|
|
157
|
+
def exists(self, path: str | Path) -> bool:
|
|
157
158
|
"""Check if path exists."""
|
|
158
159
|
pass
|
|
159
160
|
|
|
160
161
|
@abstractmethod
|
|
161
|
-
def is_file(self, path:
|
|
162
|
+
def is_file(self, path: str | Path) -> bool:
|
|
162
163
|
"""Check if path is file."""
|
|
163
164
|
pass
|
|
164
165
|
|
|
165
166
|
@abstractmethod
|
|
166
|
-
def is_directory(self, path:
|
|
167
|
+
def is_directory(self, path: str | Path) -> bool:
|
|
167
168
|
"""Check if path is directory."""
|
|
168
169
|
pass
|
|
169
170
|
|
|
170
171
|
@abstractmethod
|
|
171
|
-
def get_size(self, path:
|
|
172
|
+
def get_size(self, path: str | Path) -> int:
|
|
172
173
|
"""Get path size."""
|
|
173
174
|
pass
|
|
174
175
|
|
|
175
176
|
@abstractmethod
|
|
176
|
-
def get_modified_time(self, path:
|
|
177
|
+
def get_modified_time(self, path: str | Path) -> float:
|
|
177
178
|
"""Get path modification time."""
|
|
178
179
|
pass
|
|
179
180
|
|
|
180
181
|
@abstractmethod
|
|
181
|
-
def sanitize_path(self, path:
|
|
182
|
+
def sanitize_path(self, path: str | Path) -> str:
|
|
182
183
|
"""Sanitize path for security."""
|
|
183
184
|
pass
|
|
184
185
|
|
|
@@ -269,7 +270,7 @@ class AConfigManagerBase(ABC):
|
|
|
269
270
|
pass
|
|
270
271
|
|
|
271
272
|
@abstractmethod
|
|
272
|
-
def save_config(self, config_name: str, file_path:
|
|
273
|
+
def save_config(self, config_name: str, file_path: str | Path) -> None:
|
|
273
274
|
"""Save configuration to file."""
|
|
274
275
|
pass
|
|
275
276
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/utils/contracts.py
|
|
1
2
|
"""
|
|
2
3
|
Company: eXonware.com
|
|
3
4
|
Author: Eng. Muhammad AlShehri
|
|
4
5
|
Email: connect@exonware.com
|
|
5
|
-
Version: 0.1.0.
|
|
6
|
+
Version: 0.1.0.3
|
|
6
7
|
Generation Date: September 04, 2025
|
|
7
8
|
|
|
8
9
|
Utils module contracts - interfaces and enums for utility functionality.
|
|
9
10
|
"""
|
|
10
11
|
|
|
11
|
-
from
|
|
12
|
-
from typing import Any, Optional, Union, Callable
|
|
12
|
+
from typing import Any, Optional, Callable, Protocol, runtime_checkable
|
|
13
13
|
# Root cause: Migrating to Python 3.12 built-in generic syntax for consistency
|
|
14
14
|
# Priority #3: Maintainability - Modern type annotations improve code clarity
|
|
15
15
|
from pathlib import Path
|
|
@@ -24,161 +24,138 @@ from .defs import (
|
|
|
24
24
|
)
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
@runtime_checkable
|
|
28
|
+
class ILazyLoader[T](Protocol):
|
|
28
29
|
"""Interface for lazy loading operations."""
|
|
29
30
|
|
|
30
|
-
@abstractmethod
|
|
31
31
|
def load(self) -> T:
|
|
32
32
|
"""Load the object."""
|
|
33
|
-
|
|
33
|
+
...
|
|
34
34
|
|
|
35
|
-
@abstractmethod
|
|
36
35
|
def is_loaded(self) -> bool:
|
|
37
36
|
"""Check if object is loaded."""
|
|
38
|
-
|
|
37
|
+
...
|
|
39
38
|
|
|
40
|
-
@abstractmethod
|
|
41
39
|
def unload(self) -> None:
|
|
42
40
|
"""Unload the object."""
|
|
43
|
-
|
|
41
|
+
...
|
|
44
42
|
|
|
45
|
-
@abstractmethod
|
|
46
43
|
def reload(self) -> T:
|
|
47
44
|
"""Reload the object."""
|
|
48
|
-
|
|
45
|
+
...
|
|
49
46
|
|
|
50
|
-
@abstractmethod
|
|
51
47
|
def get_loader_function(self) -> Callable[[], T]:
|
|
52
48
|
"""Get the loader function."""
|
|
53
|
-
|
|
49
|
+
...
|
|
54
50
|
|
|
55
51
|
|
|
56
|
-
|
|
52
|
+
@runtime_checkable
|
|
53
|
+
class IPathUtils(Protocol):
|
|
57
54
|
"""Interface for path utility operations."""
|
|
58
55
|
|
|
59
|
-
|
|
60
|
-
def normalize_path(self, path: Union[str, Path]) -> Path:
|
|
56
|
+
def normalize_path(self, path: str | Path) -> Path:
|
|
61
57
|
"""Normalize path."""
|
|
62
|
-
|
|
58
|
+
...
|
|
63
59
|
|
|
64
|
-
|
|
65
|
-
def resolve_path(self, path: Union[str, Path]) -> Path:
|
|
60
|
+
def resolve_path(self, path: str | Path) -> Path:
|
|
66
61
|
"""Resolve path to absolute."""
|
|
67
|
-
|
|
62
|
+
...
|
|
68
63
|
|
|
69
|
-
|
|
70
|
-
def get_path_type(self, path: Union[str, Path]) -> PathType:
|
|
64
|
+
def get_path_type(self, path: str | Path) -> PathType:
|
|
71
65
|
"""Get path type."""
|
|
72
|
-
|
|
66
|
+
...
|
|
73
67
|
|
|
74
|
-
|
|
75
|
-
def is_safe_path(self, path: Union[str, Path]) -> bool:
|
|
68
|
+
def is_safe_path(self, path: str | Path) -> bool:
|
|
76
69
|
"""Check if path is safe."""
|
|
77
|
-
|
|
70
|
+
...
|
|
78
71
|
|
|
79
|
-
|
|
80
|
-
def sanitize_path(self, path: Union[str, Path]) -> Path:
|
|
72
|
+
def sanitize_path(self, path: str | Path) -> Path:
|
|
81
73
|
"""Sanitize path."""
|
|
82
|
-
|
|
74
|
+
...
|
|
83
75
|
|
|
84
|
-
|
|
85
|
-
def get_relative_path(self, path: Union[str, Path], base: Union[str, Path]) -> Path:
|
|
76
|
+
def get_relative_path(self, path: str | Path, base: str | Path) -> Path:
|
|
86
77
|
"""Get relative path."""
|
|
87
|
-
|
|
78
|
+
...
|
|
88
79
|
|
|
89
|
-
|
|
90
|
-
def ensure_path_exists(self, path: Union[str, Path]) -> None:
|
|
80
|
+
def ensure_path_exists(self, path: str | Path) -> None:
|
|
91
81
|
"""Ensure path exists."""
|
|
92
|
-
|
|
82
|
+
...
|
|
93
83
|
|
|
94
84
|
|
|
95
|
-
|
|
85
|
+
@runtime_checkable
|
|
86
|
+
class IUtilityRegistry(Protocol):
|
|
96
87
|
"""Interface for utility registry operations."""
|
|
97
88
|
|
|
98
|
-
@abstractmethod
|
|
99
89
|
def register_utility(self, name: str, utility: Any) -> None:
|
|
100
90
|
"""Register utility."""
|
|
101
|
-
|
|
91
|
+
...
|
|
102
92
|
|
|
103
|
-
@abstractmethod
|
|
104
93
|
def get_utility(self, name: str) -> Optional[Any]:
|
|
105
94
|
"""Get utility by name."""
|
|
106
|
-
|
|
95
|
+
...
|
|
107
96
|
|
|
108
|
-
@abstractmethod
|
|
109
97
|
def unregister_utility(self, name: str) -> None:
|
|
110
98
|
"""Unregister utility."""
|
|
111
|
-
|
|
99
|
+
...
|
|
112
100
|
|
|
113
|
-
@abstractmethod
|
|
114
101
|
def list_utilities(self) -> list[str]:
|
|
115
102
|
"""List all registered utilities."""
|
|
116
|
-
|
|
103
|
+
...
|
|
117
104
|
|
|
118
|
-
@abstractmethod
|
|
119
105
|
def has_utility(self, name: str) -> bool:
|
|
120
106
|
"""Check if utility is registered."""
|
|
121
|
-
|
|
107
|
+
...
|
|
122
108
|
|
|
123
109
|
|
|
124
|
-
|
|
110
|
+
@runtime_checkable
|
|
111
|
+
class IConfigManager(Protocol):
|
|
125
112
|
"""Interface for configuration management."""
|
|
126
113
|
|
|
127
|
-
@abstractmethod
|
|
128
114
|
def get_config(self, key: str, default: Optional[Any] = None) -> Any:
|
|
129
115
|
"""Get configuration value."""
|
|
130
|
-
|
|
116
|
+
...
|
|
131
117
|
|
|
132
|
-
@abstractmethod
|
|
133
118
|
def set_config(self, key: str, value: Any) -> None:
|
|
134
119
|
"""Set configuration value."""
|
|
135
|
-
|
|
120
|
+
...
|
|
136
121
|
|
|
137
|
-
|
|
138
|
-
def load_config(self, source: Union[str, Path, dict[str, Any]]) -> None:
|
|
122
|
+
def load_config(self, source: str | Path | dict[str, Any]) -> None:
|
|
139
123
|
"""Load configuration from source."""
|
|
140
|
-
|
|
124
|
+
...
|
|
141
125
|
|
|
142
|
-
|
|
143
|
-
def save_config(self, destination: Union[str, Path]) -> None:
|
|
126
|
+
def save_config(self, destination: str | Path) -> None:
|
|
144
127
|
"""Save configuration to destination."""
|
|
145
|
-
|
|
128
|
+
...
|
|
146
129
|
|
|
147
|
-
@abstractmethod
|
|
148
130
|
def get_all_config(self) -> dict[str, Any]:
|
|
149
131
|
"""Get all configuration."""
|
|
150
|
-
|
|
132
|
+
...
|
|
151
133
|
|
|
152
|
-
@abstractmethod
|
|
153
134
|
def clear_config(self) -> None:
|
|
154
135
|
"""Clear all configuration."""
|
|
155
|
-
|
|
136
|
+
...
|
|
156
137
|
|
|
157
138
|
|
|
158
|
-
|
|
139
|
+
@runtime_checkable
|
|
140
|
+
class IResourceManager(Protocol):
|
|
159
141
|
"""Interface for resource management."""
|
|
160
142
|
|
|
161
|
-
@abstractmethod
|
|
162
143
|
def acquire_resource(self, resource_id: str) -> Any:
|
|
163
144
|
"""Acquire resource."""
|
|
164
|
-
|
|
145
|
+
...
|
|
165
146
|
|
|
166
|
-
@abstractmethod
|
|
167
147
|
def release_resource(self, resource_id: str) -> None:
|
|
168
148
|
"""Release resource."""
|
|
169
|
-
|
|
149
|
+
...
|
|
170
150
|
|
|
171
|
-
@abstractmethod
|
|
172
151
|
def is_resource_available(self, resource_id: str) -> bool:
|
|
173
152
|
"""Check if resource is available."""
|
|
174
|
-
|
|
153
|
+
...
|
|
175
154
|
|
|
176
|
-
@abstractmethod
|
|
177
155
|
def get_resource_count(self) -> int:
|
|
178
156
|
"""Get total resource count."""
|
|
179
|
-
|
|
157
|
+
...
|
|
180
158
|
|
|
181
|
-
@abstractmethod
|
|
182
159
|
def get_available_resources(self) -> list[str]:
|
|
183
160
|
"""Get list of available resources."""
|
|
184
|
-
|
|
161
|
+
...
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/utils/dt/__init__.py
|
|
1
2
|
"""
|
|
2
3
|
DateTime Utilities
|
|
3
4
|
=================
|
|
@@ -7,7 +8,7 @@ Production-grade datetime utilities for XSystem.
|
|
|
7
8
|
Company: eXonware.com
|
|
8
9
|
Author: Eng. Muhammad AlShehri
|
|
9
10
|
Email: connect@exonware.com
|
|
10
|
-
Version: 0.1.0.
|
|
11
|
+
Version: 0.1.0.3
|
|
11
12
|
Generated: 2025-01-27
|
|
12
13
|
"""
|
|
13
14
|
|
|
@@ -15,7 +16,11 @@ from .humanize import (
|
|
|
15
16
|
humanize_timedelta, humanize_timestamp, time_ago, time_until,
|
|
16
17
|
duration_to_human, parse_human_duration
|
|
17
18
|
)
|
|
18
|
-
from .parsing import parse_datetime, parse_date, parse_time, parse_iso8601, parse_timestamp
|
|
19
|
+
from .parsing import parse_datetime, parse_date, parse_time, parse_iso8601, parse_timestamp, parse_timestamp_milliseconds
|
|
20
|
+
from .formatting import (
|
|
21
|
+
format_datetime, format_date, format_time, format_iso8601, format_relative,
|
|
22
|
+
get_datetime, get_date, get_date_from_to_month, calculate_duration_days
|
|
23
|
+
)
|
|
19
24
|
|
|
20
25
|
# Placeholder imports for timezone utilities (not yet implemented)
|
|
21
26
|
class TimezoneManager:
|
|
@@ -53,11 +58,22 @@ __all__ = [
|
|
|
53
58
|
'parse_time',
|
|
54
59
|
'parse_iso8601',
|
|
55
60
|
'parse_timestamp',
|
|
61
|
+
'parse_timestamp_milliseconds',
|
|
62
|
+
|
|
63
|
+
# Formatting
|
|
64
|
+
'format_datetime',
|
|
65
|
+
'format_date',
|
|
66
|
+
'format_time',
|
|
67
|
+
'format_iso8601',
|
|
68
|
+
'format_relative',
|
|
69
|
+
'get_datetime',
|
|
70
|
+
'get_date',
|
|
71
|
+
'get_date_from_to_month',
|
|
72
|
+
'calculate_duration_days',
|
|
56
73
|
|
|
57
74
|
# Timezone (placeholders)
|
|
58
75
|
'TimezoneManager',
|
|
59
76
|
'convert_timezone',
|
|
60
77
|
'get_timezone_info',
|
|
61
78
|
'list_timezones',
|
|
62
|
-
'format_datetime',
|
|
63
79
|
]
|