exonware-xwsystem 0.0.1.410__py3-none-any.whl → 0.1.0.1__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 +1 -1
- exonware/conf.py +1 -1
- exonware/xwsystem/__init__.py +2 -2
- exonware/xwsystem/caching/__init__.py +1 -1
- exonware/xwsystem/caching/base.py +2 -2
- exonware/xwsystem/caching/bloom_cache.py +2 -2
- exonware/xwsystem/caching/cache_manager.py +1 -1
- exonware/xwsystem/caching/conditional.py +2 -2
- exonware/xwsystem/caching/contracts.py +1 -1
- exonware/xwsystem/caching/decorators.py +2 -2
- exonware/xwsystem/caching/defs.py +1 -1
- exonware/xwsystem/caching/disk_cache.py +1 -1
- exonware/xwsystem/caching/distributed.py +1 -1
- exonware/xwsystem/caching/errors.py +1 -1
- exonware/xwsystem/caching/events.py +2 -2
- exonware/xwsystem/caching/eviction_strategies.py +1 -1
- exonware/xwsystem/caching/fluent.py +1 -1
- exonware/xwsystem/caching/integrity.py +1 -1
- exonware/xwsystem/caching/lfu_cache.py +2 -2
- exonware/xwsystem/caching/lfu_optimized.py +3 -3
- exonware/xwsystem/caching/lru_cache.py +2 -2
- exonware/xwsystem/caching/memory_bounded.py +2 -2
- exonware/xwsystem/caching/metrics_exporter.py +2 -2
- exonware/xwsystem/caching/observable_cache.py +1 -1
- exonware/xwsystem/caching/pluggable_cache.py +2 -2
- exonware/xwsystem/caching/rate_limiter.py +1 -1
- exonware/xwsystem/caching/read_through.py +2 -2
- exonware/xwsystem/caching/secure_cache.py +1 -1
- exonware/xwsystem/caching/serializable.py +2 -2
- exonware/xwsystem/caching/stats.py +1 -1
- exonware/xwsystem/caching/tagging.py +2 -2
- exonware/xwsystem/caching/ttl_cache.py +1 -1
- exonware/xwsystem/caching/two_tier_cache.py +1 -1
- exonware/xwsystem/caching/utils.py +1 -1
- exonware/xwsystem/caching/validation.py +1 -1
- exonware/xwsystem/caching/warming.py +2 -2
- exonware/xwsystem/caching/write_behind.py +2 -2
- exonware/xwsystem/cli/__init__.py +1 -1
- exonware/xwsystem/cli/args.py +1 -1
- exonware/xwsystem/cli/base.py +1 -1
- exonware/xwsystem/cli/colors.py +1 -1
- exonware/xwsystem/cli/console.py +1 -1
- exonware/xwsystem/cli/contracts.py +1 -1
- exonware/xwsystem/cli/defs.py +1 -1
- exonware/xwsystem/cli/errors.py +1 -1
- exonware/xwsystem/cli/progress.py +1 -1
- exonware/xwsystem/cli/prompts.py +1 -1
- exonware/xwsystem/cli/tables.py +1 -1
- exonware/xwsystem/config/__init__.py +1 -1
- exonware/xwsystem/config/base.py +2 -2
- exonware/xwsystem/config/contracts.py +1 -1
- exonware/xwsystem/config/defaults.py +1 -1
- exonware/xwsystem/config/defs.py +1 -1
- exonware/xwsystem/config/errors.py +2 -2
- exonware/xwsystem/config/logging.py +1 -1
- exonware/xwsystem/config/logging_setup.py +2 -2
- exonware/xwsystem/config/performance.py +115 -388
- exonware/xwsystem/http_client/__init__.py +1 -1
- exonware/xwsystem/http_client/advanced_client.py +2 -2
- exonware/xwsystem/http_client/base.py +2 -2
- exonware/xwsystem/http_client/client.py +2 -2
- exonware/xwsystem/http_client/contracts.py +1 -1
- exonware/xwsystem/http_client/defs.py +1 -1
- exonware/xwsystem/http_client/errors.py +2 -2
- exonware/xwsystem/io/__init__.py +1 -1
- exonware/xwsystem/io/archive/__init__.py +1 -1
- exonware/xwsystem/io/archive/archive.py +1 -1
- exonware/xwsystem/io/archive/archive_files.py +1 -1
- exonware/xwsystem/io/archive/archivers.py +2 -2
- exonware/xwsystem/io/archive/base.py +6 -6
- exonware/xwsystem/io/archive/codec_integration.py +1 -1
- exonware/xwsystem/io/archive/compression.py +1 -1
- exonware/xwsystem/io/archive/formats/__init__.py +1 -1
- exonware/xwsystem/io/archive/formats/brotli_format.py +6 -3
- exonware/xwsystem/io/archive/formats/lz4_format.py +6 -3
- exonware/xwsystem/io/archive/formats/rar.py +6 -3
- exonware/xwsystem/io/archive/formats/sevenzip.py +6 -3
- exonware/xwsystem/io/archive/formats/squashfs_format.py +1 -1
- exonware/xwsystem/io/archive/formats/tar.py +1 -1
- exonware/xwsystem/io/archive/formats/wim_format.py +6 -3
- exonware/xwsystem/io/archive/formats/zip.py +1 -1
- exonware/xwsystem/io/archive/formats/zpaq_format.py +1 -1
- exonware/xwsystem/io/archive/formats/zstandard.py +6 -3
- exonware/xwsystem/io/base.py +1 -1
- exonware/xwsystem/io/codec/__init__.py +1 -1
- exonware/xwsystem/io/codec/base.py +6 -6
- exonware/xwsystem/io/codec/contracts.py +1 -1
- exonware/xwsystem/io/codec/registry.py +5 -5
- exonware/xwsystem/io/common/__init__.py +1 -1
- exonware/xwsystem/io/common/base.py +1 -1
- exonware/xwsystem/io/common/lock.py +1 -1
- exonware/xwsystem/io/common/watcher.py +1 -1
- exonware/xwsystem/io/contracts.py +1 -1
- exonware/xwsystem/io/data_operations.py +746 -0
- exonware/xwsystem/io/defs.py +1 -1
- exonware/xwsystem/io/errors.py +1 -1
- exonware/xwsystem/io/facade.py +2 -2
- exonware/xwsystem/io/file/__init__.py +1 -1
- exonware/xwsystem/io/file/base.py +1 -1
- exonware/xwsystem/io/file/conversion.py +1 -1
- exonware/xwsystem/io/file/file.py +8 -6
- exonware/xwsystem/io/file/paged_source.py +8 -1
- exonware/xwsystem/io/file/paging/__init__.py +1 -1
- exonware/xwsystem/io/file/paging/byte_paging.py +1 -1
- exonware/xwsystem/io/file/paging/line_paging.py +1 -1
- exonware/xwsystem/io/file/paging/record_paging.py +1 -1
- exonware/xwsystem/io/file/paging/registry.py +4 -4
- exonware/xwsystem/io/file/source.py +20 -9
- exonware/xwsystem/io/filesystem/__init__.py +1 -1
- exonware/xwsystem/io/filesystem/base.py +1 -1
- exonware/xwsystem/io/filesystem/local.py +9 -1
- exonware/xwsystem/io/folder/__init__.py +1 -1
- exonware/xwsystem/io/folder/base.py +1 -1
- exonware/xwsystem/io/folder/folder.py +2 -2
- exonware/xwsystem/io/serialization/__init__.py +1 -1
- exonware/xwsystem/io/serialization/auto_serializer.py +52 -39
- exonware/xwsystem/io/serialization/base.py +165 -1
- exonware/xwsystem/io/serialization/contracts.py +88 -1
- exonware/xwsystem/io/serialization/defs.py +1 -1
- exonware/xwsystem/io/serialization/errors.py +1 -1
- exonware/xwsystem/io/serialization/flyweight.py +10 -10
- exonware/xwsystem/io/serialization/format_detector.py +8 -5
- exonware/xwsystem/io/serialization/formats/__init__.py +1 -1
- exonware/xwsystem/io/serialization/formats/binary/bson.py +1 -1
- exonware/xwsystem/io/serialization/formats/binary/cbor.py +1 -1
- exonware/xwsystem/io/serialization/formats/binary/marshal.py +1 -1
- exonware/xwsystem/io/serialization/formats/binary/msgpack.py +1 -1
- exonware/xwsystem/io/serialization/formats/binary/pickle.py +1 -1
- exonware/xwsystem/io/serialization/formats/binary/plistlib.py +1 -1
- exonware/xwsystem/io/serialization/formats/database/dbm.py +53 -1
- exonware/xwsystem/io/serialization/formats/database/shelve.py +48 -1
- exonware/xwsystem/io/serialization/formats/database/sqlite3.py +85 -1
- exonware/xwsystem/io/serialization/formats/text/append_only_log.py +201 -0
- exonware/xwsystem/io/serialization/formats/text/configparser.py +1 -1
- exonware/xwsystem/io/serialization/formats/text/csv.py +1 -1
- exonware/xwsystem/io/serialization/formats/text/formdata.py +1 -1
- exonware/xwsystem/io/serialization/formats/text/json.py +43 -20
- exonware/xwsystem/io/serialization/formats/text/json5.py +7 -5
- exonware/xwsystem/io/serialization/formats/text/jsonlines.py +316 -22
- exonware/xwsystem/io/serialization/formats/text/multipart.py +1 -1
- exonware/xwsystem/io/serialization/formats/text/toml.py +19 -3
- exonware/xwsystem/io/serialization/formats/text/xml.py +8 -1
- exonware/xwsystem/io/serialization/formats/text/yaml.py +52 -2
- exonware/xwsystem/io/serialization/parsers/__init__.py +15 -0
- exonware/xwsystem/io/serialization/parsers/base.py +59 -0
- exonware/xwsystem/io/serialization/parsers/hybrid_parser.py +61 -0
- exonware/xwsystem/io/serialization/parsers/msgspec_parser.py +45 -0
- exonware/xwsystem/io/serialization/parsers/orjson_direct_parser.py +53 -0
- exonware/xwsystem/io/serialization/parsers/orjson_parser.py +59 -0
- exonware/xwsystem/io/serialization/parsers/pysimdjson_parser.py +51 -0
- exonware/xwsystem/io/serialization/parsers/rapidjson_parser.py +50 -0
- exonware/xwsystem/io/serialization/parsers/registry.py +90 -0
- exonware/xwsystem/io/serialization/parsers/standard.py +43 -0
- exonware/xwsystem/io/serialization/parsers/ujson_parser.py +50 -0
- exonware/xwsystem/io/serialization/registry.py +1 -1
- exonware/xwsystem/io/serialization/serializer.py +175 -3
- exonware/xwsystem/io/serialization/utils/__init__.py +1 -1
- exonware/xwsystem/io/serialization/utils/path_ops.py +1 -1
- exonware/xwsystem/io/stream/__init__.py +1 -1
- exonware/xwsystem/io/stream/async_operations.py +1 -1
- exonware/xwsystem/io/stream/base.py +1 -1
- exonware/xwsystem/io/stream/codec_io.py +1 -1
- exonware/xwsystem/ipc/async_fabric.py +1 -2
- exonware/xwsystem/ipc/base.py +2 -2
- exonware/xwsystem/ipc/contracts.py +2 -2
- exonware/xwsystem/ipc/defs.py +1 -1
- exonware/xwsystem/ipc/errors.py +2 -2
- exonware/xwsystem/ipc/pipes.py +2 -2
- exonware/xwsystem/ipc/shared_memory.py +2 -2
- exonware/xwsystem/monitoring/base.py +2 -2
- exonware/xwsystem/monitoring/contracts.py +1 -1
- exonware/xwsystem/monitoring/defs.py +1 -1
- exonware/xwsystem/monitoring/error_recovery.py +2 -2
- exonware/xwsystem/monitoring/errors.py +2 -2
- exonware/xwsystem/monitoring/memory_monitor.py +1 -1
- exonware/xwsystem/monitoring/performance_manager_generic.py +2 -2
- exonware/xwsystem/monitoring/performance_validator.py +1 -1
- exonware/xwsystem/monitoring/system_monitor.py +2 -2
- exonware/xwsystem/monitoring/tracing.py +2 -2
- exonware/xwsystem/monitoring/tracker.py +1 -1
- exonware/xwsystem/operations/__init__.py +1 -1
- exonware/xwsystem/operations/base.py +1 -1
- exonware/xwsystem/operations/defs.py +1 -1
- exonware/xwsystem/operations/diff.py +1 -1
- exonware/xwsystem/operations/merge.py +1 -1
- exonware/xwsystem/operations/patch.py +1 -1
- exonware/xwsystem/patterns/base.py +2 -2
- exonware/xwsystem/patterns/context_manager.py +2 -2
- exonware/xwsystem/patterns/contracts.py +9 -9
- exonware/xwsystem/patterns/defs.py +1 -1
- exonware/xwsystem/patterns/dynamic_facade.py +8 -8
- exonware/xwsystem/patterns/errors.py +5 -5
- exonware/xwsystem/patterns/handler_factory.py +6 -6
- exonware/xwsystem/patterns/object_pool.py +7 -7
- exonware/xwsystem/patterns/registry.py +3 -3
- exonware/xwsystem/plugins/__init__.py +1 -1
- exonware/xwsystem/plugins/base.py +5 -5
- exonware/xwsystem/plugins/contracts.py +5 -5
- exonware/xwsystem/plugins/defs.py +1 -1
- exonware/xwsystem/plugins/errors.py +4 -4
- exonware/xwsystem/runtime/__init__.py +1 -1
- exonware/xwsystem/runtime/base.py +6 -6
- exonware/xwsystem/runtime/contracts.py +6 -6
- exonware/xwsystem/runtime/defs.py +1 -1
- exonware/xwsystem/runtime/env.py +2 -2
- exonware/xwsystem/runtime/errors.py +1 -1
- exonware/xwsystem/runtime/reflection.py +8 -8
- exonware/xwsystem/security/auth.py +1 -1
- exonware/xwsystem/security/base.py +2 -2
- exonware/xwsystem/security/contracts.py +1 -1
- exonware/xwsystem/security/crypto.py +2 -2
- exonware/xwsystem/security/defs.py +1 -1
- exonware/xwsystem/security/errors.py +2 -2
- exonware/xwsystem/security/hazmat.py +2 -2
- exonware/xwsystem/shared/__init__.py +1 -1
- exonware/xwsystem/shared/base.py +1 -1
- exonware/xwsystem/shared/contracts.py +1 -1
- exonware/xwsystem/shared/defs.py +1 -1
- exonware/xwsystem/shared/errors.py +1 -1
- exonware/xwsystem/structures/__init__.py +1 -1
- exonware/xwsystem/structures/base.py +2 -2
- exonware/xwsystem/structures/contracts.py +1 -1
- exonware/xwsystem/structures/defs.py +1 -1
- exonware/xwsystem/structures/errors.py +2 -2
- exonware/xwsystem/threading/async_primitives.py +2 -2
- exonware/xwsystem/threading/base.py +2 -2
- exonware/xwsystem/threading/contracts.py +1 -1
- exonware/xwsystem/threading/defs.py +1 -1
- exonware/xwsystem/threading/errors.py +2 -2
- exonware/xwsystem/threading/safe_factory.py +6 -6
- exonware/xwsystem/utils/base.py +2 -2
- exonware/xwsystem/utils/contracts.py +1 -1
- exonware/xwsystem/utils/dt/__init__.py +1 -1
- exonware/xwsystem/utils/dt/base.py +2 -2
- exonware/xwsystem/utils/dt/contracts.py +1 -1
- exonware/xwsystem/utils/dt/defs.py +1 -1
- exonware/xwsystem/utils/dt/errors.py +2 -2
- exonware/xwsystem/utils/dt/formatting.py +1 -1
- exonware/xwsystem/utils/dt/humanize.py +2 -2
- exonware/xwsystem/utils/dt/parsing.py +1 -1
- exonware/xwsystem/utils/dt/timezone_utils.py +1 -1
- exonware/xwsystem/utils/errors.py +2 -2
- exonware/xwsystem/utils/utils_contracts.py +1 -1
- exonware/xwsystem/validation/__init__.py +1 -1
- exonware/xwsystem/validation/base.py +15 -15
- exonware/xwsystem/validation/contracts.py +1 -1
- exonware/xwsystem/validation/data_validator.py +10 -0
- exonware/xwsystem/validation/declarative.py +9 -9
- exonware/xwsystem/validation/defs.py +1 -1
- exonware/xwsystem/validation/errors.py +2 -2
- exonware/xwsystem/validation/fluent_validator.py +4 -4
- exonware/xwsystem/version.py +4 -4
- {exonware_xwsystem-0.0.1.410.dist-info → exonware_xwsystem-0.1.0.1.dist-info}/METADATA +3 -3
- exonware_xwsystem-0.1.0.1.dist-info/RECORD +284 -0
- exonware/xwsystem/caching/USAGE_GUIDE.md +0 -779
- exonware/xwsystem/utils/test_runner.py +0 -526
- exonware_xwsystem-0.0.1.410.dist-info/RECORD +0 -273
- {exonware_xwsystem-0.0.1.410.dist-info → exonware_xwsystem-0.1.0.1.dist-info}/WHEEL +0 -0
- {exonware_xwsystem-0.0.1.410.dist-info → exonware_xwsystem-0.1.0.1.dist-info}/licenses/LICENSE +0 -0
exonware/xwsystem/config/defs.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
#exonware/
|
|
1
|
+
#exonware/xwsystem/config/errors.py
|
|
2
2
|
"""
|
|
3
3
|
Company: eXonware.com
|
|
4
4
|
Author: Eng. Muhammad AlShehri
|
|
5
5
|
Email: connect@exonware.com
|
|
6
|
-
Version: 0.0.1
|
|
6
|
+
Version: 0.1.0.1
|
|
7
7
|
Generation Date: September 04, 2025
|
|
8
8
|
|
|
9
9
|
Configuration module errors - exception classes for configuration functionality.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Company: eXonware.com
|
|
3
3
|
Author: Eng. Muhammad AlShehri
|
|
4
4
|
Email: connect@exonware.com
|
|
5
|
-
Version: 0.0.1
|
|
5
|
+
Version: 0.1.0.1
|
|
6
6
|
Generation Date: September 05, 2025
|
|
7
7
|
|
|
8
8
|
Logging configuration setup for XSystem.
|
|
@@ -19,7 +19,7 @@ from .defaults import LOGGING_ENABLED, LOGGING_LEVEL
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def setup_logging(
|
|
22
|
-
log_file="logs/
|
|
22
|
+
log_file="logs/xwsystem.log",
|
|
23
23
|
level=logging.INFO,
|
|
24
24
|
max_bytes=10 * 1024 * 1024,
|
|
25
25
|
backup_count=5,
|
|
@@ -1,406 +1,133 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Company: eXonware.com
|
|
3
|
-
Author: Eng. Muhammad AlShehri
|
|
4
|
-
Email: connect@exonware.com
|
|
5
|
-
Version: 0.0.1.410
|
|
6
|
-
Generation Date: September 04, 2025
|
|
7
|
-
|
|
8
|
-
Performance Configuration Management
|
|
1
|
+
"""Performance optimization configuration for xwsystem I/O operations.
|
|
9
2
|
|
|
10
|
-
|
|
3
|
+
This module provides configuration options to enable/disable performance
|
|
4
|
+
optimizations (parallel index building, append-only logs) with automatic
|
|
5
|
+
fallback to original implementations.
|
|
11
6
|
"""
|
|
12
7
|
|
|
13
|
-
from
|
|
14
|
-
from dataclasses import dataclass, field
|
|
15
|
-
import os
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
|
|
18
|
-
from ..config.logging_setup import get_logger
|
|
19
|
-
|
|
20
|
-
logger = get_logger(__name__)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@dataclass
|
|
24
|
-
class SerializationLimits:
|
|
25
|
-
"""Configuration limits for serialization operations."""
|
|
26
|
-
|
|
27
|
-
# Data size limits
|
|
28
|
-
max_size_mb: float = 50.0 # Maximum data size in MB
|
|
29
|
-
max_depth: int = 100 # Maximum nesting depth
|
|
30
|
-
max_string_length: int = 1_000_000 # Maximum string length
|
|
31
|
-
max_list_items: int = 100_000 # Maximum list/array items
|
|
32
|
-
max_dict_keys: int = 10_000 # Maximum dictionary keys
|
|
33
|
-
|
|
34
|
-
# File operation limits
|
|
35
|
-
max_file_size_mb: float = 100.0 # Maximum file size for operations
|
|
36
|
-
max_path_length: int = 4096 # Maximum file path length
|
|
37
|
-
|
|
38
|
-
# Performance settings
|
|
39
|
-
use_atomic_writes: bool = True # Use atomic file operations by default
|
|
40
|
-
validate_input: bool = True # Enable input validation by default
|
|
41
|
-
validate_paths: bool = True # Enable path validation by default
|
|
42
|
-
|
|
43
|
-
# Memory management
|
|
44
|
-
max_memory_mb: float = 200.0 # Maximum memory usage for operations
|
|
45
|
-
enable_compression: bool = False # Enable compression by default
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@dataclass
|
|
49
|
-
class NetworkLimits:
|
|
50
|
-
"""Configuration limits for network operations."""
|
|
51
|
-
|
|
52
|
-
# Timeout settings (seconds)
|
|
53
|
-
connect_timeout: float = 30.0 # Connection timeout
|
|
54
|
-
read_timeout: float = 60.0 # Read timeout
|
|
55
|
-
total_timeout: float = 300.0 # Total request timeout
|
|
56
|
-
|
|
57
|
-
# Retry settings
|
|
58
|
-
max_retries: int = 3 # Maximum retry attempts
|
|
59
|
-
retry_backoff_factor: float = 2.0 # Exponential backoff factor
|
|
60
|
-
retry_max_delay: float = 60.0 # Maximum retry delay
|
|
61
|
-
|
|
62
|
-
# Size limits
|
|
63
|
-
max_response_size_mb: float = 100.0 # Maximum response size
|
|
64
|
-
max_request_size_mb: float = 50.0 # Maximum request size
|
|
65
|
-
|
|
66
|
-
# Connection pool settings
|
|
67
|
-
max_connections: int = 100 # Maximum connections in pool
|
|
68
|
-
max_keepalive_connections: int = 20 # Maximum keep-alive connections
|
|
69
|
-
|
|
8
|
+
from __future__ import annotations
|
|
70
9
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
"""Configuration limits for security operations."""
|
|
74
|
-
|
|
75
|
-
# Path validation
|
|
76
|
-
allow_absolute_paths: bool = False # Allow absolute paths
|
|
77
|
-
allow_symlinks: bool = False # Allow symbolic links
|
|
78
|
-
blocked_extensions: tuple = field(default_factory=lambda: (
|
|
79
|
-
'.exe', '.bat', '.cmd', '.com', '.scr', '.dll', '.sys'
|
|
80
|
-
))
|
|
81
|
-
|
|
82
|
-
# Input validation
|
|
83
|
-
max_input_complexity: int = 1000 # Maximum input complexity score
|
|
84
|
-
enable_xss_protection: bool = True # Enable XSS protection
|
|
85
|
-
enable_injection_protection: bool = True # Enable injection protection
|
|
86
|
-
|
|
87
|
-
# Cryptography settings
|
|
88
|
-
min_key_size: int = 2048 # Minimum key size for RSA
|
|
89
|
-
hash_iterations: int = 100_000 # PBKDF2 iterations
|
|
90
|
-
salt_length: int = 32 # Salt length in bytes
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
import os
|
|
91
12
|
|
|
92
13
|
|
|
93
14
|
@dataclass
|
|
94
|
-
class PerformanceLimits:
|
|
95
|
-
"""Master configuration for all XSystem performance limits."""
|
|
96
|
-
|
|
97
|
-
# Component-specific limits
|
|
98
|
-
serialization: SerializationLimits = field(default_factory=SerializationLimits)
|
|
99
|
-
network: NetworkLimits = field(default_factory=NetworkLimits)
|
|
100
|
-
security: SecurityLimits = field(default_factory=SecurityLimits)
|
|
101
|
-
|
|
102
|
-
# Global settings
|
|
103
|
-
enable_monitoring: bool = True # Enable performance monitoring
|
|
104
|
-
enable_metrics: bool = True # Enable metrics collection
|
|
105
|
-
log_performance_warnings: bool = True # Log performance warnings
|
|
106
|
-
|
|
107
|
-
# Memory management
|
|
108
|
-
max_total_memory_mb: float = 500.0 # Maximum total memory usage
|
|
109
|
-
gc_threshold_mb: float = 100.0 # Garbage collection threshold
|
|
110
|
-
|
|
111
|
-
# Concurrency settings
|
|
112
|
-
max_threads: int = 50 # Maximum thread pool size
|
|
113
|
-
max_async_tasks: int = 100 # Maximum async tasks
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
# Default configuration instance
|
|
117
|
-
DEFAULT_LIMITS: Final[PerformanceLimits] = PerformanceLimits()
|
|
118
|
-
|
|
119
|
-
|
|
120
15
|
class PerformanceConfig:
|
|
121
|
-
"""
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if val := os.getenv('XSYSTEM_MIN_KEY_SIZE'):
|
|
173
|
-
self._limits.security.min_key_size = int(val)
|
|
174
|
-
|
|
175
|
-
# Global settings
|
|
176
|
-
if val := os.getenv('XSYSTEM_MAX_MEMORY_MB'):
|
|
177
|
-
self._limits.max_total_memory_mb = float(val)
|
|
178
|
-
|
|
179
|
-
if val := os.getenv('XSYSTEM_MAX_THREADS'):
|
|
180
|
-
self._limits.max_threads = int(val)
|
|
181
|
-
|
|
182
|
-
def _load_from_file(self, config_file: str) -> None:
|
|
183
|
-
"""
|
|
184
|
-
Load configuration from file.
|
|
185
|
-
|
|
186
|
-
Args:
|
|
187
|
-
config_file: Path to configuration file (JSON/YAML/TOML)
|
|
188
|
-
"""
|
|
189
|
-
try:
|
|
190
|
-
config_path = Path(config_file)
|
|
191
|
-
if not config_path.exists():
|
|
192
|
-
logger.warning(f"Configuration file not found: {config_file}")
|
|
193
|
-
return
|
|
194
|
-
|
|
195
|
-
# Import here to avoid circular imports
|
|
196
|
-
from ..io.serialization import JsonSerializer, YamlSerializer, TomlSerializer
|
|
197
|
-
|
|
198
|
-
# Determine format by extension
|
|
199
|
-
if config_path.suffix.lower() in ('.json',):
|
|
200
|
-
serializer = JsonSerializer(validate_paths=False)
|
|
201
|
-
elif config_path.suffix.lower() in ('.yaml', '.yml'):
|
|
202
|
-
serializer = YamlSerializer(validate_paths=False)
|
|
203
|
-
elif config_path.suffix.lower() in ('.toml',):
|
|
204
|
-
serializer = TomlSerializer(validate_paths=False)
|
|
205
|
-
else:
|
|
206
|
-
logger.warning(f"Unsupported config file format: {config_path.suffix}")
|
|
207
|
-
return
|
|
208
|
-
|
|
209
|
-
config_data = serializer.load_file(config_file)
|
|
210
|
-
self._apply_config_data(config_data)
|
|
211
|
-
|
|
212
|
-
logger.info(f"Loaded configuration from: {config_file}")
|
|
213
|
-
|
|
214
|
-
except Exception as e:
|
|
215
|
-
logger.error(f"Failed to load configuration file {config_file}: {e}")
|
|
216
|
-
|
|
217
|
-
def _apply_config_data(self, config_data: dict[str, Any]) -> None:
|
|
218
|
-
"""Apply configuration data to limits."""
|
|
219
|
-
|
|
220
|
-
if 'serialization' in config_data:
|
|
221
|
-
ser_config = config_data['serialization']
|
|
222
|
-
for key, value in ser_config.items():
|
|
223
|
-
if hasattr(self._limits.serialization, key):
|
|
224
|
-
setattr(self._limits.serialization, key, value)
|
|
225
|
-
|
|
226
|
-
if 'network' in config_data:
|
|
227
|
-
net_config = config_data['network']
|
|
228
|
-
for key, value in net_config.items():
|
|
229
|
-
if hasattr(self._limits.network, key):
|
|
230
|
-
setattr(self._limits.network, key, value)
|
|
231
|
-
|
|
232
|
-
if 'security' in config_data:
|
|
233
|
-
sec_config = config_data['security']
|
|
234
|
-
for key, value in sec_config.items():
|
|
235
|
-
if hasattr(self._limits.security, key):
|
|
236
|
-
setattr(self._limits.security, key, value)
|
|
237
|
-
|
|
238
|
-
# Global settings
|
|
239
|
-
for key in ['enable_monitoring', 'enable_metrics', 'max_total_memory_mb', 'max_threads']:
|
|
240
|
-
if key in config_data:
|
|
241
|
-
setattr(self._limits, key, config_data[key])
|
|
242
|
-
|
|
243
|
-
@property
|
|
244
|
-
def limits(self) -> PerformanceLimits:
|
|
245
|
-
"""Get current performance limits."""
|
|
246
|
-
return self._limits
|
|
247
|
-
|
|
248
|
-
def get_serialization_config(self) -> dict[str, Any]:
|
|
249
|
-
"""Get serialization configuration dictionary."""
|
|
250
|
-
return {
|
|
251
|
-
'max_size_mb': self._limits.serialization.max_size_mb,
|
|
252
|
-
'max_depth': self._limits.serialization.max_depth,
|
|
253
|
-
'max_file_size_mb': self._limits.serialization.max_file_size_mb,
|
|
254
|
-
'use_atomic_writes': self._limits.serialization.use_atomic_writes,
|
|
255
|
-
'validate_input': self._limits.serialization.validate_input,
|
|
256
|
-
'validate_paths': self._limits.serialization.validate_paths,
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
def get_network_config(self) -> dict[str, Any]:
|
|
260
|
-
"""Get network configuration dictionary."""
|
|
261
|
-
return {
|
|
262
|
-
'connect_timeout': self._limits.network.connect_timeout,
|
|
263
|
-
'read_timeout': self._limits.network.read_timeout,
|
|
264
|
-
'total_timeout': self._limits.network.total_timeout,
|
|
265
|
-
'max_retries': self._limits.network.max_retries,
|
|
266
|
-
'max_response_size_mb': self._limits.network.max_response_size_mb,
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
def get_security_config(self) -> dict[str, Any]:
|
|
270
|
-
"""Get security configuration dictionary."""
|
|
271
|
-
return {
|
|
272
|
-
'allow_absolute_paths': self._limits.security.allow_absolute_paths,
|
|
273
|
-
'allow_symlinks': self._limits.security.allow_symlinks,
|
|
274
|
-
'blocked_extensions': self._limits.security.blocked_extensions,
|
|
275
|
-
'min_key_size': self._limits.security.min_key_size,
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
def update_limits(self, **kwargs) -> None:
|
|
279
|
-
"""
|
|
280
|
-
Update performance limits at runtime.
|
|
281
|
-
|
|
282
|
-
Args:
|
|
283
|
-
**kwargs: Limit values to update
|
|
284
|
-
"""
|
|
285
|
-
for key, value in kwargs.items():
|
|
286
|
-
if '.' in key:
|
|
287
|
-
# Handle nested attributes like 'serialization.max_size_mb'
|
|
288
|
-
parts = key.split('.')
|
|
289
|
-
obj = self._limits
|
|
290
|
-
for part in parts[:-1]:
|
|
291
|
-
obj = getattr(obj, part)
|
|
292
|
-
setattr(obj, parts[-1], value)
|
|
293
|
-
else:
|
|
294
|
-
# Handle top-level attributes
|
|
295
|
-
if hasattr(self._limits, key):
|
|
296
|
-
setattr(self._limits, key, value)
|
|
297
|
-
|
|
298
|
-
logger.info(f"Updated performance limits: {kwargs}")
|
|
299
|
-
|
|
300
|
-
def set_mode(self, mode: str) -> None:
|
|
301
|
-
"""Set performance mode."""
|
|
302
|
-
self._mode = mode
|
|
303
|
-
logger.info(f"Performance mode set to: {mode}")
|
|
304
|
-
|
|
305
|
-
def get_mode(self) -> str:
|
|
306
|
-
"""Get current performance mode."""
|
|
307
|
-
return self._mode
|
|
308
|
-
|
|
309
|
-
def optimize(self) -> None:
|
|
310
|
-
"""Optimize performance settings based on current mode."""
|
|
311
|
-
if self._mode == "fast":
|
|
312
|
-
# Optimize for speed
|
|
313
|
-
self._limits.serialization.max_size_mb = 100.0
|
|
314
|
-
self._limits.serialization.max_depth = 200
|
|
315
|
-
elif self._mode == "memory_optimized":
|
|
316
|
-
# Optimize for memory
|
|
317
|
-
self._limits.serialization.max_size_mb = 25.0
|
|
318
|
-
self._limits.serialization.max_depth = 50
|
|
319
|
-
else: # balanced
|
|
320
|
-
# Balanced settings
|
|
321
|
-
self._limits.serialization.max_size_mb = 50.0
|
|
322
|
-
self._limits.serialization.max_depth = 100
|
|
323
|
-
|
|
324
|
-
logger.info(f"Performance optimized for mode: {self._mode}")
|
|
325
|
-
|
|
326
|
-
def export_config(self, format: str = 'json') -> dict[str, Any]:
|
|
327
|
-
"""
|
|
328
|
-
Export current configuration.
|
|
329
|
-
|
|
330
|
-
Args:
|
|
331
|
-
format: Export format ('json', 'yaml', 'toml')
|
|
332
|
-
|
|
333
|
-
Returns:
|
|
334
|
-
Configuration dictionary
|
|
335
|
-
"""
|
|
336
|
-
return {
|
|
337
|
-
'serialization': {
|
|
338
|
-
'max_size_mb': self._limits.serialization.max_size_mb,
|
|
339
|
-
'max_depth': self._limits.serialization.max_depth,
|
|
340
|
-
'max_file_size_mb': self._limits.serialization.max_file_size_mb,
|
|
341
|
-
'use_atomic_writes': self._limits.serialization.use_atomic_writes,
|
|
342
|
-
'validate_input': self._limits.serialization.validate_input,
|
|
343
|
-
'validate_paths': self._limits.serialization.validate_paths,
|
|
344
|
-
},
|
|
345
|
-
'network': {
|
|
346
|
-
'connect_timeout': self._limits.network.connect_timeout,
|
|
347
|
-
'read_timeout': self._limits.network.read_timeout,
|
|
348
|
-
'total_timeout': self._limits.network.total_timeout,
|
|
349
|
-
'max_retries': self._limits.network.max_retries,
|
|
350
|
-
'max_response_size_mb': self._limits.network.max_response_size_mb,
|
|
351
|
-
},
|
|
352
|
-
'security': {
|
|
353
|
-
'allow_absolute_paths': self._limits.security.allow_absolute_paths,
|
|
354
|
-
'allow_symlinks': self._limits.security.allow_symlinks,
|
|
355
|
-
'min_key_size': self._limits.security.min_key_size,
|
|
356
|
-
},
|
|
357
|
-
'global': {
|
|
358
|
-
'enable_monitoring': self._limits.enable_monitoring,
|
|
359
|
-
'enable_metrics': self._limits.enable_metrics,
|
|
360
|
-
'max_total_memory_mb': self._limits.max_total_memory_mb,
|
|
361
|
-
'max_threads': self._limits.max_threads,
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
# Global configuration instance
|
|
367
|
-
_global_config: Optional[PerformanceConfig] = None
|
|
16
|
+
"""Configuration for performance optimizations."""
|
|
17
|
+
|
|
18
|
+
# Parallel index building
|
|
19
|
+
enable_parallel_index: bool = True # Auto-enabled for large files
|
|
20
|
+
parallel_index_workers: int | None = None # None = auto (CPU count)
|
|
21
|
+
parallel_index_chunk_size_mb: int = 100 # 100MB chunks
|
|
22
|
+
parallel_index_threshold_mb: int = 200 # Use parallel for files >200MB
|
|
23
|
+
|
|
24
|
+
# Append-only log for atomic updates
|
|
25
|
+
enable_append_log: bool = True # Auto-enabled for large files
|
|
26
|
+
append_log_threshold_mb: int = 100 # Use append-only log for files >100MB
|
|
27
|
+
append_log_compaction_threshold_mb: int = 100 # Compact when log > 100MB
|
|
28
|
+
|
|
29
|
+
# Fallback behavior
|
|
30
|
+
fallback_on_error: bool = True # Fall back to original if optimization fails
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def from_env(cls) -> PerformanceConfig:
|
|
34
|
+
"""Create config from environment variables."""
|
|
35
|
+
return cls(
|
|
36
|
+
enable_parallel_index=os.getenv("XWSYSTEM_PARALLEL_INDEX", "true").lower() == "true",
|
|
37
|
+
parallel_index_workers=int(os.getenv("XWSYSTEM_PARALLEL_WORKERS", "0")) or None,
|
|
38
|
+
parallel_index_chunk_size_mb=int(os.getenv("XWSYSTEM_CHUNK_SIZE_MB", "100")),
|
|
39
|
+
parallel_index_threshold_mb=int(os.getenv("XWSYSTEM_PARALLEL_THRESHOLD_MB", "200")),
|
|
40
|
+
enable_append_log=os.getenv("XWSYSTEM_APPEND_LOG", "true").lower() == "true",
|
|
41
|
+
append_log_threshold_mb=int(os.getenv("XWSYSTEM_APPEND_LOG_THRESHOLD_MB", "100")),
|
|
42
|
+
append_log_compaction_threshold_mb=int(os.getenv("XWSYSTEM_LOG_THRESHOLD_MB", "100")),
|
|
43
|
+
fallback_on_error=os.getenv("XWSYSTEM_FALLBACK", "true").lower() == "true",
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
@classmethod
|
|
47
|
+
def conservative(cls) -> PerformanceConfig:
|
|
48
|
+
"""Conservative config (disable optimizations, use originals)."""
|
|
49
|
+
return cls(
|
|
50
|
+
enable_parallel_index=False,
|
|
51
|
+
enable_append_log=False,
|
|
52
|
+
fallback_on_error=True,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
@classmethod
|
|
56
|
+
def aggressive(cls) -> PerformanceConfig:
|
|
57
|
+
"""Aggressive config (enable all optimizations, no fallback)."""
|
|
58
|
+
return cls(
|
|
59
|
+
enable_parallel_index=True,
|
|
60
|
+
enable_append_log=True,
|
|
61
|
+
fallback_on_error=False,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# Global config instance
|
|
66
|
+
_config: PerformanceConfig | None = None
|
|
368
67
|
|
|
369
68
|
|
|
370
69
|
def get_performance_config() -> PerformanceConfig:
|
|
371
|
-
"""Get
|
|
372
|
-
global
|
|
373
|
-
if
|
|
374
|
-
|
|
375
|
-
return
|
|
376
|
-
|
|
70
|
+
"""Get global performance config."""
|
|
71
|
+
global _config
|
|
72
|
+
if _config is None:
|
|
73
|
+
_config = PerformanceConfig.from_env()
|
|
74
|
+
return _config
|
|
377
75
|
|
|
378
|
-
def configure_performance(config_file: Optional[str] = None, **kwargs) -> None:
|
|
379
|
-
"""
|
|
380
|
-
Configure global performance settings.
|
|
381
|
-
|
|
382
|
-
Args:
|
|
383
|
-
config_file: Optional configuration file path
|
|
384
|
-
**kwargs: Performance limit overrides
|
|
385
|
-
"""
|
|
386
|
-
global _global_config
|
|
387
|
-
_global_config = PerformanceConfig(config_file)
|
|
388
|
-
|
|
389
|
-
if kwargs:
|
|
390
|
-
_global_config.update_limits(**kwargs)
|
|
391
76
|
|
|
77
|
+
def set_performance_config(config: PerformanceConfig) -> None:
|
|
78
|
+
"""Set global performance config."""
|
|
79
|
+
global _config
|
|
80
|
+
_config = config
|
|
392
81
|
|
|
393
|
-
# Convenience functions for getting specific limits
|
|
394
|
-
def get_serialization_limits() -> SerializationLimits:
|
|
395
|
-
"""Get current serialization limits."""
|
|
396
|
-
return get_performance_config().limits.serialization
|
|
397
82
|
|
|
83
|
+
# Placeholder classes for backward compatibility with existing config system
|
|
84
|
+
# These are not used by the new optimization system but are required by __init__.py
|
|
85
|
+
@dataclass
|
|
86
|
+
class PerformanceLimits:
|
|
87
|
+
"""Placeholder for backward compatibility."""
|
|
88
|
+
pass
|
|
398
89
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
90
|
+
@dataclass
|
|
91
|
+
class SerializationLimits:
|
|
92
|
+
"""Placeholder for backward compatibility."""
|
|
93
|
+
pass
|
|
402
94
|
|
|
95
|
+
@dataclass
|
|
96
|
+
class NetworkLimits:
|
|
97
|
+
"""Placeholder for backward compatibility."""
|
|
98
|
+
pass
|
|
403
99
|
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
100
|
+
@dataclass
|
|
101
|
+
class SecurityLimits:
|
|
102
|
+
"""Placeholder for backward compatibility."""
|
|
103
|
+
pass
|
|
104
|
+
|
|
105
|
+
def configure_performance(**kwargs):
|
|
106
|
+
"""Placeholder for backward compatibility."""
|
|
107
|
+
pass
|
|
108
|
+
|
|
109
|
+
def get_serialization_limits():
|
|
110
|
+
"""Placeholder for backward compatibility."""
|
|
111
|
+
return SerializationLimits()
|
|
112
|
+
|
|
113
|
+
def get_network_limits():
|
|
114
|
+
"""Placeholder for backward compatibility."""
|
|
115
|
+
return NetworkLimits()
|
|
116
|
+
|
|
117
|
+
def get_security_limits():
|
|
118
|
+
"""Placeholder for backward compatibility."""
|
|
119
|
+
return SecurityLimits()
|
|
120
|
+
|
|
121
|
+
__all__ = [
|
|
122
|
+
"PerformanceConfig",
|
|
123
|
+
"PerformanceLimits",
|
|
124
|
+
"SerializationLimits",
|
|
125
|
+
"NetworkLimits",
|
|
126
|
+
"SecurityLimits",
|
|
127
|
+
"get_performance_config",
|
|
128
|
+
"set_performance_config",
|
|
129
|
+
"configure_performance",
|
|
130
|
+
"get_serialization_limits",
|
|
131
|
+
"get_network_limits",
|
|
132
|
+
"get_security_limits",
|
|
133
|
+
]
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Company: eXonware.com
|
|
3
3
|
Author: Eng. Muhammad AlShehri
|
|
4
4
|
Email: connect@exonware.com
|
|
5
|
-
Version: 0.0.1
|
|
5
|
+
Version: 0.1.0.1
|
|
6
6
|
Generation Date: September 04, 2025
|
|
7
7
|
|
|
8
8
|
Advanced HTTP client with HTTP/2, streaming, pluggable transports, and modern features.
|
|
@@ -28,7 +28,7 @@ from ..config.logging_setup import get_logger
|
|
|
28
28
|
from ..monitoring.error_recovery import retry_with_backoff
|
|
29
29
|
from .client import HttpError, RetryConfig
|
|
30
30
|
|
|
31
|
-
logger = get_logger("
|
|
31
|
+
logger = get_logger("xwsystem.http_client.advanced_client")
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
#exonware/
|
|
1
|
+
#exonware/xwsystem/http/base.py
|
|
2
2
|
"""
|
|
3
3
|
Company: eXonware.com
|
|
4
4
|
Author: Eng. Muhammad AlShehri
|
|
5
5
|
Email: connect@exonware.com
|
|
6
|
-
Version: 0.0.1
|
|
6
|
+
Version: 0.1.0.1
|
|
7
7
|
Generation Date: September 04, 2025
|
|
8
8
|
|
|
9
9
|
HTTP module base classes - abstract classes for HTTP client functionality.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Company: eXonware.com
|
|
3
3
|
Author: Eng. Muhammad AlShehri
|
|
4
4
|
Email: connect@exonware.com
|
|
5
|
-
Version: 0.0.1
|
|
5
|
+
Version: 0.1.0.1
|
|
6
6
|
Generation Date: September 04, 2025
|
|
7
7
|
|
|
8
8
|
HTTP client with retry mechanisms, connection pooling, and error handling.
|
|
@@ -24,7 +24,7 @@ from ..config.logging_setup import get_logger
|
|
|
24
24
|
from ..monitoring.error_recovery import retry_with_backoff
|
|
25
25
|
from .errors import HttpError
|
|
26
26
|
|
|
27
|
-
logger = get_logger("
|
|
27
|
+
logger = get_logger("xwsystem.http_client.client")
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
@dataclass
|