exonware-xwsystem 0.0.1.411__py3-none-any.whl → 0.1.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- exonware/__init__.py +2 -1
- exonware/conf.py +2 -2
- exonware/xwsystem/__init__.py +115 -43
- exonware/xwsystem/base.py +30 -0
- exonware/xwsystem/caching/__init__.py +39 -13
- exonware/xwsystem/caching/base.py +24 -6
- exonware/xwsystem/caching/bloom_cache.py +2 -2
- exonware/xwsystem/caching/cache_manager.py +2 -1
- exonware/xwsystem/caching/conditional.py +2 -2
- exonware/xwsystem/caching/contracts.py +85 -139
- exonware/xwsystem/caching/decorators.py +6 -19
- exonware/xwsystem/caching/defs.py +2 -1
- exonware/xwsystem/caching/disk_cache.py +2 -1
- exonware/xwsystem/caching/distributed.py +2 -1
- exonware/xwsystem/caching/errors.py +2 -1
- exonware/xwsystem/caching/events.py +110 -27
- exonware/xwsystem/caching/eviction_strategies.py +2 -2
- exonware/xwsystem/caching/external_caching_python.py +701 -0
- exonware/xwsystem/caching/facade.py +253 -0
- exonware/xwsystem/caching/factory.py +300 -0
- exonware/xwsystem/caching/fluent.py +14 -12
- exonware/xwsystem/caching/integrity.py +21 -6
- exonware/xwsystem/caching/lfu_cache.py +2 -1
- exonware/xwsystem/caching/lfu_optimized.py +18 -6
- exonware/xwsystem/caching/lru_cache.py +7 -4
- exonware/xwsystem/caching/memory_bounded.py +2 -2
- exonware/xwsystem/caching/metrics_exporter.py +2 -2
- exonware/xwsystem/caching/observable_cache.py +2 -2
- exonware/xwsystem/caching/pluggable_cache.py +2 -2
- exonware/xwsystem/caching/rate_limiter.py +2 -2
- exonware/xwsystem/caching/read_through.py +2 -2
- exonware/xwsystem/caching/secure_cache.py +81 -28
- exonware/xwsystem/caching/serializable.py +9 -7
- exonware/xwsystem/caching/stats.py +2 -2
- exonware/xwsystem/caching/tagging.py +2 -2
- exonware/xwsystem/caching/ttl_cache.py +4 -3
- exonware/xwsystem/caching/two_tier_cache.py +6 -3
- exonware/xwsystem/caching/utils.py +30 -12
- exonware/xwsystem/caching/validation.py +2 -2
- exonware/xwsystem/caching/warming.py +6 -3
- exonware/xwsystem/caching/write_behind.py +15 -6
- exonware/xwsystem/config/__init__.py +11 -17
- exonware/xwsystem/config/base.py +5 -5
- exonware/xwsystem/config/contracts.py +93 -153
- exonware/xwsystem/config/defaults.py +3 -2
- exonware/xwsystem/config/defs.py +3 -2
- exonware/xwsystem/config/errors.py +2 -5
- exonware/xwsystem/config/logging.py +12 -8
- exonware/xwsystem/config/logging_setup.py +3 -2
- exonware/xwsystem/config/performance.py +73 -391
- exonware/xwsystem/config/performance_modes.py +9 -8
- exonware/xwsystem/config/version_manager.py +1 -0
- exonware/xwsystem/config.py +27 -0
- exonware/xwsystem/console/__init__.py +53 -0
- exonware/xwsystem/console/base.py +133 -0
- exonware/xwsystem/console/cli/__init__.py +61 -0
- exonware/xwsystem/{cli → console/cli}/args.py +27 -24
- exonware/xwsystem/{cli → console/cli}/base.py +18 -87
- exonware/xwsystem/{cli → console/cli}/colors.py +15 -13
- exonware/xwsystem/console/cli/console.py +98 -0
- exonware/xwsystem/{cli → console/cli}/contracts.py +51 -69
- exonware/xwsystem/console/cli/defs.py +87 -0
- exonware/xwsystem/console/cli/encoding.py +69 -0
- exonware/xwsystem/{cli → console/cli}/errors.py +8 -3
- exonware/xwsystem/console/cli/event_logger.py +166 -0
- exonware/xwsystem/{cli → console/cli}/progress.py +25 -21
- exonware/xwsystem/{cli → console/cli}/prompts.py +3 -2
- exonware/xwsystem/{cli → console/cli}/tables.py +27 -24
- exonware/xwsystem/console/contracts.py +113 -0
- exonware/xwsystem/console/defs.py +154 -0
- exonware/xwsystem/console/errors.py +34 -0
- exonware/xwsystem/console/event_logger.py +385 -0
- exonware/xwsystem/console/writer.py +132 -0
- exonware/xwsystem/contracts.py +28 -0
- exonware/xwsystem/data_structures/__init__.py +23 -0
- exonware/xwsystem/data_structures/trie.py +34 -0
- exonware/xwsystem/data_structures/union_find.py +144 -0
- exonware/xwsystem/defs.py +17 -0
- exonware/xwsystem/errors.py +23 -0
- exonware/xwsystem/facade.py +62 -0
- exonware/xwsystem/http_client/__init__.py +22 -1
- exonware/xwsystem/http_client/advanced_client.py +8 -5
- exonware/xwsystem/http_client/base.py +3 -2
- exonware/xwsystem/http_client/client.py +7 -4
- exonware/xwsystem/http_client/contracts.py +42 -56
- exonware/xwsystem/http_client/defs.py +2 -1
- exonware/xwsystem/http_client/errors.py +2 -1
- exonware/xwsystem/http_client/facade.py +156 -0
- exonware/xwsystem/io/__init__.py +22 -3
- exonware/xwsystem/io/archive/__init__.py +8 -2
- exonware/xwsystem/io/archive/archive.py +1 -1
- exonware/xwsystem/io/archive/archive_files.py +4 -7
- exonware/xwsystem/io/archive/archivers.py +120 -10
- exonware/xwsystem/io/archive/base.py +4 -5
- exonware/xwsystem/io/archive/codec_integration.py +1 -2
- exonware/xwsystem/io/archive/compression.py +1 -2
- exonware/xwsystem/io/archive/facade.py +263 -0
- exonware/xwsystem/io/archive/formats/__init__.py +2 -3
- exonware/xwsystem/io/archive/formats/brotli_format.py +20 -7
- exonware/xwsystem/io/archive/formats/lz4_format.py +20 -7
- exonware/xwsystem/io/archive/formats/rar.py +11 -5
- exonware/xwsystem/io/archive/formats/sevenzip.py +12 -6
- exonware/xwsystem/io/archive/formats/squashfs_format.py +1 -2
- exonware/xwsystem/io/archive/formats/tar.py +52 -7
- exonware/xwsystem/io/archive/formats/wim_format.py +11 -5
- exonware/xwsystem/io/archive/formats/zip.py +1 -2
- exonware/xwsystem/io/archive/formats/zpaq_format.py +1 -2
- exonware/xwsystem/io/archive/formats/zstandard.py +20 -7
- exonware/xwsystem/io/base.py +119 -115
- exonware/xwsystem/io/codec/__init__.py +4 -2
- exonware/xwsystem/io/codec/base.py +19 -13
- exonware/xwsystem/io/codec/contracts.py +59 -2
- exonware/xwsystem/io/codec/registry.py +67 -21
- exonware/xwsystem/io/common/__init__.py +1 -1
- exonware/xwsystem/io/common/atomic.py +29 -16
- exonware/xwsystem/io/common/base.py +11 -10
- exonware/xwsystem/io/common/lock.py +6 -5
- exonware/xwsystem/io/common/path_manager.py +2 -1
- exonware/xwsystem/io/common/watcher.py +1 -2
- exonware/xwsystem/io/contracts.py +301 -433
- exonware/xwsystem/io/contracts_1.py +1180 -0
- exonware/xwsystem/io/data_operations.py +279 -14
- exonware/xwsystem/io/defs.py +4 -3
- exonware/xwsystem/io/errors.py +3 -2
- exonware/xwsystem/io/facade.py +87 -61
- exonware/xwsystem/io/file/__init__.py +1 -1
- exonware/xwsystem/io/file/base.py +8 -9
- exonware/xwsystem/io/file/conversion.py +2 -3
- exonware/xwsystem/io/file/file.py +61 -18
- exonware/xwsystem/io/file/paged_source.py +8 -8
- exonware/xwsystem/io/file/paging/__init__.py +1 -2
- exonware/xwsystem/io/file/paging/byte_paging.py +4 -5
- exonware/xwsystem/io/file/paging/line_paging.py +2 -3
- exonware/xwsystem/io/file/paging/record_paging.py +2 -3
- exonware/xwsystem/io/file/paging/registry.py +1 -2
- exonware/xwsystem/io/file/source.py +13 -17
- exonware/xwsystem/io/filesystem/__init__.py +1 -1
- exonware/xwsystem/io/filesystem/base.py +1 -2
- exonware/xwsystem/io/filesystem/local.py +3 -4
- exonware/xwsystem/io/folder/__init__.py +1 -1
- exonware/xwsystem/io/folder/base.py +1 -2
- exonware/xwsystem/io/folder/folder.py +16 -7
- exonware/xwsystem/io/indexing/__init__.py +14 -0
- exonware/xwsystem/io/indexing/facade.py +443 -0
- exonware/xwsystem/io/path_parser.py +98 -0
- exonware/xwsystem/io/serialization/__init__.py +21 -3
- exonware/xwsystem/io/serialization/auto_serializer.py +146 -20
- exonware/xwsystem/io/serialization/base.py +84 -34
- exonware/xwsystem/io/serialization/contracts.py +50 -73
- exonware/xwsystem/io/serialization/defs.py +2 -1
- exonware/xwsystem/io/serialization/errors.py +2 -1
- exonware/xwsystem/io/serialization/flyweight.py +154 -7
- exonware/xwsystem/io/serialization/format_detector.py +15 -14
- exonware/xwsystem/io/serialization/formats/__init__.py +8 -5
- exonware/xwsystem/io/serialization/formats/binary/bson.py +15 -6
- exonware/xwsystem/io/serialization/formats/binary/cbor.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/marshal.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/msgpack.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/pickle.py +5 -5
- exonware/xwsystem/io/serialization/formats/binary/plistlib.py +5 -5
- exonware/xwsystem/io/serialization/formats/database/dbm.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/shelve.py +7 -7
- exonware/xwsystem/io/serialization/formats/database/sqlite3.py +7 -7
- exonware/xwsystem/io/serialization/formats/tabular/__init__.py +27 -0
- exonware/xwsystem/io/serialization/formats/tabular/base.py +89 -0
- exonware/xwsystem/io/serialization/formats/tabular/csv.py +319 -0
- exonware/xwsystem/io/serialization/formats/tabular/df.py +249 -0
- exonware/xwsystem/io/serialization/formats/tabular/excel.py +291 -0
- exonware/xwsystem/io/serialization/formats/tabular/googlesheets.py +374 -0
- exonware/xwsystem/io/serialization/formats/text/__init__.py +1 -1
- exonware/xwsystem/io/serialization/formats/text/append_only_log.py +199 -0
- exonware/xwsystem/io/serialization/formats/text/configparser.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/csv.py +7 -5
- exonware/xwsystem/io/serialization/formats/text/formdata.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/json.py +65 -33
- exonware/xwsystem/io/serialization/formats/text/json5.py +8 -4
- exonware/xwsystem/io/serialization/formats/text/jsonlines.py +113 -25
- exonware/xwsystem/io/serialization/formats/text/multipart.py +5 -5
- exonware/xwsystem/io/serialization/formats/text/toml.py +8 -6
- exonware/xwsystem/io/serialization/formats/text/xml.py +25 -20
- exonware/xwsystem/io/serialization/formats/text/yaml.py +8 -6
- exonware/xwsystem/io/serialization/parsers/__init__.py +16 -0
- exonware/xwsystem/io/serialization/parsers/base.py +60 -0
- exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +62 -0
- exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +48 -0
- exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +54 -0
- exonware/xwsystem/io/serialization/parsers/orjson_parser.py +62 -0
- exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +55 -0
- exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +53 -0
- exonware/xwsystem/io/serialization/parsers/registry.py +91 -0
- exonware/xwsystem/io/serialization/parsers/standard.py +44 -0
- exonware/xwsystem/io/serialization/parsers/ujson_parser.py +53 -0
- exonware/xwsystem/io/serialization/registry.py +4 -4
- exonware/xwsystem/io/serialization/serializer.py +168 -79
- exonware/xwsystem/io/serialization/universal_options.py +367 -0
- exonware/xwsystem/io/serialization/utils/__init__.py +1 -2
- exonware/xwsystem/io/serialization/utils/path_ops.py +5 -6
- exonware/xwsystem/io/source_reader.py +223 -0
- exonware/xwsystem/io/stream/__init__.py +1 -1
- exonware/xwsystem/io/stream/async_operations.py +61 -14
- exonware/xwsystem/io/stream/base.py +1 -2
- exonware/xwsystem/io/stream/codec_io.py +6 -7
- exonware/xwsystem/ipc/__init__.py +1 -0
- exonware/xwsystem/ipc/async_fabric.py +4 -4
- exonware/xwsystem/ipc/base.py +6 -5
- exonware/xwsystem/ipc/contracts.py +41 -66
- exonware/xwsystem/ipc/defs.py +2 -1
- exonware/xwsystem/ipc/errors.py +2 -1
- exonware/xwsystem/ipc/message_queue.py +5 -2
- exonware/xwsystem/ipc/pipes.py +70 -34
- exonware/xwsystem/ipc/process_manager.py +7 -5
- exonware/xwsystem/ipc/process_pool.py +6 -5
- exonware/xwsystem/ipc/shared_memory.py +64 -11
- exonware/xwsystem/monitoring/__init__.py +7 -0
- exonware/xwsystem/monitoring/base.py +11 -8
- exonware/xwsystem/monitoring/contracts.py +86 -144
- exonware/xwsystem/monitoring/defs.py +2 -1
- exonware/xwsystem/monitoring/error_recovery.py +16 -3
- exonware/xwsystem/monitoring/errors.py +2 -1
- exonware/xwsystem/monitoring/facade.py +183 -0
- exonware/xwsystem/monitoring/memory_monitor.py +1 -0
- exonware/xwsystem/monitoring/metrics.py +1 -0
- exonware/xwsystem/monitoring/performance_manager_generic.py +7 -7
- exonware/xwsystem/monitoring/performance_monitor.py +1 -0
- exonware/xwsystem/monitoring/performance_validator.py +1 -0
- exonware/xwsystem/monitoring/system_monitor.py +6 -5
- exonware/xwsystem/monitoring/tracing.py +18 -16
- exonware/xwsystem/monitoring/tracker.py +2 -1
- exonware/xwsystem/operations/__init__.py +5 -50
- exonware/xwsystem/operations/base.py +3 -44
- exonware/xwsystem/operations/contracts.py +25 -15
- exonware/xwsystem/operations/defs.py +1 -1
- exonware/xwsystem/operations/diff.py +5 -4
- exonware/xwsystem/operations/errors.py +1 -1
- exonware/xwsystem/operations/merge.py +6 -4
- exonware/xwsystem/operations/patch.py +5 -4
- exonware/xwsystem/patterns/__init__.py +1 -0
- exonware/xwsystem/patterns/base.py +2 -1
- exonware/xwsystem/patterns/context_manager.py +2 -1
- exonware/xwsystem/patterns/contracts.py +215 -256
- exonware/xwsystem/patterns/defs.py +2 -1
- exonware/xwsystem/patterns/dynamic_facade.py +1 -0
- exonware/xwsystem/patterns/errors.py +2 -4
- exonware/xwsystem/patterns/handler_factory.py +2 -3
- exonware/xwsystem/patterns/import_registry.py +1 -0
- exonware/xwsystem/patterns/object_pool.py +1 -0
- exonware/xwsystem/patterns/registry.py +4 -43
- exonware/xwsystem/plugins/__init__.py +2 -1
- exonware/xwsystem/plugins/base.py +6 -5
- exonware/xwsystem/plugins/contracts.py +94 -158
- exonware/xwsystem/plugins/defs.py +2 -1
- exonware/xwsystem/plugins/errors.py +2 -1
- exonware/xwsystem/py.typed +3 -0
- exonware/xwsystem/query/__init__.py +36 -0
- exonware/xwsystem/query/contracts.py +56 -0
- exonware/xwsystem/query/errors.py +22 -0
- exonware/xwsystem/query/registry.py +128 -0
- exonware/xwsystem/runtime/__init__.py +2 -1
- exonware/xwsystem/runtime/base.py +4 -3
- exonware/xwsystem/runtime/contracts.py +39 -60
- exonware/xwsystem/runtime/defs.py +2 -1
- exonware/xwsystem/runtime/env.py +11 -9
- exonware/xwsystem/runtime/errors.py +2 -1
- exonware/xwsystem/runtime/reflection.py +3 -2
- exonware/xwsystem/security/__init__.py +68 -11
- exonware/xwsystem/security/audit.py +167 -0
- exonware/xwsystem/security/base.py +121 -24
- exonware/xwsystem/security/contracts.py +91 -146
- exonware/xwsystem/security/crypto.py +17 -16
- exonware/xwsystem/security/defs.py +2 -1
- exonware/xwsystem/security/errors.py +2 -1
- exonware/xwsystem/security/facade.py +321 -0
- exonware/xwsystem/security/file_security.py +330 -0
- exonware/xwsystem/security/hazmat.py +11 -8
- exonware/xwsystem/security/monitor.py +372 -0
- exonware/xwsystem/security/path_validator.py +140 -18
- exonware/xwsystem/security/policy.py +357 -0
- exonware/xwsystem/security/resource_limits.py +1 -0
- exonware/xwsystem/security/validator.py +455 -0
- exonware/xwsystem/shared/__init__.py +14 -1
- exonware/xwsystem/shared/base.py +285 -2
- exonware/xwsystem/shared/contracts.py +415 -126
- exonware/xwsystem/shared/defs.py +2 -1
- exonware/xwsystem/shared/errors.py +2 -2
- exonware/xwsystem/shared/xwobject.py +316 -0
- exonware/xwsystem/structures/__init__.py +1 -0
- exonware/xwsystem/structures/base.py +3 -2
- exonware/xwsystem/structures/circular_detector.py +15 -14
- exonware/xwsystem/structures/contracts.py +53 -76
- exonware/xwsystem/structures/defs.py +2 -1
- exonware/xwsystem/structures/errors.py +2 -1
- exonware/xwsystem/structures/tree_walker.py +2 -1
- exonware/xwsystem/threading/__init__.py +21 -4
- exonware/xwsystem/threading/async_primitives.py +6 -5
- exonware/xwsystem/threading/base.py +3 -2
- exonware/xwsystem/threading/contracts.py +87 -143
- exonware/xwsystem/threading/defs.py +2 -1
- exonware/xwsystem/threading/errors.py +2 -1
- exonware/xwsystem/threading/facade.py +175 -0
- exonware/xwsystem/threading/locks.py +1 -0
- exonware/xwsystem/threading/safe_factory.py +1 -0
- exonware/xwsystem/utils/__init__.py +40 -0
- exonware/xwsystem/utils/base.py +22 -21
- exonware/xwsystem/utils/contracts.py +50 -73
- exonware/xwsystem/utils/dt/__init__.py +19 -3
- exonware/xwsystem/utils/dt/base.py +5 -4
- exonware/xwsystem/utils/dt/contracts.py +22 -29
- exonware/xwsystem/utils/dt/defs.py +2 -1
- exonware/xwsystem/utils/dt/errors.py +2 -5
- exonware/xwsystem/utils/dt/formatting.py +88 -2
- exonware/xwsystem/utils/dt/humanize.py +10 -9
- exonware/xwsystem/utils/dt/parsing.py +56 -5
- exonware/xwsystem/utils/dt/timezone_utils.py +2 -24
- exonware/xwsystem/utils/errors.py +2 -4
- exonware/xwsystem/utils/paths.py +1 -0
- exonware/xwsystem/utils/string.py +49 -0
- exonware/xwsystem/utils/test_runner.py +139 -480
- exonware/xwsystem/utils/utils_contracts.py +2 -1
- exonware/xwsystem/utils/web.py +110 -0
- exonware/xwsystem/validation/__init__.py +25 -1
- exonware/xwsystem/validation/base.py +6 -5
- exonware/xwsystem/validation/contracts.py +29 -41
- exonware/xwsystem/validation/data_validator.py +1 -0
- exonware/xwsystem/validation/declarative.py +11 -8
- exonware/xwsystem/validation/defs.py +2 -1
- exonware/xwsystem/validation/errors.py +2 -1
- exonware/xwsystem/validation/facade.py +198 -0
- exonware/xwsystem/validation/fluent_validator.py +22 -19
- exonware/xwsystem/validation/schema_discovery.py +210 -0
- exonware/xwsystem/validation/type_safety.py +2 -1
- exonware/xwsystem/version.py +4 -4
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/METADATA +71 -4
- exonware_xwsystem-0.1.0.3.dist-info/RECORD +337 -0
- exonware/xwsystem/caching/USAGE_GUIDE.md +0 -779
- exonware/xwsystem/cli/__init__.py +0 -43
- exonware/xwsystem/cli/console.py +0 -113
- exonware/xwsystem/cli/defs.py +0 -134
- exonware/xwsystem/conf.py +0 -44
- exonware/xwsystem/security/auth.py +0 -484
- exonware_xwsystem-0.0.1.411.dist-info/RECORD +0 -274
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/WHEEL +0 -0
- {exonware_xwsystem-0.0.1.411.dist-info → exonware_xwsystem-0.1.0.3.dist-info}/licenses/LICENSE +0 -0
exonware/xwsystem/shared/base.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
#exonware/xwsystem/src/exonware/xwsystem/shared/base.py
|
|
1
2
|
#exonware/xwsystem/shared/base.py
|
|
2
3
|
"""
|
|
3
4
|
Company: eXonware.com
|
|
4
5
|
Author: Eng. Muhammad AlShehri
|
|
5
6
|
Email: connect@exonware.com
|
|
6
|
-
Version: 0.0.
|
|
7
|
+
Version: 0.1.0.3
|
|
7
8
|
Generation Date: September 04, 2025
|
|
8
9
|
|
|
9
10
|
Shared base classes (merged from the former core module).
|
|
@@ -11,8 +12,11 @@ Shared base classes (merged from the former core module).
|
|
|
11
12
|
|
|
12
13
|
from abc import ABC, abstractmethod
|
|
13
14
|
from typing import Any, Optional
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
import uuid
|
|
14
17
|
|
|
15
|
-
from .contracts import CoreMode, CorePriority, CoreState
|
|
18
|
+
from .contracts import CoreMode, CorePriority, CoreState, IObject
|
|
19
|
+
from .defs import DataType
|
|
16
20
|
|
|
17
21
|
|
|
18
22
|
class ACoreBase(ABC):
|
|
@@ -307,3 +311,282 @@ class BaseCore(ACoreBase):
|
|
|
307
311
|
# Basic implementation - can be overridden
|
|
308
312
|
return True
|
|
309
313
|
|
|
314
|
+
|
|
315
|
+
# ============================================================================
|
|
316
|
+
# OBJECT BASE CLASSES
|
|
317
|
+
# ============================================================================
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
class AObject(IObject, ABC):
|
|
321
|
+
"""
|
|
322
|
+
Abstract base class for all objects in the eXonware ecosystem.
|
|
323
|
+
|
|
324
|
+
Provides common functionality for objects across xwauth, xwstorage, xwentity,
|
|
325
|
+
and other libraries. Extends IObject interface. All object types share:
|
|
326
|
+
- Identity (id, uid properties from IID)
|
|
327
|
+
- Timestamps (created_at, updated_at)
|
|
328
|
+
- Metadata (title, description)
|
|
329
|
+
- Native conversion (to_native, from_native from INative)
|
|
330
|
+
- Serialization (to_dict)
|
|
331
|
+
- Storage operations (save, load)
|
|
332
|
+
|
|
333
|
+
Subclasses must implement:
|
|
334
|
+
- id property (returns object identifier)
|
|
335
|
+
- created_at property
|
|
336
|
+
- updated_at property
|
|
337
|
+
- to_dict() method (should include title and description)
|
|
338
|
+
- save() method (object-specific storage logic)
|
|
339
|
+
- load() method (object-specific loading logic)
|
|
340
|
+
"""
|
|
341
|
+
|
|
342
|
+
def __init__(self, object_id: Optional[str] = None):
|
|
343
|
+
"""
|
|
344
|
+
Initialize abstract object.
|
|
345
|
+
|
|
346
|
+
Args:
|
|
347
|
+
object_id: Optional object identifier (subclasses define their own id property)
|
|
348
|
+
"""
|
|
349
|
+
# Timestamps are initialized by subclasses
|
|
350
|
+
# Set self._created_at and self._updated_at in __init__
|
|
351
|
+
# Title and description are optional and initialized by subclasses
|
|
352
|
+
pass
|
|
353
|
+
|
|
354
|
+
@property
|
|
355
|
+
@abstractmethod
|
|
356
|
+
def id(self) -> str:
|
|
357
|
+
"""Get the unique object identifier."""
|
|
358
|
+
pass
|
|
359
|
+
|
|
360
|
+
@property
|
|
361
|
+
def uid(self) -> str:
|
|
362
|
+
"""
|
|
363
|
+
Get the unique object GUID (universal identifier).
|
|
364
|
+
|
|
365
|
+
This should be generated on object creation. XWObject provides
|
|
366
|
+
a default implementation that generates a UUID.
|
|
367
|
+
"""
|
|
368
|
+
# Default implementation - subclasses can override
|
|
369
|
+
if not hasattr(self, '_uid'):
|
|
370
|
+
self._uid = str(uuid.uuid4())
|
|
371
|
+
return self._uid
|
|
372
|
+
|
|
373
|
+
@property
|
|
374
|
+
@abstractmethod
|
|
375
|
+
def created_at(self) -> datetime:
|
|
376
|
+
"""Get the creation timestamp."""
|
|
377
|
+
pass
|
|
378
|
+
|
|
379
|
+
@property
|
|
380
|
+
@abstractmethod
|
|
381
|
+
def updated_at(self) -> datetime:
|
|
382
|
+
"""Get the last update timestamp."""
|
|
383
|
+
pass
|
|
384
|
+
|
|
385
|
+
@property
|
|
386
|
+
def title(self) -> Optional[str]:
|
|
387
|
+
"""
|
|
388
|
+
Get the object title.
|
|
389
|
+
|
|
390
|
+
Default implementation returns None. Subclasses should override
|
|
391
|
+
to provide title support, storing it in self._title.
|
|
392
|
+
"""
|
|
393
|
+
return getattr(self, '_title', None)
|
|
394
|
+
|
|
395
|
+
@property
|
|
396
|
+
def description(self) -> Optional[str]:
|
|
397
|
+
"""
|
|
398
|
+
Get the object description.
|
|
399
|
+
|
|
400
|
+
Default implementation returns None. Subclasses should override
|
|
401
|
+
to provide description support, storing it in self._description.
|
|
402
|
+
"""
|
|
403
|
+
return getattr(self, '_description', None)
|
|
404
|
+
|
|
405
|
+
@abstractmethod
|
|
406
|
+
def to_dict(self) -> dict[str, Any]:
|
|
407
|
+
"""
|
|
408
|
+
Export object as dictionary.
|
|
409
|
+
|
|
410
|
+
Should include id, uid, created_at, updated_at, title, description,
|
|
411
|
+
and any object-specific data.
|
|
412
|
+
"""
|
|
413
|
+
pass
|
|
414
|
+
|
|
415
|
+
def to_native(self) -> Any:
|
|
416
|
+
"""
|
|
417
|
+
Get object as native representation.
|
|
418
|
+
|
|
419
|
+
Default implementation returns to_dict(). Subclasses can override
|
|
420
|
+
if they need a different native representation.
|
|
421
|
+
"""
|
|
422
|
+
return self.to_dict()
|
|
423
|
+
|
|
424
|
+
def from_native(self, data: dict[str, Any]) -> "IObject":
|
|
425
|
+
"""
|
|
426
|
+
Create from native Python object.
|
|
427
|
+
|
|
428
|
+
Default implementation raises NotImplementedError. Subclasses should
|
|
429
|
+
override to provide from_native support.
|
|
430
|
+
|
|
431
|
+
Args:
|
|
432
|
+
data: Native Python object (typically a dict)
|
|
433
|
+
|
|
434
|
+
Returns:
|
|
435
|
+
Self (for chaining) - returns IObject to match protocol
|
|
436
|
+
"""
|
|
437
|
+
raise NotImplementedError("Subclasses must implement from_native method")
|
|
438
|
+
|
|
439
|
+
def is_native_compatible(self, data: Any) -> bool:
|
|
440
|
+
"""
|
|
441
|
+
Check if data is compatible with native conversion.
|
|
442
|
+
|
|
443
|
+
Default implementation checks if data is a dict. Subclasses can override
|
|
444
|
+
for more specific validation.
|
|
445
|
+
"""
|
|
446
|
+
return isinstance(data, dict)
|
|
447
|
+
|
|
448
|
+
def get_native_type(self) -> DataType:
|
|
449
|
+
"""
|
|
450
|
+
Get the native data type.
|
|
451
|
+
|
|
452
|
+
Default implementation returns DataType.DICT since objects typically
|
|
453
|
+
serialize to dictionaries. Subclasses can override for custom types.
|
|
454
|
+
|
|
455
|
+
Returns:
|
|
456
|
+
DataType enum value
|
|
457
|
+
"""
|
|
458
|
+
return DataType.DICT
|
|
459
|
+
|
|
460
|
+
@abstractmethod
|
|
461
|
+
def save(self, *args, **kwargs) -> None:
|
|
462
|
+
"""
|
|
463
|
+
Save object to storage.
|
|
464
|
+
|
|
465
|
+
Subclasses must implement this with object-specific storage logic.
|
|
466
|
+
This method can be decorated with @XWAction to enable action-based
|
|
467
|
+
execution, validation, and authorization.
|
|
468
|
+
"""
|
|
469
|
+
pass
|
|
470
|
+
|
|
471
|
+
@abstractmethod
|
|
472
|
+
def load(self, *args, **kwargs) -> None:
|
|
473
|
+
"""
|
|
474
|
+
Load object from storage.
|
|
475
|
+
|
|
476
|
+
Subclasses must implement this with object-specific loading logic.
|
|
477
|
+
This method can be decorated with @XWAction to enable action-based
|
|
478
|
+
execution, validation, and authorization.
|
|
479
|
+
"""
|
|
480
|
+
pass
|
|
481
|
+
|
|
482
|
+
def generate_id(self) -> str:
|
|
483
|
+
"""
|
|
484
|
+
Generate a new ID.
|
|
485
|
+
|
|
486
|
+
Default implementation generates a UUID. Subclasses can override
|
|
487
|
+
for custom ID generation logic.
|
|
488
|
+
|
|
489
|
+
Returns:
|
|
490
|
+
New ID string
|
|
491
|
+
"""
|
|
492
|
+
return str(uuid.uuid4())
|
|
493
|
+
|
|
494
|
+
def validate_id(self, id_value: str) -> bool:
|
|
495
|
+
"""
|
|
496
|
+
Validate an ID format.
|
|
497
|
+
|
|
498
|
+
Default implementation checks if ID is a non-empty string.
|
|
499
|
+
Subclasses can override for custom validation logic.
|
|
500
|
+
|
|
501
|
+
Args:
|
|
502
|
+
id_value: ID to validate
|
|
503
|
+
|
|
504
|
+
Returns:
|
|
505
|
+
True if valid
|
|
506
|
+
"""
|
|
507
|
+
return isinstance(id_value, str) and len(id_value) > 0
|
|
508
|
+
|
|
509
|
+
def is_same_id(self, other: "IObject") -> bool:
|
|
510
|
+
"""
|
|
511
|
+
Check if this object has the same ID as another.
|
|
512
|
+
|
|
513
|
+
Args:
|
|
514
|
+
other: Another IObject instance
|
|
515
|
+
|
|
516
|
+
Returns:
|
|
517
|
+
True if same ID
|
|
518
|
+
"""
|
|
519
|
+
if not isinstance(other, IObject):
|
|
520
|
+
return False
|
|
521
|
+
return self.id == other.id
|
|
522
|
+
|
|
523
|
+
def __getitem__(self, key: str) -> Any:
|
|
524
|
+
"""
|
|
525
|
+
Get object property using dictionary-style access.
|
|
526
|
+
|
|
527
|
+
Supports accessing properties like:
|
|
528
|
+
- obj["uid"] -> returns uid property
|
|
529
|
+
- obj["title"] -> returns title property
|
|
530
|
+
- obj["description"] -> returns description property
|
|
531
|
+
- obj["id"] -> returns id property (if implemented)
|
|
532
|
+
- obj["created_at"] -> returns created_at property (if implemented)
|
|
533
|
+
- obj["updated_at"] -> returns updated_at property (if implemented)
|
|
534
|
+
- obj["property_name"] -> returns any other attribute
|
|
535
|
+
|
|
536
|
+
Args:
|
|
537
|
+
key: Property name to access
|
|
538
|
+
|
|
539
|
+
Returns:
|
|
540
|
+
Property value
|
|
541
|
+
|
|
542
|
+
Raises:
|
|
543
|
+
KeyError: If property doesn't exist
|
|
544
|
+
|
|
545
|
+
Example:
|
|
546
|
+
>>> obj = MyObject()
|
|
547
|
+
>>> obj._title = "My Title"
|
|
548
|
+
>>> print(obj["title"]) # "My Title"
|
|
549
|
+
>>> print(obj["uid"]) # UUID string
|
|
550
|
+
"""
|
|
551
|
+
# Try to get via property methods first
|
|
552
|
+
if key == "uid":
|
|
553
|
+
return self.uid
|
|
554
|
+
elif key == "title":
|
|
555
|
+
return self.title
|
|
556
|
+
elif key == "description":
|
|
557
|
+
return self.description
|
|
558
|
+
elif key == "id":
|
|
559
|
+
# Try to get id property (may be abstract in some cases)
|
|
560
|
+
try:
|
|
561
|
+
return self.id
|
|
562
|
+
except (AttributeError, NotImplementedError):
|
|
563
|
+
# Fall back to _id attribute if it exists
|
|
564
|
+
if hasattr(self, "_id"):
|
|
565
|
+
return self._id
|
|
566
|
+
raise KeyError(f"Property 'id' not available")
|
|
567
|
+
elif key == "created_at":
|
|
568
|
+
# Try to get created_at property (may be abstract)
|
|
569
|
+
try:
|
|
570
|
+
return self.created_at
|
|
571
|
+
except (AttributeError, NotImplementedError):
|
|
572
|
+
# Fall back to _created_at attribute if it exists
|
|
573
|
+
if hasattr(self, "_created_at"):
|
|
574
|
+
return self._created_at
|
|
575
|
+
raise KeyError(f"Property 'created_at' not available")
|
|
576
|
+
elif key == "updated_at":
|
|
577
|
+
# Try to get updated_at property (may be abstract)
|
|
578
|
+
try:
|
|
579
|
+
return self.updated_at
|
|
580
|
+
except (AttributeError, NotImplementedError):
|
|
581
|
+
# Fall back to _updated_at attribute if it exists
|
|
582
|
+
if hasattr(self, "_updated_at"):
|
|
583
|
+
return self._updated_at
|
|
584
|
+
raise KeyError(f"Property 'updated_at' not available")
|
|
585
|
+
else:
|
|
586
|
+
# Try to get as attribute
|
|
587
|
+
if hasattr(self, key):
|
|
588
|
+
return getattr(self, key)
|
|
589
|
+
# Try with underscore prefix (private attributes)
|
|
590
|
+
if hasattr(self, f"_{key}"):
|
|
591
|
+
return getattr(self, f"_{key}")
|
|
592
|
+
raise KeyError(f"Property '{key}' not found")
|