amsdal_cli 0.5.7__py3-none-any.whl → 0.5.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
amsdal_cli/__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.7'
4
+ __version__ = '0.5.9'
@@ -81,7 +81,17 @@ class ConfigReaderMixin:
81
81
  """
82
82
  object_config = next(cls.read_configs_from_file(json_file))
83
83
 
84
- return object_config.type != 'Fixture'
84
+ # Exclude fixtures
85
+ if object_config.type == 'Fixture':
86
+ return False
87
+
88
+ # Exclude external models (models with __connection__ attribute)
89
+ # Check model_extra (Pydantic v2) for extra fields
90
+ if hasattr(object_config, 'model_extra') and object_config.model_extra:
91
+ if '__connection__' in object_config.model_extra:
92
+ return False
93
+
94
+ return True
85
95
 
86
96
  @staticmethod
87
97
  def read_configs_from_file(json_file: Path) -> Iterator[ObjectSchema]:
@@ -38,6 +38,12 @@ class AppBuilder(BuildMixin):
38
38
  self.build_models(self.cli_config)
39
39
  elif (self.source_path / 'models').exists():
40
40
  self.copy_class_models(self.source_path / 'models')
41
+
42
+ # Copy external models if they exist
43
+ external_models_path = self.cli_config.app_directory / 'models' / 'external'
44
+ if external_models_path.exists():
45
+ self.copy_external_models(external_models_path)
46
+
41
47
  if not is_silent:
42
48
  rprint(rich_success('OK!'))
43
49
 
@@ -53,6 +53,31 @@ class BuildMixin:
53
53
  dirs_exist_ok=True,
54
54
  )
55
55
 
56
+ @staticmethod
57
+ def copy_external_models(external_models_path: Path) -> None:
58
+ """Copy external models to the build directory.
59
+
60
+ Args:
61
+ external_models_path: Path to the external models directory (e.g., models/external)
62
+ """
63
+ from amsdal.configs.main import settings
64
+
65
+ if not settings.USER_MODELS_MODULE_PATH:
66
+ return
67
+
68
+ # External models go to USER_MODELS_MODULE_PATH/external
69
+ target_path = settings.USER_MODELS_MODULE_PATH / 'external'
70
+
71
+ # Skip copy if source and target are the same (e.g., when building in place)
72
+ if external_models_path.resolve() == target_path.resolve():
73
+ return
74
+
75
+ shutil.copytree(
76
+ external_models_path,
77
+ target_path,
78
+ dirs_exist_ok=True,
79
+ )
80
+
56
81
  @staticmethod
57
82
  def build_transactions(cli_app_path: Path) -> None:
58
83
  """
