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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.9'
4
+ __version__ = '0.6.0'
@@ -1,7 +1,7 @@
1
- from enum import Enum
1
+ from enum import StrEnum
2
2
 
3
3
 
4
- class Vcs(str, Enum):
4
+ class Vcs(StrEnum):
5
5
  github = 'github'
6
6
 
7
7
 
@@ -3,6 +3,7 @@ from amsdal_cli.commands.cloud.app import cloud_sub_app
3
3
  from amsdal_cli.commands.cloud.dependency.command import * # noqa
4
4
  from amsdal_cli.commands.cloud.deploy.command import * # noqa
5
5
  from amsdal_cli.commands.cloud.environments.command import * # noqa
6
+ from amsdal_cli.commands.cloud.external_connections.command import * # noqa
6
7
  from amsdal_cli.commands.cloud.secret.command import * # noqa
7
8
  from amsdal_cli.commands.cloud.security.command import * # noqa
8
9
  from amsdal_cli.commands.cloud.sub_commands import * # noqa
@@ -1,7 +1,7 @@
1
- from enum import Enum
1
+ from enum import StrEnum
2
2
 
3
3
 
4
- class OutputFormat(str, Enum):
4
+ class OutputFormat(StrEnum):
5
5
  """
6
6
  Output format for CLI commands.
7
7
 
@@ -16,7 +16,7 @@ class OutputFormat(str, Enum):
16
16
  wide = 'wide'
17
17
 
18
18
 
19
- class DBType(str, Enum):
19
+ class DBType(StrEnum):
20
20
  """
21
21
  Enumeration for database types.
22
22
 
