exonware-xwsystem 0.1.0.1__py3-none-any.whl → 0.1.0.4__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.4.dist-info}/METADATA +71 -4
- exonware_xwsystem-0.1.0.4.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.4.dist-info}/WHEEL +0 -0
- {exonware_xwsystem-0.1.0.1.dist-info → exonware_xwsystem-0.1.0.4.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/format_detector.py
|
|
1
2
|
#exonware\xwsystem\serialization\format_detector.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.4
|
|
7
8
|
Generation Date: September 04, 2025
|
|
8
9
|
|
|
9
10
|
Intelligent format detection for automatic serialization format selection.
|
|
@@ -11,7 +12,7 @@ Intelligent format detection for automatic serialization format selection.
|
|
|
11
12
|
|
|
12
13
|
import re
|
|
13
14
|
from pathlib import Path
|
|
14
|
-
from typing import Any, Optional
|
|
15
|
+
from typing import Any, Optional
|
|
15
16
|
|
|
16
17
|
from ...config.logging_setup import get_logger
|
|
17
18
|
|
|
@@ -127,7 +128,7 @@ class FormatDetector:
|
|
|
127
128
|
],
|
|
128
129
|
}
|
|
129
130
|
|
|
130
|
-
def detect_from_extension(self, file_path:
|
|
131
|
+
def detect_from_extension(self, file_path: str | Path) -> list[str]:
|
|
131
132
|
"""
|
|
132
133
|
Detect format from file extension.
|
|
133
134
|
|
|
@@ -164,7 +165,7 @@ class FormatDetector:
|
|
|
164
165
|
|
|
165
166
|
return []
|
|
166
167
|
|
|
167
|
-
def detect_from_content(self, content:
|
|
168
|
+
def detect_from_content(self, content: str | bytes) -> dict[str, float]:
|
|
168
169
|
"""
|
|
169
170
|
Detect format from content analysis with confidence scores.
|
|
170
171
|
|
|
@@ -208,8 +209,8 @@ class FormatDetector:
|
|
|
208
209
|
|
|
209
210
|
def detect_format(
|
|
210
211
|
self,
|
|
211
|
-
file_path: Optional[
|
|
212
|
-
content: Optional[
|
|
212
|
+
file_path: Optional[str | Path] = None,
|
|
213
|
+
content: Optional[str | bytes] = None,
|
|
213
214
|
data: Optional[bytes] = None
|
|
214
215
|
) -> dict[str, float]:
|
|
215
216
|
"""
|
|
@@ -252,8 +253,8 @@ class FormatDetector:
|
|
|
252
253
|
|
|
253
254
|
def get_best_format(
|
|
254
255
|
self,
|
|
255
|
-
file_path: Optional[
|
|
256
|
-
content: Optional[
|
|
256
|
+
file_path: Optional[str | Path] = None,
|
|
257
|
+
content: Optional[str | bytes] = None,
|
|
257
258
|
data: Optional[bytes] = None
|
|
258
259
|
) -> Optional[str]:
|
|
259
260
|
"""
|
|
@@ -283,8 +284,8 @@ class FormatDetector:
|
|
|
283
284
|
|
|
284
285
|
def get_format_suggestions(
|
|
285
286
|
self,
|
|
286
|
-
file_path: Optional[
|
|
287
|
-
content: Optional[
|
|
287
|
+
file_path: Optional[str | Path] = None,
|
|
288
|
+
content: Optional[str | bytes] = None,
|
|
288
289
|
data: Optional[bytes] = None,
|
|
289
290
|
max_suggestions: int = 3
|
|
290
291
|
) -> list[tuple[str, float]]:
|
|
@@ -342,8 +343,8 @@ class FormatDetector:
|
|
|
342
343
|
_global_detector = FormatDetector()
|
|
343
344
|
|
|
344
345
|
def detect_format(
|
|
345
|
-
file_path: Optional[
|
|
346
|
-
content: Optional[
|
|
346
|
+
file_path: Optional[str | Path] = None,
|
|
347
|
+
content: Optional[str | bytes] = None,
|
|
347
348
|
data: Optional[bytes] = None
|
|
348
349
|
) -> Optional[str]:
|
|
349
350
|
"""
|
|
@@ -360,8 +361,8 @@ def detect_format(
|
|
|
360
361
|
return _global_detector.get_best_format(file_path, content, data)
|
|
361
362
|
|
|
362
363
|
def get_format_suggestions(
|
|
363
|
-
file_path: Optional[
|
|
364
|
-
content: Optional[
|
|
364
|
+
file_path: Optional[str | Path] = None,
|
|
365
|
+
content: Optional[str | bytes] = None,
|
|
365
366
|
data: Optional[bytes] = None,
|
|
366
367
|
max_suggestions: int = 3
|
|
367
368
|
) -> list[tuple[str, float]]:
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/__init__.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.4
|
|
6
7
|
Generation Date: November 2, 2025
|
|
7
8
|
|
|
8
|
-
Serialization formats -
|
|
9
|
-
"""
|
|
9
|
+
Serialization formats - Format subpackages.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
Subpackages: .text, .binary, .database, .tabular (pandas). Tabular is not
|
|
12
|
+
imported here so that .text / .binary / .database load without pandas.
|
|
13
|
+
Import tabular explicitly: from ...formats.tabular import ExcelSerializer, ...
|
|
14
|
+
"""
|
|
13
15
|
|
|
16
|
+
__all__: list[str] = []
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/bson.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.4
|
|
6
7
|
Generation Date: November 2, 2025
|
|
7
8
|
|
|
8
9
|
BSON serialization - Binary JSON format (MongoDB).
|
|
@@ -14,7 +15,7 @@ Following I→A pattern:
|
|
|
14
15
|
"""
|
|
15
16
|
|
|
16
17
|
from importlib import import_module
|
|
17
|
-
from typing import Any, Optional
|
|
18
|
+
from typing import Any, Optional
|
|
18
19
|
|
|
19
20
|
from ...base import ASerialization
|
|
20
21
|
from ....contracts import EncodeOptions, DecodeOptions
|
|
@@ -102,7 +103,7 @@ class BsonSerializer(ASerialization):
|
|
|
102
103
|
# CORE ENCODE/DECODE (Using bson library)
|
|
103
104
|
# ========================================================================
|
|
104
105
|
|
|
105
|
-
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) ->
|
|
106
|
+
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
|
|
106
107
|
"""
|
|
107
108
|
Encode data to BSON bytes.
|
|
108
109
|
|
|
@@ -135,7 +136,7 @@ class BsonSerializer(ASerialization):
|
|
|
135
136
|
original_error=e
|
|
136
137
|
)
|
|
137
138
|
|
|
138
|
-
def decode(self, repr:
|
|
139
|
+
def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
|
|
139
140
|
"""
|
|
140
141
|
Decode BSON bytes to data.
|
|
141
142
|
|
|
@@ -146,7 +147,7 @@ class BsonSerializer(ASerialization):
|
|
|
146
147
|
options: BSON options
|
|
147
148
|
|
|
148
149
|
Returns:
|
|
149
|
-
Decoded dict
|
|
150
|
+
Decoded dict or list (if originally a list, unwrapped from {"data": [...]})
|
|
150
151
|
|
|
151
152
|
Raises:
|
|
152
153
|
SerializationError: If decoding fails
|
|
@@ -159,6 +160,13 @@ class BsonSerializer(ASerialization):
|
|
|
159
160
|
# Decode from BSON bytes
|
|
160
161
|
data = self._bson.decode(repr)
|
|
161
162
|
|
|
163
|
+
# BSON only supports dicts, so lists are wrapped as {"data": [...]}
|
|
164
|
+
# Unwrap if we detect this pattern to restore original list structure
|
|
165
|
+
if isinstance(data, dict) and len(data) == 1 and "data" in data:
|
|
166
|
+
value = data["data"]
|
|
167
|
+
if isinstance(value, list):
|
|
168
|
+
return value
|
|
169
|
+
|
|
162
170
|
return data
|
|
163
171
|
|
|
164
172
|
except Exception as e:
|
|
@@ -167,4 +175,5 @@ class BsonSerializer(ASerialization):
|
|
|
167
175
|
format_name=self.format_name,
|
|
168
176
|
original_error=e
|
|
169
177
|
)
|
|
170
|
-
|
|
178
|
+
|
|
179
|
+
# Note: File operations (save_file, load_file) are inherited from ASerialization base class
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/cbor.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.4
|
|
6
7
|
Generation Date: November 2, 2025
|
|
7
8
|
|
|
8
9
|
CBOR serialization - Concise Binary Object Representation.
|
|
@@ -13,7 +14,7 @@ Following I→A pattern:
|
|
|
13
14
|
- Concrete: CborSerializer
|
|
14
15
|
"""
|
|
15
16
|
|
|
16
|
-
from typing import Any, Optional
|
|
17
|
+
from typing import Any, Optional
|
|
17
18
|
from pathlib import Path
|
|
18
19
|
|
|
19
20
|
from ...base import ASerialization
|
|
@@ -103,7 +104,7 @@ class CborSerializer(ASerialization):
|
|
|
103
104
|
# CORE ENCODE/DECODE (Using cbor2 library)
|
|
104
105
|
# ========================================================================
|
|
105
106
|
|
|
106
|
-
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) ->
|
|
107
|
+
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
|
|
107
108
|
"""
|
|
108
109
|
Encode data to CBOR bytes.
|
|
109
110
|
|
|
@@ -138,7 +139,7 @@ class CborSerializer(ASerialization):
|
|
|
138
139
|
original_error=e
|
|
139
140
|
)
|
|
140
141
|
|
|
141
|
-
def decode(self, repr:
|
|
142
|
+
def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
|
|
142
143
|
"""
|
|
143
144
|
Decode CBOR bytes to data.
|
|
144
145
|
|
|
@@ -170,4 +171,3 @@ class CborSerializer(ASerialization):
|
|
|
170
171
|
format_name=self.format_name,
|
|
171
172
|
original_error=e
|
|
172
173
|
)
|
|
173
|
-
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/marshal.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.4
|
|
6
7
|
Generation Date: November 2, 2025
|
|
7
8
|
|
|
8
9
|
Marshal serialization - Python internal serialization.
|
|
@@ -14,7 +15,7 @@ Following I→A pattern:
|
|
|
14
15
|
"""
|
|
15
16
|
|
|
16
17
|
import marshal
|
|
17
|
-
from typing import Any, Optional
|
|
18
|
+
from typing import Any, Optional
|
|
18
19
|
from pathlib import Path
|
|
19
20
|
|
|
20
21
|
from ...base import ASerialization
|
|
@@ -95,7 +96,7 @@ class MarshalSerializer(ASerialization):
|
|
|
95
96
|
# CORE ENCODE/DECODE (Using marshal module)
|
|
96
97
|
# ========================================================================
|
|
97
98
|
|
|
98
|
-
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) ->
|
|
99
|
+
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
|
|
99
100
|
"""
|
|
100
101
|
Encode data to Marshal bytes.
|
|
101
102
|
|
|
@@ -127,7 +128,7 @@ class MarshalSerializer(ASerialization):
|
|
|
127
128
|
original_error=e
|
|
128
129
|
)
|
|
129
130
|
|
|
130
|
-
def decode(self, repr:
|
|
131
|
+
def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
|
|
131
132
|
"""
|
|
132
133
|
Decode Marshal bytes to data.
|
|
133
134
|
|
|
@@ -159,4 +160,3 @@ class MarshalSerializer(ASerialization):
|
|
|
159
160
|
format_name=self.format_name,
|
|
160
161
|
original_error=e
|
|
161
162
|
)
|
|
162
|
-
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/msgpack.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.4
|
|
6
7
|
Generation Date: November 2, 2025
|
|
7
8
|
|
|
8
9
|
MessagePack serialization - Efficient binary serialization.
|
|
@@ -13,7 +14,7 @@ Following I→A pattern:
|
|
|
13
14
|
- Concrete: MsgPackSerializer
|
|
14
15
|
"""
|
|
15
16
|
|
|
16
|
-
from typing import Any, Optional
|
|
17
|
+
from typing import Any, Optional
|
|
17
18
|
from pathlib import Path
|
|
18
19
|
|
|
19
20
|
from ...base import ASerialization
|
|
@@ -109,7 +110,7 @@ class MsgPackSerializer(ASerialization):
|
|
|
109
110
|
# CORE ENCODE/DECODE (Using msgpack library)
|
|
110
111
|
# ========================================================================
|
|
111
112
|
|
|
112
|
-
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) ->
|
|
113
|
+
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
|
|
113
114
|
"""
|
|
114
115
|
Encode data to MessagePack bytes.
|
|
115
116
|
|
|
@@ -145,7 +146,7 @@ class MsgPackSerializer(ASerialization):
|
|
|
145
146
|
original_error=e
|
|
146
147
|
)
|
|
147
148
|
|
|
148
|
-
def decode(self, repr:
|
|
149
|
+
def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
|
|
149
150
|
"""
|
|
150
151
|
Decode MessagePack bytes to data.
|
|
151
152
|
|
|
@@ -184,4 +185,3 @@ class MsgPackSerializer(ASerialization):
|
|
|
184
185
|
format_name=self.format_name,
|
|
185
186
|
original_error=e
|
|
186
187
|
)
|
|
187
|
-
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/pickle.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.4
|
|
6
7
|
Generation Date: November 2, 2025
|
|
7
8
|
|
|
8
9
|
Pickle serialization - Python object serialization.
|
|
@@ -14,7 +15,7 @@ Following I→A pattern:
|
|
|
14
15
|
"""
|
|
15
16
|
|
|
16
17
|
import pickle
|
|
17
|
-
from typing import Any, Optional
|
|
18
|
+
from typing import Any, Optional
|
|
18
19
|
from pathlib import Path
|
|
19
20
|
|
|
20
21
|
from ...base import ASerialization
|
|
@@ -101,7 +102,7 @@ class PickleSerializer(ASerialization):
|
|
|
101
102
|
# CORE ENCODE/DECODE (Using pickle module)
|
|
102
103
|
# ========================================================================
|
|
103
104
|
|
|
104
|
-
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) ->
|
|
105
|
+
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
|
|
105
106
|
"""
|
|
106
107
|
Encode data to Pickle bytes.
|
|
107
108
|
|
|
@@ -136,7 +137,7 @@ class PickleSerializer(ASerialization):
|
|
|
136
137
|
original_error=e
|
|
137
138
|
)
|
|
138
139
|
|
|
139
|
-
def decode(self, repr:
|
|
140
|
+
def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
|
|
140
141
|
"""
|
|
141
142
|
Decode Pickle bytes to data.
|
|
142
143
|
|
|
@@ -177,4 +178,3 @@ class PickleSerializer(ASerialization):
|
|
|
177
178
|
format_name=self.format_name,
|
|
178
179
|
original_error=e
|
|
179
180
|
)
|
|
180
|
-
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/binary/plistlib.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.4
|
|
6
7
|
Generation Date: November 2, 2025
|
|
7
8
|
|
|
8
9
|
Plist serialization - Apple property list format.
|
|
@@ -14,7 +15,7 @@ Following I→A pattern:
|
|
|
14
15
|
"""
|
|
15
16
|
|
|
16
17
|
import plistlib
|
|
17
|
-
from typing import Any, Optional
|
|
18
|
+
from typing import Any, Optional
|
|
18
19
|
from pathlib import Path
|
|
19
20
|
|
|
20
21
|
from ...base import ASerialization
|
|
@@ -98,7 +99,7 @@ class PlistSerializer(ASerialization):
|
|
|
98
99
|
# CORE ENCODE/DECODE (Using plistlib module)
|
|
99
100
|
# ========================================================================
|
|
100
101
|
|
|
101
|
-
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) ->
|
|
102
|
+
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
|
|
102
103
|
"""
|
|
103
104
|
Encode data to Plist bytes.
|
|
104
105
|
|
|
@@ -139,7 +140,7 @@ class PlistSerializer(ASerialization):
|
|
|
139
140
|
original_error=e
|
|
140
141
|
)
|
|
141
142
|
|
|
142
|
-
def decode(self, repr:
|
|
143
|
+
def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
|
|
143
144
|
"""
|
|
144
145
|
Decode Plist bytes to data.
|
|
145
146
|
|
|
@@ -171,4 +172,3 @@ class PlistSerializer(ASerialization):
|
|
|
171
172
|
format_name=self.format_name,
|
|
172
173
|
original_error=e
|
|
173
174
|
)
|
|
174
|
-
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/database/dbm.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.4
|
|
6
7
|
Generation Date: November 2, 2025
|
|
7
8
|
|
|
8
9
|
DBM serialization - Unix database manager.
|
|
@@ -15,7 +16,7 @@ Following I→A pattern:
|
|
|
15
16
|
|
|
16
17
|
import json
|
|
17
18
|
import dbm
|
|
18
|
-
from typing import Any, Optional
|
|
19
|
+
from typing import Any, Optional
|
|
19
20
|
from pathlib import Path
|
|
20
21
|
|
|
21
22
|
from ...base import ASerialization
|
|
@@ -63,11 +64,11 @@ class DbmSerializer(ASerialization):
|
|
|
63
64
|
def aliases(self) -> list[str]:
|
|
64
65
|
return ["dbm", "DBM"]
|
|
65
66
|
|
|
66
|
-
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) ->
|
|
67
|
+
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
|
|
67
68
|
"""DBM encode requires file path - use save_file() instead."""
|
|
68
69
|
raise NotImplementedError("DBM requires file-based operations - use save_file()")
|
|
69
70
|
|
|
70
|
-
def decode(self, repr:
|
|
71
|
+
def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
|
|
71
72
|
"""DBM decode requires file path - use load_file() instead."""
|
|
72
73
|
raise NotImplementedError("DBM requires file-based operations - use load_file()")
|
|
73
74
|
|
|
@@ -75,7 +76,7 @@ class DbmSerializer(ASerialization):
|
|
|
75
76
|
# FILE-BASED OPERATIONS
|
|
76
77
|
# ---------------------------------------------------------------------
|
|
77
78
|
|
|
78
|
-
def save_file(self, data: Any, file_path:
|
|
79
|
+
def save_file(self, data: Any, file_path: str | Path, **options: Any) -> None:
|
|
79
80
|
"""
|
|
80
81
|
Save Python data into a DBM database file.
|
|
81
82
|
|
|
@@ -98,7 +99,7 @@ class DbmSerializer(ASerialization):
|
|
|
98
99
|
original_error=e,
|
|
99
100
|
) from e
|
|
100
101
|
|
|
101
|
-
def load_file(self, file_path:
|
|
102
|
+
def load_file(self, file_path: str | Path, **options: Any) -> Any:
|
|
102
103
|
"""
|
|
103
104
|
Load Python data from a DBM database file.
|
|
104
105
|
|
|
@@ -121,4 +122,3 @@ class DbmSerializer(ASerialization):
|
|
|
121
122
|
format_name=self.format_name,
|
|
122
123
|
original_error=e,
|
|
123
124
|
) from e
|
|
124
|
-
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/database/shelve.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.4
|
|
6
7
|
Generation Date: November 2, 2025
|
|
7
8
|
|
|
8
9
|
Shelve serialization - Persistent dictionary storage.
|
|
@@ -14,7 +15,7 @@ Following I→A pattern:
|
|
|
14
15
|
"""
|
|
15
16
|
|
|
16
17
|
import shelve
|
|
17
|
-
from typing import Any, Optional
|
|
18
|
+
from typing import Any, Optional
|
|
18
19
|
from pathlib import Path
|
|
19
20
|
|
|
20
21
|
from ...base import ASerialization
|
|
@@ -62,11 +63,11 @@ class ShelveSerializer(ASerialization):
|
|
|
62
63
|
def aliases(self) -> list[str]:
|
|
63
64
|
return ["shelve", "Shelve"]
|
|
64
65
|
|
|
65
|
-
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) ->
|
|
66
|
+
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
|
|
66
67
|
"""Shelve encode requires file path - use save_file() instead."""
|
|
67
68
|
raise NotImplementedError("Shelve requires file-based operations - use save_file()")
|
|
68
69
|
|
|
69
|
-
def decode(self, repr:
|
|
70
|
+
def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
|
|
70
71
|
"""Shelve decode requires file path - use load_file() instead."""
|
|
71
72
|
raise NotImplementedError("Shelve requires file-based operations - use load_file()")
|
|
72
73
|
|
|
@@ -74,7 +75,7 @@ class ShelveSerializer(ASerialization):
|
|
|
74
75
|
# FILE-BASED OPERATIONS
|
|
75
76
|
# ---------------------------------------------------------------------
|
|
76
77
|
|
|
77
|
-
def save_file(self, data: Any, file_path:
|
|
78
|
+
def save_file(self, data: Any, file_path: str | Path, **options: Any) -> None:
|
|
78
79
|
"""
|
|
79
80
|
Save Python data into a shelve database file.
|
|
80
81
|
|
|
@@ -94,7 +95,7 @@ class ShelveSerializer(ASerialization):
|
|
|
94
95
|
original_error=e,
|
|
95
96
|
) from e
|
|
96
97
|
|
|
97
|
-
def load_file(self, file_path:
|
|
98
|
+
def load_file(self, file_path: str | Path, **options: Any) -> Any:
|
|
98
99
|
"""
|
|
99
100
|
Load Python data from a shelve database file.
|
|
100
101
|
|
|
@@ -116,4 +117,3 @@ class ShelveSerializer(ASerialization):
|
|
|
116
117
|
format_name=self.format_name,
|
|
117
118
|
original_error=e,
|
|
118
119
|
) from e
|
|
119
|
-
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/database/sqlite3.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.4
|
|
6
7
|
Generation Date: November 2, 2025
|
|
7
8
|
|
|
8
9
|
SQLite3 serialization - Embedded database storage.
|
|
@@ -15,7 +16,7 @@ Following I→A pattern:
|
|
|
15
16
|
|
|
16
17
|
import json
|
|
17
18
|
import sqlite3
|
|
18
|
-
from typing import Any, Optional
|
|
19
|
+
from typing import Any, Optional
|
|
19
20
|
from pathlib import Path
|
|
20
21
|
|
|
21
22
|
from ...base import ASerialization
|
|
@@ -63,11 +64,11 @@ class Sqlite3Serializer(ASerialization):
|
|
|
63
64
|
def aliases(self) -> list[str]:
|
|
64
65
|
return ["sqlite3", "sqlite", "db"]
|
|
65
66
|
|
|
66
|
-
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) ->
|
|
67
|
+
def encode(self, value: Any, *, options: Optional[EncodeOptions] = None) -> bytes | str:
|
|
67
68
|
"""SQLite3 encode requires file path - use save_file() instead."""
|
|
68
69
|
raise NotImplementedError("SQLite3 requires file-based operations - use save_file()")
|
|
69
70
|
|
|
70
|
-
def decode(self, repr:
|
|
71
|
+
def decode(self, repr: bytes | str, *, options: Optional[DecodeOptions] = None) -> Any:
|
|
71
72
|
"""SQLite3 decode requires file path - use load_file() instead."""
|
|
72
73
|
raise NotImplementedError("SQLite3 requires file-based operations - use load_file()")
|
|
73
74
|
|
|
@@ -75,7 +76,7 @@ class Sqlite3Serializer(ASerialization):
|
|
|
75
76
|
# FILE-BASED OPERATIONS (override ASerialization defaults)
|
|
76
77
|
# ---------------------------------------------------------------------
|
|
77
78
|
|
|
78
|
-
def save_file(self, data: Any, file_path:
|
|
79
|
+
def save_file(self, data: Any, file_path: str | Path, **options: Any) -> None:
|
|
79
80
|
"""
|
|
80
81
|
Save Python data into a SQLite3 database file.
|
|
81
82
|
|
|
@@ -119,7 +120,7 @@ class Sqlite3Serializer(ASerialization):
|
|
|
119
120
|
original_error=e,
|
|
120
121
|
) from e
|
|
121
122
|
|
|
122
|
-
def load_file(self, file_path:
|
|
123
|
+
def load_file(self, file_path: str | Path, **options: Any) -> Any:
|
|
123
124
|
"""
|
|
124
125
|
Load Python data from a SQLite3 database file.
|
|
125
126
|
|
|
@@ -153,4 +154,3 @@ class Sqlite3Serializer(ASerialization):
|
|
|
153
154
|
format_name=self.format_name,
|
|
154
155
|
original_error=e,
|
|
155
156
|
) from e
|
|
156
|
-
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/tabular/__init__.py
|
|
2
|
+
"""
|
|
3
|
+
Company: eXonware.com
|
|
4
|
+
Author: Eng. Muhammad AlShehri
|
|
5
|
+
Email: connect@exonware.com
|
|
6
|
+
Version: 0.1.0.4
|
|
7
|
+
Generation Date: January 2025
|
|
8
|
+
|
|
9
|
+
Tabular serialization formats - Excel, CSV, Google Sheets, DataFrame.
|
|
10
|
+
|
|
11
|
+
All tabular formats extend ATabularSerialization which provides
|
|
12
|
+
DataFrame conversion capabilities (to_df/from_df methods).
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from .base import ATabularSerialization
|
|
16
|
+
from .excel import ExcelSerializer
|
|
17
|
+
from .csv import CsvSerializer
|
|
18
|
+
from .googlesheets import GoogleSheetsSerializer
|
|
19
|
+
from .df import DataFrameSerializer
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
'ATabularSerialization',
|
|
23
|
+
'ExcelSerializer',
|
|
24
|
+
'CsvSerializer',
|
|
25
|
+
'GoogleSheetsSerializer',
|
|
26
|
+
'DataFrameSerializer',
|
|
27
|
+
]
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/io/serialization/formats/tabular/base.py
|
|
2
|
+
"""
|
|
3
|
+
Company: eXonware.com
|
|
4
|
+
Author: Eng. Muhammad AlShehri
|
|
5
|
+
Email: connect@exonware.com
|
|
6
|
+
Version: 0.1.0.4
|
|
7
|
+
Generation Date: January 2025
|
|
8
|
+
|
|
9
|
+
Tabular serialization base class - ATabularSerialization.
|
|
10
|
+
|
|
11
|
+
Extends ASerialization to provide DataFrame conversion capabilities.
|
|
12
|
+
All tabular formats (Excel, CSV, Google Sheets, DataFrame) extend this.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from abc import ABC, abstractmethod
|
|
16
|
+
from typing import Optional, Any
|
|
17
|
+
import pandas as pd
|
|
18
|
+
|
|
19
|
+
from ...base import ASerialization
|
|
20
|
+
from ....contracts import EncodeOptions, DecodeOptions
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ATabularSerialization(ASerialization, ABC):
|
|
24
|
+
"""
|
|
25
|
+
Abstract base class for tabular data formats.
|
|
26
|
+
|
|
27
|
+
Extends ASerialization to provide DataFrame conversion capabilities.
|
|
28
|
+
All tabular formats (Excel, CSV, Google Sheets, DataFrame) extend this.
|
|
29
|
+
|
|
30
|
+
Key features:
|
|
31
|
+
- Convert to/from pandas DataFrame(s)
|
|
32
|
+
- Support multiple sheets (returns dict of sheet_name: DataFrame)
|
|
33
|
+
- Integrate with xwsystem serialization framework
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
>>> # Excel serializer
|
|
37
|
+
>>> excel_serializer = ExcelSerializer()
|
|
38
|
+
>>> df = excel_serializer.to_df(excel_bytes)
|
|
39
|
+
>>> excel_bytes = excel_serializer.from_df(df)
|
|
40
|
+
|
|
41
|
+
>>> # CSV serializer
|
|
42
|
+
>>> csv_serializer = CsvSerializer()
|
|
43
|
+
>>> df = csv_serializer.to_df(csv_str)
|
|
44
|
+
>>> csv_str = csv_serializer.from_df(df)
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
@abstractmethod
|
|
48
|
+
def to_df(
|
|
49
|
+
self,
|
|
50
|
+
data: bytes | str | dict,
|
|
51
|
+
sheet_name: Optional[str | list[str]] = None,
|
|
52
|
+
**options
|
|
53
|
+
) -> pd.DataFrame | dict[str, pd.DataFrame]:
|
|
54
|
+
"""
|
|
55
|
+
Convert tabular data to DataFrame(s).
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
data: Input data (bytes, str, or dict depending on format)
|
|
59
|
+
sheet_name: Specific sheet name(s) to load, or None for all sheets
|
|
60
|
+
**options: Format-specific options
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Single DataFrame if one sheet, or dict of {sheet_name: DataFrame} if multiple
|
|
64
|
+
|
|
65
|
+
Raises:
|
|
66
|
+
SerializationError: If conversion fails
|
|
67
|
+
"""
|
|
68
|
+
pass
|
|
69
|
+
|
|
70
|
+
@abstractmethod
|
|
71
|
+
def from_df(
|
|
72
|
+
self,
|
|
73
|
+
df: pd.DataFrame | dict[str, pd.DataFrame],
|
|
74
|
+
**options
|
|
75
|
+
) -> bytes | str:
|
|
76
|
+
"""
|
|
77
|
+
Convert DataFrame(s) to tabular format.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
df: Single DataFrame or dict of {sheet_name: DataFrame}
|
|
81
|
+
**options: Format-specific options
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
Serialized data (bytes for binary formats, str for text formats)
|
|
85
|
+
|
|
86
|
+
Raises:
|
|
87
|
+
SerializationError: If conversion fails
|
|
88
|
+
"""
|
|
89
|
+
pass
|