swiftpy-framework 0.1.0__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.
- swiftpy/.gitignore +0 -0
- swiftpy/__init__.py +572 -0
- swiftpy/admin/__init__.py +50 -0
- swiftpy/admin/auth.py +522 -0
- swiftpy/admin/registry.py +567 -0
- swiftpy/admin/views.py +1583 -0
- swiftpy/ai/__init__.py +199 -0
- swiftpy/ai/_deterministic.py +40 -0
- swiftpy/ai/_fake.py +604 -0
- swiftpy/ai/agents/__init__.py +30 -0
- swiftpy/ai/agents/base_agent.py +506 -0
- swiftpy/ai/agents/memory.py +864 -0
- swiftpy/ai/client.py +1011 -0
- swiftpy/ai/conversation.py +171 -0
- swiftpy/ai/embeddings.py +321 -0
- swiftpy/ai/exceptions.py +75 -0
- swiftpy/ai/history_strategies.py +157 -0
- swiftpy/ai/middleware.py +918 -0
- swiftpy/ai/observability/__init__.py +28 -0
- swiftpy/ai/observability/drivers.py +763 -0
- swiftpy/ai/observability/observer.py +364 -0
- swiftpy/ai/pool.py +102 -0
- swiftpy/ai/pricing.py +101 -0
- swiftpy/ai/prompts/__init__.py +6 -0
- swiftpy/ai/prompts/loader.py +343 -0
- swiftpy/ai/providers/__init__.py +22 -0
- swiftpy/ai/providers/anthropic_provider.py +353 -0
- swiftpy/ai/providers/base.py +273 -0
- swiftpy/ai/providers/openai_provider.py +275 -0
- swiftpy/ai/rag/__init__.py +53 -0
- swiftpy/ai/rag/context_formatter.py +263 -0
- swiftpy/ai/rag/pipeline_builder.py +544 -0
- swiftpy/ai/rag/reranker.py +484 -0
- swiftpy/ai/rag/result.py +78 -0
- swiftpy/ai/rag/retriever.py +315 -0
- swiftpy/ai/redis_store.py +227 -0
- swiftpy/ai/streaming.py +115 -0
- swiftpy/ai/tools/__init__.py +22 -0
- swiftpy/ai/tools/base_tool.py +489 -0
- swiftpy/ai/tools/first_party.py +384 -0
- swiftpy/ai/tools/tool_loop.py +417 -0
- swiftpy/ai/vectorstore/__init__.py +46 -0
- swiftpy/ai/vectorstore/base.py +542 -0
- swiftpy/ai/vectorstore/chroma_adapter.py +435 -0
- swiftpy/ai/vectorstore/in_memory_adapter.py +321 -0
- swiftpy/ai/vectorstore/lancedb_adapter.py +370 -0
- swiftpy/ai/vectorstore/pgvector_adapter.py +496 -0
- swiftpy/ai/vectorstore/pinecone_adapter.py +445 -0
- swiftpy/ai/vectorstore/qdrant_adapter.py +418 -0
- swiftpy/auth/__init__.py +50 -0
- swiftpy/auth/api_key_guard.py +544 -0
- swiftpy/auth/auth_manager.py +259 -0
- swiftpy/auth/exceptions.py +71 -0
- swiftpy/auth/jwt_guard.py +230 -0
- swiftpy/auth/jwt_issuer.py +658 -0
- swiftpy/auth/token_blacklist.py +300 -0
- swiftpy/cache/__init__.py +14 -0
- swiftpy/cache/cache.py +251 -0
- swiftpy/cache/driver.py +216 -0
- swiftpy/cache/drivers/memory.py +199 -0
- swiftpy/cache/drivers/redis.py +421 -0
- swiftpy/console/__init__.py +0 -0
- swiftpy/console/cli.py +68 -0
- swiftpy/console/commands/__init__.py +0 -0
- swiftpy/console/commands/cache.py +164 -0
- swiftpy/console/commands/make.py +935 -0
- swiftpy/console/commands/migrate.py +280 -0
- swiftpy/console/commands/new.py +1806 -0
- swiftpy/console/commands/queue.py +306 -0
- swiftpy/console/commands/seed.py +252 -0
- swiftpy/console/commands/start.py +171 -0
- swiftpy/console/commands/storage.py +104 -0
- swiftpy/console/loader.py +21 -0
- swiftpy/console/stubs/__init__.py +26 -0
- swiftpy/console/stubs/controller.stub +14 -0
- swiftpy/console/stubs/event.stub +14 -0
- swiftpy/console/stubs/job.stub +22 -0
- swiftpy/console/stubs/listener.stub +14 -0
- swiftpy/console/stubs/mail.stub +20 -0
- swiftpy/console/stubs/middleware.stub +16 -0
- swiftpy/console/stubs/migration.alter.stub +17 -0
- swiftpy/console/stubs/migration.api_keys.stub +22 -0
- swiftpy/console/stubs/migration.blank.stub +11 -0
- swiftpy/console/stubs/migration.create.stub +15 -0
- swiftpy/console/stubs/migration.stub +11 -0
- swiftpy/console/stubs/migration.update.stub +17 -0
- swiftpy/console/stubs/model.stub +17 -0
- swiftpy/console/stubs/provider.stub +18 -0
- swiftpy/console/stubs/repository.stub +10 -0
- swiftpy/console/stubs/request.stub +16 -0
- swiftpy/console/stubs/resource.stub +21 -0
- swiftpy/console/stubs/schema.stub +12 -0
- swiftpy/console/stubs/seeder.stub +14 -0
- swiftpy/console/stubs/service.stub +10 -0
- swiftpy/core/__init__.py +0 -0
- swiftpy/core/application.py +1306 -0
- swiftpy/core/bootstrap.py +30 -0
- swiftpy/core/config.py +432 -0
- swiftpy/core/container.py +596 -0
- swiftpy/core/container_exceptions.py +18 -0
- swiftpy/core/context.py +148 -0
- swiftpy/core/exceptions.py +352 -0
- swiftpy/core/providers/base.py +35 -0
- swiftpy/database/__init__.py +41 -0
- swiftpy/database/exceptions.py +42 -0
- swiftpy/database/identifiers.py +105 -0
- swiftpy/database/migrations/__init__.py +36 -0
- swiftpy/database/migrations/blueprint.py +431 -0
- swiftpy/database/migrations/lock.py +104 -0
- swiftpy/database/migrations/migration.py +22 -0
- swiftpy/database/migrations/migrator.py +507 -0
- swiftpy/database/migrations/schema.py +435 -0
- swiftpy/database/orm/__init__.py +33 -0
- swiftpy/database/orm/fields.py +92 -0
- swiftpy/database/orm/model.py +2034 -0
- swiftpy/database/orm/registry.py +33 -0
- swiftpy/database/orm/relationships.py +836 -0
- swiftpy/database/pagination/__init__.py +16 -0
- swiftpy/database/pagination/contracts.py +60 -0
- swiftpy/database/pagination/paginator.py +112 -0
- swiftpy/database/pagination/simple_paginator.py +97 -0
- swiftpy/database/pool.py +218 -0
- swiftpy/database/query_builder.py +1803 -0
- swiftpy/database/seeder.py +39 -0
- swiftpy/database/transaction.py +276 -0
- swiftpy/events/__init__.py +10 -0
- swiftpy/events/dispatcher.py +308 -0
- swiftpy/events/redis_bus.py +552 -0
- swiftpy/filesystem/__init__.py +227 -0
- swiftpy/filesystem/disk.py +378 -0
- swiftpy/filesystem/drivers/__init__.py +11 -0
- swiftpy/filesystem/drivers/base.py +156 -0
- swiftpy/filesystem/drivers/local.py +559 -0
- swiftpy/filesystem/drivers/s3.py +655 -0
- swiftpy/filesystem/events.py +37 -0
- swiftpy/filesystem/exceptions.py +127 -0
- swiftpy/filesystem/manager.py +138 -0
- swiftpy/filesystem/metadata.py +22 -0
- swiftpy/filesystem/paths.py +99 -0
- swiftpy/filesystem/service_provider.py +17 -0
- swiftpy/filesystem/uploads/__init__.py +13 -0
- swiftpy/filesystem/uploads/handlers.py +362 -0
- swiftpy/filesystem/uploads/uploaded_file.py +222 -0
- swiftpy/filesystem/uploads/validators.py +186 -0
- swiftpy/filesystem/visibility.py +22 -0
- swiftpy/helpers/__init__.py +42 -0
- swiftpy/helpers/helper.py +180 -0
- swiftpy/http/exceptions.py +41 -0
- swiftpy/http/middleware.py +307 -0
- swiftpy/http/request.py +375 -0
- swiftpy/http/response.py +442 -0
- swiftpy/http/router.py +1050 -0
- swiftpy/mail/__init__.py +58 -0
- swiftpy/mail/attachments.py +255 -0
- swiftpy/mail/config.py +71 -0
- swiftpy/mail/envelope.py +183 -0
- swiftpy/mail/exceptions.py +90 -0
- swiftpy/mail/facade.py +312 -0
- swiftpy/mail/mailable.py +53 -0
- swiftpy/mail/manager.py +240 -0
- swiftpy/mail/message.py +186 -0
- swiftpy/mail/models.py +19 -0
- swiftpy/mail/queue/__init__.py +5 -0
- swiftpy/mail/queue/job.py +279 -0
- swiftpy/mail/service_provider.py +19 -0
- swiftpy/mail/templates/__init__.py +5 -0
- swiftpy/mail/templates/renderer.py +173 -0
- swiftpy/mail/transports/__init__.py +21 -0
- swiftpy/mail/transports/api/__init__.py +13 -0
- swiftpy/mail/transports/api/base.py +194 -0
- swiftpy/mail/transports/api/mailgun.py +158 -0
- swiftpy/mail/transports/api/resend.py +156 -0
- swiftpy/mail/transports/api/sendgrid.py +172 -0
- swiftpy/mail/transports/base.py +24 -0
- swiftpy/mail/transports/console.py +91 -0
- swiftpy/mail/transports/sendmail.py +128 -0
- swiftpy/mail/transports/smtp.py +466 -0
- swiftpy/queue/__init__.py +13 -0
- swiftpy/queue/dispatcher.py +813 -0
- swiftpy/queue/job.py +541 -0
- swiftpy/queue/worker.py +556 -0
- swiftpy/support/__init__.py +12 -0
- swiftpy/support/keys.py +108 -0
- swiftpy/support/redis_config.py +223 -0
- swiftpy/support/strings.py +114 -0
- swiftpy/testing/__init__.py +20 -0
- swiftpy/testing/fakes/__init__.py +11 -0
- swiftpy/testing/fakes/ai_fake.py +21 -0
- swiftpy/testing/fakes/vectorstore_fake.py +194 -0
- swiftpy/testing/fixtures.py +124 -0
- swiftpy/testing/http_client.py +730 -0
- swiftpy/testing/test_case.py +126 -0
- swiftpy/validation/__init__.py +97 -0
- swiftpy/validation/exceptions.py +26 -0
- swiftpy/validation/form_request.py +302 -0
- swiftpy/validation/protocols.py +33 -0
- swiftpy/validation/rules/__init__.py +89 -0
- swiftpy/validation/rules/builtin.py +391 -0
- swiftpy/validation/rules/exists.py +86 -0
- swiftpy/validation/rules/registry.py +290 -0
- swiftpy/validation/rules/required.py +55 -0
- swiftpy/validation/rules/unique.py +138 -0
- swiftpy/validation/validator.py +612 -0
- swiftpy/websockets/__init__.py +19 -0
- swiftpy/websockets/connection.py +317 -0
- swiftpy/websockets/manager.py +271 -0
- swiftpy_framework-0.1.0.dist-info/METADATA +603 -0
- swiftpy_framework-0.1.0.dist-info/RECORD +211 -0
- swiftpy_framework-0.1.0.dist-info/WHEEL +4 -0
- swiftpy_framework-0.1.0.dist-info/entry_points.txt +2 -0
- swiftpy_framework-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from collections.abc import AsyncIterator
|
|
5
|
+
from datetime import datetime, timedelta
|
|
6
|
+
from typing import BinaryIO
|
|
7
|
+
|
|
8
|
+
from swiftpy.filesystem.metadata import FileMetadata
|
|
9
|
+
from swiftpy.filesystem.visibility import Visibility
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class StorageDriver(ABC):
|
|
13
|
+
"""Abstract contract for SwiftPY storage drivers."""
|
|
14
|
+
|
|
15
|
+
@abstractmethod
|
|
16
|
+
async def write(
|
|
17
|
+
self,
|
|
18
|
+
path: str,
|
|
19
|
+
content: bytes | str,
|
|
20
|
+
visibility: Visibility | str | None = None,
|
|
21
|
+
) -> int:
|
|
22
|
+
"""
|
|
23
|
+
Write content to the given path.
|
|
24
|
+
Returns the number of bytes written.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
@abstractmethod
|
|
28
|
+
async def write_stream(
|
|
29
|
+
self,
|
|
30
|
+
path: str,
|
|
31
|
+
stream: AsyncIterator[bytes] | BinaryIO,
|
|
32
|
+
chunk_size: int = 64 * 1024,
|
|
33
|
+
visibility: Visibility | str | None = None,
|
|
34
|
+
) -> int:
|
|
35
|
+
"""
|
|
36
|
+
Stream content to the given path without loading the entire payload into RAM.
|
|
37
|
+
Returns total bytes written.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
@abstractmethod
|
|
41
|
+
async def read(self, path: str) -> bytes:
|
|
42
|
+
"""
|
|
43
|
+
Read the entire binary content of the file.
|
|
44
|
+
Raises FileNotFoundError if the file does not exist.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
@abstractmethod
|
|
48
|
+
async def read_text(self, path: str, encoding: str = "utf-8") -> str:
|
|
49
|
+
"""
|
|
50
|
+
Read the file content decoded as text.
|
|
51
|
+
Raises FileNotFoundError if the file does not exist.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
@abstractmethod
|
|
55
|
+
def read_stream(
|
|
56
|
+
self,
|
|
57
|
+
path: str,
|
|
58
|
+
chunk_size: int = 64 * 1024,
|
|
59
|
+
) -> AsyncIterator[bytes]:
|
|
60
|
+
"""
|
|
61
|
+
Stream file content asynchronously in chunks.
|
|
62
|
+
Raises FileNotFoundError if the file does not exist.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
@abstractmethod
|
|
66
|
+
async def exists(self, path: str) -> bool:
|
|
67
|
+
"""Determine if a file or object exists at the given path."""
|
|
68
|
+
|
|
69
|
+
@abstractmethod
|
|
70
|
+
async def missing(self, path: str) -> bool:
|
|
71
|
+
"""Determine if a file or object is missing at the given path."""
|
|
72
|
+
|
|
73
|
+
@abstractmethod
|
|
74
|
+
async def delete(self, path: str) -> bool:
|
|
75
|
+
"""
|
|
76
|
+
Delete the file at the given path.
|
|
77
|
+
Returns True if deleted or already absent.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
@abstractmethod
|
|
81
|
+
async def copy(self, source: str, destination: str) -> bool:
|
|
82
|
+
"""
|
|
83
|
+
Copy a file from source to destination.
|
|
84
|
+
Returns True on success.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
@abstractmethod
|
|
88
|
+
async def move(self, source: str, destination: str) -> bool:
|
|
89
|
+
"""
|
|
90
|
+
Move/rename a file from source to destination.
|
|
91
|
+
Returns True on success.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
@abstractmethod
|
|
95
|
+
async def size(self, path: str) -> int:
|
|
96
|
+
"""Get the file size in bytes."""
|
|
97
|
+
|
|
98
|
+
@abstractmethod
|
|
99
|
+
async def mime_type(self, path: str) -> str:
|
|
100
|
+
"""Get the detected MIME type of the file."""
|
|
101
|
+
|
|
102
|
+
@abstractmethod
|
|
103
|
+
async def last_modified(self, path: str) -> datetime:
|
|
104
|
+
"""Get the last modified timestamp in UTC."""
|
|
105
|
+
|
|
106
|
+
@abstractmethod
|
|
107
|
+
async def checksum(self, path: str, algorithm: str = "sha256") -> str:
|
|
108
|
+
"""Compute the cryptographic hex digest of the file."""
|
|
109
|
+
|
|
110
|
+
@abstractmethod
|
|
111
|
+
async def files(self, directory: str = "", recursive: bool = False) -> list[str]:
|
|
112
|
+
"""
|
|
113
|
+
List all file paths within a directory (relative to the disk root).
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
@abstractmethod
|
|
117
|
+
async def directories(self, directory: str = "", recursive: bool = False) -> list[str]:
|
|
118
|
+
"""
|
|
119
|
+
List all directory paths within a directory (relative to the disk root).
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
@abstractmethod
|
|
123
|
+
async def make_directory(self, directory: str) -> bool:
|
|
124
|
+
"""Create a directory if it does not exist."""
|
|
125
|
+
|
|
126
|
+
@abstractmethod
|
|
127
|
+
async def delete_directory(self, directory: str) -> bool:
|
|
128
|
+
"""Recursively delete a directory and all its contents."""
|
|
129
|
+
|
|
130
|
+
@abstractmethod
|
|
131
|
+
async def url(self, path: str) -> str:
|
|
132
|
+
"""Get the public URL for the file."""
|
|
133
|
+
|
|
134
|
+
@abstractmethod
|
|
135
|
+
async def temporary_url(
|
|
136
|
+
self,
|
|
137
|
+
path: str,
|
|
138
|
+
expires_in: int | timedelta,
|
|
139
|
+
) -> str:
|
|
140
|
+
"""Generate a cryptographically signed temporary URL with expiration."""
|
|
141
|
+
|
|
142
|
+
@abstractmethod
|
|
143
|
+
async def get_visibility(self, path: str) -> Visibility:
|
|
144
|
+
"""Get the access visibility (public or private) for a file."""
|
|
145
|
+
|
|
146
|
+
@abstractmethod
|
|
147
|
+
async def set_visibility(self, path: str, visibility: Visibility | str) -> bool:
|
|
148
|
+
"""Set the access visibility for a file."""
|
|
149
|
+
|
|
150
|
+
@abstractmethod
|
|
151
|
+
async def metadata(self, path: str) -> FileMetadata:
|
|
152
|
+
"""Retrieve unified metadata for a file."""
|
|
153
|
+
|
|
154
|
+
async def close(self) -> None:
|
|
155
|
+
"""Clean up underlying connections, pools, or open handles."""
|
|
156
|
+
|