@@ -0,0 +1,3 @@
1
+ from amsdal_cli.commands.cloud.external_connections.app import external_connections_sub_app
2
+
3
+ __all__ = ['external_connections_sub_app']
@@ -0,0 +1,11 @@
1
+ import typer
2
+
3
+ from amsdal_cli.utils.alias_group import AliasGroup
4
+
5
+ external_connections_sub_app = typer.Typer(
6
+ help=(
7
+ 'Manage external connections for your Cloud Server app. '
8
+ 'Without any sub-command, it will list all external connections.'
9
+ ),
10
+ cls=AliasGroup,
11
+ )
@@ -0,0 +1,5 @@
1
+ from amsdal_cli.commands.cloud.app import cloud_sub_app
2
+ from amsdal_cli.commands.cloud.external_connections.app import external_connections_sub_app
3
+ from amsdal_cli.commands.cloud.external_connections.sub_commands import * # noqa
4
+
5
+ cloud_sub_app.add_typer(external_connections_sub_app, name='external-connections, ext-conn, ec')
@@ -0,0 +1,11 @@
1
+ from amsdal_cli.commands.cloud.external_connections.sub_commands.connection_add import connection_add_command
2
+ from amsdal_cli.commands.cloud.external_connections.sub_commands.connection_list import connection_list_callback
3
+ from amsdal_cli.commands.cloud.external_connections.sub_commands.connection_remove import connection_remove_command
4
+ from amsdal_cli.commands.cloud.external_connections.sub_commands.connection_update import connection_update_command
5
+
6
+ __all__ = [
7
+ 'connection_add_command',
8
+ 'connection_list_callback',
9
+ 'connection_remove_command',
10
+ 'connection_update_command',
11
+ ]
@@ -0,0 +1,123 @@
1
+ import tempfile
2
+ import typing
3
+ from pathlib import Path
4
+
5
+ import typer
6
+ from rich import print as rprint
7
+ from typer import Option
8
+
9
+ from amsdal_cli.commands.cloud.external_connections.app import external_connections_sub_app
10
+
11
+
12
+ def parse_credentials(credential_options: list[str]) -> dict[str, str]:
13
+ """
14
+ Parse credential key=value pairs into a dictionary.
15
+
16
+ Args:
17
+ credential_options: Tuple of strings in format "key=value"
18
+
19
+ Returns:
20
+ Dictionary mapping credential keys to values
21
+
22
+ Raises:
23
+ typer.BadParameter: If credential format is invalid
24
+ """
25
+ credentials = {}
26
+ for cred in credential_options:
27
+ if '=' not in cred:
28
+ msg = f"Invalid credential format: '{cred}'. Expected 'key=value'"
29
+ raise typer.BadParameter(msg)
30
+ key, value = cred.split('=', 1)
31
+ credentials[key.strip()] = value.strip()
32
+ return credentials
33
+
34
+
35
+ @external_connections_sub_app.command(name='add, a')
36
+ def connection_add_command(
37
+ ctx: typer.Context,
38
+ connection_name: str,
39
+ backend: str,
40
+ credentials: typing.Annotated[
41
+ typing.Optional[list[str]], # noqa: UP007
42
+ Option('--credential', '-c', help='Credential in key=value format. Can be specified multiple times.'),
43
+ ] = None,
44
+ env_name: typing.Annotated[
45
+ typing.Optional[str], # noqa: UP007
46
+ Option('--env', help='Environment name. Default is the current environment from configuration.'),
47
+ ] = None,
48
+ ) -> None:
49
+ """
50
+ Adds a new external connection to your Cloud Server app.
51
+ """
52
+ from amsdal.errors import AmsdalCloudError
53
+ from amsdal.manager import AmsdalManager
54
+ from amsdal.manager import AsyncAmsdalManager
55
+ from amsdal_utils.config.manager import AmsdalConfigManager
56
+
57
+ from amsdal_cli.commands.build.services.builder import AppBuilder
58
+ from amsdal_cli.commands.cloud.environments.utils import get_current_env
59
+ from amsdal_cli.utils.cli_config import CliConfig
60
+ from amsdal_cli.utils.text import rich_error
61
+ from amsdal_cli.utils.text import rich_highlight
62
+ from amsdal_cli.utils.text import rich_info
63
+ from amsdal_cli.utils.text import rich_success
64
+
65
+ cli_config: CliConfig = ctx.meta['config']
66
+ env_name = env_name or get_current_env(cli_config)
67
+
68
+ # Parse credentials
69
+ if not credentials or len(credentials) == 0:
70
+ rprint(rich_error('At least one credential must be provided using --credential/-c'))
71
+ raise typer.Exit(1)
72
+
73
+ try:
74
+ credentials_dict = parse_credentials(credentials)
75
+ except typer.BadParameter as e:
76
+ rprint(rich_error(str(e)))
77
+ raise typer.Exit(1) from e
78
+
79
+ if cli_config.verbose:
80
+ rprint(
81
+ rich_info(
82
+ f'Adding external connection {rich_highlight(connection_name)} '
83
+ f'with backend {rich_highlight(backend)} '
84
+ f'to environment: {rich_highlight(env_name)}'
85
+ )
86
+ )
87
+
88
+ with tempfile.TemporaryDirectory() as _temp_dir:
89
+ output_path: Path = Path(_temp_dir)
90
+
91
+ app_builder = AppBuilder(
92
+ cli_config=cli_config,
93
+ config_path=cli_config.config_path,
94
+ )
95
+ app_builder.build(output_path, is_silent=True)
96
+ manager: AsyncAmsdalManager | AmsdalManager
97
+
98
+ manager = AsyncAmsdalManager() if AmsdalConfigManager().get_config().async_mode else AmsdalManager()
99
+
100
+ manager.authenticate()
101
+
102
+ try:
103
+ manager.cloud_actions_manager.add_external_connection(
104
+ connection_name=connection_name,
105
+ backend=backend,
106
+ credentials=credentials_dict,
107
+ env_name=env_name,
108
+ application_uuid=cli_config.application_uuid,
109
+ application_name=cli_config.application_name,
110
+ )
111
+ except AmsdalCloudError as e:
112
+ rprint(rich_error(str(e)))
113
+ raise typer.Exit(1) from e
114
+ else:
115
+ config_dir: Path = cli_config.app_directory / '.amsdal'
116
+ config_dir.mkdir(exist_ok=True, parents=True)
117
+ _connections_path: Path = config_dir / '.external_connections'
118
+ _connections_path.touch(exist_ok=True)
119
+ _connections = set(_connections_path.read_text().split('\n'))
120
+ _connections.add(connection_name)
121
+ _connections_path.write_text('\n'.join(_connections))
122
+
123
+ rprint(rich_success(f'External connection {rich_highlight(connection_name)} added successfully.'))
@@ -0,0 +1,146 @@
1
+ import json
2
+ import tempfile
3
+ import typing
4
+ from pathlib import Path
5
+ from typing import Annotated
6
+
7
+ import typer
8
+ from rich import print as rprint
9
+ from rich.table import Table
10
+ from typer import Option
11
+
12
+ from amsdal_cli.commands.cloud.enums import OutputFormat
13
+ from amsdal_cli.commands.cloud.external_connections.app import external_connections_sub_app
14
+
15
+
16
+ def connection_list_command(
17
+ ctx: typer.Context,
18
+ output: Annotated[OutputFormat, typer.Option('--output', '-o')] = OutputFormat.default,
19
+ env_name: typing.Annotated[
20
+ typing.Optional[str], # noqa: UP007
21
+ Option('--env', help='Environment name. Default is the current environment from configuration.'),
22
+ ] = None,
23
+ *,
24
+ sync: bool = Option(
25
+ False,
26
+ '--sync',
27
+ help='Sync the external connections from the Cloud Server to ".external_connections".',
28
+ ),
29
+ ) -> None:
30
+ """
31
+ List the app external connections on the Cloud Server.
32
+
33
+ Args:
34
+ ctx (typer.Context): The Typer context object.
35
+ output (Annotated[OutputFormat, typer.Option]): The output format for the list.
36
+ Defaults to OutputFormat.default.
37
+ env_name (typing.Annotated[typing.Optional[str], Option]): The name of the environment. Defaults to the current
38
+ environment from configuration.
39
+ sync (bool): Whether to sync the external connections from the Cloud Server to ".external_connections".
40
+ Defaults to False.
41
+
42
+ Returns:
43
+ None
44
+ """
45
+ from amsdal.errors import AmsdalCloudError
46
+ from amsdal.manager import AmsdalManager
47
+ from amsdal.manager import AsyncAmsdalManager
48
+ from amsdal_utils.config.manager import AmsdalConfigManager
49
+
50
+ from amsdal_cli.commands.build.services.builder import AppBuilder
51
+ from amsdal_cli.commands.cloud.environments.utils import get_current_env
52
+ from amsdal_cli.utils.cli_config import CliConfig
53
+ from amsdal_cli.utils.text import rich_error
54
+ from amsdal_cli.utils.text import rich_highlight
55
+ from amsdal_cli.utils.text import rich_info
56
+
57
+ cli_config: CliConfig = ctx.meta['config']
58
+ env_name = env_name or get_current_env(cli_config)
59
+
60
+ if cli_config.verbose:
61
+ rprint(rich_info(f'Listing external connections for environment: {rich_highlight(env_name)}'))
62
+
63
+ with tempfile.TemporaryDirectory() as _temp_dir:
64
+ output_path: Path = Path(_temp_dir)
65
+ app_builder = AppBuilder(
66
+ cli_config=cli_config,
67
+ config_path=cli_config.config_path,
68
+ )
69
+ app_builder.build(output_path, is_silent=True)
70
+ manager: AsyncAmsdalManager | AmsdalManager
71
+
72
+ manager = AsyncAmsdalManager() if AmsdalConfigManager().get_config().async_mode else AmsdalManager()
73
+
74
+ manager.authenticate()
75
+
76
+ try:
77
+ list_response = manager.cloud_actions_manager.list_external_connections(
78
+ env_name=env_name,
79
+ application_uuid=cli_config.application_uuid,
80
+ application_name=cli_config.application_name,
81
+ )
82
+ except AmsdalCloudError as e:
83
+ rprint(rich_error(str(e)))
84
+ raise typer.Exit(1) from e
85
+
86
+ if not list_response or not list_response.details:
87
+ return
88
+
89
+ if sync and list_response.details.connections:
90
+ config_dir: Path = cli_config.app_directory / '.amsdal'
91
+ config_dir.mkdir(exist_ok=True, parents=True)
92
+ _connections_path: Path = config_dir / '.external_connections'
93
+ _connections_path.touch(exist_ok=True)
94
+ _connections_path.write_text(
95
+ '\n'.join([connection.name for connection in list_response.details.connections]),
96
+ )
97
+
98
+ if output == OutputFormat.json:
99
+ rprint(json.dumps(list_response.model_dump(), indent=4))
100
+ return
101
+
102
+ if not list_response.details.connections:
103
+ rprint('No external connections found.')
104
+ return
105
+
106
+ data_table = Table()
107
+ data_table.add_column('Connection Name', justify='center')
108
+ data_table.add_column('Backend', justify='center')
109
+ data_table.add_column('Credentials', justify='center')
110
+
111
+ for connection in list_response.details.connections:
112
+ # Show only credential keys, not values for security
113
+ credential_keys = ', '.join(connection.credentials.keys()) if connection.credentials else ''
114
+ data_table.add_row(connection.name, connection.backend, credential_keys)
115
+
116
+ rprint(data_table)
117
+
118
+
119
+ @external_connections_sub_app.callback(invoke_without_command=True)
120
+ def connection_list_callback(
121
+ ctx: typer.Context,
122
+ output: Annotated[OutputFormat, typer.Option('--output', '-o')] = OutputFormat.default,
123
+ env_name: typing.Annotated[
124
+ typing.Optional[str], # noqa: UP007
125
+ Option('--env', help='Environment name. Default is the current environment from configuration.'),
126
+ ] = None,
127
+ *,
128
+ sync: bool = Option(
129
+ False,
130
+ '--sync',
131
+ help='Sync the external connections from the Cloud Server to ".external_connections".',
132
+ ),
133
+ ) -> None:
134
+ """
135
+ Lists the app external connections on the Cloud Server.
136
+ """
137
+
138
+ if ctx.invoked_subcommand is not None:
139
+ return
140
+
141
+ connection_list_command(
142
+ ctx=ctx,
143
+ output=output,
144
+ env_name=env_name,
145
+ sync=sync,
146
+ )
@@ -0,0 +1,82 @@
1
+ import tempfile
2
+ import typing
3
+ from pathlib import Path
4
+
5
+ import typer
6
+ from rich import print as rprint
7
+ from typer import Option
8
+
9
+ from amsdal_cli.commands.cloud.external_connections.app import external_connections_sub_app
10
+
11
+
12
+ @external_connections_sub_app.command(name='remove, rm, r')
13
+ def connection_remove_command(
14
+ ctx: typer.Context,
15
+ connection_name: str,
16
+ env_name: typing.Annotated[
17
+ typing.Optional[str], # noqa: UP007
18
+ Option('--env', help='Environment name. Default is the current environment from configuration.'),
19
+ ] = None,
20
+ ) -> None:
21
+ """
22
+ Removes an external connection from the Cloud Server app.
23
+ """
24
+ from amsdal.errors import AmsdalCloudError
25
+ from amsdal.manager import AmsdalManager
26
+ from amsdal.manager import AsyncAmsdalManager
27
+ from amsdal_utils.config.manager import AmsdalConfigManager
28
+
29
+ from amsdal_cli.commands.build.services.builder import AppBuilder
30
+ from amsdal_cli.commands.cloud.environments.utils import get_current_env
31
+ from amsdal_cli.utils.cli_config import CliConfig
32
+ from amsdal_cli.utils.text import rich_error
33
+ from amsdal_cli.utils.text import rich_highlight
34
+ from amsdal_cli.utils.text import rich_info
35
+ from amsdal_cli.utils.text import rich_success
36
+
37
+ cli_config: CliConfig = ctx.meta['config']
38
+ env_name = env_name or get_current_env(cli_config)
39
+
40
+ if cli_config.verbose:
41
+ rprint(
42
+ rich_info(
43
+ f'Removing external connection {rich_highlight(connection_name)} '
44
+ f'from environment: {rich_highlight(env_name)}'
45
+ )
46
+ )
47
+
48
+ with tempfile.TemporaryDirectory() as _temp_dir:
49
+ output_path: Path = Path(_temp_dir)
50
+ app_builder = AppBuilder(
51
+ cli_config=cli_config,
52
+ config_path=cli_config.config_path,
53
+ )
54
+ app_builder.build(output_path, is_silent=True)
55
+ manager: AsyncAmsdalManager | AmsdalManager
56
+
57
+ manager = AsyncAmsdalManager() if AmsdalConfigManager().get_config().async_mode else AmsdalManager()
58
+
59
+ manager.authenticate()
60
+
61
+ try:
62
+ manager.cloud_actions_manager.remove_external_connection(
63
+ connection_name=connection_name,
64
+ env_name=env_name,
65
+ application_uuid=cli_config.application_uuid,
66
+ application_name=cli_config.application_name,
67
+ )
68
+ except AmsdalCloudError as e:
69
+ rprint(rich_error(str(e)))
70
+ raise typer.Exit(1) from e
71
+ else:
72
+ config_dir: Path = cli_config.app_directory / '.amsdal'
73
+ config_dir.mkdir(exist_ok=True, parents=True)
74
+ _connections_path: Path = config_dir / '.external_connections'
75
+ _connections_path.touch(exist_ok=True)
76
+ _connections = set(_connections_path.read_text().split('\n'))
77
+
78
+ if connection_name in _connections:
79
+ _connections.remove(connection_name)
80
+ _connections_path.write_text('\n'.join(_connections))
81
+
82
+ rprint(rich_success(f'External connection {rich_highlight(connection_name)} removed successfully.'))
@@ -0,0 +1,104 @@
1
+ import tempfile
2
+ import typing
3
+ from pathlib import Path
4
+
5
+ import typer
6
+ from rich import print as rprint
7
+ from typer import Option
8
+
9
+ from amsdal_cli.commands.cloud.external_connections.app import external_connections_sub_app
10
+ from amsdal_cli.commands.cloud.external_connections.sub_commands.connection_add import parse_credentials
11
+
12
+
13
+ @external_connections_sub_app.command(name='update, u')
14
+ def connection_update_command(
15
+ ctx: typer.Context,
16
+ connection_name: str,
17
+ backend: typing.Annotated[
18
+ typing.Optional[str], # noqa: UP007
19
+ Option('--backend', '-b', help='New backend type for the connection.'),
20
+ ] = None,
21
+ credentials: typing.Annotated[
22
+ typing.Optional[list[str]], # noqa: UP007
23
+ Option('--credential', '-c', help='Credential in key=value format. Can be specified multiple times.'),
24
+ ] = None,
25
+ env_name: typing.Annotated[
26
+ typing.Optional[str], # noqa: UP007
27
+ Option('--env', help='Environment name. Default is the current environment from configuration.'),
28
+ ] = None,
29
+ ) -> None:
30
+ """
31
+ Updates an existing external connection in your Cloud Server app.
32
+ """
33
+ from amsdal.errors import AmsdalCloudError
34
+ from amsdal.manager import AmsdalManager
35
+ from amsdal.manager import AsyncAmsdalManager
36
+ from amsdal_utils.config.manager import AmsdalConfigManager
37
+
38
+ from amsdal_cli.commands.build.services.builder import AppBuilder
39
+ from amsdal_cli.commands.cloud.environments.utils import get_current_env
40
+ from amsdal_cli.utils.cli_config import CliConfig
41
+ from amsdal_cli.utils.text import rich_error
42
+ from amsdal_cli.utils.text import rich_highlight
43
+ from amsdal_cli.utils.text import rich_info
44
+ from amsdal_cli.utils.text import rich_success
45
+
46
+ cli_config: CliConfig = ctx.meta['config']
47
+ env_name = env_name or get_current_env(cli_config)
48
+
49
+ # Validate that at least one update parameter is provided
50
+ if not backend and (not credentials or len(credentials) == 0):
51
+ rprint(rich_error('No updates specified. Provide --backend or --credential.'))
52
+ raise typer.Exit(1)
53
+
54
+ # Parse credentials if provided
55
+ credentials_dict = None
56
+ if credentials:
57
+ try:
58
+ credentials_dict = parse_credentials(credentials)
59
+ except typer.BadParameter as e:
60
+ rprint(rich_error(str(e)))
61
+ raise typer.Exit(1) from e
62
+
63
+ if cli_config.verbose:
64
+ update_info = []
65
+ if backend:
66
+ update_info.append(f'backend to {rich_highlight(backend)}')
67
+ if credentials_dict:
68
+ update_info.append('credentials')
69
+ rprint(
70
+ rich_info(
71
+ f'Updating external connection {rich_highlight(connection_name)} '
72
+ f'({", ".join(update_info)}) '
73
+ f'in environment: {rich_highlight(env_name)}'
74
+ )
75
+ )
76
+
77
+ with tempfile.TemporaryDirectory() as _temp_dir:
78
+ output_path: Path = Path(_temp_dir)
79
+
80
+ app_builder = AppBuilder(
81
+ cli_config=cli_config,
82
+ config_path=cli_config.config_path,
83
+ )
84
+ app_builder.build(output_path, is_silent=True)
85
+ manager: AsyncAmsdalManager | AmsdalManager
86
+
87
+ manager = AsyncAmsdalManager() if AmsdalConfigManager().get_config().async_mode else AmsdalManager()
88
+
89
+ manager.authenticate()
90
+
91
+ try:
92
+ manager.cloud_actions_manager.update_external_connection(
93
+ connection_name=connection_name,
94
+ env_name=env_name,
95
+ backend=backend,
96
+ credentials=credentials_dict,
97
+ application_uuid=cli_config.application_uuid,
98
+ application_name=cli_config.application_name,
99
+ )
100
+ except AmsdalCloudError as e:
101
+ rprint(rich_error(str(e)))
102
+ raise typer.Exit(1) from e
103
+
104
+ rprint(rich_success(f'External connection {rich_highlight(connection_name)} updated successfully.'))
@@ -1,4 +1,4 @@
1
- from enum import Enum
1
+ from enum import StrEnum
2
2
 
