Azure cloud services SDK with Storage (blob, file share, queue), Key Vault, Cosmos DB, OpenTelemetry tracing, and builder patterns.
Project description
azpaddypy
Azure cloud services SDK with Storage (blob, append blob, file share, queue), Key Vault, Cosmos DB, OpenTelemetry tracing, and builder patterns.
Designed for Python 3.11+ running in Dockerized Azure Function Apps and Web Apps.
Installation
uv add azpaddypy
Quick Start
from azpaddypy import AzureStorage, AzureIdentity, create_azure_storage
# Factory function (cached instances, auto-creates identity)
storage = create_azure_storage(
account_url="https://myaccount.blob.core.windows.net/",
service_name="my_service",
)
# Or explicit identity
identity = AzureIdentity(service_name="my_service")
storage = AzureStorage(
account_url="https://myaccount.blob.core.windows.net/",
azure_identity=identity,
enable_file_storage=True,
)
Storage Operations
Blob Storage
# Upload
storage.upload_blob(
container_name="documents",
blob_name="report.pdf",
data=pdf_bytes,
content_type="application/pdf",
metadata={"author": "team"},
)
# Download (returns None if not found)
data = storage.download_blob(container_name="documents", blob_name="report.pdf")
# Upload and get SAS URL
sas_url = storage.upload_blob_with_sas(
container_name="documents",
blob_name="report.pdf",
data=pdf_bytes,
sas_permission="r",
sas_expiry_delta=timedelta(hours=3),
)
# List, exists, delete
blobs = storage.list_blobs(container_name="documents", name_starts_with="reports/")
exists = storage.blob_exists(container_name="documents", blob_name="report.pdf")
storage.delete_blob(container_name="documents", blob_name="report.pdf")
# Metadata upsert (merges with existing)
storage.upsert_blob_metadata(
container_name="documents",
blob_name="report.pdf",
metadata={"status": "processed"},
)
# SAS token generation
blob_sas = storage.get_blob_sas(container_name="docs", blob_name="file.pdf")
container_sas = storage.get_container_sas(container_name="docs", permission="r")
Append Blob Storage
Append blobs are optimized for append operations such as logging, auditing, or streaming data. Each append block can be up to 4 MiB. Unlike block blobs, append blobs do not support overwriting existing content.
# Create an empty append blob
storage.create_append_blob(
container_name="logs",
blob_name="app-2026-04-05.log",
content_type="text/plain; charset=utf-8",
metadata={"source": "web-app"},
)
# Append data blocks
storage.append_block(
container_name="logs",
blob_name="app-2026-04-05.log",
data="2026-04-05T10:00:00Z INFO Application started\n",
)
storage.append_block(
container_name="logs",
blob_name="app-2026-04-05.log",
data=b"2026-04-05T10:00:01Z DEBUG Connection pool initialized\n",
)
# Convenience: create-if-missing + append in one call
storage.append_blob_from_text(
container_name="logs",
blob_name="app-2026-04-05.log",
text="2026-04-05T10:05:00Z WARN High memory usage\n",
create_if_not_exists=True, # default, skips creation if blob already exists
)
File Share Storage
Requires enable_file_storage=True. Uses Azure File Shares (SMB/NFS), not blob storage.
storage = AzureStorage(
account_url="https://myaccount.blob.core.windows.net/",
azure_identity=identity,
enable_file_storage=True,
)
# Upload (auto-creates parent directories)
storage.upload_share_file(
share_name="myshare",
file_path="reports/2026/q1.pdf",
data=pdf_bytes,
content_type="application/pdf",
)
# Download (returns None if not found)
data = storage.download_share_file(share_name="myshare", file_path="reports/2026/q1.pdf")
# List files and directories
items = storage.list_share_files(share_name="myshare", directory_path="reports/2026")
# Returns: [{"name": "q1.pdf", "is_directory": False, "size": 1024}, ...]
# Exists, properties, delete
exists = storage.share_file_exists(share_name="myshare", file_path="reports/2026/q1.pdf")
props = storage.get_share_file_properties(share_name="myshare", file_path="reports/2026/q1.pdf")
storage.delete_share_file(share_name="myshare", file_path="reports/2026/q1.pdf")
# Directory management
storage.create_share_directory(share_name="myshare", directory_path="reports/2026/q2")
storage.delete_share_directory(share_name="myshare", directory_path="reports/2026/q2")
# Metadata upsert (merges with existing)
storage.upsert_share_file_metadata(
share_name="myshare",
file_path="reports/2026/q1.pdf",
metadata={"reviewed": "true"},
)
Queue Storage
# Send
storage.send_message(
queue_name="tasks",
content='{"task": "process"}',
visibility_timeout=30,
time_to_live=3600,
)
# Receive
messages = storage.receive_messages(queue_name="tasks", messages_per_page=5)
for msg in messages:
print(msg["id"], msg["content"])
storage.delete_message(
queue_name="tasks",
message_id=msg["id"],
pop_receipt=msg["pop_receipt"],
)
Builder Pattern
For complex multi-resource setups:
from azpaddypy.builder import AzureManagementBuilder, AzureResourceBuilder
from azpaddypy.builder.directors import ConfigurationSetupDirector
# One-liner setup with director
config = ConfigurationSetupDirector.default_setup(
service_name="my_app",
service_version="1.0.0",
)
# Or step-by-step with builders
mgmt = (
AzureManagementBuilder()
.with_logger(service_name="my_app")
.with_identity()
.with_keyvault(vault_url="https://myvault.vault.azure.net/")
.build()
)
resources = (
AzureResourceBuilder(mgmt, env_config)
.with_storage("default", enable_blob=True, enable_queue=True)
.with_storage("archive", account_url="https://archive.blob.core.windows.net/", enable_file=True)
.build()
)
storage = resources.get_storage("default")
archive = resources.get_storage("archive")
Key Vault
from azpaddypy import AzureKeyVault, create_azure_keyvault
kv = create_azure_keyvault(
vault_url="https://myvault.vault.azure.net/",
service_name="my_service",
)
secret = kv.get_secret("database-connection-string")
Observability
All operations include OpenTelemetry spans and structured logging via Application Insights.
storage = AzureStorage(
account_url="https://myaccount.blob.core.windows.net/",
azure_identity=identity,
connection_string="InstrumentationKey=...", # App Insights
)
# Correlation tracking across distributed calls
storage.set_correlation_id("request-abc-123")
Feature Flags
Enable only the storage services you need:
| Flag | Default | Service |
|---|---|---|
enable_blob_storage |
True |
BlobServiceClient |
enable_file_storage |
False |
ShareServiceClient (requires token_intent="backup" RBAC) |
enable_queue_storage |
True |
QueueServiceClient |
Dependencies
azure-storage-blob- Blob operationsazure-storage-file-share- File share operationsazure-storage-queue- Queue operationsazure-identity- Credential managementazure-keyvault-secrets/keys/certificates- Key Vaultazure-cosmos- Cosmos DBazure-monitor-opentelemetry- Telemetry
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file azpaddypy-0.9.78.tar.gz.
File metadata
- Download URL: azpaddypy-0.9.78.tar.gz
- Upload date:
- Size: 105.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2b187336bf49a667f592fac9aa8643bc8e582e566b7ecd5beaa738f1f736f64
|
|
| MD5 |
13950f437f4e6dcb2812bf60e5569c76
|
|
| BLAKE2b-256 |
07de14d95048151c4e6ce96015635d97e83475343f87731c97af473e4592dd7a
|
File details
Details for the file azpaddypy-0.9.78-py3-none-any.whl.
File metadata
- Download URL: azpaddypy-0.9.78-py3-none-any.whl
- Upload date:
- Size: 64.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aef6b351fea4f6034cdb675cbc0d26866b1fead9628f4e66716448ddc3d76aff
|
|
| MD5 |
d4a179e11f8a500e4d9d34523432a44d
|
|
| BLAKE2b-256 |
11d440ce7e2e33edcf5b13b37ec2dff5090ee7e71ff2ec906e7e5e1e211f2770
|