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.

Files changed (59) hide show
  1. amsdal/__about__.py +1 -1
  2. amsdal/cloud/__init__.cpython-312-darwin.so +0 -0
  3. amsdal/cloud/client.cpython-312-darwin.so +0 -0
  4. amsdal/cloud/constants.cpython-312-darwin.so +0 -0
  5. amsdal/cloud/enums.cpython-312-darwin.so +0 -0
  6. amsdal/cloud/models/__init__.cpython-312-darwin.so +0 -0
  7. amsdal/cloud/models/base.cpython-312-darwin.so +0 -0
  8. amsdal/cloud/services/__init__.cpython-312-darwin.so +0 -0
  9. amsdal/cloud/services/actions/__init__.cpython-312-darwin.so +0 -0
  10. amsdal/cloud/services/actions/add_allowlist_ip.cpython-312-darwin.so +0 -0
  11. amsdal/cloud/services/actions/add_basic_auth.cpython-312-darwin.so +0 -0
  12. amsdal/cloud/services/actions/add_dependency.cpython-312-darwin.so +0 -0
  13. amsdal/cloud/services/actions/add_secret.cpython-312-darwin.so +0 -0
  14. amsdal/cloud/services/actions/base.cpython-312-darwin.so +0 -0
  15. amsdal/cloud/services/actions/create_deploy.cpython-312-darwin.so +0 -0
  16. amsdal/cloud/services/actions/create_env.cpython-312-darwin.so +0 -0
  17. amsdal/cloud/services/actions/create_session.cpython-312-darwin.so +0 -0
  18. amsdal/cloud/services/actions/delete_allowlist_ip.cpython-312-darwin.so +0 -0
  19. amsdal/cloud/services/actions/delete_basic_auth.cpython-312-darwin.so +0 -0
  20. amsdal/cloud/services/actions/delete_dependency.cpython-312-darwin.so +0 -0
  21. amsdal/cloud/services/actions/delete_env.cpython-312-darwin.so +0 -0
  22. amsdal/cloud/services/actions/delete_secret.cpython-312-darwin.so +0 -0
  23. amsdal/cloud/services/actions/destroy_deploy.cpython-312-darwin.so +0 -0
  24. amsdal/cloud/services/actions/expose_db.cpython-312-darwin.so +0 -0
  25. amsdal/cloud/services/actions/get_basic_auth_credentials.cpython-312-darwin.so +0 -0
  26. amsdal/cloud/services/actions/get_monitoring_info.cpython-312-darwin.so +0 -0
  27. amsdal/cloud/services/actions/list_dependencies.cpython-312-darwin.so +0 -0
  28. amsdal/cloud/services/actions/list_deploys.cpython-312-darwin.so +0 -0
  29. amsdal/cloud/services/actions/list_envs.cpython-312-darwin.so +0 -0
  30. amsdal/cloud/services/actions/list_secrets.cpython-312-darwin.so +0 -0
  31. amsdal/cloud/services/actions/manager.cpython-312-darwin.so +0 -0
  32. amsdal/cloud/services/actions/signup_action.cpython-312-darwin.so +0 -0
  33. amsdal/cloud/services/actions/update_deploy.cpython-312-darwin.so +0 -0
  34. amsdal/cloud/services/auth/__init__.cpython-312-darwin.so +0 -0
  35. amsdal/cloud/services/auth/base.cpython-312-darwin.so +0 -0
  36. amsdal/cloud/services/auth/credentials.cpython-312-darwin.so +0 -0
  37. amsdal/cloud/services/auth/manager.cpython-312-darwin.so +0 -0
  38. amsdal/cloud/services/auth/signup_service.cpython-312-darwin.so +0 -0
  39. amsdal/cloud/services/auth/token.cpython-312-darwin.so +0 -0
  40. amsdal/contrib/__init__.cpython-312-darwin.so +0 -0
  41. amsdal/fixtures/__init__.cpython-312-darwin.so +0 -0
  42. amsdal/fixtures/manager.cpython-312-darwin.so +0 -0
  43. amsdal/fixtures/utils.cpython-312-darwin.so +0 -0
  44. amsdal/manager.cpython-312-darwin.so +0 -0
  45. amsdal/mixins/__init__.cpython-312-darwin.so +0 -0
  46. amsdal/mixins/class_versions_mixin.cpython-312-darwin.so +0 -0
  47. amsdal/schemas/manager.cpython-312-darwin.so +0 -0
  48. amsdal/services/__init__.py +11 -0
  49. amsdal/services/external_connections.py +262 -0
  50. amsdal/services/external_model_generator.py +350 -0
  51. amsdal/services/transaction_execution.cpython-312-darwin.so +0 -0
  52. {amsdal-0.5.19.dist-info → amsdal-0.5.20.dist-info}/METADATA +1 -1
  53. {amsdal-0.5.19.dist-info → amsdal-0.5.20.dist-info}/RECORD +56 -56
  54. amsdal/services/__init__.cpython-312-darwin.so +0 -0
  55. amsdal/services/external_connections.cpython-312-darwin.so +0 -0
  56. amsdal/services/external_model_generator.cpython-312-darwin.so +0 -0
  57. {amsdal-0.5.19.dist-info → amsdal-0.5.20.dist-info}/WHEEL +0 -0
  58. {amsdal-0.5.19.dist-info → amsdal-0.5.20.dist-info}/licenses/LICENSE.txt +0 -0
  59. {amsdal-0.5.19.dist-info → amsdal-0.5.20.dist-info}/top_level.txt +0 -0