3
3
  MODEL_JSON_FILE = 'model.json'
4
4
  MODEL_PY_FILE = 'model.py'
@@ -6,7 +6,7 @@ FIXTURES_JSON_FILE = 'fixtures.json'
6
6
  FIXTURES = 'fixtures'
7
7
 
8
8
 
9
- class HookName(str, Enum):
9
+ class HookName(StrEnum):
10
10
  """
11
11
  Enum representing different hook names used in the application lifecycle.
12
12
 
@@ -31,7 +31,7 @@ class HookName(str, Enum):
31
31
  POST_DELETE = 'post_delete'
32
32
 
33
33
 
34
- class ModifierName(str, Enum):
34
+ class ModifierName(StrEnum):
35
35
  """
36
36
  Enum representing different modifier names used in the application.
37
37
 
@@ -46,7 +46,7 @@ class ModifierName(str, Enum):
46
46
  VERSION_NAME = 'version_name'
47
47
 
48
48
 
49
- class AttributeType(str, Enum):
49
+ class AttributeType(StrEnum):
50
50
  """
51
51
  Enum representing different attribute types used in the application.
52
52
 
@@ -69,7 +69,7 @@ class AttributeType(str, Enum):
69
69
  DICT = 'dict'
70
70
 
71
71
 
72
- class JsonType(str, Enum):
72
+ class JsonType(StrEnum):
73
73
  """
