amsdal 0.5.19__cp312-cp312-macosx_10_13_universal2.whl → 0.5.20__cp312-cp312-macosx_10_13_universal2.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.
Potentially problematic release.
This version of amsdal might be problematic. Click here for more details.
- amsdal/__about__.py +1 -1
- amsdal/cloud/__init__.cpython-312-darwin.so +0 -0
- amsdal/cloud/client.cpython-312-darwin.so +0 -0
- amsdal/cloud/constants.cpython-312-darwin.so +0 -0
- amsdal/cloud/enums.cpython-312-darwin.so +0 -0
- amsdal/cloud/models/__init__.cpython-312-darwin.so +0 -0
- amsdal/cloud/models/base.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/__init__.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/__init__.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/add_allowlist_ip.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/add_basic_auth.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/add_dependency.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/add_secret.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/base.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/create_deploy.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/create_env.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/create_session.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/delete_allowlist_ip.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/delete_basic_auth.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/delete_dependency.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/delete_env.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/delete_secret.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/destroy_deploy.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/expose_db.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/get_basic_auth_credentials.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/get_monitoring_info.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/list_dependencies.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/list_deploys.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/list_envs.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/list_secrets.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/manager.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/signup_action.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/actions/update_deploy.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/auth/__init__.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/auth/base.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/auth/credentials.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/auth/manager.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/auth/signup_service.cpython-312-darwin.so +0 -0
- amsdal/cloud/services/auth/token.cpython-312-darwin.so +0 -0
- amsdal/contrib/__init__.cpython-312-darwin.so +0 -0
- amsdal/fixtures/__init__.cpython-312-darwin.so +0 -0
- amsdal/fixtures/manager.cpython-312-darwin.so +0 -0
- amsdal/fixtures/utils.cpython-312-darwin.so +0 -0
- amsdal/manager.cpython-312-darwin.so +0 -0
- amsdal/mixins/__init__.cpython-312-darwin.so +0 -0
- amsdal/mixins/class_versions_mixin.cpython-312-darwin.so +0 -0
- amsdal/schemas/manager.cpython-312-darwin.so +0 -0
- amsdal/services/__init__.py +11 -0
- amsdal/services/external_connections.py +262 -0
- amsdal/services/external_model_generator.py +350 -0
- amsdal/services/transaction_execution.cpython-312-darwin.so +0 -0
- {amsdal-0.5.19.dist-info → amsdal-0.5.20.dist-info}/METADATA +1 -1
- {amsdal-0.5.19.dist-info → amsdal-0.5.20.dist-info}/RECORD +56 -56
- amsdal/services/__init__.cpython-312-darwin.so +0 -0
- amsdal/services/external_connections.cpython-312-darwin.so +0 -0
- amsdal/services/external_model_generator.cpython-312-darwin.so +0 -0
- {amsdal-0.5.19.dist-info → amsdal-0.5.20.dist-info}/WHEEL +0 -0
- {amsdal-0.5.19.dist-info → amsdal-0.5.20.dist-info}/licenses/LICENSE.txt +0 -0
- {amsdal-0.5.19.dist-info → amsdal-0.5.20.dist-info}/top_level.txt +0 -0
amsdal/__about__.py
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# AMSDAL services package
|
|
2
|
+
|
|
3
|
+
from amsdal.services.external_connections import ExternalConnectionManager
|
|
4
|
+
from amsdal.services.external_connections import ExternalDatabaseReader
|
|
5
|
+
from amsdal.services.external_model_generator import ExternalModelGenerator
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
'ExternalConnectionManager',
|
|
9
|
+
'ExternalDatabaseReader',
|
|
10
|
+
'ExternalModelGenerator',
|
|
11
|
+
]
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"""
|
|
2
|
+
External Connection Manager for accessing external services and databases.
|
|
3
|
+
|
|
4
|
+
This module provides a high-level interface for working with external connections
|
|
5
|
+
such as read-only databases, email services, storage services, etc.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any
|
|
9
|
+
from typing import TypeVar
|
|
10
|
+
|
|
11
|
+
from amsdal_data.application import AsyncDataApplication
|
|
12
|
+
from amsdal_data.application import DataApplication
|
|
13
|
+
from amsdal_utils.utils.singleton import Singleton
|
|
14
|
+
|
|
15
|
+
T = TypeVar('T')
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ExternalConnectionManager(metaclass=Singleton):
|
|
19
|
+
"""
|
|
20
|
+
Manager for accessing external service connections.
|
|
21
|
+
|
|
22
|
+
Provides a convenient interface to access external connections configured
|
|
23
|
+
in the application, such as read-only databases, email services, etc.
|
|
24
|
+
|
|
25
|
+
Example usage:
|
|
26
|
+
manager = ExternalConnectionManager()
|
|
27
|
+
|
|
28
|
+
# Get read-only database connection
|
|
29
|
+
external_db = manager.get_connection('external_users_db')
|
|
30
|
+
rows = external_db.fetch_all('SELECT * FROM users WHERE active = 1')
|
|
31
|
+
|
|
32
|
+
# Get email service
|
|
33
|
+
email = manager.get_connection('email_service')
|
|
34
|
+
email.send_email(...)
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self) -> None:
|
|
38
|
+
self._data_application: DataApplication | None = None
|
|
39
|
+
self._async_data_application: AsyncDataApplication | None = None
|
|
40
|
+
|
|
41
|
+
def setup(
|
|
42
|
+
self,
|
|
43
|
+
data_application: DataApplication | None = None,
|
|
44
|
+
async_data_application: AsyncDataApplication | None = None,
|
|
45
|
+
) -> None:
|
|
46
|
+
"""
|
|
47
|
+
Set up the manager with the data application instance.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
data_application: Sync DataApplication instance
|
|
51
|
+
async_data_application: Async DataApplication instance
|
|
52
|
+
"""
|
|
53
|
+
self._data_application = data_application
|
|
54
|
+
self._async_data_application = async_data_application
|
|
55
|
+
|
|
56
|
+
def get_connection(self, name: str) -> Any:
|
|
57
|
+
"""
|
|
58
|
+
Get an external service connection by name.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
name: Name of the external connection (as configured in resources)
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
The external connection object
|
|
65
|
+
|
|
66
|
+
Raises:
|
|
67
|
+
RuntimeError: If manager is not set up
|
|
68
|
+
KeyError: If connection not found
|
|
69
|
+
"""
|
|
70
|
+
if self._data_application is None and self._async_data_application is None:
|
|
71
|
+
msg = 'ExternalConnectionManager not set up. Call setup() first.'
|
|
72
|
+
raise RuntimeError(msg)
|
|
73
|
+
|
|
74
|
+
app = self._data_application or self._async_data_application
|
|
75
|
+
if app is None: # Shouldn't happen due to check above, but satisfy mypy
|
|
76
|
+
msg = 'No data application available'
|
|
77
|
+
raise RuntimeError(msg)
|
|
78
|
+
return app.get_external_service_connection(name)
|
|
79
|
+
|
|
80
|
+
def has_connection(self, name: str) -> bool:
|
|
81
|
+
"""
|
|
82
|
+
Check if an external connection exists.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
name: Name of the external connection
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
bool: True if connection exists, False otherwise
|
|
89
|
+
"""
|
|
90
|
+
if self._data_application is None and self._async_data_application is None:
|
|
91
|
+
return False
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
self.get_connection(name)
|
|
95
|
+
return True
|
|
96
|
+
except KeyError:
|
|
97
|
+
return False
|
|
98
|
+
|
|
99
|
+
def list_connections(self) -> list[str]:
|
|
100
|
+
"""
|
|
101
|
+
List all available external connection names.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
list[str]: List of connection names
|
|
105
|
+
"""
|
|
106
|
+
if self._data_application:
|
|
107
|
+
return list(self._data_application._external_service_connections.keys()) # noqa: SLF001
|
|
108
|
+
if self._async_data_application:
|
|
109
|
+
return list(self._async_data_application._external_service_connections.keys()) # noqa: SLF001
|
|
110
|
+
return []
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class ExternalDatabaseReader:
|
|
114
|
+
"""
|
|
115
|
+
Helper class for reading from external read-only databases.
|
|
116
|
+
|
|
117
|
+
Provides a convenient interface for querying external databases
|
|
118
|
+
with common patterns like filtering, mapping results, etc.
|
|
119
|
+
|
|
120
|
+
Example usage:
|
|
121
|
+
reader = ExternalDatabaseReader('external_users_db')
|
|
122
|
+
|
|
123
|
+
# Fetch all users
|
|
124
|
+
users = reader.fetch_all('SELECT * FROM users')
|
|
125
|
+
|
|
126
|
+
# Fetch with parameters
|
|
127
|
+
active_users = reader.fetch_all(
|
|
128
|
+
'SELECT * FROM users WHERE active = ?',
|
|
129
|
+
(1,)
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# Fetch one record
|
|
133
|
+
user = reader.fetch_one('SELECT * FROM users WHERE id = ?', (user_id,))
|
|
134
|
+
|
|
135
|
+
# Get as dictionaries
|
|
136
|
+
user_dicts = reader.fetch_all_as_dicts('SELECT * FROM users LIMIT 10')
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
def __init__(self, connection_name: str):
|
|
140
|
+
"""
|
|
141
|
+
Initialize the reader with a connection name.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
connection_name: Name of the external database connection
|
|
145
|
+
"""
|
|
146
|
+
self.connection_name = connection_name
|
|
147
|
+
self._manager = ExternalConnectionManager()
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def connection(self) -> Any:
|
|
151
|
+
"""Get the underlying connection object."""
|
|
152
|
+
return self._manager.get_connection(self.connection_name)
|
|
153
|
+
|
|
154
|
+
def fetch_all(self, query: str, parameters: tuple[Any, ...] | None = None) -> list[Any]:
|
|
155
|
+
"""
|
|
156
|
+
Execute query and fetch all results.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
query: SQL query to execute
|
|
160
|
+
parameters: Query parameters (optional)
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
list: List of result rows
|
|
164
|
+
"""
|
|
165
|
+
return self.connection.fetch_all(query, parameters)
|
|
166
|
+
|
|
167
|
+
def fetch_one(self, query: str, parameters: tuple[Any, ...] | None = None) -> Any | None:
|
|
168
|
+
"""
|
|
169
|
+
Execute query and fetch one result.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
query: SQL query to execute
|
|
173
|
+
parameters: Query parameters (optional)
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
Single result row or None
|
|
177
|
+
"""
|
|
178
|
+
return self.connection.fetch_one(query, parameters)
|
|
179
|
+
|
|
180
|
+
def fetch_all_as_dicts(self, query: str, parameters: tuple[Any, ...] | None = None) -> list[dict[str, Any]]:
|
|
181
|
+
"""
|
|
182
|
+
Execute query and fetch all results as dictionaries.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
query: SQL query to execute
|
|
186
|
+
parameters: Query parameters (optional)
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
list[dict]: List of result dictionaries
|
|
190
|
+
"""
|
|
191
|
+
rows = self.fetch_all(query, parameters)
|
|
192
|
+
return [dict(row) for row in rows]
|
|
193
|
+
|
|
194
|
+
def fetch_one_as_dict(self, query: str, parameters: tuple[Any, ...] | None = None) -> dict[str, Any] | None:
|
|
195
|
+
"""
|
|
196
|
+
Execute query and fetch one result as dictionary.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
query: SQL query to execute
|
|
200
|
+
parameters: Query parameters (optional)
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
dict | None: Result dictionary or None
|
|
204
|
+
"""
|
|
205
|
+
row = self.fetch_one(query, parameters)
|
|
206
|
+
return dict(row) if row else None
|
|
207
|
+
|
|
208
|
+
def get_table_names(self) -> list[str]:
|
|
209
|
+
"""
|
|
210
|
+
Get list of all tables in the database.
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
list[str]: List of table names
|
|
214
|
+
"""
|
|
215
|
+
return self.connection.get_table_names()
|
|
216
|
+
|
|
217
|
+
def get_table_schema(self, table_name: str) -> list[dict[str, Any]]:
|
|
218
|
+
"""
|
|
219
|
+
Get schema information for a table.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
table_name: Name of the table
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
list[dict]: List of column information dictionaries
|
|
226
|
+
"""
|
|
227
|
+
return self.connection.get_table_schema(table_name)
|
|
228
|
+
|
|
229
|
+
def count(self, table: str, where_clause: str = '', parameters: tuple[Any, ...] | None = None) -> int:
|
|
230
|
+
"""
|
|
231
|
+
Count rows in a table.
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
table: Table name
|
|
235
|
+
where_clause: Optional WHERE clause (without WHERE keyword)
|
|
236
|
+
parameters: Query parameters for WHERE clause
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
int: Number of rows
|
|
240
|
+
"""
|
|
241
|
+
query = f'SELECT COUNT(*) as count FROM {table}' # noqa: S608
|
|
242
|
+
if where_clause:
|
|
243
|
+
query += f' WHERE {where_clause}'
|
|
244
|
+
|
|
245
|
+
result = self.fetch_one(query, parameters)
|
|
246
|
+
return result['count'] if result else 0
|
|
247
|
+
|
|
248
|
+
def exists(self, table: str, where_clause: str, parameters: tuple[Any, ...]) -> bool:
|
|
249
|
+
"""
|
|
250
|
+
Check if a record exists.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
table: Table name
|
|
254
|
+
where_clause: WHERE clause (without WHERE keyword)
|
|
255
|
+
parameters: Query parameters
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
bool: True if record exists, False otherwise
|
|
259
|
+
"""
|
|
260
|
+
query = f'SELECT 1 FROM {table} WHERE {where_clause} LIMIT 1' # noqa: S608
|
|
261
|
+
result = self.fetch_one(query, parameters)
|
|
262
|
+
return result is not None
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
"""
|
|
2
|
+
External Model Generator Service.
|
|
3
|
+
|
|
4
|
+
Generates ExternalModel classes from external connection schemas.
|
|
5
|
+
This allows runtime model generation from external databases without
|
|
6
|
+
manual model definition.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
from typing import cast
|
|
11
|
+
|
|
12
|
+
from amsdal_data.connections.external.base import SchemaIntrospectionProtocol
|
|
13
|
+
from amsdal_models.classes.external_model import ExternalModel
|
|
14
|
+
from amsdal_models.utils.schema_converter import ExternalSchemaConverter
|
|
15
|
+
from amsdal_utils.schemas.schema import ObjectSchema
|
|
16
|
+
|
|
17
|
+
from amsdal.services.external_connections import ExternalConnectionManager
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ExternalModelGenerator:
|
|
21
|
+
"""
|
|
22
|
+
Service for generating ExternalModel classes from external connections.
|
|
23
|
+
|
|
24
|
+
This service introspects external database schemas and generates
|
|
25
|
+
corresponding ExternalModel classes that can be used immediately
|
|
26
|
+
for querying the external data.
|
|
27
|
+
|
|
28
|
+
Features:
|
|
29
|
+
- Automatic schema introspection
|
|
30
|
+
- Type mapping (SQL types -> Python types)
|
|
31
|
+
- Primary key detection
|
|
32
|
+
- In-memory model class generation
|
|
33
|
+
- No lakehouse schema creation
|
|
34
|
+
|
|
35
|
+
Example usage:
|
|
36
|
+
# Generate models for a single table
|
|
37
|
+
generator = ExternalModelGenerator()
|
|
38
|
+
User = generator.generate_model('external_db', 'users')
|
|
39
|
+
|
|
40
|
+
# Now use the generated model
|
|
41
|
+
users = User.objects.filter(active=True).execute()
|
|
42
|
+
|
|
43
|
+
# Generate models for all tables
|
|
44
|
+
models = generator.generate_models_for_connection('external_db')
|
|
45
|
+
User = models['User']
|
|
46
|
+
Post = models['Post']
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(self) -> None:
|
|
50
|
+
self._connection_manager = ExternalConnectionManager()
|
|
51
|
+
self._schema_converter = ExternalSchemaConverter()
|
|
52
|
+
|
|
53
|
+
def generate_model(
|
|
54
|
+
self,
|
|
55
|
+
connection_name: str,
|
|
56
|
+
table_name: str,
|
|
57
|
+
model_name: str | None = None,
|
|
58
|
+
) -> type[ExternalModel]:
|
|
59
|
+
"""
|
|
60
|
+
Generate an ExternalModel class for a specific table.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
connection_name: Name of the external connection
|
|
64
|
+
table_name: Name of the table to generate model for
|
|
65
|
+
model_name: Optional custom model name (defaults to classified table name)
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
type[ExternalModel]: Generated model class ready to use
|
|
69
|
+
|
|
70
|
+
Raises:
|
|
71
|
+
ValueError: If connection doesn't support schema introspection
|
|
72
|
+
ConnectionError: If connection is not available
|
|
73
|
+
RuntimeError: If model generation fails
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
generator = ExternalModelGenerator()
|
|
77
|
+
User = generator.generate_model('external_db', 'users')
|
|
78
|
+
|
|
79
|
+
# Query using the generated model
|
|
80
|
+
active_users = User.objects.filter(active=True).execute()
|
|
81
|
+
"""
|
|
82
|
+
# Get the connection
|
|
83
|
+
connection = self._connection_manager.get_connection(connection_name)
|
|
84
|
+
|
|
85
|
+
# Check if connection supports schema introspection
|
|
86
|
+
if not isinstance(connection, SchemaIntrospectionProtocol): # type: ignore[misc]
|
|
87
|
+
msg = (
|
|
88
|
+
f"Connection '{connection_name}' does not support schema introspection. "
|
|
89
|
+
f'Connection type: {type(connection).__name__}'
|
|
90
|
+
)
|
|
91
|
+
raise ValueError(msg)
|
|
92
|
+
|
|
93
|
+
# Get table schema
|
|
94
|
+
table_schema = connection.get_table_schema(table_name)
|
|
95
|
+
|
|
96
|
+
# Convert to ObjectSchema
|
|
97
|
+
# Detect connection type and use appropriate converter
|
|
98
|
+
object_schema = self._convert_schema(
|
|
99
|
+
connection=connection,
|
|
100
|
+
table_name=table_name,
|
|
101
|
+
table_schema=table_schema,
|
|
102
|
+
connection_name=connection_name,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# Generate model class from ObjectSchema
|
|
106
|
+
model_class = self._create_model_class(object_schema, model_name)
|
|
107
|
+
|
|
108
|
+
return model_class
|
|
109
|
+
|
|
110
|
+
def generate_models_for_connection(
|
|
111
|
+
self,
|
|
112
|
+
connection_name: str,
|
|
113
|
+
table_names: list[str] | None = None,
|
|
114
|
+
) -> dict[str, type[ExternalModel]]:
|
|
115
|
+
"""
|
|
116
|
+
Generate ExternalModel classes for all tables in a connection.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
connection_name: Name of the external connection
|
|
120
|
+
table_names: Optional list of specific tables to generate models for.
|
|
121
|
+
If None, generates models for all tables.
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
dict[str, type[ExternalModel]]: Dictionary mapping model names to model classes
|
|
125
|
+
|
|
126
|
+
Raises:
|
|
127
|
+
ValueError: If connection doesn't support schema introspection
|
|
128
|
+
ConnectionError: If connection is not available
|
|
129
|
+
|
|
130
|
+
Example:
|
|
131
|
+
generator = ExternalModelGenerator()
|
|
132
|
+
models = generator.generate_models_for_connection('external_db')
|
|
133
|
+
|
|
134
|
+
# Access generated models
|
|
135
|
+
User = models['User']
|
|
136
|
+
Post = models['Post']
|
|
137
|
+
Comment = models['Comment']
|
|
138
|
+
|
|
139
|
+
# Or generate only specific tables
|
|
140
|
+
models = generator.generate_models_for_connection(
|
|
141
|
+
'external_db',
|
|
142
|
+
table_names=['users', 'posts']
|
|
143
|
+
)
|
|
144
|
+
"""
|
|
145
|
+
# Get the connection
|
|
146
|
+
connection = self._connection_manager.get_connection(connection_name)
|
|
147
|
+
|
|
148
|
+
# Check if connection supports schema introspection
|
|
149
|
+
if not isinstance(connection, SchemaIntrospectionProtocol): # type: ignore[misc]
|
|
150
|
+
msg = (
|
|
151
|
+
f"Connection '{connection_name}' does not support schema introspection. "
|
|
152
|
+
f'Connection type: {type(connection).__name__}'
|
|
153
|
+
)
|
|
154
|
+
raise ValueError(msg)
|
|
155
|
+
|
|
156
|
+
# Get list of tables
|
|
157
|
+
if table_names is None:
|
|
158
|
+
table_names = connection.get_table_names()
|
|
159
|
+
|
|
160
|
+
# Generate models for each table
|
|
161
|
+
models: dict[str, type[ExternalModel]] = {}
|
|
162
|
+
for table_name in table_names:
|
|
163
|
+
try:
|
|
164
|
+
model = self.generate_model(connection_name, table_name)
|
|
165
|
+
models[model.__name__] = model
|
|
166
|
+
except Exception as e:
|
|
167
|
+
# Log error but continue with other tables
|
|
168
|
+
print(f"Warning: Failed to generate model for table '{table_name}': {e}")
|
|
169
|
+
continue
|
|
170
|
+
|
|
171
|
+
return models
|
|
172
|
+
|
|
173
|
+
def _convert_schema(
|
|
174
|
+
self,
|
|
175
|
+
connection: Any,
|
|
176
|
+
table_name: str,
|
|
177
|
+
table_schema: list[dict[str, Any]],
|
|
178
|
+
connection_name: str,
|
|
179
|
+
) -> ObjectSchema:
|
|
180
|
+
"""
|
|
181
|
+
Convert raw table schema to ObjectSchema based on connection type.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
connection: The connection object
|
|
185
|
+
table_name: Name of the table
|
|
186
|
+
table_schema: Raw schema data from connection
|
|
187
|
+
connection_name: Name of the connection
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
ObjectSchema: Converted schema
|
|
191
|
+
"""
|
|
192
|
+
# Detect connection type and use appropriate converter
|
|
193
|
+
connection_type = type(connection).__name__
|
|
194
|
+
|
|
195
|
+
if 'sqlite' in connection_type.lower():
|
|
196
|
+
return self._schema_converter.sqlite_schema_to_object_schema(
|
|
197
|
+
table_name=table_name,
|
|
198
|
+
columns=table_schema,
|
|
199
|
+
connection_name=connection_name,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# For other connection types, try to use generic converter
|
|
203
|
+
# First, try to detect the schema format
|
|
204
|
+
if table_schema and isinstance(table_schema[0], dict):
|
|
205
|
+
# Check if it's SQLite format (has 'cid', 'name', 'type', 'pk', etc.)
|
|
206
|
+
if all(key in table_schema[0] for key in ('cid', 'name', 'type')):
|
|
207
|
+
return self._schema_converter.sqlite_schema_to_object_schema(
|
|
208
|
+
table_name=table_name,
|
|
209
|
+
columns=table_schema,
|
|
210
|
+
connection_name=connection_name,
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# Check if it's PostgreSQL format (has 'column_name', 'data_type', etc.)
|
|
214
|
+
if 'column_name' in table_schema[0] and 'data_type' in table_schema[0]:
|
|
215
|
+
return self._schema_converter.postgres_schema_to_object_schema(
|
|
216
|
+
table_name=table_name,
|
|
217
|
+
columns=table_schema,
|
|
218
|
+
connection_name=connection_name,
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
# Try generic converter with format normalization
|
|
222
|
+
normalized_columns = self._normalize_schema_format(table_schema)
|
|
223
|
+
return self._schema_converter.generic_schema_to_object_schema(
|
|
224
|
+
table_name=table_name,
|
|
225
|
+
columns=normalized_columns,
|
|
226
|
+
connection_name=connection_name,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
msg = f'Unknown schema format for connection type: {connection_type}'
|
|
230
|
+
raise ValueError(msg)
|
|
231
|
+
|
|
232
|
+
def _normalize_schema_format(self, table_schema: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
233
|
+
"""
|
|
234
|
+
Normalize various schema formats to generic format.
|
|
235
|
+
|
|
236
|
+
Converts various schema formats to the format expected by generic_schema_to_object_schema:
|
|
237
|
+
{'name': str, 'type': str, 'nullable': bool, 'primary_key': bool, 'default': Any}
|
|
238
|
+
"""
|
|
239
|
+
normalized = []
|
|
240
|
+
|
|
241
|
+
for column in table_schema:
|
|
242
|
+
# Try to extract name
|
|
243
|
+
name = column.get('name') or column.get('column_name') or column.get('field')
|
|
244
|
+
|
|
245
|
+
# Try to extract type
|
|
246
|
+
col_type = column.get('type') or column.get('data_type') or column.get('field_type') or 'TEXT'
|
|
247
|
+
|
|
248
|
+
# Try to extract nullable
|
|
249
|
+
nullable = True
|
|
250
|
+
if 'nullable' in column:
|
|
251
|
+
nullable = column['nullable']
|
|
252
|
+
elif 'is_nullable' in column:
|
|
253
|
+
nullable = column['is_nullable'] in (True, 'YES', 'yes', 1)
|
|
254
|
+
elif 'notnull' in column:
|
|
255
|
+
nullable = column['notnull'] in (False, 0)
|
|
256
|
+
|
|
257
|
+
# Try to extract primary key
|
|
258
|
+
pk = column.get('primary_key') or column.get('pk') or False
|
|
259
|
+
if isinstance(pk, int):
|
|
260
|
+
pk = pk > 0
|
|
261
|
+
|
|
262
|
+
# Try to extract default
|
|
263
|
+
default = column.get('default') or column.get('dflt_value') or column.get('column_default')
|
|
264
|
+
|
|
265
|
+
normalized.append(
|
|
266
|
+
{
|
|
267
|
+
'name': name,
|
|
268
|
+
'type': col_type,
|
|
269
|
+
'nullable': nullable,
|
|
270
|
+
'primary_key': pk,
|
|
271
|
+
'default': default,
|
|
272
|
+
}
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
return normalized
|
|
276
|
+
|
|
277
|
+
def _create_model_class(
|
|
278
|
+
self,
|
|
279
|
+
object_schema: ObjectSchema,
|
|
280
|
+
custom_name: str | None = None,
|
|
281
|
+
) -> type[ExternalModel]:
|
|
282
|
+
"""
|
|
283
|
+
Create an ExternalModel class from ObjectSchema.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
object_schema: The schema to create model from
|
|
287
|
+
custom_name: Optional custom model name
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
type[ExternalModel]: Generated model class
|
|
291
|
+
"""
|
|
292
|
+
# Extract model metadata from schema
|
|
293
|
+
model_name = custom_name or object_schema.title
|
|
294
|
+
table_name = cast(str, object_schema.__table_name__) # type: ignore[attr-defined]
|
|
295
|
+
connection_name = cast(str, object_schema.__connection__) # type: ignore[attr-defined]
|
|
296
|
+
pk_fields = getattr(object_schema, '__primary_key__', None)
|
|
297
|
+
|
|
298
|
+
# Build class attributes
|
|
299
|
+
class_attrs: dict[str, Any] = {
|
|
300
|
+
'__table_name__': table_name,
|
|
301
|
+
'__connection__': connection_name,
|
|
302
|
+
'__module__': __name__,
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
# Add primary key if present
|
|
306
|
+
if pk_fields:
|
|
307
|
+
# For composite keys, use list; for single key, use string
|
|
308
|
+
if len(pk_fields) == 1:
|
|
309
|
+
class_attrs['__primary_key__'] = pk_fields[0]
|
|
310
|
+
else:
|
|
311
|
+
class_attrs['__primary_key__'] = pk_fields
|
|
312
|
+
|
|
313
|
+
# Add field annotations from schema properties
|
|
314
|
+
annotations: dict[str, type] = {}
|
|
315
|
+
if object_schema.properties:
|
|
316
|
+
for field_name, field_def in object_schema.properties.items():
|
|
317
|
+
# Map CoreTypes to Python types for annotations
|
|
318
|
+
field_type = self._core_type_to_python_type(getattr(field_def, 'type', 'string'))
|
|
319
|
+
annotations[field_name] = field_type
|
|
320
|
+
|
|
321
|
+
class_attrs['__annotations__'] = annotations
|
|
322
|
+
|
|
323
|
+
# Create the model class dynamically
|
|
324
|
+
model_class = type(model_name, (ExternalModel,), class_attrs)
|
|
325
|
+
|
|
326
|
+
return cast(type[ExternalModel], model_class)
|
|
327
|
+
|
|
328
|
+
@staticmethod
|
|
329
|
+
def _core_type_to_python_type(core_type: str) -> type:
|
|
330
|
+
"""
|
|
331
|
+
Convert CoreType string to Python type for annotations.
|
|
332
|
+
|
|
333
|
+
Args:
|
|
334
|
+
core_type: CoreType value (e.g., 'string', 'integer')
|
|
335
|
+
|
|
336
|
+
Returns:
|
|
337
|
+
type: Corresponding Python type
|
|
338
|
+
"""
|
|
339
|
+
type_mapping = {
|
|
340
|
+
'string': str,
|
|
341
|
+
'integer': int,
|
|
342
|
+
'number': float,
|
|
343
|
+
'boolean': bool,
|
|
344
|
+
'date': str, # Will be string representation
|
|
345
|
+
'datetime': str, # Will be string representation
|
|
346
|
+
'binary': bytes,
|
|
347
|
+
'array': list,
|
|
348
|
+
'dictionary': dict,
|
|
349
|
+
}
|
|
350
|
+
return type_mapping.get(core_type, str)
|
|
Binary file
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
amsdal-0.5.20.dist-info/RECORD,,
|
|
2
|
+
amsdal-0.5.20.dist-info/WHEEL,sha256=_N1vyLgwJ10g4JxFsp-IfU42zGJgf-DUqwfdbV1YvEM,115
|
|
3
|
+
amsdal-0.5.20.dist-info/top_level.txt,sha256=VPQLnOP3mf7q0JuQ_vPZYQyPNGKd_uc6ouz-hZRkhSk,7
|
|
4
|
+
amsdal-0.5.20.dist-info/METADATA,sha256=YDpdiTaeGtMmX0K_6sXzeBZ6wRg3-p2XjlhM_gB4CVk,57623
|
|
5
|
+
amsdal-0.5.20.dist-info/licenses/LICENSE.txt,sha256=hG-541PFYfNJi9WRZi_hno91UyqNg7YLK8LR3vLblZA,27355
|
|
1
6
|
amsdal/manager.pyi,sha256=aRX-FO3KIozgaoJg3_pAVJjPAW9PL8hMiYvaTJ_kp5E,9466
|
|
2
7
|
amsdal/__init__.pyi,sha256=4FIq7rQKQXoDNIzrDxtklKrbPcE2qqKU8W0jp8Mld6Q,741
|
|
3
8
|
amsdal/__init__.py,sha256=eg_kMNcJSTvb8Q32AstCARJURBhrlIVmE12Dgq0nOUk,742
|
|
4
9
|
amsdal/Third-Party Materials - AMSDAL Dependencies - License Notices.md,sha256=3YRsqickIvSW7EmjlC-yk5h-YW_GMzAz7wsT9ZPIiaM,74780
|
|
5
|
-
amsdal/__about__.py,sha256=
|
|
10
|
+
amsdal/__about__.py,sha256=RETd2XJ38IWN5gbh16Wv9TBeKjUe7jM_reeIuSoBgGI,125
|
|
6
11
|
amsdal/errors.pyi,sha256=mcuGsQMWaIUmC9GJDIkf99dQMMsCfBy6OI_UB3NSNmc,597
|
|
7
|
-
amsdal/manager.cpython-312-darwin.so,sha256=
|
|
12
|
+
amsdal/manager.cpython-312-darwin.so,sha256=b5nERmyppeR83gaaLpcIjYSud4r-IPG1IsmA0ByfZf4,501968
|
|
8
13
|
amsdal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
14
|
amsdal/errors.py,sha256=pZZKIklaDkh8jdFSAfX81TbiylvbaE70nttRjTcTSBk,616
|
|
10
15
|
amsdal/__about__.pyi,sha256=Y25n44pyE3vp92MiABKrcK3IWRyQ1JG1rZ4Ufqy2nC0,17
|
|
@@ -17,8 +22,8 @@ amsdal/context/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
17
22
|
amsdal/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
23
|
amsdal/context/manager.py,sha256=CKGY75P2y-TCnZvK5p9NJsDgHo8KXHSE0Eg5AGRjnfk,1850
|
|
19
24
|
amsdal/mixins/class_versions_mixin.pyi,sha256=oSXjkTsN35d-3YgCckclhk7xRkljKHLYtN8a8gJgj2o,548
|
|
20
|
-
amsdal/mixins/__init__.cpython-312-darwin.so,sha256=
|
|
21
|
-
amsdal/mixins/class_versions_mixin.cpython-312-darwin.so,sha256=
|
|
25
|
+
amsdal/mixins/__init__.cpython-312-darwin.so,sha256=AHsgv9WzNy6WkPxveByGooJD9Uh11ljPMRuxwo7oijM,120720
|
|
26
|
+
amsdal/mixins/class_versions_mixin.cpython-312-darwin.so,sha256=Ws-InNuB4N2IQT0nTgcijjEE_BBNQ2Y6PJUoKPFZHgI,180480
|
|
22
27
|
amsdal/mixins/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
28
|
amsdal/utils/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
29
|
amsdal/utils/contrib_paths.py,sha256=9BpNegbPofuvaQ4bE4E5cO4IV415ZZJkTqSLHUruJ3k,787
|
|
@@ -43,7 +48,7 @@ amsdal/models/core/storage_metadata.py,sha256=q-IOcsIpZHf_bt7v2NTtXAfV2i8fip3F_w
|
|
|
43
48
|
amsdal/models/core/file.py,sha256=IZIS3H_RHYYlwlgOpTROspMNHcpthofMbyzd3bD8lcY,7685
|
|
44
49
|
amsdal/models/core/class_property.py,sha256=HFIMb0DE8bhmRf_l45VeJJD_tE85eUZ---IPSBdld7I,1098
|
|
45
50
|
amsdal/models/core/class_object.py,sha256=Y5sdatrNZK1jkMImyeRFTxeUonuzJaDCKZzULZvJIHw,1487
|
|
46
|
-
amsdal/contrib/__init__.cpython-312-darwin.so,sha256=
|
|
51
|
+
amsdal/contrib/__init__.cpython-312-darwin.so,sha256=GLFhF2Bwsc-WVXfDcM3lrN2JWTKQVK1BFRU-EFVg3uM,120736
|
|
47
52
|
amsdal/contrib/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
53
|
amsdal/contrib/app_config.pyi,sha256=j3MYfBcn9MzhTagEczGWfVH9N5jrfiKmUhxZMoakojw,149
|
|
49
54
|
amsdal/contrib/app_config.py,sha256=RT3RAEE49XtzuFTXYNVuaqU9V4YIl0ZWZijtXgV-SC4,131
|
|
@@ -105,7 +110,7 @@ amsdal/schemas/interfaces.pyi,sha256=jUXLEKIa_af9Qrv9a4UvfRmsUV78N921i4dDXKHPaQk
|
|
|
105
110
|
amsdal/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
106
111
|
amsdal/schemas/utils.pyi,sha256=UbeISOxetojP6HlzhiJWeaAVyYZUrnGAS5niTQ0m6n0,437
|
|
107
112
|
amsdal/schemas/utils.py,sha256=t8k7QYYR6SsCPpBhp7s585eSYKVIF895EKRMK1w1y1Q,492
|
|
108
|
-
amsdal/schemas/manager.cpython-312-darwin.so,sha256=
|
|
113
|
+
amsdal/schemas/manager.cpython-312-darwin.so,sha256=rf4f-oN4lVtpx8ENT3JZYa2eJio0qeZEIoNBUlujXI0,120736
|
|
109
114
|
amsdal/schemas/repository.py,sha256=PbskgDr8JMabQm2uf8Kfj5bBSPlPkx4cDGXn-jfIsPM,3249
|
|
110
115
|
amsdal/schemas/manager.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
111
116
|
amsdal/schemas/types/array/model.json,sha256=I9Z7r691yd8i-Ndy8Cf3rFGg22mnLxg_weeVU2kRtkY,117
|
|
@@ -154,98 +159,93 @@ amsdal/configs/constants.py,sha256=faghdS6r3on1WKrp782WmgONd1fMf4X73LJzAwMO1po,9
|
|
|
154
159
|
amsdal/configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
155
160
|
amsdal/configs/main.pyi,sha256=LQLyErlnW8m6MWW8lk0sA9jJqRdPyBuxRRMAeWtk-Us,7000
|
|
156
161
|
amsdal/configs/main.py,sha256=sk01zezWynALKsVsB0zyCkNPZ9Cv1iSQ39nJ5lusfQ0,10143
|
|
157
|
-
amsdal/cloud/__init__.cpython-312-darwin.so,sha256=
|
|
162
|
+
amsdal/cloud/__init__.cpython-312-darwin.so,sha256=L_yiyQXGdXkv4c4NNGRvFw1APpZFqn6W-Qc0uNunDts,120720
|
|
158
163
|
amsdal/cloud/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
159
164
|
amsdal/cloud/constants.pyi,sha256=0qWxDqjQkETwUtgco5kV83fPHhQ4jRdJe_YPPNTnSIY,327
|
|
160
165
|
amsdal/cloud/client.pyi,sha256=3VjPRtJrbUU29u_wswETrMorN0iUb4GFAXmMc73bUf4,2247
|
|
161
|
-
amsdal/cloud/constants.cpython-312-darwin.so,sha256=
|
|
162
|
-
amsdal/cloud/enums.cpython-312-darwin.so,sha256=
|
|
163
|
-
amsdal/cloud/client.cpython-312-darwin.so,sha256=
|
|
166
|
+
amsdal/cloud/constants.cpython-312-darwin.so,sha256=ER8i-Ia7QlHpVC8gNhs7YqcIl8etDH9q5ZT5QnzN6XU,158688
|
|
167
|
+
amsdal/cloud/enums.cpython-312-darwin.so,sha256=zfIIG12OvWrF7KVM-VDAu0J7DcWKwUZjgv3gZb3aSU4,158128
|
|
168
|
+
amsdal/cloud/client.cpython-312-darwin.so,sha256=s9LjCqv3n7BJPh_K3mcvVXbeaEXkvIEMtV_8CLkM5K4,216144
|
|
164
169
|
amsdal/cloud/enums.pyi,sha256=mX5O1FPc3aNnN108aOJT66Nn9KlcyrRTj9B23sFdDfw,1757
|
|
165
|
-
amsdal/cloud/models/__init__.cpython-312-darwin.so,sha256=
|
|
170
|
+
amsdal/cloud/models/__init__.cpython-312-darwin.so,sha256=uH2OPwDGagPlz1yeByMjir3_hRS5YGNa81lCWZTSUnI,120752
|
|
166
171
|
amsdal/cloud/models/base.pyi,sha256=avwAj4uS4NHrXvmSKBxokFKFWSaBPXtJPl1Ig1CD6sg,7727
|
|
167
172
|
amsdal/cloud/models/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
168
|
-
amsdal/cloud/models/base.cpython-312-darwin.so,sha256=
|
|
169
|
-
amsdal/cloud/services/__init__.cpython-312-darwin.so,sha256=
|
|
173
|
+
amsdal/cloud/models/base.cpython-312-darwin.so,sha256=_NQf8KxRXnJHEQ4RrrS3DwRjKF-nBbNEmJd1uMqyXnU,195328
|
|
174
|
+
amsdal/cloud/services/__init__.cpython-312-darwin.so,sha256=5xFbhRlvKikF3hspW6V4JraWGxkH8pQyTDO-YfWF8YU,120768
|
|
170
175
|
amsdal/cloud/services/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
171
|
-
amsdal/cloud/services/auth/__init__.cpython-312-darwin.so,sha256=
|
|
176
|
+
amsdal/cloud/services/auth/__init__.cpython-312-darwin.so,sha256=xvkmn634yL7QEvAWHhi39-qu4hATzuLZojHuo6hxDYY,120784
|
|
172
177
|
amsdal/cloud/services/auth/base.pyi,sha256=oj_tgwWhf02g-FzCLcNOEZjYDxfcrrDssING4jsUMb8,167
|
|
173
178
|
amsdal/cloud/services/auth/manager.pyi,sha256=AhKllHgraztP3JSKta9MmQjTNRAbQbwqZg2EpQZSwhI,1243
|
|
174
179
|
amsdal/cloud/services/auth/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
175
|
-
amsdal/cloud/services/auth/credentials.cpython-312-darwin.so,sha256=
|
|
180
|
+
amsdal/cloud/services/auth/credentials.cpython-312-darwin.so,sha256=kwXZKAdcRTmoFnHg-NjvQP3meo53U0_LrO4JZGyQU8U,287944
|
|
176
181
|
amsdal/cloud/services/auth/signup_service.pyi,sha256=SfSN1tLIwrzGi9JbMgoLuKKH1u5uoh_MOFJ4n_NHcBY,1145
|
|
177
|
-
amsdal/cloud/services/auth/signup_service.cpython-312-darwin.so,sha256=
|
|
182
|
+
amsdal/cloud/services/auth/signup_service.cpython-312-darwin.so,sha256=w5xpSaEIG5gWaDGqka6ir8Y3gttlk1Fexy_y78IxL8U,216232
|
|
178
183
|
amsdal/cloud/services/auth/token.pyi,sha256=v9QDleIytAZGlYHHaO-W1fTr5d2OLGWsh5g6HDeuk90,1042
|
|
179
|
-
amsdal/cloud/services/auth/token.cpython-312-darwin.so,sha256=
|
|
180
|
-
amsdal/cloud/services/auth/manager.cpython-312-darwin.so,sha256=
|
|
181
|
-
amsdal/cloud/services/auth/base.cpython-312-darwin.so,sha256=
|
|
184
|
+
amsdal/cloud/services/auth/token.cpython-312-darwin.so,sha256=bF655mimjbcgv4e3WAZCSx4DxSAoRWapqeOJfYCIryQ,251648
|
|
185
|
+
amsdal/cloud/services/auth/manager.cpython-312-darwin.so,sha256=M7DVBfjFiTw3Y3PROoUsWe7AGS61lT4hZATaeTkMUy0,214144
|
|
186
|
+
amsdal/cloud/services/auth/base.cpython-312-darwin.so,sha256=QYdCGTIRzEmIXxAWGQwTIja5vNTQ204PHi0i9gKX18w,163120
|
|
182
187
|
amsdal/cloud/services/auth/credentials.pyi,sha256=ghp3r8rDq5l5xxx7UKFkCASyQJbWChkF2PQDJrQmeW4,1417
|
|
183
|
-
amsdal/cloud/services/actions/delete_env.cpython-312-darwin.so,sha256=
|
|
184
|
-
amsdal/cloud/services/actions/__init__.cpython-312-darwin.so,sha256=
|
|
188
|
+
amsdal/cloud/services/actions/delete_env.cpython-312-darwin.so,sha256=hJ4OlI2B4MQ-yBozbmmX0T_Cka3Jn_nAaNcK1DkpubA,180840
|
|
189
|
+
amsdal/cloud/services/actions/__init__.cpython-312-darwin.so,sha256=FMoXL2IFPgg7U8r0G465oUOt5avP6ZnfmbEBWpWyYSA,120800
|
|
185
190
|
amsdal/cloud/services/actions/list_envs.pyi,sha256=7PylFRd1Jb6nkTt8q8iy27rLj-Q5qcwfqW02_OlfDZs,878
|
|
186
191
|
amsdal/cloud/services/actions/base.pyi,sha256=J98igdu3E9-mled_kbxerja4DTLM0OAW8cHtsVOQ_fc,5880
|
|
187
192
|
amsdal/cloud/services/actions/manager.pyi,sha256=Tal5u1nMhi7MeuJ9lBIPYPLgKoIB6DUXPU2AokrusHI,15441
|
|
188
193
|
amsdal/cloud/services/actions/delete_allowlist_ip.pyi,sha256=W5zVq7YKL_OVigZl58bqau3rvAzsLdItAZaqDO1HGJw,933
|
|
189
194
|
amsdal/cloud/services/actions/add_basic_auth.pyi,sha256=4tyTci_k_xlJrkBd71sY0ivRr8alo3Bq0KCkjIfacu4,1106
|
|
190
195
|
amsdal/cloud/services/actions/list_secrets.pyi,sha256=vF-EikAy7WHdkvkGikD_oDFDIgE1GEr8nxAQKYAs9rY,1079
|
|
191
|
-
amsdal/cloud/services/actions/delete_secret.cpython-312-darwin.so,sha256=
|
|
196
|
+
amsdal/cloud/services/actions/delete_secret.cpython-312-darwin.so,sha256=QQIVNnypKxvKlLpckXLuDwwgTLSWkq97FST8MkBdsBo,164312
|
|
192
197
|
amsdal/cloud/services/actions/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
193
198
|
amsdal/cloud/services/actions/get_basic_auth_credentials.pyi,sha256=1FU8BtDRaGTx8fSqdhmotQK-rR7gKr4Qav_E-T_23rc,1071
|
|
194
|
-
amsdal/cloud/services/actions/add_basic_auth.cpython-312-darwin.so,sha256=
|
|
199
|
+
amsdal/cloud/services/actions/add_basic_auth.cpython-312-darwin.so,sha256=Uug3Fn1YGYifWRo3XNqOSlqvj68Z0j2HmHuuQJz8uNI,197512
|
|
195
200
|
amsdal/cloud/services/actions/delete_secret.pyi,sha256=gZi17MivNYBIfdPU2GjoJ2I2lWiefdvLuXTcxDss1P4,953
|
|
196
201
|
amsdal/cloud/services/actions/delete_env.pyi,sha256=uyBHMOp_AprbpSfv6y6QfYW5FvK1-8jb2NxK_FmuPHE,969
|
|
197
|
-
amsdal/cloud/services/actions/delete_allowlist_ip.cpython-312-darwin.so,sha256
|
|
198
|
-
amsdal/cloud/services/actions/add_dependency.cpython-312-darwin.so,sha256=
|
|
199
|
-
amsdal/cloud/services/actions/create_env.cpython-312-darwin.so,sha256=
|
|
200
|
-
amsdal/cloud/services/actions/update_deploy.cpython-312-darwin.so,sha256=
|
|
201
|
-
amsdal/cloud/services/actions/get_monitoring_info.cpython-312-darwin.so,sha256=
|
|
202
|
+
amsdal/cloud/services/actions/delete_allowlist_ip.cpython-312-darwin.so,sha256=triWJOtuDl83V6ag0fA4WaBkon4lSL93ep1bEog4X0g,180848
|
|
203
|
+
amsdal/cloud/services/actions/add_dependency.cpython-312-darwin.so,sha256=4Jp7rtMKtgdhAIqJQdbI0Cs3oFyTaxtgr9zfgcudGoI,164328
|
|
204
|
+
amsdal/cloud/services/actions/create_env.cpython-312-darwin.so,sha256=dUD2ZtLxgLVtuXd_l9IjcVySrjtL6619LN0u3T6kg3c,180840
|
|
205
|
+
amsdal/cloud/services/actions/update_deploy.cpython-312-darwin.so,sha256=FCoM3M6tQfcMfKp0wjRiDcR6OzEL6E7BVrCGHCZRlQI,181080
|
|
206
|
+
amsdal/cloud/services/actions/get_monitoring_info.cpython-312-darwin.so,sha256=CKAvFfK3dH2sd1VV3zkHuCiIOF7zuZ_6EogYcWrl0q0,197376
|
|
202
207
|
amsdal/cloud/services/actions/delete_dependency.pyi,sha256=VuT1w2qOpjR7I9mBi9tPXMXDPEeU8tG0vi9TXV82Frg,1021
|
|
203
|
-
amsdal/cloud/services/actions/destroy_deploy.cpython-312-darwin.so,sha256=
|
|
204
|
-
amsdal/cloud/services/actions/list_dependencies.cpython-312-darwin.so,sha256=
|
|
205
|
-
amsdal/cloud/services/actions/list_envs.cpython-312-darwin.so,sha256=
|
|
206
|
-
amsdal/cloud/services/actions/list_deploys.cpython-312-darwin.so,sha256=
|
|
208
|
+
amsdal/cloud/services/actions/destroy_deploy.cpython-312-darwin.so,sha256=VsxxnVFgGKr5UQG3W10hiUWCzkDSKfwKQkj2i9j1X9k,164168
|
|
209
|
+
amsdal/cloud/services/actions/list_dependencies.cpython-312-darwin.so,sha256=H3VBivKz90V1abYCw_E5KcTAQ3pFMTXs9KYQZ2KZsbE,197704
|
|
210
|
+
amsdal/cloud/services/actions/list_envs.cpython-312-darwin.so,sha256=NsZ_XPiNNzXb4zpTPcIXcLh5VCPQiNNQ8ge6bDokuGA,164384
|
|
211
|
+
amsdal/cloud/services/actions/list_deploys.cpython-312-darwin.so,sha256=paZJ9czvSdkCMoJZaH0pLB2WQfdWKvTigb7oo2tUCZs,181096
|
|
207
212
|
amsdal/cloud/services/actions/create_session.pyi,sha256=KUvx_vkhLQfGp_DM1ZvgszyT_G8LB28KoI1XpjNR7YY,674
|
|
208
213
|
amsdal/cloud/services/actions/list_deploys.pyi,sha256=Q8da3PDPxICLP2V7L-A7p-9_a3qNKrARqgHhu0CA0nA,724
|
|
209
|
-
amsdal/cloud/services/actions/create_deploy.cpython-312-darwin.so,sha256=
|
|
210
|
-
amsdal/cloud/services/actions/create_session.cpython-312-darwin.so,sha256=
|
|
214
|
+
amsdal/cloud/services/actions/create_deploy.cpython-312-darwin.so,sha256=rtotI2Yv5dnUoRROWPYEQNWOhdBEAbTNTZMhPl2Q0jw,269176
|
|
215
|
+
amsdal/cloud/services/actions/create_session.cpython-312-darwin.so,sha256=jciAO_0IwT4sCfF0155X3w6MzVcCryhehKGfZbSurXw,181000
|
|
211
216
|
amsdal/cloud/services/actions/add_allowlist_ip.pyi,sha256=gB2NQVz8NcSsgXYiym2Suh1RPI8eHKIAFE13RmeTHkA,883
|
|
212
217
|
amsdal/cloud/services/actions/get_monitoring_info.pyi,sha256=uvtBgWvtWf-Mq4vZq_q-q8Z8hJh5voAY61KRJQPGWFk,1045
|
|
213
218
|
amsdal/cloud/services/actions/add_dependency.pyi,sha256=uVEIhvDa4GRS0Lg6TkcYdOwezKcxrzL7A_Lh8BxcAeU,837
|
|
214
|
-
amsdal/cloud/services/actions/manager.cpython-312-darwin.so,sha256=
|
|
219
|
+
amsdal/cloud/services/actions/manager.cpython-312-darwin.so,sha256=TVLSB12mVUU4tso9hyNf5owICcJWoccu4mlqEthsT18,354848
|
|
215
220
|
amsdal/cloud/services/actions/signup_action.pyi,sha256=VswHjhxw2eHYqXwc---F2LpwlD7GlIuL_Ev2DmA96_4,808
|
|
216
221
|
amsdal/cloud/services/actions/add_secret.pyi,sha256=H6rS3PRwiktMfnoY8qwtmTplN9gG2yZgQKKCX8S8Q6c,890
|
|
217
|
-
amsdal/cloud/services/actions/base.cpython-312-darwin.so,sha256=
|
|
218
|
-
amsdal/cloud/services/actions/get_basic_auth_credentials.cpython-312-darwin.so,sha256=
|
|
222
|
+
amsdal/cloud/services/actions/base.cpython-312-darwin.so,sha256=TBqk_G5VMYwgATs1kc2m5VKsvbnjuTh9MnwZJ1T26pU,307200
|
|
223
|
+
amsdal/cloud/services/actions/get_basic_auth_credentials.cpython-312-darwin.so,sha256=FRrhefU2q3ufy9r5PmtToTxKT-s3cbIgRK2la9XkBeY,197512
|
|
219
224
|
amsdal/cloud/services/actions/destroy_deploy.pyi,sha256=VNb0J71B3gk4SVJwxlB9XTj4vCG-37ucojcGzsvKwe8,609
|
|
220
225
|
amsdal/cloud/services/actions/update_deploy.pyi,sha256=alM1nquQZ5O8PYlDIqDdSuiyuc_aj9fkd01bL9KANEI,766
|
|
221
|
-
amsdal/cloud/services/actions/add_secret.cpython-312-darwin.so,sha256=
|
|
222
|
-
amsdal/cloud/services/actions/expose_db.cpython-312-darwin.so,sha256=
|
|
223
|
-
amsdal/cloud/services/actions/delete_dependency.cpython-312-darwin.so,sha256=
|
|
224
|
-
amsdal/cloud/services/actions/add_allowlist_ip.cpython-312-darwin.so,sha256=
|
|
225
|
-
amsdal/cloud/services/actions/signup_action.cpython-312-darwin.so,sha256=
|
|
226
|
-
amsdal/cloud/services/actions/delete_basic_auth.cpython-312-darwin.so,sha256=
|
|
227
|
-
amsdal/cloud/services/actions/list_secrets.cpython-312-darwin.so,sha256=
|
|
226
|
+
amsdal/cloud/services/actions/add_secret.cpython-312-darwin.so,sha256=EVB5NOxwpJCPI0Eq2i802ZhWoiQkPTcs_RUqZEt15rI,164264
|
|
227
|
+
amsdal/cloud/services/actions/expose_db.cpython-312-darwin.so,sha256=ys28lk1cK9h61LJXIyKnkw9_iqXxUfH1NbQQosLR4oc,197568
|
|
228
|
+
amsdal/cloud/services/actions/delete_dependency.cpython-312-darwin.so,sha256=7CaLZaPOpI9g4aUJsG-IS4RQF20H81emCCUq2N-t5k4,164376
|
|
229
|
+
amsdal/cloud/services/actions/add_allowlist_ip.cpython-312-darwin.so,sha256=bbXsNvVPw48QGi_95NFhc_qFxA0QRPxoIl46pMa5HTo,180792
|
|
230
|
+
amsdal/cloud/services/actions/signup_action.cpython-312-darwin.so,sha256=RYhfksgk2NkFp8xO06GHguYXOdLPsygW21PnE4pCgwY,164216
|
|
231
|
+
amsdal/cloud/services/actions/delete_basic_auth.cpython-312-darwin.so,sha256=uh_gsmmUoxJfLBHKS9sTVi1gAYmhWoHba_K6CZxzNd0,164376
|
|
232
|
+
amsdal/cloud/services/actions/list_secrets.cpython-312-darwin.so,sha256=VqdiGG_XoEF3bBDTfi5NlnTQyJ-1icUJi_jSgB76W4o,197688
|
|
228
233
|
amsdal/cloud/services/actions/create_deploy.pyi,sha256=VmVMYJQmjPZce6Cm8sMQ27HomhfdzZc_0X57ZWZmCt0,1988
|
|
229
234
|
amsdal/cloud/services/actions/delete_basic_auth.pyi,sha256=-I1YoOMFi0LaRsZL2JBGH_sg18PZoUL1PP9YetboDJA,915
|
|
230
235
|
amsdal/cloud/services/actions/list_dependencies.pyi,sha256=C37VamSyRT-uNLuwQJ0OrHKavs8Jt0bfPbAsE5BQEvE,1035
|
|
231
236
|
amsdal/cloud/services/actions/create_env.pyi,sha256=ITvyLrvwt6H36JNYURHZ_PbmGZquc5Fm07dVo7H6ll0,910
|
|
232
237
|
amsdal/cloud/services/actions/expose_db.pyi,sha256=uk2zuz1SiXwjDFxtKF-yyWGNEONOgfm7EcrEyVT0cMM,1049
|
|
233
|
-
amsdal/fixtures/__init__.cpython-312-darwin.so,sha256=
|
|
238
|
+
amsdal/fixtures/__init__.cpython-312-darwin.so,sha256=t3f6g7seQXmx_e6trsxa_Eotx44DO0RzMA1QVxhTdy0,120736
|
|
234
239
|
amsdal/fixtures/manager.pyi,sha256=fMl3nNa2A9jiZanZ_7tnUGaPigk_03KMmdcUGPoX9kI,7077
|
|
235
240
|
amsdal/fixtures/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
236
|
-
amsdal/fixtures/utils.cpython-312-darwin.so,sha256=
|
|
241
|
+
amsdal/fixtures/utils.cpython-312-darwin.so,sha256=_H-9QhmrE4Ol2ACfYnMLSoaZqRBG_sb8GzfYnxuATzw,290128
|
|
237
242
|
amsdal/fixtures/utils.pyi,sha256=OnFn7opJscOydj-rlcXQIdDodlIKGCt79TRy5zAUkqg,457
|
|
238
|
-
amsdal/fixtures/manager.cpython-312-darwin.so,sha256=
|
|
239
|
-
amsdal/services/external_connections.cpython-312-darwin.so,sha256=Z3_Yz2awQd9zCM2_WsTTTGnRIcaXorpRBeO2ztWCEvQ,287616
|
|
240
|
-
amsdal/services/__init__.cpython-312-darwin.so,sha256=7oHbWkGD3QZL69ebaybAEGygHnE3KGUpm7D8D-2dChY,121808
|
|
243
|
+
amsdal/fixtures/manager.cpython-312-darwin.so,sha256=LCn0cDvKzMjH_FeJCBJDyKzLIoxReMn68IopOyAcCL4,638960
|
|
241
244
|
amsdal/services/external_connections.pyi,sha256=NEKcmoXIQViFZF9Sr0XRgvw2sC73jD7dg55dgCAhaJ0,5973
|
|
242
245
|
amsdal/services/transaction_execution.pyi,sha256=TwCuurOoqSHgNu9GCYYZPSpGjxXssF2eNygQ5KVwAZM,4374
|
|
243
|
-
amsdal/services/transaction_execution.cpython-312-darwin.so,sha256=
|
|
246
|
+
amsdal/services/transaction_execution.cpython-312-darwin.so,sha256=xbKUGyT0cLNuJ2TSTAtYlPmFm1ilNpTv9pPDnMyG1C8,435648
|
|
244
247
|
amsdal/services/__init__.pyi,sha256=amezsprEb708wi5fhZOKYV9nrM-374iE-XFIqTNRif4,349
|
|
245
248
|
amsdal/services/external_model_generator.pyi,sha256=h_fQF0MPOdK8kdRh53srzJ_apzMo4RxIgwJxkFcRToA,5130
|
|
246
|
-
amsdal/services/
|
|
247
|
-
amsdal
|
|
248
|
-
amsdal
|
|
249
|
-
amsdal-0.5.19.dist-info/top_level.txt,sha256=VPQLnOP3mf7q0JuQ_vPZYQyPNGKd_uc6ouz-hZRkhSk,7
|
|
250
|
-
amsdal-0.5.19.dist-info/METADATA,sha256=FCdicnOt0QbjZFMhduC4M_OvWPdDTL3iLDl3zNVmEtE,57623
|
|
251
|
-
amsdal-0.5.19.dist-info/licenses/LICENSE.txt,sha256=hG-541PFYfNJi9WRZi_hno91UyqNg7YLK8LR3vLblZA,27355
|
|
249
|
+
amsdal/services/__init__.py,sha256=lz0twKy9IuWbm6kQZM67A-ahb0avlAwEKq7Zz4DAkCs,358
|
|
250
|
+
amsdal/services/external_model_generator.py,sha256=ihSfgGiM7FBFkVcxcN8JACOM-x9YVRBsX86gl7FSjNg,12835
|
|
251
|
+
amsdal/services/external_connections.py,sha256=m0bHCcoHnZUw15L4rbyf8ckpscETOU4qcgXnqFAZ81I,8368
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|