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,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/stream/async_operations.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
|
Asynchronous I/O operations for non-blocking file handling.
|
|
@@ -10,12 +11,13 @@ Asynchronous I/O operations for non-blocking file handling.
|
|
|
10
11
|
|
|
11
12
|
import asyncio
|
|
12
13
|
import os
|
|
14
|
+
import platform
|
|
13
15
|
import shutil
|
|
14
16
|
import tempfile
|
|
15
17
|
import time
|
|
16
18
|
from contextlib import asynccontextmanager
|
|
17
19
|
from pathlib import Path
|
|
18
|
-
from typing import Any, AsyncContextManager, BinaryIO, Optional, TextIO
|
|
20
|
+
from typing import Any, AsyncContextManager, BinaryIO, Optional, TextIO
|
|
19
21
|
|
|
20
22
|
# Import aiofiles - lazy installation system will handle it if missing
|
|
21
23
|
import aiofiles
|
|
@@ -38,11 +40,11 @@ class AsyncAtomicFileWriter:
|
|
|
38
40
|
|
|
39
41
|
def __init__(
|
|
40
42
|
self,
|
|
41
|
-
target_path:
|
|
43
|
+
target_path: str | Path,
|
|
42
44
|
mode: str = "w",
|
|
43
45
|
encoding: Optional[str] = "utf-8",
|
|
44
46
|
backup: bool = False,
|
|
45
|
-
temp_dir: Optional[
|
|
47
|
+
temp_dir: Optional[str | Path] = None,
|
|
46
48
|
):
|
|
47
49
|
"""
|
|
48
50
|
Initialize async atomic file writer.
|
|
@@ -130,6 +132,51 @@ class AsyncAtomicFileWriter:
|
|
|
130
132
|
await self._cleanup()
|
|
131
133
|
raise FileOperationError(f"Failed to start async atomic write: {e}") from e
|
|
132
134
|
|
|
135
|
+
async def write(self, data: bytes | str) -> int:
|
|
136
|
+
"""
|
|
137
|
+
Write data to the temporary file.
|
|
138
|
+
|
|
139
|
+
Automatically handles conversion between bytes and str based on file mode:
|
|
140
|
+
- Text mode ("w", "w+", etc.): Accepts str or bytes (bytes are decoded with encoding)
|
|
141
|
+
- Binary mode ("wb", "wb+", etc.): Accepts bytes only
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
data: Data to write (bytes or str)
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
Number of bytes/characters written
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
FileOperationError: If write operation not started or write fails
|
|
151
|
+
"""
|
|
152
|
+
if not self._started:
|
|
153
|
+
raise FileOperationError("Async atomic write operation not started. Call start() first.")
|
|
154
|
+
|
|
155
|
+
if not self.file_handle:
|
|
156
|
+
raise FileOperationError("File handle not available")
|
|
157
|
+
|
|
158
|
+
try:
|
|
159
|
+
is_binary_mode = "b" in self.mode
|
|
160
|
+
|
|
161
|
+
if is_binary_mode:
|
|
162
|
+
# Binary mode: must write bytes
|
|
163
|
+
if isinstance(data, str):
|
|
164
|
+
# Convert string to bytes using the encoding if available
|
|
165
|
+
encoding = self.encoding or "utf-8"
|
|
166
|
+
data = data.encode(encoding)
|
|
167
|
+
await self.file_handle.write(data)
|
|
168
|
+
return len(data)
|
|
169
|
+
else:
|
|
170
|
+
# Text mode: write string
|
|
171
|
+
if isinstance(data, bytes):
|
|
172
|
+
# Decode bytes to string using the encoding
|
|
173
|
+
encoding = self.encoding or "utf-8"
|
|
174
|
+
data = data.decode(encoding)
|
|
175
|
+
await self.file_handle.write(data)
|
|
176
|
+
return len(data)
|
|
177
|
+
except Exception as e:
|
|
178
|
+
raise FileOperationError(f"Failed to write data: {e}") from e
|
|
179
|
+
|
|
133
180
|
async def commit(self) -> None:
|
|
134
181
|
"""
|
|
135
182
|
Commit the async atomic write operation.
|
|
@@ -161,8 +208,8 @@ class AsyncAtomicFileWriter:
|
|
|
161
208
|
logger.warning(f"Temporary file is empty: {self.temp_path}")
|
|
162
209
|
|
|
163
210
|
# Atomic move to target location
|
|
164
|
-
# On Windows, need to remove target first if it exists
|
|
165
|
-
if
|
|
211
|
+
# On Windows, need to remove target first if it exists (Windows filesystem limitation)
|
|
212
|
+
if platform.system() == 'Windows' and await aiofiles.os.path.exists(self.target_path):
|
|
166
213
|
await aiofiles.os.remove(self.target_path)
|
|
167
214
|
|
|
168
215
|
# Perform the atomic move (using sync operation as aiofiles doesn't have move)
|
|
@@ -268,11 +315,11 @@ class AsyncAtomicFileWriter:
|
|
|
268
315
|
|
|
269
316
|
@asynccontextmanager
|
|
270
317
|
async def async_atomic_write(
|
|
271
|
-
target_path:
|
|
318
|
+
target_path: str | Path,
|
|
272
319
|
mode: str = "w",
|
|
273
320
|
encoding: Optional[str] = "utf-8",
|
|
274
321
|
backup: bool = True,
|
|
275
|
-
temp_dir: Optional[
|
|
322
|
+
temp_dir: Optional[str | Path] = None,
|
|
276
323
|
) -> AsyncContextManager[Any]:
|
|
277
324
|
"""
|
|
278
325
|
Async context manager for atomic file writing.
|
|
@@ -304,7 +351,7 @@ async def async_atomic_write(
|
|
|
304
351
|
|
|
305
352
|
|
|
306
353
|
async def async_safe_write_text(
|
|
307
|
-
target_path:
|
|
354
|
+
target_path: str | Path,
|
|
308
355
|
content: str,
|
|
309
356
|
encoding: str = "utf-8",
|
|
310
357
|
backup: bool = True,
|
|
@@ -323,7 +370,7 @@ async def async_safe_write_text(
|
|
|
323
370
|
|
|
324
371
|
|
|
325
372
|
async def async_safe_write_bytes(
|
|
326
|
-
target_path:
|
|
373
|
+
target_path: str | Path, content: bytes, backup: bool = True
|
|
327
374
|
) -> None:
|
|
328
375
|
"""
|
|
329
376
|
Safely write binary content to a file atomically (async).
|
|
@@ -338,7 +385,7 @@ async def async_safe_write_bytes(
|
|
|
338
385
|
|
|
339
386
|
|
|
340
387
|
async def async_safe_read_text(
|
|
341
|
-
file_path:
|
|
388
|
+
file_path: str | Path, encoding: str = "utf-8", max_size_mb: float = 100.0
|
|
342
389
|
) -> str:
|
|
343
390
|
"""
|
|
344
391
|
Safely read text content from a file with size validation (async).
|
|
@@ -391,7 +438,7 @@ async def async_safe_read_text(
|
|
|
391
438
|
raise FileOperationError(f"IOError reading file '{file_path}': {e}") from e
|
|
392
439
|
|
|
393
440
|
|
|
394
|
-
async def async_safe_read_bytes(file_path:
|
|
441
|
+
async def async_safe_read_bytes(file_path: str | Path, max_size_mb: float = 100.0) -> bytes:
|
|
395
442
|
"""
|
|
396
443
|
Safely read binary content from a file with size validation (async).
|
|
397
444
|
|
|
@@ -439,7 +486,7 @@ async def async_safe_read_bytes(file_path: Union[str, Path], max_size_mb: float
|
|
|
439
486
|
|
|
440
487
|
|
|
441
488
|
async def async_safe_read_with_fallback(
|
|
442
|
-
file_path:
|
|
489
|
+
file_path: str | Path,
|
|
443
490
|
preferred_encoding: str = "utf-8",
|
|
444
491
|
fallback_encodings: Optional[list[str]] = None,
|
|
445
492
|
max_size_mb: float = 100.0,
|
|
@@ -462,7 +509,7 @@ async def async_safe_read_with_fallback(
|
|
|
462
509
|
if fallback_encodings is None:
|
|
463
510
|
fallback_encodings = ["latin1", "cp1252", "iso-8859-1"]
|
|
464
511
|
|
|
465
|
-
# Try
|
|
512
|
+
# Try encoding first
|
|
466
513
|
try:
|
|
467
514
|
return await async_safe_read_text(file_path, preferred_encoding, max_size_mb)
|
|
468
515
|
except FileOperationError as e:
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
Company: eXonware.com
|
|
5
5
|
Author: Eng. Muhammad AlShehri
|
|
6
6
|
Email: connect@exonware.com
|
|
7
|
-
Version: 0.1.0.
|
|
7
|
+
Version: 0.1.0.3
|
|
8
8
|
Generation Date: 30-Oct-2025
|
|
9
9
|
|
|
10
10
|
Base classes for stream operations.
|
|
@@ -39,4 +39,3 @@ class ACodecIO[T, R](ICodecIO[T, R], ABC):
|
|
|
39
39
|
class APagedCodecIO[T, R](ACodecIO[T, R], IPagedCodecIO[T, R], ABC):
|
|
40
40
|
"""Abstract base for paged codec I/O."""
|
|
41
41
|
pass
|
|
42
|
-
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
Company: eXonware.com
|
|
5
5
|
Author: Eng. Muhammad AlShehri
|
|
6
6
|
Email: connect@exonware.com
|
|
7
|
-
Version: 0.1.0.
|
|
7
|
+
Version: 0.1.0.3
|
|
8
8
|
Generation Date: 30-Oct-2025
|
|
9
9
|
|
|
10
10
|
Codec-integrated I/O - THE KILLER FEATURE!
|
|
@@ -19,7 +19,7 @@ Priority 5 (Extensibility): Works with ANY codec + ANY data source
|
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
21
|
from pathlib import Path
|
|
22
|
-
from typing import
|
|
22
|
+
from typing import Optional, Iterator, Any
|
|
23
23
|
|
|
24
24
|
from ..contracts import ICodecIO, IPagedCodecIO, IDataSource, IPagedDataSource
|
|
25
25
|
|
|
@@ -165,7 +165,7 @@ class CodecIO[T, R](ICodecIO[T, R]):
|
|
|
165
165
|
# Fallback: load full file, update in memory, save
|
|
166
166
|
data = self.load(**opts)
|
|
167
167
|
|
|
168
|
-
# Simple path update (subclasses
|
|
168
|
+
# Simple path update (subclasses override for format-specific logic)
|
|
169
169
|
if isinstance(data, dict) and path.startswith('/'):
|
|
170
170
|
from ..serialization.utils.path_ops import set_value_by_path
|
|
171
171
|
set_value_by_path(data, path, value, create=opts.get('create', False))
|
|
@@ -213,7 +213,7 @@ class CodecIO[T, R](ICodecIO[T, R]):
|
|
|
213
213
|
# Fallback: load full file, extract path
|
|
214
214
|
data = self.load(**opts)
|
|
215
215
|
|
|
216
|
-
# Simple path extraction (subclasses
|
|
216
|
+
# Simple path extraction (subclasses override for format-specific logic)
|
|
217
217
|
if isinstance(data, dict) and path.startswith('/'):
|
|
218
218
|
from ..serialization.utils.path_ops import get_value_by_path
|
|
219
219
|
return get_value_by_path(data, path)
|
|
@@ -224,7 +224,7 @@ class CodecIO[T, R](ICodecIO[T, R]):
|
|
|
224
224
|
)
|
|
225
225
|
|
|
226
226
|
@staticmethod
|
|
227
|
-
def from_file(path:
|
|
227
|
+
def from_file(path: str | Path, mode: str = 'rb', encoding: Optional[str] = None):
|
|
228
228
|
"""
|
|
229
229
|
Create CodecIO with auto-detected codec from file extension.
|
|
230
230
|
|
|
@@ -399,7 +399,7 @@ class PagedCodecIO[T, R](CodecIO[T, R], IPagedCodecIO[T, R]):
|
|
|
399
399
|
self._source.write(combined, **opts)
|
|
400
400
|
|
|
401
401
|
@staticmethod
|
|
402
|
-
def from_file(path:
|
|
402
|
+
def from_file(path: str | Path, mode: str = 'rb', encoding: Optional[str] = None):
|
|
403
403
|
"""
|
|
404
404
|
Create PagedCodecIO with auto-detected codec from file extension.
|
|
405
405
|
|
|
@@ -431,4 +431,3 @@ class PagedCodecIO[T, R](CodecIO[T, R], IPagedCodecIO[T, R]):
|
|
|
431
431
|
source = PagedFileSource(path, mode=mode, encoding=encoding)
|
|
432
432
|
|
|
433
433
|
return PagedCodecIO(codec, source)
|
|
434
|
-
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/ipc/async_fabric.py
|
|
1
2
|
#exonware/xwsystem/ipc/async_fabric.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: 09-Nov-2025
|
|
8
9
|
|
|
9
10
|
Async Process Fabric
|
|
@@ -39,7 +40,7 @@ from .shared_memory import SharedData, SharedMemoryManager
|
|
|
39
40
|
|
|
40
41
|
logger = logging.getLogger("xwsystem.ipc.async_fabric")
|
|
41
42
|
|
|
42
|
-
CallableRef =
|
|
43
|
+
CallableRef = str | Callable[..., Any]
|
|
43
44
|
TaskId = str
|
|
44
45
|
|
|
45
46
|
|
|
@@ -230,7 +231,7 @@ class AsyncProcessFabricSession:
|
|
|
230
231
|
|
|
231
232
|
async def iter_results(
|
|
232
233
|
self,
|
|
233
|
-
task_ids:
|
|
234
|
+
task_ids: TaskId | Sequence[TaskId],
|
|
234
235
|
*,
|
|
235
236
|
timeout: Optional[float] = None,
|
|
236
237
|
) -> AsyncIterator[Any]:
|
|
@@ -355,4 +356,3 @@ class AsyncProcessFabricSession:
|
|
|
355
356
|
def active_tasks(self) -> Sequence[TaskId]:
|
|
356
357
|
"""Return snapshot of currently tracked task IDs."""
|
|
357
358
|
return tuple(self._active_task_ids)
|
|
358
|
-
|
exonware/xwsystem/ipc/base.py
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/ipc/base.py
|
|
1
2
|
#exonware/xwsystem/ipc/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
|
IPC module base classes - abstract classes for inter-process communication functionality.
|
|
10
11
|
"""
|
|
11
12
|
|
|
12
13
|
from abc import ABC, abstractmethod
|
|
13
|
-
from typing import Any, Optional
|
|
14
|
+
from typing import Any, Optional
|
|
14
15
|
from .contracts import MessageType, QueueType, ProcessState, SharedMemoryType
|
|
15
16
|
|
|
16
17
|
|
|
@@ -116,12 +117,12 @@ class APipeBase(ABC):
|
|
|
116
117
|
pass
|
|
117
118
|
|
|
118
119
|
@abstractmethod
|
|
119
|
-
def write(self, data:
|
|
120
|
+
def write(self, data: str | bytes) -> int:
|
|
120
121
|
"""Write data to pipe."""
|
|
121
122
|
pass
|
|
122
123
|
|
|
123
124
|
@abstractmethod
|
|
124
|
-
def read(self, size: Optional[int] = None) ->
|
|
125
|
+
def read(self, size: Optional[int] = None) -> str | bytes:
|
|
125
126
|
"""Read data from pipe."""
|
|
126
127
|
pass
|
|
127
128
|
|
|
@@ -331,7 +332,7 @@ class AProcessPoolBase(ABC):
|
|
|
331
332
|
|
|
332
333
|
class BaseIPC:
|
|
333
334
|
"""
|
|
334
|
-
Base IPC class
|
|
335
|
+
Base IPC class.
|
|
335
336
|
|
|
336
337
|
Provides a simple interface for IPC operations.
|
|
337
338
|
"""
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/ipc/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
|
IPC module contracts - interfaces and enums for inter-process communication.
|
|
9
10
|
"""
|
|
10
11
|
|
|
11
|
-
from
|
|
12
|
-
from typing import Any, Optional, Union, AsyncGenerator, Callable
|
|
12
|
+
from typing import Any, Optional, AsyncGenerator, Callable, Protocol, runtime_checkable
|
|
13
13
|
from multiprocessing import Process
|
|
14
14
|
|
|
15
15
|
# Import enums from types module
|
|
@@ -23,165 +23,140 @@ from .defs import (
|
|
|
23
23
|
)
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
@runtime_checkable
|
|
27
|
+
class IMessageQueue(Protocol):
|
|
27
28
|
"""Interface for message queue operations."""
|
|
28
29
|
|
|
29
|
-
@abstractmethod
|
|
30
30
|
async def put(self, message: Any, message_type: MessageType = MessageType.DATA) -> None:
|
|
31
31
|
"""Put message in queue."""
|
|
32
|
-
|
|
32
|
+
...
|
|
33
33
|
|
|
34
|
-
@abstractmethod
|
|
35
34
|
async def get(self, timeout: Optional[float] = None) -> Any:
|
|
36
35
|
"""Get message from queue."""
|
|
37
|
-
|
|
36
|
+
...
|
|
38
37
|
|
|
39
|
-
@abstractmethod
|
|
40
38
|
async def get_nowait(self) -> Any:
|
|
41
39
|
"""Get message without waiting."""
|
|
42
|
-
|
|
40
|
+
...
|
|
43
41
|
|
|
44
|
-
@abstractmethod
|
|
45
42
|
def empty(self) -> bool:
|
|
46
43
|
"""Check if queue is empty."""
|
|
47
|
-
|
|
44
|
+
...
|
|
48
45
|
|
|
49
|
-
@abstractmethod
|
|
50
46
|
def full(self) -> bool:
|
|
51
47
|
"""Check if queue is full."""
|
|
52
|
-
|
|
48
|
+
...
|
|
53
49
|
|
|
54
|
-
@abstractmethod
|
|
55
50
|
def size(self) -> int:
|
|
56
51
|
"""Get queue size."""
|
|
57
|
-
|
|
52
|
+
...
|
|
58
53
|
|
|
59
54
|
|
|
60
|
-
|
|
55
|
+
@runtime_checkable
|
|
56
|
+
class IPipe(Protocol):
|
|
61
57
|
"""Interface for pipe operations."""
|
|
62
58
|
|
|
63
|
-
@abstractmethod
|
|
64
59
|
async def send(self, data: Any) -> None:
|
|
65
60
|
"""Send data through pipe."""
|
|
66
|
-
|
|
61
|
+
...
|
|
67
62
|
|
|
68
|
-
@abstractmethod
|
|
69
63
|
async def recv(self, timeout: Optional[float] = None) -> Any:
|
|
70
64
|
"""Receive data from pipe."""
|
|
71
|
-
|
|
65
|
+
...
|
|
72
66
|
|
|
73
|
-
@abstractmethod
|
|
74
67
|
async def recv_nowait(self) -> Any:
|
|
75
68
|
"""Receive data without waiting."""
|
|
76
|
-
|
|
69
|
+
...
|
|
77
70
|
|
|
78
|
-
@abstractmethod
|
|
79
71
|
def close(self) -> None:
|
|
80
72
|
"""Close pipe."""
|
|
81
|
-
|
|
73
|
+
...
|
|
82
74
|
|
|
83
|
-
@abstractmethod
|
|
84
75
|
def closed(self) -> bool:
|
|
85
76
|
"""Check if pipe is closed."""
|
|
86
|
-
|
|
77
|
+
...
|
|
87
78
|
|
|
88
79
|
|
|
89
|
-
|
|
80
|
+
@runtime_checkable
|
|
81
|
+
class ISharedMemory(Protocol):
|
|
90
82
|
"""Interface for shared memory operations."""
|
|
91
83
|
|
|
92
|
-
@abstractmethod
|
|
93
84
|
def create(self, name: str, size: int) -> None:
|
|
94
85
|
"""Create shared memory segment."""
|
|
95
|
-
|
|
86
|
+
...
|
|
96
87
|
|
|
97
|
-
@abstractmethod
|
|
98
88
|
def attach(self, name: str) -> None:
|
|
99
89
|
"""Attach to shared memory segment."""
|
|
100
|
-
|
|
90
|
+
...
|
|
101
91
|
|
|
102
|
-
@abstractmethod
|
|
103
92
|
def detach(self) -> None:
|
|
104
93
|
"""Detach from shared memory segment."""
|
|
105
|
-
|
|
94
|
+
...
|
|
106
95
|
|
|
107
|
-
@abstractmethod
|
|
108
96
|
def unlink(self) -> None:
|
|
109
97
|
"""Unlink shared memory segment."""
|
|
110
|
-
|
|
98
|
+
...
|
|
111
99
|
|
|
112
|
-
@abstractmethod
|
|
113
100
|
def read(self, offset: int = 0, size: Optional[int] = None) -> bytes:
|
|
114
101
|
"""Read from shared memory."""
|
|
115
|
-
|
|
102
|
+
...
|
|
116
103
|
|
|
117
|
-
@abstractmethod
|
|
118
104
|
def write(self, data: bytes, offset: int = 0) -> None:
|
|
119
105
|
"""Write to shared memory."""
|
|
120
|
-
|
|
106
|
+
...
|
|
121
107
|
|
|
122
108
|
|
|
123
|
-
|
|
109
|
+
@runtime_checkable
|
|
110
|
+
class IProcessManager(Protocol):
|
|
124
111
|
"""Interface for process management."""
|
|
125
112
|
|
|
126
|
-
@abstractmethod
|
|
127
113
|
def create_process(self, target: Callable, args: tuple = (), kwargs: Optional[dict] = None) -> Process:
|
|
128
114
|
"""Create new process."""
|
|
129
|
-
|
|
115
|
+
...
|
|
130
116
|
|
|
131
|
-
@abstractmethod
|
|
132
117
|
def start_process(self, process: Process) -> None:
|
|
133
118
|
"""Start process."""
|
|
134
|
-
|
|
119
|
+
...
|
|
135
120
|
|
|
136
|
-
@abstractmethod
|
|
137
121
|
def stop_process(self, process: Process, timeout: Optional[float] = None) -> None:
|
|
138
122
|
"""Stop process."""
|
|
139
|
-
|
|
123
|
+
...
|
|
140
124
|
|
|
141
|
-
@abstractmethod
|
|
142
125
|
def get_process_state(self, process: Process) -> ProcessState:
|
|
143
126
|
"""Get process state."""
|
|
144
|
-
|
|
127
|
+
...
|
|
145
128
|
|
|
146
|
-
@abstractmethod
|
|
147
129
|
def is_process_alive(self, process: Process) -> bool:
|
|
148
130
|
"""Check if process is alive."""
|
|
149
|
-
|
|
131
|
+
...
|
|
150
132
|
|
|
151
133
|
|
|
152
|
-
|
|
134
|
+
@runtime_checkable
|
|
135
|
+
class IProcessPool(Protocol):
|
|
153
136
|
"""Interface for process pool operations."""
|
|
154
137
|
|
|
155
|
-
@abstractmethod
|
|
156
138
|
def submit(self, func: Callable, *args, **kwargs) -> Any:
|
|
157
139
|
"""Submit task to pool."""
|
|
158
|
-
|
|
140
|
+
...
|
|
159
141
|
|
|
160
|
-
@abstractmethod
|
|
161
142
|
async def submit_async(self, func: Callable, *args, **kwargs) -> Any:
|
|
162
143
|
"""Submit async task to pool."""
|
|
163
|
-
|
|
144
|
+
...
|
|
164
145
|
|
|
165
|
-
@abstractmethod
|
|
166
146
|
def map(self, func: Callable, iterable: list[Any]) -> list[Any]:
|
|
167
147
|
"""Map function over iterable."""
|
|
168
|
-
|
|
148
|
+
...
|
|
169
149
|
|
|
170
|
-
@abstractmethod
|
|
171
150
|
async def map_async(self, func: Callable, iterable: list[Any]) -> list[Any]:
|
|
172
151
|
"""Map function over iterable asynchronously."""
|
|
173
|
-
|
|
152
|
+
...
|
|
174
153
|
|
|
175
|
-
@abstractmethod
|
|
176
154
|
def close(self) -> None:
|
|
177
155
|
"""Close process pool."""
|
|
178
|
-
|
|
156
|
+
...
|
|
179
157
|
|
|
180
|
-
@abstractmethod
|
|
181
158
|
def join(self) -> None:
|
|
182
159
|
"""Join all processes."""
|
|
183
|
-
|
|
160
|
+
...
|
|
184
161
|
|
|
185
162
|
|
|
186
|
-
# Aliases for backward compatibility
|
|
187
|
-
IPipeManager = IPipe
|
exonware/xwsystem/ipc/defs.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
+
#exonware/xwsystem/src/exonware/xwsystem/ipc/defs.py
|
|
2
3
|
#exonware/xwsystem/ipc/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
|
IPC types and enums for XWSystem.
|
exonware/xwsystem/ipc/errors.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/ipc/errors.py
|
|
1
2
|
#exonware/xwsystem/ipc/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
|
IPC module errors - exception classes for inter-process communication functionality.
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/ipc/message_queue.py
|
|
1
2
|
"""
|
|
2
3
|
Message Queue Utilities
|
|
3
4
|
=======================
|
|
@@ -208,7 +209,8 @@ class MessageQueue[T]:
|
|
|
208
209
|
while not self.empty():
|
|
209
210
|
try:
|
|
210
211
|
self.get_nowait()
|
|
211
|
-
except:
|
|
212
|
+
except queue.Empty:
|
|
213
|
+
# Queue is empty, stop clearing
|
|
212
214
|
break
|
|
213
215
|
|
|
214
216
|
def get_stats(self) -> dict:
|
|
@@ -398,7 +400,8 @@ class AsyncMessageQueue[T]:
|
|
|
398
400
|
while not self.empty():
|
|
399
401
|
try:
|
|
400
402
|
self.get_nowait()
|
|
401
|
-
except:
|
|
403
|
+
except queue.Empty:
|
|
404
|
+
# Queue is empty, stop clearing
|
|
402
405
|
break
|
|
403
406
|
|
|
404
407
|
async def get_stats(self) -> dict:
|