74
74
  Enum representing different JSON types used in the application.
75
75
 
@@ -90,7 +90,7 @@ class JsonType(str, Enum):
90
90
  DICT = 'dictionary'
91
91
 
92
92
 
93
- class OptionName(str, Enum):
93
+ class OptionName(StrEnum):
94
94
  """
95
95
  Enum representing different option names used in the application.
96
96
 
@@ -107,7 +107,7 @@ class OptionName(str, Enum):
107
107
  UNIQUE = 'unique'
108
108
 
109
109
 
110
- class TestType(str, Enum):
110
+ class TestType(StrEnum):
111
111
  """
112
112
  Enum representing different test types used in the application.
113
113
 
@@ -118,7 +118,7 @@ class TestType(str, Enum):
118
118
  UNIT = 'unit'
119
119
 
120
120
 
121
- class TestDataType(str, Enum):
121
+ class TestDataType(StrEnum):
122
122
  """
123
123
  Enum representing different test data types used in the application.
124
124
 
@@ -1,7 +1,7 @@
1
- from enum import Enum
1
+ from enum import StrEnum
2
2
 
3
3
 
4
- class RestoreType(str, Enum):
4
+ class RestoreType(StrEnum):
5
5
  """
6
6
  Restore type for CLI `restore` command.
7
7
 