@@ -92,11 +92,11 @@ async def list_command(
92
92
  deployment.application_name or '-',
93
93
  datetime.datetime.fromtimestamp(
94
94
  deployment.created_at / 1000,
95
- tz=datetime.timezone.utc,
95
+ tz=datetime.UTC,
96
96
  ).strftime('%Y-%m-%d %H:%M:%S %Z'),
97
97
  datetime.datetime.fromtimestamp(
98
98
  deployment.last_update_at / 1000,
99
- tz=datetime.timezone.utc,
99
+ tz=datetime.UTC,
100
100
  ).strftime('%Y-%m-%d %H:%M:%S %Z'),
101
101
  deployment.application_uuid or '-',
102
102
  deployment.domain_url or '-',
@@ -109,11 +109,11 @@ async def list_command(
109
109
  deployment.application_name or '-',
110
110
  datetime.datetime.fromtimestamp(
111
111
  deployment.created_at / 1000,
112
- tz=datetime.timezone.utc,
112
+ tz=datetime.UTC,
113
113
  ).strftime('%Y-%m-%d %H:%M:%S %Z'),
114
114
  datetime.datetime.fromtimestamp(
115
115
  deployment.last_update_at / 1000,
116
- tz=datetime.timezone.utc,
116
+ tz=datetime.UTC,
117
117
  ).strftime('%Y-%m-%d %H:%M:%S %Z'),
118
118
  )
119
119
 
@@ -308,7 +308,7 @@ async def _async_check_missing_generated_migrations(
308
308
  if not amsdal_manager.is_authenticated:
309
309
  amsdal_manager.authenticate()
310
310
 
311
- await amsdal_manager.post_setup() # type: ignore[call-arg, misc]
311
+ await amsdal_manager.post_setup() # type: ignore[call-arg]
312
312
 
313
313
  migrations_dir = app_source_path / MIGRATIONS_DIR_NAME
314
314
 
@@ -1,3 +1,4 @@
1
+ from amsdal_cli.commands.generate.sub_commands.generate_external_models import generate_external_models
1
2
  from amsdal_cli.commands.generate.sub_commands.generate_frontend_config import generate_frontend_config
2
3
  from amsdal_cli.commands.generate.sub_commands.generate_hook import generate_hook
3
4
  from amsdal_cli.commands.generate.sub_commands.generate_model import generate_model
@@ -8,6 +9,7 @@ from amsdal_cli.commands.generate.sub_commands.generate_tests import generate_te
8
9
  from amsdal_cli.commands.generate.sub_commands.generate_transaction import generate_transaction
9
10
 
10
11
  __all__ = [
12
+ 'generate_external_models',
11
13
  'generate_frontend_config',
12
14
  'generate_hook',
13
15
  'generate_model',
@@ -0,0 +1,365 @@
1
+ """Generate ExternalModel classes from external database connections."""
2
+
3
+ from pathlib import Path
4
+ from typing import TYPE_CHECKING
5
+ from typing import Any
6
+
7
+ import typer
8
+
9
+ from amsdal_cli.commands.generate.app import sub_app
10
+
11
+ if TYPE_CHECKING:
12
+ from amsdal_cli.utils.cli_config import CliConfig
13
+
14
+
15
+ @sub_app.command(name='external-models, ext-models, em')
16
+ def generate_external_models(
17
+ ctx: typer.Context,
18
+ connection_name: str = typer.Argument(
19
+ ...,
20
+ help='The name of the external connection configured in config',
21
+ ),
22
+ output_dir: Path = typer.Option( # noqa: B008
23
+ None,
24
+ '--output',
25
+ '-o',
26
+ help='Output directory for generated models (defaults to models/external/)',
27
+ ),
28
+ tables: list[str] = typer.Option( # noqa: B008
29
+ None,
30
+ '--table',
31
+ '-t',
32
+ help='Specific table names to generate models for (generates all if not specified)',
33
+ ),
34
+ format_type: str = typer.Option( # noqa: B008
35
+ 'python',
36
+ '--format',
37
+ '-f',
38
+ help='Output format: "python" or "json"',
39
+ ),
40
+ schema: str | None = typer.Option( # noqa: B008, ARG001
41
+ None,
42
+ '--schema',
43
+ '-s',
44
+ help='Database schema name (for databases that support schemas like PostgreSQL)',
45
+ ),
46
+ ) -> None:
47
+ """Generate ExternalModel classes from external database connections.
48
+
49
+ This command introspects an external database connection and generates
50
+ ExternalModel classes for the tables. The generated models can be used
51
+ immediately to query the external database.
52
+
53
+ **Examples:**
54
+
55
+ Generate models for all tables in an external connection:
56
+
57
+ ```bash
58
+ amsdal generate external-models my_external_db
59
+ ```
60
+
61
+ Generate models for specific tables only:
62
+
63
+ ```bash
64
+ amsdal generate external-models my_external_db -t users -t posts -t comments
65
+ ```
66
+
67
+ Generate models in JSON format:
68
+
69
+ ```bash
70
+ amsdal generate external-models my_external_db --format json
71
+ ```
72
+
73
+ Specify custom output directory:
74
+
75
+ ```bash
76
+ amsdal generate external-models my_external_db -o src/external_models
77
+ ```
78
+
79
+ Generate models for a specific PostgreSQL schema:
80
+
81
+ ```bash
82
+ amsdal generate external-models pg_db --schema public
83
+ ```
84
+
85
+ **Prerequisites:**
86
+
87
+ 1. The external connection must be configured in your AMSDAL config
88
+ 2. The connection must support schema introspection (SQLite, PostgreSQL)
89
+ 3. The ExternalConnectionManager must be properly set up
90
+
91
+ **Generated Output:**
92
+
93
+ For Python format:
94
+ - Creates a module for each model: `models/external/{table_name}.py`
95
+ - Each module contains an ExternalModel class ready to use
96
+
97
+ For JSON format:
98
+ - Creates JSON schema files: `models/external/{table_name}/model.json`
99
+ - Can be loaded dynamically by AMSDAL framework
100
+ """
101
+ from amsdal.services.external_connections import ExternalConnectionManager
102
+ from amsdal.services.external_model_generator import ExternalModelGenerator
103
+ from amsdal_data.application import DataApplication
104
+ from amsdal_utils.config.manager import AmsdalConfigManager
105
+ from amsdal_utils.utils.text import to_snake_case
106
+
107
+ from amsdal_cli.utils.cli_config import CliConfig
108
+
109
+ cli_config: CliConfig = ctx.meta['config']
110
+
111
+ # Validate format
112
+ if format_type not in ('python', 'json'):
113
+ typer.echo(f"Error: Invalid format '{format_type}'. Must be 'python' or 'json'.", err=True)
114
+ raise typer.Exit(1)
115
+
116
+ # Set default output directory
117
+ if output_dir is None:
118
+ output_dir = Path.cwd() / 'models' / 'external'
119
+
120
+ # Ensure output directory exists
121
+ output_dir.mkdir(parents=True, exist_ok=True)
122
+
123
+ # Initialize AMSDAL components
124
+ config_manager = AmsdalConfigManager()
125
+ config = config_manager.get_config()
126
+
127
+ # Verify connection exists in config
128
+ if connection_name not in config.connections:
129
+ typer.echo(
130
+ f"Error: Connection '{connection_name}' not found in configuration.\n"
131
+ f'Available connections: {", ".join(config.connections.keys())}',
132
+ err=True,
133
+ )
134
+ raise typer.Exit(1)
135
+
136
+ # Initialize DataApplication
137
+ app = DataApplication()
138
+ app.setup(config)
139
+
140
+ # Initialize ExternalConnectionManager
141
+ manager = ExternalConnectionManager()
142
+ manager.setup(data_application=app)
143
+
144
+ # Initialize ExternalModelGenerator
145
+ generator = ExternalModelGenerator()
146
+
147
+ try:
148
+ # Generate models
149
+ typer.echo(f"Generating external models from connection '{connection_name}'...")
150
+
151
+ if tables:
152
+ typer.echo(f'Tables: {", ".join(tables)}')
153
+ else:
154
+ typer.echo('Generating models for all tables...')
155
+
156
+ models_dict = generator.generate_models_for_connection(
157
+ connection_name=connection_name,
158
+ table_names=tables if tables else None,
159
+ )
160
+
161
+ if not models_dict:
162
+ typer.echo('No tables found or no models generated.', err=True)
163
+ raise typer.Exit(1)
164
+
165
+ typer.echo(f'Successfully generated {len(models_dict)} model(s)')
166
+
167
+ # Write models to files
168
+ if format_type == 'python':
169
+ _write_python_models(models_dict, output_dir, cli_config)
170
+ else:
171
+ _write_json_models(models_dict, output_dir, cli_config, connection_name)
172
+
173
+ typer.echo(f'\nGenerated models written to: {output_dir}')
174
+ typer.echo('\nYou can now import and use these models:')
175
+ typer.echo('```python')
176
+ first_model = next(iter(models_dict.keys()))
177
+ typer.echo(f'from models.external.{to_snake_case(first_model)} import {first_model}')
178
+ typer.echo(f'{first_model}.objects.all().execute()')
179
+ typer.echo('```')
180
+
181
+ except ValueError as e:
182
+ typer.echo(f'Error: {e}', err=True)
183
+ raise typer.Exit(1) from e
184
+ except ConnectionError as e:
185
+ typer.echo(f'Connection error: {e}', err=True)
186
+ raise typer.Exit(1) from e
187
+ except Exception as e:
188
+ typer.echo(f'Unexpected error: {e}', err=True)
189
+ raise typer.Exit(1) from e
190
+ finally:
191
+ # Clean up
192
+ app.teardown()
193
+ ExternalConnectionManager.invalidate()
194
+ AmsdalConfigManager.invalidate()
195
+ DataApplication.invalidate()
196
+
197
+
198
+ def _write_python_models(
199
+ models_dict: dict[str, type],
200
+ output_dir: Path,
201
+ cli_config: 'CliConfig', # noqa: F821
202
+ ) -> None:
203
+ """Write generated models as Python files."""
204
+ from amsdal_utils.utils.text import to_snake_case
205
+
206
+ # Create __init__.py for the package
207
+ init_file = output_dir / '__init__.py'
208
+ init_file.touch(exist_ok=True)
209
+
210
+ # Write each model to a separate file
211
+ for model_name, model_class in models_dict.items():
212
+ module_name = to_snake_case(model_name)
213
+ file_path = output_dir / f'{module_name}.py'
214
+
215
+ # Generate the model file content
216
+ content = _generate_python_model_content(model_class, cli_config)
217
+
218
+ # Write to file
219
+ file_path.write_text(content)
220
+ typer.echo(f' ✓ {module_name}.py')
221
+
222
+
223
+ def _generate_python_model_content(model_class: type, cli_config: 'CliConfig') -> str: # noqa: F821
224
+ """Generate Python code for an ExternalModel class."""
225
+ model_name = model_class.__name__
226
+ table_name = model_class.__table_name__ # type: ignore[attr-defined]
227
+ connection = model_class.__connection__ # type: ignore[attr-defined]
228
+
229
+ # Get annotations
230
+ annotations = getattr(model_class, '__annotations__', {})
231
+
232
+ # Build imports
233
+ imports = {'from amsdal_models.classes.external_model import ExternalModel'}
234
+
235
+ # Build field definitions
236
+ field_lines = []
237
+ indent = ' ' * cli_config.indent
238
+
239
+ for field_name, field_type in annotations.items():
240
+ type_str = _get_type_annotation(field_type)
241
+ field_lines.append(f'{indent}{field_name}: {type_str}')
242
+
243
+ # Build class definition
244
+ lines = [
245
+ '"""',
246
+ f'External model for {table_name} table.',
247
+ '',
248
+ f'Generated from external connection: {connection}',
249
+ '"""',
250
+ '',
251
+ *sorted(imports),
252
+ '',
253
+ '',
254
+ f'class {model_name}(ExternalModel):',
255
+ f'{indent}"""External model for {table_name}."""',
256
+ '',
257
+ f"{indent}__table_name__ = '{table_name}'",
258
+ f"{indent}__connection__ = '{connection}'",
259
+ ]
260
+
261
+ # Add primary key if present
262
+ if hasattr(model_class, '__primary_key__'):
263
+ pk = model_class.__primary_key__
264
+ if isinstance(pk, list):
265
+ lines.append(f'{indent}__primary_key__ = {pk!r}')
266
+ else:
267
+ lines.append(f"{indent}__primary_key__ = '{pk}'")
268
+
269
+ # Add field definitions
270
+ if field_lines:
271
+ lines.append('')
272
+ lines.extend(field_lines)
273
+
274
+ return '\n'.join(lines) + '\n'
275
+
276
+
277
+ def _get_type_annotation(python_type: type) -> str:
278
+ """Convert Python type to string annotation."""
279
+ type_mapping = {
280
+ str: 'str',
281
+ int: 'int',
282
+ float: 'float',
283
+ bool: 'bool',
284
+ bytes: 'bytes',
285
+ list: 'list',
286
+ dict: 'dict',
287
+ }
288
+
289
+ return type_mapping.get(python_type, 'str')
290
+
291
+
292
+ def _write_json_models(
293
+ models_dict: dict[str, type],
294
+ output_dir: Path,
295
+ cli_config: 'CliConfig', # noqa: F821
296
+ connection_name: str,
297
+ ) -> None:
298
+ """Write generated models as JSON schema files."""
299
+ import json
300
+
301
+ from amsdal_utils.utils.text import to_snake_case
302
+
303
+ for model_name, model_class in models_dict.items():
304
+ module_name = to_snake_case(model_name)
305
+ model_dir = output_dir / module_name
306
+ model_dir.mkdir(exist_ok=True, parents=True)
307
+
308
+ json_file = model_dir / 'model.json'
309
+
310
+ # Build JSON schema
311
+ schema = _generate_json_schema(model_class, connection_name)
312
+
313
+ # Write to file
314
+ json_file.write_text(json.dumps(schema, indent=cli_config.indent, ensure_ascii=False))
315
+ typer.echo(f' ✓ {module_name}/model.json')
316
+
317
+
318
+ def _generate_json_schema(model_class: type, connection_name: str) -> dict[str, Any]:
319
+ """Generate JSON schema for an ExternalModel class."""
320
+ model_name = model_class.__name__
321
+ table_name = model_class.__table_name__ # type: ignore[attr-defined]
322
+ annotations = getattr(model_class, '__annotations__', {})
323
+
324
+ # Build properties
325
+ properties = {}
326
+ for field_name, field_type in annotations.items():
327
+ properties[field_name] = {
328
+ 'type': _python_type_to_json_type(field_type),
329
+ 'title': field_name,
330
+ }
331
+
332
+ schema: dict[str, Any] = {
333
+ 'title': model_name,
334
+ 'type': 'object',
335
+ 'properties': properties,
336
+ '__table_name__': table_name,
337
+ '__connection__': connection_name,
338
+ }
339
+
340
+ # Add primary key if present
341
+ if hasattr(model_class, '__primary_key__'):
342
+ pk = model_class.__primary_key__
343
+ if isinstance(pk, str):
344
+ schema['__primary_key__'] = [pk]
345
+ else:
346
+ schema['__primary_key__'] = list(pk)
347
+
348
+ return schema
349
+
350
+
351
+ def _python_type_to_json_type(python_type: type) -> str:
352
+ """Convert Python type to JSON schema type string."""
353
+ from amsdal_utils.models.data_models.enums import CoreTypes
354
+
355
+ type_mapping = {
356
+ str: CoreTypes.STRING.value,
357
+ int: CoreTypes.INTEGER.value,
358
+ float: CoreTypes.NUMBER.value,
359
+ bool: CoreTypes.BOOLEAN.value,
360
+ bytes: CoreTypes.BINARY.value,
361
+ list: CoreTypes.ARRAY.value,
362
+ dict: CoreTypes.DICTIONARY.value,
363
+ }
364
+
365
+ return type_mapping.get(python_type, CoreTypes.STRING.value)
@@ -1,6 +1,6 @@
1
1
  import ast
2
+ from datetime import UTC
2
3
  from datetime import date
3
- from datetime import timezone
4
4
  from pathlib import Path
5
5
 
6
6
  import faker
@@ -122,7 +122,7 @@ def _generate_values_for_type(
122
122
  return ast.Constant(value='2023-01-01T00:00:00Z')
123
123
 
124
124
  if test_data_type == TestDataType.RANDOM:
125
- dt = FAKER.date_time(tzinfo=timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0)
125
+ dt = FAKER.date_time(tzinfo=UTC).replace(hour=0, minute=0, second=0, microsecond=0)
126
126
  return ast.Constant(value=dt) # type: ignore[arg-type]
127
127
  if test_data_type == TestDataType.DYNAMIC:
128
128
  return _faker_call('date_time')
@@ -132,7 +132,7 @@ def _generate_values_for_type(
132
132
  return ast.Constant(value=date(2023, 1, 1)) # type: ignore[arg-type]
133
133
 
134
134
  if test_data_type == TestDataType.RANDOM:
135
- dt = FAKER.date_time(tzinfo=timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0)
135
+ dt = FAKER.date_time(tzinfo=UTC).replace(hour=0, minute=0, second=0, microsecond=0)
136
136
  return ast.Constant(value=dt.date()) # type: ignore[arg-type]
137
137
 
138
138
  if test_data_type == TestDataType.DYNAMIC:
@@ -55,7 +55,7 @@ def _sync_apply(
55
55
  core_migrations_path=CORE_MIGRATIONS_PATH,
56
56
  app_migrations_loader=app_migrations_loader,
57
57
  executor=DefaultMigrationExecutor(schemas),
58
- contrib=settings.CONTRIBS,
58
+ contrib=settings.CONTRIBS, # type: ignore[arg-type]
59
59
  contrib_migrations_directory_name=settings.CONTRIB_MIGRATIONS_DIRECTORY_NAME,
60
60
  )
61
61
 
@@ -116,7 +116,7 @@ async def _async_sync_apply(
116
116
  try:
117
117
  amsdal_manager.authenticate()
118
118
 
119
- await amsdal_manager.post_setup() # type: ignore[call-arg, misc]
119
+ await amsdal_manager.post_setup() # type: ignore[call-arg]
120
120
 
121
121
  app_migrations_loader = MigrationsLoader(
122
122
  migrations_dir=build_dir / MIGRATIONS_DIR_NAME,
@@ -132,7 +132,7 @@ async def _async_sync_apply(
132
132
  core_migrations_path=CORE_MIGRATIONS_PATH,
133
133
  app_migrations_loader=app_migrations_loader,
134
134
  executor=DefaultAsyncMigrationExecutor(schemas),
135
- contrib=settings.CONTRIBS,
135
+ contrib=settings.CONTRIBS, # type: ignore[arg-type]
136
136
  contrib_migrations_directory_name=settings.CONTRIB_MIGRATIONS_DIRECTORY_NAME,
137
137
  )
138
138
 
@@ -39,7 +39,7 @@ async def _async_fetch_migrations(app_migrations_path: Path) -> list['MigrationF
39
39
 
40
40
  try:
41
41
  amsdal_manager.authenticate()
42
- await amsdal_manager.post_setup() # type: ignore[call-arg,misc]
42
+ await amsdal_manager.post_setup() # type: ignore[call-arg]
43
43
 
44
44
  store = AsyncFileMigrationStore(app_migrations_path)
45
45
  await store.init_migration_table()
@@ -89,7 +89,7 @@ async def _async_make_migrations(
89
89
  if not amsdal_manager.is_setup:
90
90
  await amsdal_manager.setup()
91
91
  amsdal_manager.authenticate()
92
- await amsdal_manager.post_setup() # type: ignore[call-arg, misc]
92
+ await amsdal_manager.post_setup() # type: ignore[call-arg]
93
93
 
94
94
  schema_repository = build_schema_repository(cli_config=cli_config)
95
95
  migrations_dir: Path = cli_config.app_directory / cli_config.src_dir / MIGRATIONS_DIR_NAME
@@ -87,7 +87,7 @@ async def _async_make_contrib_migrations(
87
87
  if not amsdal_manager.is_setup:
88
88
  await amsdal_manager.setup()
89
89
  amsdal_manager.authenticate()
90
- await amsdal_manager.post_setup() # type: ignore[call-arg, misc]
90
+ await amsdal_manager.post_setup() # type: ignore[call-arg]
91
91
 
92
92
  schema_repository = build_schema_repository(cli_config=cli_config)
93
93
  migrations_dir: Path = cli_config.app_directory / cli_config.src_dir / MIGRATIONS_DIR_NAME
@@ -1,2 +1,2 @@
1
1
  amsdal[cli]=={{ ctx.amsdal_version }}
2
- {% if ctx.is_async_mode %}amsdal-glue-connections[async-sqlite]{% endif %}
2
+ {% if ctx.is_async_mode %}amsdal-glue-connections[async-sqlite,postgres-binary]{% endif %}
@@ -38,4 +38,4 @@ async def _async_init() -> None:
38
38
  amsdal_manager = AsyncAmsdalManager()
39
39
  await amsdal_manager.setup()
40
40
  amsdal_manager.authenticate()
41
- await amsdal_manager.post_setup() # type: ignore[call-arg, misc]
41
+ await amsdal_manager.post_setup() # type: ignore[call-arg]
@@ -178,7 +178,7 @@ async def _async_migrate_models(config_path: Path) -> None:
178
178
  new_manager = AsyncAmsdalManager()
179
179
  if not new_manager.is_setup:
180
180
  await new_manager.setup()
181
- await new_manager.post_setup() # type: ignore[call-arg, misc]
181
+ await new_manager.post_setup() # type: ignore[call-arg]
182
182
 
183
183
  schemas = MigrationSchemas()
184
184
  executor = DefaultAsyncMigrationExecutor(schemas, use_foreign_keys=True)
@@ -310,7 +310,7 @@ async def _async_migrate_data(new_connection_name: str) -> None:
310
310
  origin_manager = AsyncAmsdalManager()
311
311
  if not origin_manager.is_setup:
312
312
  await origin_manager.setup()
313
- await origin_manager.post_setup() # type: ignore[call-arg, misc]
313
+ await origin_manager.post_setup() # type: ignore[call-arg]
314
314
 
315
315
  model_class_loader = ModelClassLoader(settings.USER_MODELS_MODULE)
316
316
  tables_for_connection = _resolve_tables_for_connection(new_connection_name)
@@ -346,7 +346,7 @@ async def _async_migrate_data(new_connection_name: str) -> None:
346
346
  force_insert = True
347
347
  lakehouse_item = model_class(**item.model_dump_refs())
348
348
 
349
- await lakehouse_item.asave( # type: ignore[misc]
349
+ await lakehouse_item.asave(
350
350
  force_insert=force_insert,
351
351
  using=LAKEHOUSE_DB_ALIAS,
352
352
  )
@@ -45,7 +45,7 @@ async def _async_serve(
45
45
  async def on_event_async(self, *args: Any, **kwargs: Any) -> None: # noqa: ARG002
46
46
  if not amsdal_manager._is_setup:
47
47
  await amsdal_manager.setup()
48
- await amsdal_manager.post_setup() # type: ignore[call-arg, misc]
48
+ await amsdal_manager.post_setup() # type: ignore[call-arg]
49
49
 
50
50
  if not amsdal_manager.is_authenticated:
51
51
  amsdal_manager.authenticate()
@@ -397,13 +397,13 @@ async def async_build_app_and_check_migrations(
397
397
  if not amsdal_manager.is_setup:
398
398
  await amsdal_manager.setup()
399
399
 
400
- await amsdal_manager.post_setup() # type: ignore[call-arg,misc]
400
+ await amsdal_manager.post_setup() # type: ignore[call-arg]
401
401
  amsdal_manager.init_classes()
402
402
 
403
403
  if not amsdal_manager.is_authenticated:
404
404
  amsdal_manager.authenticate()
405
405
 
406
- await amsdal_manager.apply_fixtures() # type: ignore[call-arg,misc]
406
+ await amsdal_manager.apply_fixtures() # type: ignore[call-arg]
407
407
  rprint(rich_success('OK!'))
408
408
  except Exception:
409
409
  if amsdal_manager.is_setup:
@@ -438,7 +438,7 @@ async def async_check_migrations_generated_and_applied(
438
438
  if not amsdal_manager.is_authenticated:
439
439
  amsdal_manager.authenticate()
440
440
 
441
- await amsdal_manager.post_setup() # type: ignore[call-arg,misc]
441
+ await amsdal_manager.post_setup() # type: ignore[call-arg]
442
442
 
443
443
  has_unapplied_migrations = await _async_check_has_unapplied_migrations(build_dir=build_dir)
444
444
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: amsdal_cli
3
- Version: 0.5.7
3
+ Version: 0.5.9
4
4
  Summary: CLI for AMSDAL framework
5
5
  Project-URL: Documentation, https://pypi.org/project/amsdal_cli/#readme
6
6
  Project-URL: Issues, https://pypi.org/project/amsdal_cli/
@@ -118,17 +118,18 @@ Classifier: Development Status :: 4 - Beta
118
118
  Classifier: Programming Language :: Python
119
119
  Classifier: Programming Language :: Python :: 3.11
120
120
  Classifier: Programming Language :: Python :: 3.12
121
+ Classifier: Programming Language :: Python :: 3.13
121
122
  Classifier: Programming Language :: Python :: Implementation :: CPython
122
123
  Classifier: Programming Language :: Python :: Implementation :: PyPy
123
- Requires-Python: >=3.11
124
+ Requires-Python: <3.14,>=3.11
124
125
  Requires-Dist: amsdal-server==0.5.*
125
126
  Requires-Dist: click<8.2.0
126
127
  Requires-Dist: faker==27.*
127
128
  Requires-Dist: gitpython~=3.1
128
129
  Requires-Dist: httpx==0.28.*
129
130
  Requires-Dist: jinja2~=3.1
130
- Requires-Dist: pydantic-settings~=2.2
131
- Requires-Dist: pydantic~=2.3
131
+ Requires-Dist: pydantic-settings~=2.12
132
+ Requires-Dist: pydantic~=2.12
132
133
  Requires-Dist: rich~=14.0
133
134
  Requires-Dist: typer~=0.15.3
134
135
  Requires-Dist: watchfiles~=0.21
@@ -1,5 +1,5 @@
1
1
  amsdal_cli/Third-Party Materials - AMSDAL Dependencies - License Notices.md,sha256=uHJlGG0D4tbpUi8cq-497NNO9ltQ67a5448k-T14HTw,68241
2
- amsdal_cli/__about__.py,sha256=6iW8h6OIk_sNDiVyp7NxCzL_PEkI5J0OHZQ6VEA84jQ,124
2
+ amsdal_cli/__about__.py,sha256=6kYLhdHkt8K7kGaoPcOypmOiRuisFHUqVenu6fa0rn8,124
3
3
  amsdal_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  amsdal_cli/app.py,sha256=_ucuLT5ospf1ifFKEG0IMfVnxKjnvPUQ4iMhkvOfCrc,466
5
5
  amsdal_cli/main.py,sha256=LtH-BD1eJrAUecjKzC8Gx7kYFUstOMH1erdeJUVqFB8,144
@@ -30,7 +30,7 @@ amsdal_cli/commands/build/schemas/extenders/__init__.py,sha256=47DEQpj8HBSa-_TIm
30
30
  amsdal_cli/commands/build/schemas/extenders/custom_code_extender.py,sha256=wE3jvJkaanPWFiafLWDiIry70WMLxeF6_GEppT1jgvw,1586
31
31
  amsdal_cli/commands/build/schemas/extenders/options_extender.py,sha256=WInuTtkOwPXA9tPvRy4pWFaNFziDdX24U7WGjvIeR94,2007
32
32
  amsdal_cli/commands/build/schemas/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- amsdal_cli/commands/build/schemas/loaders/base.py,sha256=-naxukn7WM218i9u92JeESEMCVMcuBpM0KW8S06-8mY,2565
33
+ amsdal_cli/commands/build/schemas/loaders/base.py,sha256=Jk5PRTTv4wNz5WeX6SVrjVYliaoVFOP9vVyUYaZ3W9k,2939
34
34
  amsdal_cli/commands/build/schemas/loaders/cli_custom_code_loader.py,sha256=gbcS0JdfeS6XNWA-Q6O4MCqmV2V1RkQWLWpCtShUFFo,4611
35
35
  amsdal_cli/commands/build/schemas/loaders/cli_loader.py,sha256=LpqmrR5iVpHqur-bHAHi-E2EyhlLK0RD0xgn_Pu9Kks,2259
36
36
  amsdal_cli/commands/build/schemas/loaders/cli_options_loader.py,sha256=RusYssXNPY_FDO942PqZ2Y7OPiEMvMLq9N9C8311fdE,2822
@@ -42,8 +42,8 @@ amsdal_cli/commands/build/schemas/mixins/enrich_schemas_mixin.py,sha256=4TvvIuev
42
42
  amsdal_cli/commands/build/schemas/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  amsdal_cli/commands/build/schemas/utils/merger.py,sha256=8dlSV3qgGAGNbOtGGx8zQ7yC99dihxg8JwPHMDboU2w,2229
44
44
  amsdal_cli/commands/build/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- amsdal_cli/commands/build/services/builder.py,sha256=7g4PoF2zmy9I-XxmSyP2Ved54SHScePtbojNR0I4BK4,3168
46
- amsdal_cli/commands/build/services/mixin.py,sha256=8MHkasdQ1nPpBY90S4KHpr1rTHLC9Om2v89golcWE38,5749
45
+ amsdal_cli/commands/build/services/builder.py,sha256=MR3wQ0CEv7FOQDQboTtUHUHJ1pqt7kjdNKfJ8BN9mp0,3402
46
+ amsdal_cli/commands/build/services/mixin.py,sha256=1hC2nYEgoTIrxJaC1oa4srIARCCWwbAkpGnAdvOBbOY,6565
47
47
  amsdal_cli/commands/build/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
48
  amsdal_cli/commands/build/utils/build_config_file.py,sha256=65s3rP_nnr5FJLQlYStGF2JNYxExq5tWZvIU_h8Ae7I,2009
49
49
  amsdal_cli/commands/ci_cd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -68,8 +68,8 @@ amsdal_cli/commands/cloud/deploy/app.py,sha256=_t2LVD8apbyvBrcWdNv1_nXtubng1hLW9
68
68
  amsdal_cli/commands/cloud/deploy/command.py,sha256=LIX07pTU55GUA9KmTiKDtoCj5Ytx9ZDC7XQsVYUYsh8,262
69
69
  amsdal_cli/commands/cloud/deploy/sub_commands/__init__.py,sha256=I7MJEyceCIgCXP7JpX06nLvEA6HUkjj9LSDAb7VfTGo,353
70
70
  amsdal_cli/commands/cloud/deploy/sub_commands/deploy_delete.py,sha256=pRLumeigF4e_Nod32p6XkgJsYxbB9H3WSxbv0IwA5Eo,3221
71
- amsdal_cli/commands/cloud/deploy/sub_commands/deploy_list.py,sha256=ozr7tVbPrTnx_YscyAb1_ZockFfQQSwd6XDijrkZSWk,5534
72
- amsdal_cli/commands/cloud/deploy/sub_commands/deploy_new.py,sha256=n87MNWad-oOFYXRpQvWqZZtRo0NXaQZSb3GQkMFE0ls,12692
71
+ amsdal_cli/commands/cloud/deploy/sub_commands/deploy_list.py,sha256=rqykOi49C3CHm7GiVOKTgwlrYcN3mSguHx759ZzZJ3k,5498
72
+ amsdal_cli/commands/cloud/deploy/sub_commands/deploy_new.py,sha256=N591T6XKpj1xPx_qGmpAmCqumeWpGrA0RH0e9_SSs-8,12686
73
73
  amsdal_cli/commands/cloud/environments/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
74
  amsdal_cli/commands/cloud/environments/app.py,sha256=kkzf_kW2jpl3d44qWuIZB5C3uWXzpNpnTIvUpuuPJHE,238
75
75
  amsdal_cli/commands/cloud/environments/command.py,sha256=roeg2tpa53W1qzCa_3-zEn5z2xiVS4STWB9M7P5BVKA,283
@@ -112,7 +112,8 @@ amsdal_cli/commands/generate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
112
112
  amsdal_cli/commands/generate/app.py,sha256=-wEccTR0MhZyj3Y1R2VMyO9RzyGiBSrdWNPQc4ACHqc,201
113
113
  amsdal_cli/commands/generate/command.py,sha256=j6CGiZ_7st-A6qpMTA8XYl15UeONopauQALObVWB2xc,197
114
114
  amsdal_cli/commands/generate/enums.py,sha256=SQ_ZFW6F9RbvM__Ohz5r3Ld54MlKoxid83kqiVqaZwY,3696
115
- amsdal_cli/commands/generate/sub_commands/__init__.py,sha256=WyZ4kE6IH9O_igOVJ31UQtqE12cCKyATi4E-qgslN3k,941
115
+ amsdal_cli/commands/generate/sub_commands/__init__.py,sha256=afAyY3hWNb6a4e3lapQX-GsR1SB6EHZi9hwtsWzrPKY,1077
116
+ amsdal_cli/commands/generate/sub_commands/generate_external_models.py,sha256=QH54RuiRyzFzmiEQsw7mbLk1d_vSbLAPqp4F-oJGwD8,11515
116
117
  amsdal_cli/commands/generate/sub_commands/generate_frontend_config.py,sha256=SkEzx7-mWgrPINwPXGRmYO1SVA0RZojOd6BZFQRmG0Q,2574
117
118
  amsdal_cli/commands/generate/sub_commands/generate_hook.py,sha256=C0Oy5VokM3BXPq33Kknjvtjwd7hdfSxQFKxJcHu_bgg,1738
118
119
  amsdal_cli/commands/generate/sub_commands/generate_model.py,sha256=yjZEfadjDf2zRkXh9z5RWYqnO9vFVu8tzVQzxWZPWY4,5885
@@ -137,7 +138,7 @@ amsdal_cli/commands/generate/utils/tests/async_mode_utils.py,sha256=iub84Pj5TMa3
137
138
  amsdal_cli/commands/generate/utils/tests/conftest_utils.py,sha256=Ma0yRcrwzGwN_IdnAoYgVnYVjgLy0CgQveqXHuhn5RA,786
138
139
  amsdal_cli/commands/generate/utils/tests/function_utils.py,sha256=Bkk9JDbANX2aSreNRr1Bste5rPwVKc2HV5xLFg2dQK4,496
139
140
  amsdal_cli/commands/generate/utils/tests/model_utils.py,sha256=CBfR9AcL6Q1boEejjmOD16F0kgJFdIjYYWNE3vQMkfE,4051
140
- amsdal_cli/commands/generate/utils/tests/type_utils.py,sha256=yglZHcvAQ0m6JnwQEBxHdcWxlkHY65P-Cp81fCrC3q8,9325
141
+ amsdal_cli/commands/generate/utils/tests/type_utils.py,sha256=c2eKOrzuioDHbxQieiRAT8reF9TCgTq5CRx7WB3_W-Y,9302
141
142
  amsdal_cli/commands/generate/utils/tests/unit.py,sha256=XEoTmgZP-8dSmFqA6lPk5U8k3AfDbDom92CviXgzFtw,27696
142
143
  amsdal_cli/commands/generate/utils/tests/templates/async/conftest.py,sha256=9GfoV_HzwuWtglI7uz0fP5_pOsPk2f56elaoinuPa80,1632
143
144
  amsdal_cli/commands/generate/utils/tests/templates/sync/conftest.py,sha256=wMmnKQnVTSJsS5MdH25ChRcc-aQevQYqIZhXwLnZl0U,1564
@@ -147,17 +148,17 @@ amsdal_cli/commands/migrations/command.py,sha256=jlpdYZAc02ZUBxSdzGSzkDxEb1nlHNz
147
148
  amsdal_cli/commands/migrations/constants.py,sha256=846-DQ-Iqcxw2akd5aBAmbnXHDmRFqEKu6vai2ZFBkU,35
148
149
  amsdal_cli/commands/migrations/utils.py,sha256=Fvu6NlIFL3OAz0MhLkvnucIsHBZlDDCOZZ38VhNahws,2700
149
150
  amsdal_cli/commands/migrations/sub_commands/__init__.py,sha256=HHxiJxcbJUQLv6QOLwcvcSjTYJTixiRJ89IUb1H7sRo,1100
150
- amsdal_cli/commands/migrations/sub_commands/apply.py,sha256=4MyO_gP7r4PBRz_agi2xnoMTHcLlvxlo4335mmLrpYQ,8696
151
- amsdal_cli/commands/migrations/sub_commands/list.py,sha256=vC-oeTVHjYNzI_HhiylZSNeOsIFvnDZ6TRwrqQ-wpUk,5833
152
- amsdal_cli/commands/migrations/sub_commands/make.py,sha256=Qh3_4djVgdT67oRZ46AF2dqSyUDEiipOOkW5_-n4DOY,6429
153
- amsdal_cli/commands/migrations/sub_commands/make_contrib.py,sha256=JdlD8hGjNMrbWFIqSw5eXRSxUd1hW6D2UcxWR6-6uTg,6337
151
+ amsdal_cli/commands/migrations/sub_commands/apply.py,sha256=MrlykOqsdBZoC1gnaHSOa6oGfTREDmxKyTmB7-mBRPU,8742
152
+ amsdal_cli/commands/migrations/sub_commands/list.py,sha256=kZc-qI-lVFrVpWyPV3b21wx1aLUYcFbFX1U1WDq2l0E,5828
153
+ amsdal_cli/commands/migrations/sub_commands/make.py,sha256=6Xh4wZFyZQmxSR8InBc0f_FUuIM_eqyfqO0ynLuDlPY,6423
154
+ amsdal_cli/commands/migrations/sub_commands/make_contrib.py,sha256=G3w5fRKR16-tKrTfOWCGj4Vkuwl22V5aEsRxEhIoD1k,6331
154
155
  amsdal_cli/commands/new/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
156
  amsdal_cli/commands/new/command.py,sha256=B-chjS_TAEzH4CIr_vBtxFWn7Y4xWm8vpUetCf1lwKo,3233
156
157
  amsdal_cli/commands/new/templates/.amsdal-cli,sha256=PdXPovcT8AfPhqwDLI_4EWFYAS6e3J5JcsHVityBdF8,304
157
158
  amsdal_cli/commands/new/templates/.gitignore,sha256=u7cZFs8VyeZahreeYtkoRnAQduko23Lz4SoGCyMSOQc,153
158
159
  amsdal_cli/commands/new/templates/README.md,sha256=SM_MPq4HNWIxo2B4HJmfM1kfJYawW4YneuZxFqZnDo4,21552
159
160
  amsdal_cli/commands/new/templates/config.yml,sha256=89BTeSrzPO92JTCRS8N03DXY0kdw-uMWCStLHzNaeRw,640
160
- amsdal_cli/commands/new/templates/requirements.txt,sha256=SZ3s8KxuCFfat3FHl8-ZF3mrghDNdMXFS4T1QI1YXeo,113
161
+ amsdal_cli/commands/new/templates/requirements.txt,sha256=05SVW1yzgvHwir231NIEgeCguZovGJyJKtHA1uFC3aA,129
161
162
  amsdal_cli/commands/new/templates/.amsdal/.dependencies,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
162
163
  amsdal_cli/commands/new/templates/.amsdal/.environment,sha256=DW5AeeNnA-vTfAByL1iR0osOKBHcEUsSkhUSOtzONgU,4
163
164
  amsdal_cli/commands/new/templates/.amsdal/.secrets,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -178,17 +179,17 @@ amsdal_cli/commands/register_connection/utils/__init__.py,sha256=47DEQpj8HBSa-_T
178
179
  amsdal_cli/commands/register_connection/utils/build.py,sha256=nsx2EeN-KhZHg1IwICeRSTfUJS1ajNy1LrP33lXoD4s,710
179
180
  amsdal_cli/commands/register_connection/utils/config_updater.py,sha256=CDsaCuli5tCsHoNrzfeWoVDPlyOTWvi8TPdbM4Fzo4o,4204
180
181
  amsdal_cli/commands/register_connection/utils/credentials.py,sha256=iaAF5STbKJNIoT8vL30DafTn4uzYnrjumtM3XNHuOS8,1066
181
- amsdal_cli/commands/register_connection/utils/initialize.py,sha256=9NvfAWOvWQVrSfVNZnGBqeKcQ7bxpTf56oj8239jgc8,1279
182
+ amsdal_cli/commands/register_connection/utils/initialize.py,sha256=Fjs3ilpnv3TqdzpfkT8UUxtZhWR2GQ8_2-pGvazQu3s,1273
182
183
  amsdal_cli/commands/register_connection/utils/meta.py,sha256=PDs2miN0SPW2hCATLY8uGe1WOzDyw-D6my90P-mpcl8,709
183
- amsdal_cli/commands/register_connection/utils/migrate_models.py,sha256=oU_5oZcwU-qIMImpFIGniXvs7CJXyCyfSJozhFBRYkM,14077
184
+ amsdal_cli/commands/register_connection/utils/migrate_models.py,sha256=vljLYKBDZJn4h2fywbDfNeKd5W4G_KYZ8vKpMhc1oMI,14043
184
185
  amsdal_cli/commands/register_connection/utils/model_generator.py,sha256=w0vz-i-tMdimcQYmFbtfpOZJF8heTTRIzu1yTdbKBpc,10853
185
186
  amsdal_cli/commands/register_connection/utils/tables.py,sha256=FOwbWOpEw485Leoqe8LXCVY5osGKTKlMqWD9oqosapk,474
186
187
  amsdal_cli/commands/restore/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
188
  amsdal_cli/commands/restore/command.py,sha256=yrtF0y3HHmv6RXrMKQCnUIDhEQecDWY7THI_erh6WtA,35976
188
189
  amsdal_cli/commands/restore/enums.py,sha256=6SiKMRGlSjiLyepfbfQFXGAYqlM6Bkoeko2KscntTUQ,307
189
190
  amsdal_cli/commands/serve/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
190
- amsdal_cli/commands/serve/command.py,sha256=rdeS9obphECV6UsGIExVEWUiFL8ntqbNfLiNTMUD4nM,6543
191
- amsdal_cli/commands/serve/utils.py,sha256=2APwAytxKBuS8PbfGJ0MVLgi_9Q3p-OfBCiZoAMt0bU,18490
191
+ amsdal_cli/commands/serve/command.py,sha256=r27g3mw-P77LfP43ygTk9QbxN7HklWbzrlosjO4hB5c,6537
192
+ amsdal_cli/commands/serve/utils.py,sha256=ErwuQFRJxo32Y7uLgxtUXYdbPlDCYsh8OfAkqWSblrA,18475
192
193
  amsdal_cli/commands/serve/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
194
  amsdal_cli/commands/serve/filters/models_watch_filter.py,sha256=cnoAjrn-PYDAFq5MtgbQ6QeCvJJmcNisVNlA8QtFv4A,170
194
195
  amsdal_cli/commands/serve/filters/static_files_watch_filter.py,sha256=jKAF5RHq1au2v0kcOrqaAHP1x5IUjt_KgZURJLm29Tw,552
@@ -223,8 +224,8 @@ amsdal_cli/utils/vcs/base.py,sha256=jC05ExJZDnyHAsW7_4IDf8gQcYgK4dXq3zNlFIX66T4,
223
224
  amsdal_cli/utils/vcs/dummy.py,sha256=Lk8MT-b0YlHHUsiXsq5cvmPwcl4jTYdo8piN5_C8ORA,434
224
225
  amsdal_cli/utils/vcs/enums.py,sha256=tYR9LN1IOr8BZFbSeX_vDlhn8fPl4IU-Yakii8lRDYs,69
225
226
  amsdal_cli/utils/vcs/git.py,sha256=xHynbZcV6p2D3RFCwu1MGGpV9D7eK-pGUtO8kVexTQM,1269
226
- amsdal_cli-0.5.7.dist-info/METADATA,sha256=xT_KeYNRJy5TYkcikn5rrkiklhNpBqgtX-RccqdtT7I,57105
227
- amsdal_cli-0.5.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
228
- amsdal_cli-0.5.7.dist-info/entry_points.txt,sha256=GC-8LZsD3W--Pd9_gD4W3tw3ZZyPbSvkZ-qWc9Fx0NI,47
229
- amsdal_cli-0.5.7.dist-info/licenses/LICENSE.txt,sha256=hG-541PFYfNJi9WRZi_hno91UyqNg7YLK8LR3vLblZA,27355
230
- amsdal_cli-0.5.7.dist-info/RECORD,,
227
+ amsdal_cli-0.5.9.dist-info/METADATA,sha256=uFiVJXIDg30UwS0T47yiyypMaGT7CNKQDO1kr453xxQ,57164
228
+ amsdal_cli-0.5.9.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
229
+ amsdal_cli-0.5.9.dist-info/entry_points.txt,sha256=GC-8LZsD3W--Pd9_gD4W3tw3ZZyPbSvkZ-qWc9Fx0NI,47
230
+ amsdal_cli-0.5.9.dist-info/licenses/LICENSE.txt,sha256=hG-541PFYfNJi9WRZi_hno91UyqNg7YLK8LR3vLblZA,27355
231
+ amsdal_cli-0.5.9.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any