altcodepro-polydb-python 2.5.4__tar.gz → 2.5.6__tar.gz
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.
- {altcodepro_polydb_python-2.5.4/src/altcodepro_polydb_python.egg-info → altcodepro_polydb_python-2.5.6}/PKG-INFO +69 -20
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/README.md +51 -6
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/pyproject.toml +30 -16
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6/src/altcodepro_polydb_python.egg-info}/PKG-INFO +69 -20
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/altcodepro_polydb_python.egg-info/SOURCES.txt +14 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/altcodepro_polydb_python.egg-info/requires.txt +20 -13
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/__init__.py +1 -1
- altcodepro_polydb_python-2.5.6/src/polydb/adapters/AWSSecretsManagerAdapter.py +72 -0
- altcodepro_polydb_python-2.5.6/src/polydb/adapters/AzureKeyVaultAdapter.py +65 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/AzureQueueAdapter.py +82 -4
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/DynamoDBAdapter.py +31 -16
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/FirestoreAdapter.py +30 -13
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/GCPPubSubAdapter.py +46 -0
- altcodepro_polydb_python-2.5.6/src/polydb/adapters/GCPSecretManagerAdapter.py +79 -0
- altcodepro_polydb_python-2.5.6/src/polydb/adapters/KafkaQueueAdapter.py +332 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/PostgreSQLAdapter.py +114 -6
- altcodepro_polydb_python-2.5.6/src/polydb/adapters/RabbitMQAdapter.py +465 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/SQSAdapter.py +60 -0
- altcodepro_polydb_python-2.5.6/src/polydb/adapters/VaultAdapter.py +75 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/VercelKVAdapter.py +38 -24
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/VercelQueueAdapter.py +30 -2
- altcodepro_polydb_python-2.5.6/src/polydb/base/QueueAdapter.py +149 -0
- altcodepro_polydb_python-2.5.6/src/polydb/base/SecretsAdapter.py +30 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/cache.py +90 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/cloudDatabaseFactory.py +129 -15
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/databaseFactory.py +225 -49
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/errors.py +6 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/models.py +77 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/retry.py +7 -0
- altcodepro_polydb_python-2.5.6/tests/test_kafka.py +442 -0
- altcodepro_polydb_python-2.5.6/tests/test_queue_extend_delay_cancel.py +378 -0
- altcodepro_polydb_python-2.5.6/tests/test_rabbitmq.py +410 -0
- altcodepro_polydb_python-2.5.6/tests/test_redis_kv.py +199 -0
- altcodepro_polydb_python-2.5.6/tests/test_secrets_aws.py +70 -0
- altcodepro_polydb_python-2.5.6/tests/test_secrets_vault.py +84 -0
- altcodepro_polydb_python-2.5.6/tests/test_session_vars.py +295 -0
- altcodepro_polydb_python-2.5.4/src/polydb/base/QueueAdapter.py +0 -27
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/LICENSE +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/MANIFEST.in +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/requirements-aws.txt +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/requirements-azure.txt +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/requirements-dev.txt +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/requirements-gcp.txt +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/requirements-generic.txt +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/requirements.txt +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/setup.cfg +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/setup.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/altcodepro_polydb_python.egg-info/dependency_links.txt +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/altcodepro_polydb_python.egg-info/top_level.txt +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/PolyDB.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/AzureBlobStorageAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/AzureFileStorageAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/AzureTableStorageAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/BlockchainBlobAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/BlockchainFileAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/BlockchainKVAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/BlockchainQueueAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/EFSAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/GCPFilestoreAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/GCPStorageAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/MongoDBAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/S3Adapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/S3CompatibleAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/VercelBlobAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/VercelFileAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/adapters/__init__.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/advanced_query.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/audit/AuditStorage.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/audit/__init__.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/audit/context.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/audit/manager.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/audit/models.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/base/NoSQLKVAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/base/ObjectStorageAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/base/SharedFilesAdapter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/base/__init__.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/batch.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/decorators.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/json_safe.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/monitoring.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/multitenancy.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/observability/__init__.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/observability/logging.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/py.typed +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/query.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/registry.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/schema.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/security.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/services/__init__.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/services/compliance_service.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/services/security_service.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/types.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/utils.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/src/polydb/validation.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_advanced_query_injection.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_atomic_decrement.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_audit_chain_cutover.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_audit_hmac.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_aws.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_azure.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_azure_queue_receipt_handle.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_azure_table_empty_filter.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_azure_table_unpack_entity.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_blockchain.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_cloud_factory.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_field_encryption.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_gcp.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_like_pattern_escaping.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_mongodb.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_multi_engine.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_multitenancy_ddl_injection.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_nosql_operator_injection.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_observability.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_postgresql.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_schema_ddl_injection.py +0 -0
- {altcodepro_polydb_python-2.5.4 → altcodepro_polydb_python-2.5.6}/tests/test_vercel.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: altcodepro-polydb-python
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.6
|
|
4
4
|
Summary: Production-ready multi-cloud database abstraction layer with connection pooling, retry logic, and thread safety
|
|
5
5
|
Author: AltCodePro
|
|
6
6
|
Project-URL: Homepage, https://github.com/altcodepro/polydb-python
|
|
@@ -27,19 +27,6 @@ Requires-Dist: psycopg2-binary>=2.9.11
|
|
|
27
27
|
Requires-Dist: tenacity>=9.1.4
|
|
28
28
|
Requires-Dist: redis>=6.4.0
|
|
29
29
|
Requires-Dist: python-dotenv>=1.1.1
|
|
30
|
-
Requires-Dist: azure-storage-queue>=12.15.0
|
|
31
|
-
Requires-Dist: azure-storage-blob>=12.29.0
|
|
32
|
-
Requires-Dist: boto3>=1.43.18
|
|
33
|
-
Requires-Dist: google-cloud-storage>=3.10.1
|
|
34
|
-
Requires-Dist: azure-storage-file-share>=12.25.0
|
|
35
|
-
Requires-Dist: azure-data-tables>=12.7.0
|
|
36
|
-
Requires-Dist: ipfshttpclient>=0.7.0
|
|
37
|
-
Requires-Dist: web3>=7.16.0
|
|
38
|
-
Requires-Dist: google-cloud-firestore>=2.27.0
|
|
39
|
-
Requires-Dist: google-cloud-pubsub>=2.38.0
|
|
40
|
-
Requires-Dist: pymongo>=4.17.0
|
|
41
|
-
Requires-Dist: build>=1.5.0
|
|
42
|
-
Requires-Dist: twine>=6.2.0
|
|
43
30
|
Provides-Extra: aws
|
|
44
31
|
Requires-Dist: boto3>=1.42.47; extra == "aws"
|
|
45
32
|
Requires-Dist: botocore>=1.42.47; extra == "aws"
|
|
@@ -49,6 +36,8 @@ Requires-Dist: azure-data-tables>=12.7.0; extra == "azure"
|
|
|
49
36
|
Requires-Dist: azure-storage-blob>=12.28.0; extra == "azure"
|
|
50
37
|
Requires-Dist: azure-storage-file-share>=12.24.0; extra == "azure"
|
|
51
38
|
Requires-Dist: azure-storage-queue>=12.15.0; extra == "azure"
|
|
39
|
+
Requires-Dist: azure-identity>=1.16.0; extra == "azure"
|
|
40
|
+
Requires-Dist: azure-keyvault-secrets>=4.8.0; extra == "azure"
|
|
52
41
|
Provides-Extra: gcp
|
|
53
42
|
Requires-Dist: google-api-core>=2.29.0; extra == "gcp"
|
|
54
43
|
Requires-Dist: google-auth>=2.48.0; extra == "gcp"
|
|
@@ -56,18 +45,27 @@ Requires-Dist: google-cloud-core>=2.5.0; extra == "gcp"
|
|
|
56
45
|
Requires-Dist: google-cloud-firestore>=2.23.0; extra == "gcp"
|
|
57
46
|
Requires-Dist: google-cloud-pubsub>=2.35.0; extra == "gcp"
|
|
58
47
|
Requires-Dist: google-cloud-storage>=3.9.0; extra == "gcp"
|
|
48
|
+
Requires-Dist: google-cloud-secret-manager>=2.20.0; extra == "gcp"
|
|
59
49
|
Provides-Extra: mongodb
|
|
60
50
|
Requires-Dist: pymongo>=4.16.0; extra == "mongodb"
|
|
61
51
|
Provides-Extra: rabbitmq
|
|
62
52
|
Requires-Dist: pika>=1.3.2; extra == "rabbitmq"
|
|
53
|
+
Provides-Extra: kafka
|
|
54
|
+
Requires-Dist: kafka-python>=2.0.2; extra == "kafka"
|
|
63
55
|
Provides-Extra: vercel
|
|
64
56
|
Requires-Dist: requests>=2.32.5; extra == "vercel"
|
|
57
|
+
Provides-Extra: blockchain
|
|
58
|
+
Requires-Dist: ipfshttpclient>=0.7.0; extra == "blockchain"
|
|
59
|
+
Requires-Dist: web3>=7.14.1; extra == "blockchain"
|
|
65
60
|
Provides-Extra: bolckchain
|
|
66
61
|
Requires-Dist: ipfshttpclient>=0.7.0; extra == "bolckchain"
|
|
67
62
|
Requires-Dist: web3>=7.14.1; extra == "bolckchain"
|
|
63
|
+
Provides-Extra: secrets
|
|
64
|
+
Requires-Dist: hvac>=2.1.0; extra == "secrets"
|
|
68
65
|
Provides-Extra: generic
|
|
69
66
|
Requires-Dist: pymongo>=4.16.0; extra == "generic"
|
|
70
67
|
Requires-Dist: pika>=1.3.2; extra == "generic"
|
|
68
|
+
Requires-Dist: kafka-python>=2.0.2; extra == "generic"
|
|
71
69
|
Requires-Dist: boto3>=1.42.47; extra == "generic"
|
|
72
70
|
Provides-Extra: security
|
|
73
71
|
Requires-Dist: cryptography>=42.0.0; extra == "security"
|
|
@@ -79,13 +77,18 @@ Requires-Dist: azure-data-tables>=12.7.0; extra == "all"
|
|
|
79
77
|
Requires-Dist: azure-storage-blob>=12.28.0; extra == "all"
|
|
80
78
|
Requires-Dist: azure-storage-file-share>=12.24.0; extra == "all"
|
|
81
79
|
Requires-Dist: azure-storage-queue>=12.15.0; extra == "all"
|
|
80
|
+
Requires-Dist: azure-identity>=1.16.0; extra == "all"
|
|
81
|
+
Requires-Dist: azure-keyvault-secrets>=4.8.0; extra == "all"
|
|
82
82
|
Requires-Dist: google-cloud-firestore>=2.23.0; extra == "all"
|
|
83
83
|
Requires-Dist: google-cloud-pubsub>=2.35.0; extra == "all"
|
|
84
84
|
Requires-Dist: google-cloud-storage>=3.9.0; extra == "all"
|
|
85
|
+
Requires-Dist: google-cloud-secret-manager>=2.20.0; extra == "all"
|
|
85
86
|
Requires-Dist: pymongo>=4.16.0; extra == "all"
|
|
86
87
|
Requires-Dist: pika>=1.3.2; extra == "all"
|
|
88
|
+
Requires-Dist: kafka-python>=2.0.2; extra == "all"
|
|
87
89
|
Requires-Dist: requests>=2.32.5; extra == "all"
|
|
88
90
|
Requires-Dist: cryptography>=42.0.0; extra == "all"
|
|
91
|
+
Requires-Dist: hvac>=2.1.0; extra == "all"
|
|
89
92
|
Provides-Extra: dev
|
|
90
93
|
Requires-Dist: black>=26.1.0; extra == "dev"
|
|
91
94
|
Requires-Dist: flake8>=7.3.0; extra == "dev"
|
|
@@ -97,6 +100,7 @@ Requires-Dist: pytest-asyncio>=1.2.0; extra == "test"
|
|
|
97
100
|
Requires-Dist: pytest-cov>=7.0.0; extra == "test"
|
|
98
101
|
Requires-Dist: pytest-mock>=3.15.1; extra == "test"
|
|
99
102
|
Requires-Dist: moto>=5.1.21; extra == "test"
|
|
103
|
+
Requires-Dist: hvac>=2.1.0; extra == "test"
|
|
100
104
|
Dynamic: license-file
|
|
101
105
|
|
|
102
106
|
|
|
@@ -291,19 +295,64 @@ Supported systems:
|
|
|
291
295
|
* AWS SQS
|
|
292
296
|
* Azure Queue
|
|
293
297
|
* Google Pub/Sub
|
|
294
|
-
* Vercel Queue
|
|
298
|
+
* Vercel Queue (cloud REST API, or a plain local `redis://` URL for
|
|
299
|
+
dev/test)
|
|
300
|
+
* Kafka
|
|
301
|
+
* RabbitMQ
|
|
295
302
|
* Blockchain event queues
|
|
296
303
|
|
|
297
|
-
Example
|
|
304
|
+
Example (method names below match `QueueAdapter`'s actual signatures —
|
|
305
|
+
`send`/`receive`/`ack`/`delete`, not `send_message`/`receive_message`):
|
|
298
306
|
|
|
299
307
|
```python
|
|
300
|
-
queue = factory.get_queue()
|
|
308
|
+
queue = factory.get_queue("rabbitmq")
|
|
301
309
|
|
|
302
|
-
queue.
|
|
303
|
-
|
|
304
|
-
queue.
|
|
310
|
+
message_id = queue.send({"task": "process"}, queue_name="jobs")
|
|
311
|
+
messages = queue.receive(queue_name="jobs", max_messages=1)
|
|
312
|
+
queue.ack(messages[0]["receipt_handle"], queue_name="jobs")
|
|
305
313
|
```
|
|
306
314
|
|
|
315
|
+
## Extended queue management (`nack`/`purge`/`declare`/`status`)
|
|
316
|
+
|
|
317
|
+
`QueueAdapter`'s base class also defines `nack`, `purge`, `declare`
|
|
318
|
+
(explicit provisioning ahead of first use, with optional dead-letter
|
|
319
|
+
queue wiring), and `status` — regular (non-abstract) base methods that
|
|
320
|
+
raise `NotImplementedError` by default, overridden only where a
|
|
321
|
+
subclass genuinely implements them. Honest status, verified against a
|
|
322
|
+
real local broker/client, not assumed:
|
|
323
|
+
|
|
324
|
+
* **RabbitMQAdapter** — all four implemented for real against a live
|
|
325
|
+
broker: `nack` is `basic_nack(requeue=True)` (immediate redelivery,
|
|
326
|
+
not dead-lettering); `purge` reads the real purged count off
|
|
327
|
+
`queue_purge`'s `Queue.PurgeOk` response; `declare` wires real AMQP
|
|
328
|
+
dead-lettering (`x-dead-letter-exchange`/`x-dead-letter-routing-key`
|
|
329
|
+
queue arguments — not a hand-rolled shadow re-router) when
|
|
330
|
+
`dead_letter_queue` is given, and `status` reads `message_count`/
|
|
331
|
+
`consumer_count` off a passive `queue_declare`. A message only
|
|
332
|
+
actually gets dead-lettered by a real reject-without-requeue
|
|
333
|
+
(`basic_nack`/`basic_reject` with `requeue=False`) or a TTL/
|
|
334
|
+
max-length policy — `nack()`'s own contract is "redeliver now", so it
|
|
335
|
+
deliberately does **not** trigger dead-lettering itself. `dlq_list`/
|
|
336
|
+
`dlq_replay` aren't separate adapter methods — they're just
|
|
337
|
+
`receive`/`send`+`ack` aimed at the DLQ's own queue name.
|
|
338
|
+
* **KafkaQueueAdapter** — only `nack` is implemented, and it's a
|
|
339
|
+
documented no-op: `receive()` already never commits an offset until
|
|
340
|
+
`ack()`/`delete()` does, so a received-but-unacked message is already
|
|
341
|
+
effectively "nacked". `purge`/`declare`/`status` are **not**
|
|
342
|
+
implemented — not practical against `kafka-python`'s client-level API
|
|
343
|
+
without broker admin tooling; they raise the base class's
|
|
344
|
+
`NotImplementedError`.
|
|
345
|
+
* **SQS / Azure Queue / GCP Pub/Sub / Blockchain** — none of the four
|
|
346
|
+
new methods are implemented; all raise the base class's
|
|
347
|
+
`NotImplementedError`. No credentials/emulator for any of these three
|
|
348
|
+
cloud providers, and no real blockchain node, were available where
|
|
349
|
+
this was built and tested.
|
|
350
|
+
* **Vercel Queue (local-redis mode)** — also not implemented for these
|
|
351
|
+
four, though flagged as a real, likely-tractable gap for later: Redis
|
|
352
|
+
Streams' `XPENDING`/`XCLAIM`/`XTRIM` could plausibly back `nack`/
|
|
353
|
+
`status`/`purge` for the local-redis mode specifically. Deliberately
|
|
354
|
+
left out of this round rather than half-implemented.
|
|
355
|
+
|
|
307
356
|
---
|
|
308
357
|
|
|
309
358
|
# Blockchain Storage
|
|
@@ -190,19 +190,64 @@ Supported systems:
|
|
|
190
190
|
* AWS SQS
|
|
191
191
|
* Azure Queue
|
|
192
192
|
* Google Pub/Sub
|
|
193
|
-
* Vercel Queue
|
|
193
|
+
* Vercel Queue (cloud REST API, or a plain local `redis://` URL for
|
|
194
|
+
dev/test)
|
|
195
|
+
* Kafka
|
|
196
|
+
* RabbitMQ
|
|
194
197
|
* Blockchain event queues
|
|
195
198
|
|
|
196
|
-
Example
|
|
199
|
+
Example (method names below match `QueueAdapter`'s actual signatures —
|
|
200
|
+
`send`/`receive`/`ack`/`delete`, not `send_message`/`receive_message`):
|
|
197
201
|
|
|
198
202
|
```python
|
|
199
|
-
queue = factory.get_queue()
|
|
203
|
+
queue = factory.get_queue("rabbitmq")
|
|
200
204
|
|
|
201
|
-
queue.
|
|
202
|
-
|
|
203
|
-
queue.
|
|
205
|
+
message_id = queue.send({"task": "process"}, queue_name="jobs")
|
|
206
|
+
messages = queue.receive(queue_name="jobs", max_messages=1)
|
|
207
|
+
queue.ack(messages[0]["receipt_handle"], queue_name="jobs")
|
|
204
208
|
```
|
|
205
209
|
|
|
210
|
+
## Extended queue management (`nack`/`purge`/`declare`/`status`)
|
|
211
|
+
|
|
212
|
+
`QueueAdapter`'s base class also defines `nack`, `purge`, `declare`
|
|
213
|
+
(explicit provisioning ahead of first use, with optional dead-letter
|
|
214
|
+
queue wiring), and `status` — regular (non-abstract) base methods that
|
|
215
|
+
raise `NotImplementedError` by default, overridden only where a
|
|
216
|
+
subclass genuinely implements them. Honest status, verified against a
|
|
217
|
+
real local broker/client, not assumed:
|
|
218
|
+
|
|
219
|
+
* **RabbitMQAdapter** — all four implemented for real against a live
|
|
220
|
+
broker: `nack` is `basic_nack(requeue=True)` (immediate redelivery,
|
|
221
|
+
not dead-lettering); `purge` reads the real purged count off
|
|
222
|
+
`queue_purge`'s `Queue.PurgeOk` response; `declare` wires real AMQP
|
|
223
|
+
dead-lettering (`x-dead-letter-exchange`/`x-dead-letter-routing-key`
|
|
224
|
+
queue arguments — not a hand-rolled shadow re-router) when
|
|
225
|
+
`dead_letter_queue` is given, and `status` reads `message_count`/
|
|
226
|
+
`consumer_count` off a passive `queue_declare`. A message only
|
|
227
|
+
actually gets dead-lettered by a real reject-without-requeue
|
|
228
|
+
(`basic_nack`/`basic_reject` with `requeue=False`) or a TTL/
|
|
229
|
+
max-length policy — `nack()`'s own contract is "redeliver now", so it
|
|
230
|
+
deliberately does **not** trigger dead-lettering itself. `dlq_list`/
|
|
231
|
+
`dlq_replay` aren't separate adapter methods — they're just
|
|
232
|
+
`receive`/`send`+`ack` aimed at the DLQ's own queue name.
|
|
233
|
+
* **KafkaQueueAdapter** — only `nack` is implemented, and it's a
|
|
234
|
+
documented no-op: `receive()` already never commits an offset until
|
|
235
|
+
`ack()`/`delete()` does, so a received-but-unacked message is already
|
|
236
|
+
effectively "nacked". `purge`/`declare`/`status` are **not**
|
|
237
|
+
implemented — not practical against `kafka-python`'s client-level API
|
|
238
|
+
without broker admin tooling; they raise the base class's
|
|
239
|
+
`NotImplementedError`.
|
|
240
|
+
* **SQS / Azure Queue / GCP Pub/Sub / Blockchain** — none of the four
|
|
241
|
+
new methods are implemented; all raise the base class's
|
|
242
|
+
`NotImplementedError`. No credentials/emulator for any of these three
|
|
243
|
+
cloud providers, and no real blockchain node, were available where
|
|
244
|
+
this was built and tested.
|
|
245
|
+
* **Vercel Queue (local-redis mode)** — also not implemented for these
|
|
246
|
+
four, though flagged as a real, likely-tractable gap for later: Redis
|
|
247
|
+
Streams' `XPENDING`/`XCLAIM`/`XTRIM` could plausibly back `nack`/
|
|
248
|
+
`status`/`purge` for the local-redis mode specifically. Deliberately
|
|
249
|
+
left out of this round rather than half-implemented.
|
|
250
|
+
|
|
206
251
|
---
|
|
207
252
|
|
|
208
253
|
# Blockchain Storage
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "altcodepro-polydb-python"
|
|
7
|
-
version = "2.5.
|
|
7
|
+
version = "2.5.6"
|
|
8
8
|
description = "Production-ready multi-cloud database abstraction layer with connection pooling, retry logic, and thread safety"
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -40,25 +40,22 @@ classifiers = [
|
|
|
40
40
|
"Operating System :: OS Independent",
|
|
41
41
|
]
|
|
42
42
|
|
|
43
|
-
# Core dependencies - always installed
|
|
43
|
+
# Core dependencies - always installed. Deliberately just the
|
|
44
|
+
# generic/open-source stack (Postgres + Redis) plus cross-cutting
|
|
45
|
+
# concerns (retry, env config) -- every cloud SDK moved to its extra
|
|
46
|
+
# below, where it already belonged. A plain `pip install
|
|
47
|
+
# altcodepro-polydb-python` used to require boto3/every-azure-package/
|
|
48
|
+
# every-google-cloud-package/pymongo/web3/ipfshttpclient/build/twine
|
|
49
|
+
# unconditionally, defeating these extras entirely and breaking outright
|
|
50
|
+
# on any environment where the blockchain extras' transitive deps don't
|
|
51
|
+
# build (found by actually trying a minimal install). `build`/`twine`
|
|
52
|
+
# were never runtime dependencies at all -- packaging/publishing tools,
|
|
53
|
+
# not something this library needs to function.
|
|
44
54
|
dependencies = [
|
|
45
55
|
"psycopg2-binary>=2.9.11",
|
|
46
56
|
"tenacity>=9.1.4",
|
|
47
57
|
"redis>=6.4.0",
|
|
48
58
|
"python-dotenv>=1.1.1",
|
|
49
|
-
"azure-storage-queue>=12.15.0",
|
|
50
|
-
"azure-storage-blob>=12.29.0",
|
|
51
|
-
"boto3>=1.43.18",
|
|
52
|
-
"google-cloud-storage>=3.10.1",
|
|
53
|
-
"azure-storage-file-share>=12.25.0",
|
|
54
|
-
"azure-data-tables>=12.7.0",
|
|
55
|
-
"ipfshttpclient>=0.7.0",
|
|
56
|
-
"web3>=7.16.0",
|
|
57
|
-
"google-cloud-firestore>=2.27.0",
|
|
58
|
-
"google-cloud-pubsub>=2.38.0",
|
|
59
|
-
"pymongo>=4.17.0",
|
|
60
|
-
"build>=1.5.0",
|
|
61
|
-
"twine>=6.2.0",
|
|
62
59
|
]
|
|
63
60
|
|
|
64
61
|
# Generic/Open-source stack (cheapest option)
|
|
@@ -72,6 +69,8 @@ azure = [
|
|
|
72
69
|
"azure-storage-blob>=12.28.0",
|
|
73
70
|
"azure-storage-file-share>=12.24.0",
|
|
74
71
|
"azure-storage-queue>=12.15.0",
|
|
72
|
+
"azure-identity>=1.16.0",
|
|
73
|
+
"azure-keyvault-secrets>=4.8.0",
|
|
75
74
|
]
|
|
76
75
|
|
|
77
76
|
gcp = [
|
|
@@ -81,16 +80,25 @@ gcp = [
|
|
|
81
80
|
"google-cloud-firestore>=2.23.0",
|
|
82
81
|
"google-cloud-pubsub>=2.35.0",
|
|
83
82
|
"google-cloud-storage>=3.9.0",
|
|
83
|
+
"google-cloud-secret-manager>=2.20.0",
|
|
84
84
|
]
|
|
85
85
|
|
|
86
86
|
mongodb = ["pymongo>=4.16.0"]
|
|
87
87
|
|
|
88
88
|
rabbitmq = ["pika>=1.3.2"]
|
|
89
89
|
|
|
90
|
+
kafka = ["kafka-python>=2.0.2"]
|
|
91
|
+
|
|
90
92
|
vercel = ["requests>=2.32.5"]
|
|
93
|
+
# "bolckchain" (sic) kept as a deprecated alias -- fixing the typo
|
|
94
|
+
# outright would silently break anyone already pinning
|
|
95
|
+
# altcodepro-polydb-python[bolckchain].
|
|
96
|
+
blockchain = ["ipfshttpclient>=0.7.0", "web3>=7.14.1"]
|
|
91
97
|
bolckchain = ["ipfshttpclient>=0.7.0", "web3>=7.14.1"]
|
|
92
98
|
|
|
93
|
-
|
|
99
|
+
secrets = ["hvac>=2.1.0"]
|
|
100
|
+
|
|
101
|
+
generic = ["pymongo>=4.16.0", "pika>=1.3.2", "kafka-python>=2.0.2", "boto3>=1.42.47"]
|
|
94
102
|
|
|
95
103
|
security = ["cryptography>=42.0.0"]
|
|
96
104
|
|
|
@@ -102,13 +110,18 @@ all = [
|
|
|
102
110
|
"azure-storage-blob>=12.28.0",
|
|
103
111
|
"azure-storage-file-share>=12.24.0",
|
|
104
112
|
"azure-storage-queue>=12.15.0",
|
|
113
|
+
"azure-identity>=1.16.0",
|
|
114
|
+
"azure-keyvault-secrets>=4.8.0",
|
|
105
115
|
"google-cloud-firestore>=2.23.0",
|
|
106
116
|
"google-cloud-pubsub>=2.35.0",
|
|
107
117
|
"google-cloud-storage>=3.9.0",
|
|
118
|
+
"google-cloud-secret-manager>=2.20.0",
|
|
108
119
|
"pymongo>=4.16.0",
|
|
109
120
|
"pika>=1.3.2",
|
|
121
|
+
"kafka-python>=2.0.2",
|
|
110
122
|
"requests>=2.32.5",
|
|
111
123
|
"cryptography>=42.0.0",
|
|
124
|
+
"hvac>=2.1.0",
|
|
112
125
|
]
|
|
113
126
|
|
|
114
127
|
|
|
@@ -123,6 +136,7 @@ test = [
|
|
|
123
136
|
"pytest-cov>=7.0.0",
|
|
124
137
|
"pytest-mock>=3.15.1",
|
|
125
138
|
"moto>=5.1.21",
|
|
139
|
+
"hvac>=2.1.0",
|
|
126
140
|
]
|
|
127
141
|
|
|
128
142
|
[project.urls]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: altcodepro-polydb-python
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.6
|
|
4
4
|
Summary: Production-ready multi-cloud database abstraction layer with connection pooling, retry logic, and thread safety
|
|
5
5
|
Author: AltCodePro
|
|
6
6
|
Project-URL: Homepage, https://github.com/altcodepro/polydb-python
|
|
@@ -27,19 +27,6 @@ Requires-Dist: psycopg2-binary>=2.9.11
|
|
|
27
27
|
Requires-Dist: tenacity>=9.1.4
|
|
28
28
|
Requires-Dist: redis>=6.4.0
|
|
29
29
|
Requires-Dist: python-dotenv>=1.1.1
|
|
30
|
-
Requires-Dist: azure-storage-queue>=12.15.0
|
|
31
|
-
Requires-Dist: azure-storage-blob>=12.29.0
|
|
32
|
-
Requires-Dist: boto3>=1.43.18
|
|
33
|
-
Requires-Dist: google-cloud-storage>=3.10.1
|
|
34
|
-
Requires-Dist: azure-storage-file-share>=12.25.0
|
|
35
|
-
Requires-Dist: azure-data-tables>=12.7.0
|
|
36
|
-
Requires-Dist: ipfshttpclient>=0.7.0
|
|
37
|
-
Requires-Dist: web3>=7.16.0
|
|
38
|
-
Requires-Dist: google-cloud-firestore>=2.27.0
|
|
39
|
-
Requires-Dist: google-cloud-pubsub>=2.38.0
|
|
40
|
-
Requires-Dist: pymongo>=4.17.0
|
|
41
|
-
Requires-Dist: build>=1.5.0
|
|
42
|
-
Requires-Dist: twine>=6.2.0
|
|
43
30
|
Provides-Extra: aws
|
|
44
31
|
Requires-Dist: boto3>=1.42.47; extra == "aws"
|
|
45
32
|
Requires-Dist: botocore>=1.42.47; extra == "aws"
|
|
@@ -49,6 +36,8 @@ Requires-Dist: azure-data-tables>=12.7.0; extra == "azure"
|
|
|
49
36
|
Requires-Dist: azure-storage-blob>=12.28.0; extra == "azure"
|
|
50
37
|
Requires-Dist: azure-storage-file-share>=12.24.0; extra == "azure"
|
|
51
38
|
Requires-Dist: azure-storage-queue>=12.15.0; extra == "azure"
|
|
39
|
+
Requires-Dist: azure-identity>=1.16.0; extra == "azure"
|
|
40
|
+
Requires-Dist: azure-keyvault-secrets>=4.8.0; extra == "azure"
|
|
52
41
|
Provides-Extra: gcp
|
|
53
42
|
Requires-Dist: google-api-core>=2.29.0; extra == "gcp"
|
|
54
43
|
Requires-Dist: google-auth>=2.48.0; extra == "gcp"
|
|
@@ -56,18 +45,27 @@ Requires-Dist: google-cloud-core>=2.5.0; extra == "gcp"
|
|
|
56
45
|
Requires-Dist: google-cloud-firestore>=2.23.0; extra == "gcp"
|
|
57
46
|
Requires-Dist: google-cloud-pubsub>=2.35.0; extra == "gcp"
|
|
58
47
|
Requires-Dist: google-cloud-storage>=3.9.0; extra == "gcp"
|
|
48
|
+
Requires-Dist: google-cloud-secret-manager>=2.20.0; extra == "gcp"
|
|
59
49
|
Provides-Extra: mongodb
|
|
60
50
|
Requires-Dist: pymongo>=4.16.0; extra == "mongodb"
|
|
61
51
|
Provides-Extra: rabbitmq
|
|
62
52
|
Requires-Dist: pika>=1.3.2; extra == "rabbitmq"
|
|
53
|
+
Provides-Extra: kafka
|
|
54
|
+
Requires-Dist: kafka-python>=2.0.2; extra == "kafka"
|
|
63
55
|
Provides-Extra: vercel
|
|
64
56
|
Requires-Dist: requests>=2.32.5; extra == "vercel"
|
|
57
|
+
Provides-Extra: blockchain
|
|
58
|
+
Requires-Dist: ipfshttpclient>=0.7.0; extra == "blockchain"
|
|
59
|
+
Requires-Dist: web3>=7.14.1; extra == "blockchain"
|
|
65
60
|
Provides-Extra: bolckchain
|
|
66
61
|
Requires-Dist: ipfshttpclient>=0.7.0; extra == "bolckchain"
|
|
67
62
|
Requires-Dist: web3>=7.14.1; extra == "bolckchain"
|
|
63
|
+
Provides-Extra: secrets
|
|
64
|
+
Requires-Dist: hvac>=2.1.0; extra == "secrets"
|
|
68
65
|
Provides-Extra: generic
|
|
69
66
|
Requires-Dist: pymongo>=4.16.0; extra == "generic"
|
|
70
67
|
Requires-Dist: pika>=1.3.2; extra == "generic"
|
|
68
|
+
Requires-Dist: kafka-python>=2.0.2; extra == "generic"
|
|
71
69
|
Requires-Dist: boto3>=1.42.47; extra == "generic"
|
|
72
70
|
Provides-Extra: security
|
|
73
71
|
Requires-Dist: cryptography>=42.0.0; extra == "security"
|
|
@@ -79,13 +77,18 @@ Requires-Dist: azure-data-tables>=12.7.0; extra == "all"
|
|
|
79
77
|
Requires-Dist: azure-storage-blob>=12.28.0; extra == "all"
|
|
80
78
|
Requires-Dist: azure-storage-file-share>=12.24.0; extra == "all"
|
|
81
79
|
Requires-Dist: azure-storage-queue>=12.15.0; extra == "all"
|
|
80
|
+
Requires-Dist: azure-identity>=1.16.0; extra == "all"
|
|
81
|
+
Requires-Dist: azure-keyvault-secrets>=4.8.0; extra == "all"
|
|
82
82
|
Requires-Dist: google-cloud-firestore>=2.23.0; extra == "all"
|
|
83
83
|
Requires-Dist: google-cloud-pubsub>=2.35.0; extra == "all"
|
|
84
84
|
Requires-Dist: google-cloud-storage>=3.9.0; extra == "all"
|
|
85
|
+
Requires-Dist: google-cloud-secret-manager>=2.20.0; extra == "all"
|
|
85
86
|
Requires-Dist: pymongo>=4.16.0; extra == "all"
|
|
86
87
|
Requires-Dist: pika>=1.3.2; extra == "all"
|
|
88
|
+
Requires-Dist: kafka-python>=2.0.2; extra == "all"
|
|
87
89
|
Requires-Dist: requests>=2.32.5; extra == "all"
|
|
88
90
|
Requires-Dist: cryptography>=42.0.0; extra == "all"
|
|
91
|
+
Requires-Dist: hvac>=2.1.0; extra == "all"
|
|
89
92
|
Provides-Extra: dev
|
|
90
93
|
Requires-Dist: black>=26.1.0; extra == "dev"
|
|
91
94
|
Requires-Dist: flake8>=7.3.0; extra == "dev"
|
|
@@ -97,6 +100,7 @@ Requires-Dist: pytest-asyncio>=1.2.0; extra == "test"
|
|
|
97
100
|
Requires-Dist: pytest-cov>=7.0.0; extra == "test"
|
|
98
101
|
Requires-Dist: pytest-mock>=3.15.1; extra == "test"
|
|
99
102
|
Requires-Dist: moto>=5.1.21; extra == "test"
|
|
103
|
+
Requires-Dist: hvac>=2.1.0; extra == "test"
|
|
100
104
|
Dynamic: license-file
|
|
101
105
|
|
|
102
106
|
|
|
@@ -291,19 +295,64 @@ Supported systems:
|
|
|
291
295
|
* AWS SQS
|
|
292
296
|
* Azure Queue
|
|
293
297
|
* Google Pub/Sub
|
|
294
|
-
* Vercel Queue
|
|
298
|
+
* Vercel Queue (cloud REST API, or a plain local `redis://` URL for
|
|
299
|
+
dev/test)
|
|
300
|
+
* Kafka
|
|
301
|
+
* RabbitMQ
|
|
295
302
|
* Blockchain event queues
|
|
296
303
|
|
|
297
|
-
Example
|
|
304
|
+
Example (method names below match `QueueAdapter`'s actual signatures —
|
|
305
|
+
`send`/`receive`/`ack`/`delete`, not `send_message`/`receive_message`):
|
|
298
306
|
|
|
299
307
|
```python
|
|
300
|
-
queue = factory.get_queue()
|
|
308
|
+
queue = factory.get_queue("rabbitmq")
|
|
301
309
|
|
|
302
|
-
queue.
|
|
303
|
-
|
|
304
|
-
queue.
|
|
310
|
+
message_id = queue.send({"task": "process"}, queue_name="jobs")
|
|
311
|
+
messages = queue.receive(queue_name="jobs", max_messages=1)
|
|
312
|
+
queue.ack(messages[0]["receipt_handle"], queue_name="jobs")
|
|
305
313
|
```
|
|
306
314
|
|
|
315
|
+
## Extended queue management (`nack`/`purge`/`declare`/`status`)
|
|
316
|
+
|
|
317
|
+
`QueueAdapter`'s base class also defines `nack`, `purge`, `declare`
|
|
318
|
+
(explicit provisioning ahead of first use, with optional dead-letter
|
|
319
|
+
queue wiring), and `status` — regular (non-abstract) base methods that
|
|
320
|
+
raise `NotImplementedError` by default, overridden only where a
|
|
321
|
+
subclass genuinely implements them. Honest status, verified against a
|
|
322
|
+
real local broker/client, not assumed:
|
|
323
|
+
|
|
324
|
+
* **RabbitMQAdapter** — all four implemented for real against a live
|
|
325
|
+
broker: `nack` is `basic_nack(requeue=True)` (immediate redelivery,
|
|
326
|
+
not dead-lettering); `purge` reads the real purged count off
|
|
327
|
+
`queue_purge`'s `Queue.PurgeOk` response; `declare` wires real AMQP
|
|
328
|
+
dead-lettering (`x-dead-letter-exchange`/`x-dead-letter-routing-key`
|
|
329
|
+
queue arguments — not a hand-rolled shadow re-router) when
|
|
330
|
+
`dead_letter_queue` is given, and `status` reads `message_count`/
|
|
331
|
+
`consumer_count` off a passive `queue_declare`. A message only
|
|
332
|
+
actually gets dead-lettered by a real reject-without-requeue
|
|
333
|
+
(`basic_nack`/`basic_reject` with `requeue=False`) or a TTL/
|
|
334
|
+
max-length policy — `nack()`'s own contract is "redeliver now", so it
|
|
335
|
+
deliberately does **not** trigger dead-lettering itself. `dlq_list`/
|
|
336
|
+
`dlq_replay` aren't separate adapter methods — they're just
|
|
337
|
+
`receive`/`send`+`ack` aimed at the DLQ's own queue name.
|
|
338
|
+
* **KafkaQueueAdapter** — only `nack` is implemented, and it's a
|
|
339
|
+
documented no-op: `receive()` already never commits an offset until
|
|
340
|
+
`ack()`/`delete()` does, so a received-but-unacked message is already
|
|
341
|
+
effectively "nacked". `purge`/`declare`/`status` are **not**
|
|
342
|
+
implemented — not practical against `kafka-python`'s client-level API
|
|
343
|
+
without broker admin tooling; they raise the base class's
|
|
344
|
+
`NotImplementedError`.
|
|
345
|
+
* **SQS / Azure Queue / GCP Pub/Sub / Blockchain** — none of the four
|
|
346
|
+
new methods are implemented; all raise the base class's
|
|
347
|
+
`NotImplementedError`. No credentials/emulator for any of these three
|
|
348
|
+
cloud providers, and no real blockchain node, were available where
|
|
349
|
+
this was built and tested.
|
|
350
|
+
* **Vercel Queue (local-redis mode)** — also not implemented for these
|
|
351
|
+
four, though flagged as a real, likely-tractable gap for later: Redis
|
|
352
|
+
Streams' `XPENDING`/`XCLAIM`/`XTRIM` could plausibly back `nack`/
|
|
353
|
+
`status`/`purge` for the local-redis mode specifically. Deliberately
|
|
354
|
+
left out of this round rather than half-implemented.
|
|
355
|
+
|
|
307
356
|
---
|
|
308
357
|
|
|
309
358
|
# Blockchain Storage
|
|
@@ -36,8 +36,10 @@ src/polydb/security.py
|
|
|
36
36
|
src/polydb/types.py
|
|
37
37
|
src/polydb/utils.py
|
|
38
38
|
src/polydb/validation.py
|
|
39
|
+
src/polydb/adapters/AWSSecretsManagerAdapter.py
|
|
39
40
|
src/polydb/adapters/AzureBlobStorageAdapter.py
|
|
40
41
|
src/polydb/adapters/AzureFileStorageAdapter.py
|
|
42
|
+
src/polydb/adapters/AzureKeyVaultAdapter.py
|
|
41
43
|
src/polydb/adapters/AzureQueueAdapter.py
|
|
42
44
|
src/polydb/adapters/AzureTableStorageAdapter.py
|
|
43
45
|
src/polydb/adapters/BlockchainBlobAdapter.py
|
|
@@ -49,12 +51,16 @@ src/polydb/adapters/EFSAdapter.py
|
|
|
49
51
|
src/polydb/adapters/FirestoreAdapter.py
|
|
50
52
|
src/polydb/adapters/GCPFilestoreAdapter.py
|
|
51
53
|
src/polydb/adapters/GCPPubSubAdapter.py
|
|
54
|
+
src/polydb/adapters/GCPSecretManagerAdapter.py
|
|
52
55
|
src/polydb/adapters/GCPStorageAdapter.py
|
|
56
|
+
src/polydb/adapters/KafkaQueueAdapter.py
|
|
53
57
|
src/polydb/adapters/MongoDBAdapter.py
|
|
54
58
|
src/polydb/adapters/PostgreSQLAdapter.py
|
|
59
|
+
src/polydb/adapters/RabbitMQAdapter.py
|
|
55
60
|
src/polydb/adapters/S3Adapter.py
|
|
56
61
|
src/polydb/adapters/S3CompatibleAdapter.py
|
|
57
62
|
src/polydb/adapters/SQSAdapter.py
|
|
63
|
+
src/polydb/adapters/VaultAdapter.py
|
|
58
64
|
src/polydb/adapters/VercelBlobAdapter.py
|
|
59
65
|
src/polydb/adapters/VercelFileAdapter.py
|
|
60
66
|
src/polydb/adapters/VercelKVAdapter.py
|
|
@@ -68,6 +74,7 @@ src/polydb/audit/models.py
|
|
|
68
74
|
src/polydb/base/NoSQLKVAdapter.py
|
|
69
75
|
src/polydb/base/ObjectStorageAdapter.py
|
|
70
76
|
src/polydb/base/QueueAdapter.py
|
|
77
|
+
src/polydb/base/SecretsAdapter.py
|
|
71
78
|
src/polydb/base/SharedFilesAdapter.py
|
|
72
79
|
src/polydb/base/__init__.py
|
|
73
80
|
src/polydb/observability/__init__.py
|
|
@@ -88,6 +95,7 @@ tests/test_blockchain.py
|
|
|
88
95
|
tests/test_cloud_factory.py
|
|
89
96
|
tests/test_field_encryption.py
|
|
90
97
|
tests/test_gcp.py
|
|
98
|
+
tests/test_kafka.py
|
|
91
99
|
tests/test_like_pattern_escaping.py
|
|
92
100
|
tests/test_mongodb.py
|
|
93
101
|
tests/test_multi_engine.py
|
|
@@ -95,5 +103,11 @@ tests/test_multitenancy_ddl_injection.py
|
|
|
95
103
|
tests/test_nosql_operator_injection.py
|
|
96
104
|
tests/test_observability.py
|
|
97
105
|
tests/test_postgresql.py
|
|
106
|
+
tests/test_queue_extend_delay_cancel.py
|
|
107
|
+
tests/test_rabbitmq.py
|
|
108
|
+
tests/test_redis_kv.py
|
|
98
109
|
tests/test_schema_ddl_injection.py
|
|
110
|
+
tests/test_secrets_aws.py
|
|
111
|
+
tests/test_secrets_vault.py
|
|
112
|
+
tests/test_session_vars.py
|
|
99
113
|
tests/test_vercel.py
|
|
@@ -2,19 +2,6 @@ psycopg2-binary>=2.9.11
|
|
|
2
2
|
tenacity>=9.1.4
|
|
3
3
|
redis>=6.4.0
|
|
4
4
|
python-dotenv>=1.1.1
|
|
5
|
-
azure-storage-queue>=12.15.0
|
|
6
|
-
azure-storage-blob>=12.29.0
|
|
7
|
-
boto3>=1.43.18
|
|
8
|
-
google-cloud-storage>=3.10.1
|
|
9
|
-
azure-storage-file-share>=12.25.0
|
|
10
|
-
azure-data-tables>=12.7.0
|
|
11
|
-
ipfshttpclient>=0.7.0
|
|
12
|
-
web3>=7.16.0
|
|
13
|
-
google-cloud-firestore>=2.27.0
|
|
14
|
-
google-cloud-pubsub>=2.38.0
|
|
15
|
-
pymongo>=4.17.0
|
|
16
|
-
build>=1.5.0
|
|
17
|
-
twine>=6.2.0
|
|
18
5
|
|
|
19
6
|
[all]
|
|
20
7
|
boto3>=1.42.47
|
|
@@ -24,13 +11,18 @@ azure-data-tables>=12.7.0
|
|
|
24
11
|
azure-storage-blob>=12.28.0
|
|
25
12
|
azure-storage-file-share>=12.24.0
|
|
26
13
|
azure-storage-queue>=12.15.0
|
|
14
|
+
azure-identity>=1.16.0
|
|
15
|
+
azure-keyvault-secrets>=4.8.0
|
|
27
16
|
google-cloud-firestore>=2.23.0
|
|
28
17
|
google-cloud-pubsub>=2.35.0
|
|
29
18
|
google-cloud-storage>=3.9.0
|
|
19
|
+
google-cloud-secret-manager>=2.20.0
|
|
30
20
|
pymongo>=4.16.0
|
|
31
21
|
pika>=1.3.2
|
|
22
|
+
kafka-python>=2.0.2
|
|
32
23
|
requests>=2.32.5
|
|
33
24
|
cryptography>=42.0.0
|
|
25
|
+
hvac>=2.1.0
|
|
34
26
|
|
|
35
27
|
[aws]
|
|
36
28
|
boto3>=1.42.47
|
|
@@ -42,6 +34,12 @@ azure-data-tables>=12.7.0
|
|
|
42
34
|
azure-storage-blob>=12.28.0
|
|
43
35
|
azure-storage-file-share>=12.24.0
|
|
44
36
|
azure-storage-queue>=12.15.0
|
|
37
|
+
azure-identity>=1.16.0
|
|
38
|
+
azure-keyvault-secrets>=4.8.0
|
|
39
|
+
|
|
40
|
+
[blockchain]
|
|
41
|
+
ipfshttpclient>=0.7.0
|
|
42
|
+
web3>=7.14.1
|
|
45
43
|
|
|
46
44
|
[bolckchain]
|
|
47
45
|
ipfshttpclient>=0.7.0
|
|
@@ -60,18 +58,26 @@ google-cloud-core>=2.5.0
|
|
|
60
58
|
google-cloud-firestore>=2.23.0
|
|
61
59
|
google-cloud-pubsub>=2.35.0
|
|
62
60
|
google-cloud-storage>=3.9.0
|
|
61
|
+
google-cloud-secret-manager>=2.20.0
|
|
63
62
|
|
|
64
63
|
[generic]
|
|
65
64
|
pymongo>=4.16.0
|
|
66
65
|
pika>=1.3.2
|
|
66
|
+
kafka-python>=2.0.2
|
|
67
67
|
boto3>=1.42.47
|
|
68
68
|
|
|
69
|
+
[kafka]
|
|
70
|
+
kafka-python>=2.0.2
|
|
71
|
+
|
|
69
72
|
[mongodb]
|
|
70
73
|
pymongo>=4.16.0
|
|
71
74
|
|
|
72
75
|
[rabbitmq]
|
|
73
76
|
pika>=1.3.2
|
|
74
77
|
|
|
78
|
+
[secrets]
|
|
79
|
+
hvac>=2.1.0
|
|
80
|
+
|
|
75
81
|
[security]
|
|
76
82
|
cryptography>=42.0.0
|
|
77
83
|
|
|
@@ -81,6 +87,7 @@ pytest-asyncio>=1.2.0
|
|
|
81
87
|
pytest-cov>=7.0.0
|
|
82
88
|
pytest-mock>=3.15.1
|
|
83
89
|
moto>=5.1.21
|
|
90
|
+
hvac>=2.1.0
|
|
84
91
|
|
|
85
92
|
[vercel]
|
|
86
93
|
requests>=2.32.5
|
|
@@ -4,7 +4,7 @@ PolyDB - Enterprise Cloud-Independent Database Abstraction
|
|
|
4
4
|
Full LINQ support, field-level audit, cache, soft delete, overflow storage
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
__version__ = "2.
|
|
7
|
+
__version__ = "2.5.6"
|
|
8
8
|
|
|
9
9
|
from .cloudDatabaseFactory import CloudDatabaseFactory
|
|
10
10
|
from .databaseFactory import DatabaseFactory
|