@@ -1,5 +1,5 @@
1
1
  import re
2
- from enum import Enum
2
+ from enum import StrEnum
3
3
  from pathlib import Path
4
4
 
5
5
  from pydantic import BaseModel
@@ -10,7 +10,7 @@ from amsdal_cli.utils.vcs.enums import VCSOptions
10
10
  APPLICATION_UUID_PATTERN = re.compile(r'^[a-zA-Z][a-zA-Z0-9]{31}$')
11
11
 
12
12
 
13
- class ModelsFormat(str, Enum):
13
+ class ModelsFormat(StrEnum):
14
14
  JSON = 'json'
15
15
  PY = 'py'
16
16
 
@@ -1,5 +1,5 @@
1
- from enum import Enum
1
+ from enum import StrEnum
2
2
 
3
3
 
4
- class VCSOptions(str, Enum):
4
+ class VCSOptions(StrEnum):
5
5
  git = 'git'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: amsdal_cli
3
- Version: 0.5.9
3
+ Version: 0.6.0
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/
@@ -122,7 +122,7 @@ Classifier: Programming Language :: Python :: 3.13
122
122
  Classifier: Programming Language :: Python :: Implementation :: CPython
123
123
  Classifier: Programming Language :: Python :: Implementation :: PyPy
124
124
  Requires-Python: <3.14,>=3.11