amsdal/__about__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2023-present
2
2
  #
3
3
  # SPDX-License-Identifier: AMSDAL End User License Agreement
4
- __version__ = '0.5.19'
4
+ __version__ = '0.5.20'
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: amsdal
3
- Version: 0.5.19
3
+ Version: 0.5.20
4
4
  Summary: AMSDAL
5
5
  License: AMSDAL End User License Agreement
6
6
 
@@ -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=RdFno7a2EZU6RqeOVmL2KuX-H0XeTHEizPt4zqx0zr4,125
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=gwNAtTO9aKR1xrV87dipF1_qt78TT1kQYC83BCSL5lw,501968
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=tcF3aIVslfE9GKGykpXT8LOGfvjhbnc9pZBLCNAxL8Y,120720
21
- amsdal/mixins/class_versions_mixin.cpython-312-darwin.so,sha256=1Sv0bLaSwMmI2AlGsuqUdDTv57gf9dbf6_u6BLijRWk,180480
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=Jpr7b50ZBQuVEW2B868OOI4kdqunRibJPq4phEyBKD4,120736
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=kkbrzrw4pMrgt3yG7_ZVcondWE7iy-haZqUC7_Lc-WM,120736
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=yR50LTdMeKA-jkynmTdFFlYXtos-2IC6YVJeAqAFxRM,120720
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=AoUm7OQahwi1g24okaiPVbCetjfUHRFRkcEMk4UFk4I,158688
162
- amsdal/cloud/enums.cpython-312-darwin.so,sha256=aJ5feLncZRnzy5O7PBVSoA8_CoyXk9YWfaisDnB0G0k,158128
163
- amsdal/cloud/client.cpython-312-darwin.so,sha256=BWvNyRc6VlDLxZ6Af0ZX41Ub1S4yIyKBWcx4t9UdA7o,216144
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=dskaC-93nos19owWfTjWdAc6WWHYlawibEAXC1k97OA,120752
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=la-zDdspjZMWQ-Ig0cjrfx6iRfWAB9x8DB8yxckOTiI,195328
169
- amsdal/cloud/services/__init__.cpython-312-darwin.so,sha256=C0kQxfZIx-1WquC5A2r-1leiyfnGjyCNqmSceWFeLKc,120768
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=1_m_4AiSbmzderQaP3s6s_NvCy23fycox_WLSQyE8yk,120784
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=t31DF3YSJpJ6BjsECzOJK9PbNa-6SGzb-E-SKDWTo6s,287944
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=9C46sEjhLb2kZTYmQd_FsM0GiPieQcckld5pDCJxCZM,216232
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=NT9jRputSdimR8aBEKtG8ajj_da-o1pCiDd5nhdHHwE,251648
180
- amsdal/cloud/services/auth/manager.cpython-312-darwin.so,sha256=xb2ARVCyIndGuyx640moGtWevxz4fWQDWfkPFPoDuRE,214144
181
- amsdal/cloud/services/auth/base.cpython-312-darwin.so,sha256=QKn2aHEHux_WUdTkdd65_XurhBG7PSA_H2XCw8u8Ut4,163120
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=EGo2BEKAXLB8lLGRQpPWkctgRdTd7VfjMhjwYqKcirs,180840
184
- amsdal/cloud/services/actions/__init__.cpython-312-darwin.so,sha256=1dd1TMcbEMq0BDRWN1MIixS8Qwjmn5O6xsusID2wrTU,120800
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=LW9ZkIvtxeVCUX_SX1MZmoqBCaFmWN_-ezPL-ULSfXE,164312
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=IhFBexclX9G05d8JGWYN9Ib3S84MSFw0bOJEqomNvnY,197512
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=-NewQ4OrDshIL97Q5Vsci6nbXXihCWFY5gT8_1rEpWM,180848
198
- amsdal/cloud/services/actions/add_dependency.cpython-312-darwin.so,sha256=jcMC49ZCXV77e7Cmr12WE3Kb5lwTX52rBa5LHHxU44k,164328
199
- amsdal/cloud/services/actions/create_env.cpython-312-darwin.so,sha256=ASMUDcHQGysgJXW7MIYnOB9pvVymWRINtruzb-Aa3jU,180840
200
- amsdal/cloud/services/actions/update_deploy.cpython-312-darwin.so,sha256=FKyHrHIfZzZwzzD1GjwNBGS37NtsGcUeeQNkU0_ddqE,181080
201
- amsdal/cloud/services/actions/get_monitoring_info.cpython-312-darwin.so,sha256=agitZ7jqBmNtiZ1hWToeUAFXPFCHOEj80D1s5aF0XYk,197376
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=nNAotOGL7ibBYSazP3gbp1_6IKvg1R9YFGg9kWqh2LM,164168
204
- amsdal/cloud/services/actions/list_dependencies.cpython-312-darwin.so,sha256=qZ7kz-vg5bHA3XZViXP_Tyx9JMkkCUa64qt1FzcZfL4,197704
205
- amsdal/cloud/services/actions/list_envs.cpython-312-darwin.so,sha256=coeD0FSM3UTdzybpLt1BzModZSTxRk6l-Dz2w-C0hR8,164384
206
- amsdal/cloud/services/actions/list_deploys.cpython-312-darwin.so,sha256=poqX2Sw7gUGM8th0W0nI7uY1skrKFCY4hAe0Ut4_qAM,181096
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=BfeeGyy3uXZ5-Hb2zXhHxAl3ZdzLlFzG3Fx69314s5c,269176
210
- amsdal/cloud/services/actions/create_session.cpython-312-darwin.so,sha256=GuCuC9sHKqKZ9V8HWK6qMr71mcv_vL3cQsMHxkWLLYM,181000
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=uKTLG-rRloRkaZeTGi_jrgur2HqhasB2lIkRp1t2jiU,354848
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=a62KMbLg5pvmn1OYCK5QNWImr4kA9EybXisUFWQnTcg,307200
218
- amsdal/cloud/services/actions/get_basic_auth_credentials.cpython-312-darwin.so,sha256=13BYL9Id7ivN-qCvNSuRmr0FRL2-_KQqeeOf2244X1U,197512
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=1velrrbuecFXfwc3AVihsy-rnbAACkT0UKIkVPnFhhI,164264
222
- amsdal/cloud/services/actions/expose_db.cpython-312-darwin.so,sha256=_IGRLlDH9oYEHogzhCGqbi8a_XuUh-UcdumUT6-YI0g,197568
223
- amsdal/cloud/services/actions/delete_dependency.cpython-312-darwin.so,sha256=eQWH23ROEkYADfnm7ROjLbLv0k84bqixYRM21gIE67o,164376
224
- amsdal/cloud/services/actions/add_allowlist_ip.cpython-312-darwin.so,sha256=n4lpXjuJzw9HAeHXq_iTx9L8NV6_AGRYVBTTW0J6yB0,180792
225
- amsdal/cloud/services/actions/signup_action.cpython-312-darwin.so,sha256=hPxUOUEnx7G36296f3o0zqH3ZURhrB1T9pudNua4das,164216
226
- amsdal/cloud/services/actions/delete_basic_auth.cpython-312-darwin.so,sha256=gbHMxEioOanD2CGIxfKHrRwZG-ktUA18NKGh34ekUI8,164376
227
- amsdal/cloud/services/actions/list_secrets.cpython-312-darwin.so,sha256=mMxkGfZc-U-FohtRM87GSk3Vw70n3bYMEPMxOqzAVgA,197688
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=W7GYTb7cm43-Cakb8HOLPJKKc4haZCMMyY9kzmWzsfM,120736
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=r-y-CnEcmdN1ykWcmFDYmHpzB_IKmV_PAZNPUh3Xg9s,290128
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=WoiQ2XGJ92GI607JzUxTzDuLPD-aRlpyYINFWAjefyw,638960
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=efipYh0RzYCcU-y_9819NvxfI2oV9UxcypQ8EinDOIQ,435648
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/external_model_generator.cpython-312-darwin.so,sha256=jKk0H-7mG4oJ2qcPfcTsQNepJgtdd92vkodfogEwpYk,361952
247
- amsdal-0.5.19.dist-info/RECORD,,
248
- amsdal-0.5.19.dist-info/WHEEL,sha256=_N1vyLgwJ10g4JxFsp-IfU42zGJgf-DUqwfdbV1YvEM,115
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