125
- Requires-Dist: amsdal-server==0.5.*
125
+ Requires-Dist: amsdal-server>=0.5.0
126
126
  Requires-Dist: click<8.2.0
127
127
  Requires-Dist: faker==27.*
128
128
  Requires-Dist: gitpython~=3.1
@@ -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=6kYLhdHkt8K7kGaoPcOypmOiRuisFHUqVenu6fa0rn8,124
2
+ amsdal_cli/__about__.py,sha256=L9I3u2z3UsLTmwP99KJ8u9WMvIGgp6dH1-e7eZsHvlE,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
@@ -48,14 +48,14 @@ amsdal_cli/commands/build/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
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
50
50
  amsdal_cli/commands/ci_cd/command.py,sha256=REhNCbCet1cQuDLzt6q4ain4MrUitRyZW5OtlwZ6sic,1115
51
- amsdal_cli/commands/ci_cd/constants.py,sha256=lJzWXv6f-ewrTPiqktE3-7oDRbWL22hmmf5wegxlIkk,301
51
+ amsdal_cli/commands/ci_cd/constants.py,sha256=r02mjhz9-S7bTjn72MqFNK_iG3TN98FZUe7s22tok0w,302
52
52
  amsdal_cli/commands/ci_cd/templates/github.yml,sha256=e6RUSyqpwMncdpQOwOsYky646bpI0EKJ08FGXK1bP3o,600
53
53
  amsdal_cli/commands/clean/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
54
  amsdal_cli/commands/clean/command.py,sha256=a4h0ZB7B9pRSyUaJF5d1eD33cwgvmexm_z8W3Ws71_Q,934
55
55
  amsdal_cli/commands/cloud/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  amsdal_cli/commands/cloud/app.py,sha256=PKtcnIoByDMn0vGPSQrr9lfhg90Za2S2X9Z0C-zM430,174
57
- amsdal_cli/commands/cloud/command.py,sha256=imgV1E-LeBXR3Ax11tRuSVVWAvNpigeJSa87xv0G0EY,524
58
- amsdal_cli/commands/cloud/enums.py,sha256=mQJzdRDSeWgm9D2zTaXMbG0_EKcQ_ff-79iZE57kAME,612
57
+ amsdal_cli/commands/cloud/command.py,sha256=L5Es2Xukqs6WPdskVC_jDzqroEVUL-HxPUnCzvp1nwo,601
58
+ amsdal_cli/commands/cloud/enums.py,sha256=6XnAdBwPJ-e-aAFgY7hgA3prDLG48qwfE39JbKHEr84,611
59
59
  amsdal_cli/commands/cloud/dependency/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  amsdal_cli/commands/cloud/dependency/app.py,sha256=m2pcB5z3257uU7pKt9XoOdQn7J3PUys6elCs9c9qc2o,230
61
61
  amsdal_cli/commands/cloud/dependency/command.py,sha256=6nri04NBl4fy4FlrZyorY05samMbYU1-2j88m4t2FD4,272
@@ -80,6 +80,14 @@ amsdal_cli/commands/cloud/environments/sub_commands/env_checkout.py,sha256=S4wh-
80
80
  amsdal_cli/commands/cloud/environments/sub_commands/env_delete.py,sha256=4OlTKASd0fKCh7Pv7AUcMJlgiQYVViID1GwlQsmOsgc,1773
81
81
  amsdal_cli/commands/cloud/environments/sub_commands/env_list.py,sha256=7QT-cVuBVQ3ddjlCLVIXf-D9PI1lkaUn96K1THW6A-Q,2789
82
82
  amsdal_cli/commands/cloud/environments/sub_commands/env_new.py,sha256=GzemfFXc623OU1PakUhMAJ8vcJhXopXSghTSMx0joPs,1761
83
+ amsdal_cli/commands/cloud/external_connections/__init__.py,sha256=BFs3y_xV8DORVjNcHoTgFVbZCtpFR6_Q7szDC47juPI,136
84
+ amsdal_cli/commands/cloud/external_connections/app.py,sha256=NHsG9-wnE2COpeD0PJEhmmKnlzK2y6bC9-2qJF_fArI,291
85
+ amsdal_cli/commands/cloud/external_connections/command.py,sha256=o9Q1PXqj16LhGTbRasFpV2X4VHYmqMFOraWLCjhHOGY,328
86
+ amsdal_cli/commands/cloud/external_connections/sub_commands/__init__.py,sha256=QERWNr1qYFlqyDSkBnSjkJ6H-v2ipJxANRZJNtSQJU4,598
87
+ amsdal_cli/commands/cloud/external_connections/sub_commands/connection_add.py,sha256=m3TlrjL-uKUlVzboWtF0zQ3oNAWUcMc9r-aIej-zT1U,4372
88
+ amsdal_cli/commands/cloud/external_connections/sub_commands/connection_list.py,sha256=c-k5OrlTAHmw93werYEc7ykRQMslURTLLPR45u8GAaI,5203
89
+ amsdal_cli/commands/cloud/external_connections/sub_commands/connection_remove.py,sha256=XCxrSPP1vKMoK2asEZKswqdEHUUHe2QVQjq54h1Z8r4,3037
90
+ amsdal_cli/commands/cloud/external_connections/sub_commands/connection_update.py,sha256=68qMy3n4e6RRYn0ew0MNeXuj27H0dAZM8Kb9i9RqI1Y,3883
83
91
  amsdal_cli/commands/cloud/secret/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
92
  amsdal_cli/commands/cloud/secret/app.py,sha256=0GnTkNYAUQwGpccton4Ndy2NYTEGox53I7UteHTXX-Y,224
85
93
  amsdal_cli/commands/cloud/secret/command.py,sha256=mvEjNIiuxowlHkxK_BNOT6dh0cYaaabkuXc4sEj48N0,253
@@ -111,7 +119,7 @@ amsdal_cli/commands/cloud/sub_commands/sync_db.py,sha256=o5yaqcanCDffaAj73jvk7vX
111
119
  amsdal_cli/commands/generate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
120
  amsdal_cli/commands/generate/app.py,sha256=-wEccTR0MhZyj3Y1R2VMyO9RzyGiBSrdWNPQc4ACHqc,201
113
121
  amsdal_cli/commands/generate/command.py,sha256=j6CGiZ_7st-A6qpMTA8XYl15UeONopauQALObVWB2xc,197
114
- amsdal_cli/commands/generate/enums.py,sha256=SQ_ZFW6F9RbvM__Ohz5r3Ld54MlKoxid83kqiVqaZwY,3696
122
+ amsdal_cli/commands/generate/enums.py,sha256=f53uKOxTKn6-z169NZmkTn_dtCNO1RE07hBes_1cZ4U,3685
115
123
  amsdal_cli/commands/generate/sub_commands/__init__.py,sha256=afAyY3hWNb6a4e3lapQX-GsR1SB6EHZi9hwtsWzrPKY,1077
116
124
  amsdal_cli/commands/generate/sub_commands/generate_external_models.py,sha256=QH54RuiRyzFzmiEQsw7mbLk1d_vSbLAPqp4F-oJGwD8,11515
117
125
  amsdal_cli/commands/generate/sub_commands/generate_frontend_config.py,sha256=SkEzx7-mWgrPINwPXGRmYO1SVA0RZojOd6BZFQRmG0Q,2574
@@ -186,7 +194,7 @@ amsdal_cli/commands/register_connection/utils/model_generator.py,sha256=w0vz-i-t
186
194
  amsdal_cli/commands/register_connection/utils/tables.py,sha256=FOwbWOpEw485Leoqe8LXCVY5osGKTKlMqWD9oqosapk,474
187
195
  amsdal_cli/commands/restore/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
188
196
  amsdal_cli/commands/restore/command.py,sha256=yrtF0y3HHmv6RXrMKQCnUIDhEQecDWY7THI_erh6WtA,35976
189
- amsdal_cli/commands/restore/enums.py,sha256=6SiKMRGlSjiLyepfbfQFXGAYqlM6Bkoeko2KscntTUQ,307
197
+ amsdal_cli/commands/restore/enums.py,sha256=oeEs9qTEsW4xgi6gAylFfRD5loFId416wwGkNhsSEkU,308
190
198
  amsdal_cli/commands/serve/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
191
199
  amsdal_cli/commands/serve/command.py,sha256=r27g3mw-P77LfP43ygTk9QbxN7HklWbzrlosjO4hB5c,6537
192
200
  amsdal_cli/commands/serve/utils.py,sha256=ErwuQFRJxo32Y7uLgxtUXYdbPlDCYsh8OfAkqWSblrA,18475
@@ -213,7 +221,7 @@ amsdal_cli/config/main.py,sha256=leYnDJlzhzIAYWOH65QhPLu4zk3ii26ogMBWGYx3uqM,287
213
221
  amsdal_cli/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
214
222
  amsdal_cli/utils/alias_group.py,sha256=v0ninrhZGtZFuJtUH6ZZZ97Irs96nkmIBFm2gY1NdmU,991
215
223
  amsdal_cli/utils/check_versions.py,sha256=4Q3GwY_0xgP_RV_ITuFSDigXds-f1QhqCqkUkn-CSMI,1475
216
- amsdal_cli/utils/cli_config.py,sha256=4trzdWfbvR0jc9rgyahgl7sKGlodRJMEa7NvZAzENRM,2797
224
+ amsdal_cli/utils/cli_config.py,sha256=V2Do7j0zI6_WScDQ55e2OB0kt-ZHXZPfRPe9yfeWhl0,2798
217
225
  amsdal_cli/utils/copier.py,sha256=nKo0-P1AhWIb7IjbndYr3Vnvd_avCa566iIbXLK_5a0,5122
218
226
  amsdal_cli/utils/markdown_patch.py,sha256=RW58pJhRoUYW1fhId70hw8MD2DF-UqXTYfv7JrSGz5I,1816
219
227
  amsdal_cli/utils/render_template.py,sha256=wVjw6K4JZDKz0VElC76Dkgme8di4yfhHIb6hVju9el4,645
@@ -222,10 +230,10 @@ amsdal_cli/utils/text.py,sha256=oAC6H6nhuH_jSdKqbC3vRKpgzs2Qot7DluojWOwh9GU,2489
222
230
  amsdal_cli/utils/vcs/__init__.py,sha256=WWxqfpYP5AK9zGj6_KzKfbQCX6H1FCLqHfQyVnRof9E,513
223
231
  amsdal_cli/utils/vcs/base.py,sha256=jC05ExJZDnyHAsW7_4IDf8gQcYgK4dXq3zNlFIX66T4,422
224
232
  amsdal_cli/utils/vcs/dummy.py,sha256=Lk8MT-b0YlHHUsiXsq5cvmPwcl4jTYdo8piN5_C8ORA,434
225
- amsdal_cli/utils/vcs/enums.py,sha256=tYR9LN1IOr8BZFbSeX_vDlhn8fPl4IU-Yakii8lRDYs,69
233
+ amsdal_cli/utils/vcs/enums.py,sha256=Y18zEM77EGgjmmcO_3qzLHrALrTnXAXngoA0v60PhIw,70
226
234
  amsdal_cli/utils/vcs/git.py,sha256=xHynbZcV6p2D3RFCwu1MGGpV9D7eK-pGUtO8kVexTQM,1269
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,,
235
+ amsdal_cli-0.6.0.dist-info/METADATA,sha256=5yqUFLsn4zXwG7ONR9lrpCg2Aip5ebQt1ggJhytjuMo,57164
236
+ amsdal_cli-0.6.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
237
+ amsdal_cli-0.6.0.dist-info/entry_points.txt,sha256=GC-8LZsD3W--Pd9_gD4W3tw3ZZyPbSvkZ-qWc9Fx0NI,47
238
+ amsdal_cli-0.6.0.dist-info/licenses/LICENSE.txt,sha256=hG-541PFYfNJi9WRZi_hno91UyqNg7YLK8LR3vLblZA,27355
239
+ amsdal_cli-0.6.0.dist-info/RECORD,,