thestage 0.5.46__py3-none-any.whl → 0.5.49__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.
Files changed (179) hide show
  1. thestage/.env +5 -0
  2. thestage/__init__.py +3 -3
  3. thestage/__main__.py +9 -9
  4. thestage/cli_command.py +56 -0
  5. thestage/cli_command_helper.py +51 -0
  6. thestage/color_scheme/color_scheme.py +7 -7
  7. thestage/config/__init__.py +18 -18
  8. thestage/config/config_storage.py +5 -0
  9. thestage/config/env_base.py +7 -7
  10. thestage/controllers/__init__.py +0 -0
  11. thestage/controllers/base_controller.py +67 -63
  12. thestage/controllers/config_controller.py +137 -145
  13. thestage/controllers/container_controller.py +389 -425
  14. thestage/controllers/instance_controller.py +183 -200
  15. thestage/controllers/project_controller.py +802 -872
  16. thestage/controllers/utils_controller.py +32 -28
  17. thestage/debug_main.dist.py +28 -28
  18. thestage/entities/__init__.py +0 -0
  19. thestage/entities/container.py +17 -22
  20. thestage/entities/enums/__init__.py +0 -0
  21. thestage/entities/enums/order_direction_type.py +6 -6
  22. thestage/entities/enums/shell_type.py +7 -7
  23. thestage/entities/enums/tail_output_type.py +6 -6
  24. thestage/entities/enums/yes_no_response.py +7 -7
  25. thestage/entities/file_item.py +27 -27
  26. thestage/entities/project_inference_simulator.py +18 -18
  27. thestage/entities/project_inference_simulator_model.py +16 -16
  28. thestage/entities/project_task.py +19 -19
  29. thestage/entities/rented_instance.py +19 -24
  30. thestage/entities/self_hosted_instance.py +18 -20
  31. thestage/exceptions/__init__.py +0 -0
  32. thestage/exceptions/auth_exception.py +6 -6
  33. thestage/exceptions/base_exception.py +13 -13
  34. thestage/exceptions/business_logic_exception.py +6 -6
  35. thestage/exceptions/config_exception.py +6 -6
  36. thestage/exceptions/file_system_exception.py +6 -6
  37. thestage/exceptions/git_access_exception.py +17 -17
  38. thestage/exceptions/remote_server_exception.py +24 -24
  39. thestage/git/ProgressPrinter.py +22 -22
  40. thestage/helpers/__init__.py +0 -0
  41. thestage/helpers/error_handler.py +115 -115
  42. thestage/helpers/exception_hook.py +14 -0
  43. thestage/helpers/logger/__init__.py +0 -0
  44. thestage/helpers/logger/app_logger.py +50 -51
  45. thestage/helpers/ssh_util.py +38 -38
  46. thestage/i18n/en_GB/messages.po +947 -947
  47. thestage/i18n/translation.py +9 -9
  48. thestage/main.py +36 -24
  49. thestage/services/.env +6 -6
  50. thestage/services/__init__.py +0 -0
  51. thestage/services/abstract_mapper.py +9 -9
  52. thestage/services/abstract_service.py +87 -127
  53. thestage/services/app_config_service.py +52 -51
  54. thestage/services/clients/__init__.py +0 -0
  55. thestage/services/clients/git/__init__.py +0 -0
  56. thestage/services/clients/git/git_client.py +433 -331
  57. thestage/services/clients/thestage_api/__init__.py +0 -0
  58. thestage/services/clients/thestage_api/api_client.py +718 -734
  59. thestage/services/clients/thestage_api/core/api_client_core.py +108 -25
  60. thestage/services/clients/thestage_api/core/http_client_exception.py +12 -12
  61. thestage/services/clients/thestage_api/dtos/__init__.py +0 -0
  62. thestage/services/clients/thestage_api/dtos/base_response.py +13 -13
  63. thestage/services/clients/thestage_api/dtos/cloud_provider_region.py +19 -19
  64. thestage/services/clients/thestage_api/dtos/container_param_request.py +11 -11
  65. thestage/services/clients/thestage_api/dtos/container_response.py +67 -67
  66. thestage/services/clients/thestage_api/dtos/docker_container_assigned_device.py +10 -10
  67. thestage/services/clients/thestage_api/dtos/docker_container_controller/docker_container_list_request.py +13 -13
  68. thestage/services/clients/thestage_api/dtos/docker_container_controller/docker_container_list_response.py +13 -13
  69. thestage/services/clients/thestage_api/dtos/docker_container_mapping.py +10 -10
  70. thestage/services/clients/thestage_api/dtos/entity_filter_request.py +14 -14
  71. thestage/services/clients/thestage_api/dtos/enums/__init__.py +0 -0
  72. thestage/services/clients/thestage_api/dtos/enums/container_pending_action.py +10 -10
  73. thestage/services/clients/thestage_api/dtos/enums/container_status.py +17 -17
  74. thestage/services/clients/thestage_api/dtos/enums/cpu_type.py +8 -8
  75. thestage/services/clients/thestage_api/dtos/enums/currency_type.py +10 -10
  76. thestage/services/clients/thestage_api/dtos/enums/daemon_status.py +9 -9
  77. thestage/services/clients/thestage_api/dtos/enums/disk_type.py +7 -7
  78. thestage/services/clients/thestage_api/dtos/enums/drive_type.py +7 -7
  79. thestage/services/clients/thestage_api/dtos/enums/gpu_name.py +8 -8
  80. thestage/services/clients/thestage_api/dtos/enums/inference_model_status.py +9 -9
  81. thestage/services/clients/thestage_api/dtos/enums/inference_simulator_status.py +15 -15
  82. thestage/services/clients/thestage_api/dtos/enums/instance_rented_status.py +17 -17
  83. thestage/services/clients/thestage_api/dtos/enums/instance_type.py +7 -7
  84. thestage/services/clients/thestage_api/dtos/enums/location_region.py +11 -11
  85. thestage/services/clients/thestage_api/dtos/enums/power_status.py +10 -10
  86. thestage/services/clients/thestage_api/dtos/enums/provider_name.py +11 -11
  87. thestage/services/clients/thestage_api/dtos/enums/selfhosted_status.py +10 -10
  88. thestage/services/clients/thestage_api/dtos/enums/task_execution_status.py +12 -12
  89. thestage/services/clients/thestage_api/dtos/enums/task_status.py +12 -12
  90. thestage/services/clients/thestage_api/dtos/frontend_status.py +10 -10
  91. thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_instance_request.py +13 -13
  92. thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_instance_response.py +13 -13
  93. thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_sagemaker_request.py +12 -12
  94. thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_sagemaker_response.py +12 -12
  95. thestage/services/clients/thestage_api/dtos/inference_controller/get_inference_simulator_request.py +10 -10
  96. thestage/services/clients/thestage_api/dtos/inference_controller/get_inference_simulator_response.py +13 -13
  97. thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_list_for_project_request.py +14 -14
  98. thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_list_for_project_response.py +12 -12
  99. thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_model_list_for_project_request.py +12 -12
  100. thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_model_list_for_project_response.py +13 -13
  101. thestage/services/clients/thestage_api/dtos/inference_simulator_model_response.py +11 -11
  102. thestage/services/clients/thestage_api/dtos/inference_simulator_response.py +11 -11
  103. thestage/services/clients/thestage_api/dtos/installed_service.py +17 -17
  104. thestage/services/clients/thestage_api/dtos/instance_detected_gpus.py +20 -20
  105. thestage/services/clients/thestage_api/dtos/instance_rented_response.py +71 -71
  106. thestage/services/clients/thestage_api/dtos/logging_controller/docker_container_log_stream_request.py +7 -7
  107. thestage/services/clients/thestage_api/dtos/logging_controller/log_polling_request.py +13 -13
  108. thestage/services/clients/thestage_api/dtos/logging_controller/log_polling_response.py +14 -14
  109. thestage/services/clients/thestage_api/dtos/logging_controller/task_log_stream_request.py +7 -7
  110. thestage/services/clients/thestage_api/dtos/logging_controller/user_logs_query_request.py +21 -21
  111. thestage/services/clients/thestage_api/dtos/logging_controller/user_logs_query_response.py +14 -14
  112. thestage/services/clients/thestage_api/dtos/paginated_entity_list.py +11 -11
  113. thestage/services/clients/thestage_api/dtos/pagination_data.py +10 -10
  114. thestage/services/clients/thestage_api/dtos/price_definition.py +14 -14
  115. thestage/services/clients/thestage_api/dtos/project_controller/project_get_deploy_ssh_key_request.py +7 -7
  116. thestage/services/clients/thestage_api/dtos/project_controller/project_get_deploy_ssh_key_response.py +10 -10
  117. thestage/services/clients/thestage_api/dtos/project_controller/project_push_inference_simulator_model_request.py +8 -8
  118. thestage/services/clients/thestage_api/dtos/project_controller/project_push_inference_simulator_model_response.py +6 -6
  119. thestage/services/clients/thestage_api/dtos/project_controller/project_run_task_request.py +15 -15
  120. thestage/services/clients/thestage_api/dtos/project_controller/project_run_task_response.py +10 -10
  121. thestage/services/clients/thestage_api/dtos/project_controller/project_start_inference_simulator_request.py +13 -14
  122. thestage/services/clients/thestage_api/dtos/project_controller/project_start_inference_simulator_response.py +10 -10
  123. thestage/services/clients/thestage_api/dtos/project_response.py +32 -32
  124. thestage/services/clients/thestage_api/dtos/selfhosted_instance_response.py +56 -56
  125. thestage/services/clients/thestage_api/dtos/sftp_path_helper.py +13 -13
  126. thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_key_to_user_request.py +8 -8
  127. thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_key_to_user_response.py +11 -11
  128. thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_public_key_to_instance_request.py +8 -8
  129. thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_public_key_to_instance_response.py +11 -11
  130. thestage/services/clients/thestage_api/dtos/ssh_key_controller/is_user_has_public_ssh_key_request.py +7 -7
  131. thestage/services/clients/thestage_api/dtos/ssh_key_controller/is_user_has_public_ssh_key_response.py +12 -12
  132. thestage/services/clients/thestage_api/dtos/task_controller/task_list_for_project_request.py +10 -10
  133. thestage/services/clients/thestage_api/dtos/task_controller/task_list_for_project_response.py +12 -12
  134. thestage/services/clients/thestage_api/dtos/task_controller/task_status_localized_map_response.py +9 -9
  135. thestage/services/clients/thestage_api/dtos/task_controller/task_view_response.py +12 -12
  136. thestage/services/clients/thestage_api/dtos/user_controller/user_profile.py +12 -12
  137. thestage/services/clients/thestage_api/dtos/validate_token_response.py +11 -0
  138. thestage/services/config_provider/__init__.py +0 -0
  139. thestage/services/config_provider/config_provider.py +237 -209
  140. thestage/services/connect/connect_service.py +196 -207
  141. thestage/services/connect/dto/remote_server_config.py +9 -9
  142. thestage/services/container/__init__.py +0 -0
  143. thestage/services/container/container_service.py +374 -391
  144. thestage/services/container/mapper/__init__.py +0 -0
  145. thestage/services/container/mapper/container_mapper.py +30 -30
  146. thestage/services/core_files/config_entity.py +26 -20
  147. thestage/services/filesystem_service.py +133 -133
  148. thestage/services/instance/__init__.py +0 -0
  149. thestage/services/instance/instance_service.py +303 -317
  150. thestage/services/instance/mapper/__init__.py +0 -0
  151. thestage/services/instance/mapper/instance_mapper.py +24 -24
  152. thestage/services/instance/mapper/selfhosted_mapper.py +33 -33
  153. thestage/services/logging/byte_print_style.py +5 -5
  154. thestage/services/logging/dto/log_message.py +15 -15
  155. thestage/services/logging/dto/log_type.py +6 -6
  156. thestage/services/logging/exception/log_polling_exception.py +6 -6
  157. thestage/services/logging/logging_constants.py +3 -3
  158. thestage/services/logging/logging_service.py +367 -395
  159. thestage/services/project/__init__.py +0 -0
  160. thestage/services/project/dto/inference_simulator_dto.py +22 -22
  161. thestage/services/project/dto/inference_simulator_model_dto.py +20 -20
  162. thestage/services/project/dto/project_config.py +14 -14
  163. thestage/services/project/mapper/__init__.py +0 -0
  164. thestage/services/project/mapper/project_inference_simulator_mapper.py +21 -21
  165. thestage/services/project/mapper/project_inference_simulator_model_mapper.py +21 -21
  166. thestage/services/project/mapper/project_task_mapper.py +22 -22
  167. thestage/services/project/project_service.py +1260 -1280
  168. thestage/services/remote_server_service.py +609 -610
  169. thestage/services/service_factory.py +97 -103
  170. thestage/services/task/dto/task_dto.py +40 -40
  171. thestage/services/validation_service.py +61 -56
  172. {thestage-0.5.46.dist-info → thestage-0.5.49.dist-info}/LICENSE.txt +12 -12
  173. {thestage-0.5.46.dist-info → thestage-0.5.49.dist-info}/METADATA +3 -4
  174. thestage-0.5.49.dist-info/RECORD +176 -0
  175. {thestage-0.5.46.dist-info → thestage-0.5.49.dist-info}/WHEEL +1 -1
  176. thestage/exceptions/http_error_exception.py +0 -12
  177. thestage/services/clients/thestage_api/core/api_client_abstract.py +0 -91
  178. thestage-0.5.46.dist-info/RECORD +0 -172
  179. {thestage-0.5.46.dist-info → thestage-0.5.49.dist-info}/entry_points.txt +0 -0
@@ -1,9 +1,9 @@
1
- from typing import Optional
2
-
3
- from python_gettext_translations.translations import translate
4
-
5
- from thestage.config import THESTAGE_LOCAL_LANGUAGE
6
-
7
-
8
- def __(original: str, placeholders: Optional[dict] = None) -> str:
9
- return translate(THESTAGE_LOCAL_LANGUAGE, original, placeholders)
1
+ from typing import Optional
2
+
3
+ from python_gettext_translations.translations import translate
4
+
5
+ from thestage.config import THESTAGE_LOCAL_LANGUAGE
6
+
7
+
8
+ def __(original: str, placeholders: Optional[dict] = None) -> str:
9
+ return translate(THESTAGE_LOCAL_LANGUAGE, original, placeholders)
thestage/main.py CHANGED
@@ -1,24 +1,36 @@
1
- from thestage.services.core_files.config_entity import ConfigEntity
2
-
3
- # TODO use this in config_provider
4
- initial_config: ConfigEntity = ConfigEntity()
5
-
6
- def main():
7
- try:
8
- import warnings
9
- warnings.filterwarnings(action='ignore', module='.*paramiko.*')
10
-
11
- from . import __app_name__
12
-
13
- from thestage.controllers import base_controller, container_controller, instance_controller, project_controller, \
14
- config_controller
15
-
16
- base_controller.app.add_typer(project_controller.app, name="project")
17
- base_controller.app.add_typer(container_controller.app, name="container")
18
- base_controller.app.add_typer(instance_controller.app, name="instance")
19
- base_controller.app.add_typer(config_controller.app, name="config")
20
-
21
- import thestage.config
22
- base_controller.app(prog_name=__app_name__)
23
- except KeyboardInterrupt:
24
- print('THESTAGE: Keyboard Interrupt')
1
+ from thestage.helpers import exception_hook
2
+ import traceback
3
+
4
+ from thestage.cli_command_helper import get_command_group_help_panel
5
+ from thestage.helpers.logger.app_logger import app_logger, get_log_path_from_os
6
+ from thestage.services.service_factory import ServiceFactory
7
+ from rich import print
8
+
9
+
10
+ def main():
11
+ service_factory = ServiceFactory()
12
+ config_provider = service_factory.get_config_provider()
13
+ config = config_provider.build_config()
14
+
15
+ try:
16
+ try:
17
+ api_client = service_factory.get_thestage_api_client()
18
+ token_info = api_client.validate_token(config.main.thestage_auth_token)
19
+ config_provider.update_allowed_commands_and_is_token_valid(validate_token_response=token_info)
20
+ except Exception as e:
21
+ app_logger.error(f'{traceback.format_exc()}')
22
+ print('Unexpected error occurred') # TODO inquire what we want here if backend is offline
23
+ print(f'Application logs path: {str(get_log_path_from_os())}')
24
+ return
25
+
26
+ from thestage.controllers import base_controller, container_controller, instance_controller, project_controller, \
27
+ config_controller
28
+
29
+ base_controller.app.add_typer(project_controller.app, name="project", rich_help_panel=get_command_group_help_panel())
30
+ base_controller.app.add_typer(container_controller.app, name="container", rich_help_panel=get_command_group_help_panel())
31
+ base_controller.app.add_typer(instance_controller.app, name="instance", rich_help_panel=get_command_group_help_panel())
32
+ base_controller.app.add_typer(config_controller.app, name="config", rich_help_panel=get_command_group_help_panel())
33
+
34
+ base_controller.app()
35
+ except KeyboardInterrupt:
36
+ print('THESTAGE: Keyboard Interrupt')
thestage/services/.env CHANGED
@@ -1,6 +1,6 @@
1
- THESTAGE_CONFIG_DIR=.thestage
2
- THESTAGE_CONFIG_FILE=config.json
3
- THESTAGE_CLI_ENV=DEV
4
- THESTAGE_API_URL=http://localhost:8100
5
- THESTAGE_API_URL=http://localhost:8100
6
- LOG_FILE=thestage.log
1
+ THESTAGE_CONFIG_DIR=.thestage
2
+ THESTAGE_CONFIG_FILE=config.json
3
+ THESTAGE_CLI_ENV=DEV
4
+ THESTAGE_API_URL=http://localhost:8100
5
+ THESTAGE_API_URL=http://localhost:8100
6
+ LOG_FILE=thestage.log
File without changes
@@ -1,9 +1,9 @@
1
- from abc import ABC, abstractmethod
2
- from typing import Any, Optional, Tuple
3
-
4
-
5
- class AbstractMapper(ABC):
6
-
7
- @abstractmethod
8
- def build_entity(self, item: Any) -> Optional[Any]:
9
- raise NotImplementedError()
1
+ from abc import ABC, abstractmethod
2
+ from typing import Any, Optional, Tuple
3
+
4
+
5
+ class AbstractMapper(ABC):
6
+
7
+ @abstractmethod
8
+ def build_entity(self, item: Any) -> Optional[Any]:
9
+ raise NotImplementedError()
@@ -1,127 +1,87 @@
1
- from abc import ABC
2
- from typing import List, Dict, Any, Optional
3
-
4
- import typer
5
- from tabulate import tabulate
6
- from thestage.services.core_files.config_entity import ConfigEntity
7
- from thestage.helpers.logger.app_logger import app_logger
8
- from thestage.i18n.translation import __
9
- from thestage.services.abstract_mapper import AbstractMapper
10
- from thestage.services.clients.thestage_api.dtos.paginated_entity_list import PaginatedEntityList
11
- from thestage.services.config_provider.config_provider import ConfigProvider
12
-
13
-
14
- class AbstractService(ABC):
15
-
16
- def __init__(
17
- self,
18
- config_provider: ConfigProvider,
19
- ):
20
- self._config_provider = config_provider
21
-
22
- def map_frontend_statuses(self, statuses_mapper: Dict[str, str], frontend: List[str]) -> Optional[List[str]]:
23
-
24
- real_statuses = []
25
-
26
- mapper: Dict[str, List] = {}
27
- for key, value in statuses_mapper.items():
28
-
29
- map_key = value if ' ' not in value else value.replace(' ', '_')
30
- if value not in mapper:
31
- mapper[map_key] = [key]
32
- else:
33
- mapper[map_key].append(key)
34
-
35
- for item in frontend:
36
- if item == 'all':
37
- return []
38
- elif item == 'unknown':
39
- continue
40
- else:
41
- if item in mapper:
42
- real_statuses.extend(mapper[item])
43
- else:
44
- app_logger.error(f'Not found status: {item}')
45
-
46
- return real_statuses
47
-
48
-
49
- # TODO remove recursion
50
- def print(
51
- self,
52
- func_get_data,
53
- func_special_params: Dict[str, Any],
54
- mapper: AbstractMapper,
55
- config: ConfigEntity,
56
- headers: List[str],
57
- row: int = 5,
58
- page: int = 1,
59
- show_index: str = 'always',
60
- max_col_width: List[Optional[int]] = None,
61
- depth: int = 0,
62
- ):
63
- paginated_entity_list: PaginatedEntityList = func_get_data(
64
- config=config,
65
- row=row,
66
- page=page,
67
- **func_special_params,
68
- )
69
-
70
- result = list(map(lambda x: mapper.build_entity(x), paginated_entity_list.entities))
71
-
72
- if result:
73
- raw_data = [list(item.model_dump(
74
- by_alias=True,
75
- ).values()) for item in result]
76
- else:
77
- if depth == 0:
78
- typer.echo(__("No items found"))
79
- else:
80
- typer.echo(__("Listing completed"))
81
- raise typer.Exit(0)
82
-
83
- # tabulate() crashes on any None value, check mappers
84
-
85
- typer.echo(__(
86
- "Current page: %page% | Total pages: %total_pages% | Items per page: %limit%",
87
- {
88
- 'page': str(page),
89
- 'limit': str(row),
90
- 'total_pages': str(paginated_entity_list.pagination_data.total_pages),
91
- }
92
- ))
93
-
94
- typer.echo(tabulate(
95
- raw_data,
96
- headers=headers,
97
- showindex=show_index,
98
- tablefmt="double_grid",
99
- maxcolwidths=max_col_width,
100
- ))
101
-
102
- if page >= paginated_entity_list.pagination_data.total_pages:
103
- typer.echo(__("Listing completed"))
104
- raise typer.Exit(0)
105
-
106
- next_page: int = typer.prompt(
107
- text=__('Go to next page (0 to exit)?'),
108
- default=page + 1,
109
- show_choices=False,
110
- type=int,
111
- show_default=True,
112
- )
113
- if next_page == 0:
114
- raise typer.Exit(0)
115
- else:
116
- self.print(
117
- func_get_data=func_get_data,
118
- func_special_params=func_special_params,
119
- mapper=mapper,
120
- config=config,
121
- headers=headers,
122
- row=row,
123
- page=next_page,
124
- max_col_width=max_col_width,
125
- show_index=show_index,
126
- depth=depth + 1,
127
- )
1
+ from abc import ABC
2
+ from typing import List, Dict, Any, Optional
3
+
4
+ import typer
5
+ from tabulate import tabulate
6
+ from thestage.i18n.translation import __
7
+ from thestage.services.abstract_mapper import AbstractMapper
8
+ from thestage.services.clients.thestage_api.dtos.paginated_entity_list import PaginatedEntityList
9
+
10
+
11
+ class AbstractService(ABC):
12
+ # TODO remove recursion
13
+ def print(
14
+ self,
15
+ func_get_data,
16
+ func_special_params: Dict[str, Any],
17
+ mapper: AbstractMapper,
18
+ headers: List[str],
19
+ row: int = 5,
20
+ page: int = 1,
21
+ show_index: str = 'always',
22
+ max_col_width: List[Optional[int]] = None,
23
+ depth: int = 0,
24
+ ):
25
+ paginated_entity_list: PaginatedEntityList = func_get_data(
26
+ row=row,
27
+ page=page,
28
+ **func_special_params,
29
+ )
30
+
31
+ result = list(map(lambda x: mapper.build_entity(x), paginated_entity_list.entities))
32
+
33
+ if result:
34
+ raw_data = [list(item.model_dump(
35
+ by_alias=True,
36
+ ).values()) for item in result]
37
+ else:
38
+ if depth == 0:
39
+ typer.echo(__("No items found"))
40
+ else:
41
+ typer.echo(__("Listing completed"))
42
+ raise typer.Exit(0)
43
+
44
+ # tabulate() crashes on any None value, check mappers
45
+
46
+ typer.echo(__(
47
+ "Current page: %page% | Total pages: %total_pages% | Items per page: %limit%",
48
+ {
49
+ 'page': str(page),
50
+ 'limit': str(row),
51
+ 'total_pages': str(paginated_entity_list.pagination_data.total_pages),
52
+ }
53
+ ))
54
+
55
+ typer.echo(tabulate(
56
+ raw_data,
57
+ headers=headers,
58
+ showindex=show_index,
59
+ tablefmt="double_grid",
60
+ maxcolwidths=max_col_width,
61
+ ))
62
+
63
+ if page >= paginated_entity_list.pagination_data.total_pages:
64
+ typer.echo(__("Listing completed"))
65
+ raise typer.Exit(0)
66
+
67
+ next_page: int = typer.prompt(
68
+ text=__('Go to next page (0 to exit)?'),
69
+ default=page + 1,
70
+ show_choices=False,
71
+ type=int,
72
+ show_default=True,
73
+ )
74
+ if next_page == 0:
75
+ raise typer.Exit(0)
76
+ else:
77
+ self.print(
78
+ func_get_data=func_get_data,
79
+ func_special_params=func_special_params,
80
+ mapper=mapper,
81
+ headers=headers,
82
+ row=row,
83
+ page=next_page,
84
+ max_col_width=max_col_width,
85
+ show_index=show_index,
86
+ depth=depth + 1,
87
+ )
@@ -1,51 +1,52 @@
1
- import os
2
-
3
- import click
4
- import typer
5
- from thestage.services.core_files.config_entity import ConfigEntity
6
- from thestage.i18n.translation import __
7
- from thestage.entities.enums.yes_no_response import YesOrNoResponse
8
- from thestage.services.config_provider.config_provider import ConfigProvider
9
- from thestage.services.validation_service import ValidationService
10
-
11
-
12
- class AppConfigService:
13
-
14
- __validation_service: ValidationService
15
- __config_provider: ConfigProvider
16
-
17
- def __init__(
18
- self,
19
- validation_service: ValidationService,
20
- config_provider: ConfigProvider,
21
- ):
22
- self.__validation_service = validation_service
23
- self.__config_provider = config_provider
24
-
25
- def app_change_token(
26
- self,
27
- config: ConfigEntity,
28
- token: str,
29
- ):
30
- if config.main.thestage_auth_token:
31
- response: YesOrNoResponse = typer.prompt(
32
- text=__('Do you want to change current token?'),
33
- show_choices=True,
34
- default=YesOrNoResponse.YES.value,
35
- type=click.Choice([r.value for r in YesOrNoResponse]),
36
- show_default=True,
37
- )
38
- if response == YesOrNoResponse.NO:
39
- raise typer.Exit(0)
40
-
41
- config.main.thestage_auth_token = token
42
-
43
- self.__validation_service.check_token(config=config)
44
- self.__config_provider.save_config(config=config)
45
-
46
- @staticmethod
47
- def app_remove_env():
48
- os.unsetenv('THESTAGE_CONFIG_FILE')
49
- os.unsetenv('THESTAGE_API_URL')
50
- os.unsetenv('THESTAGE_LOG_FILE')
51
- os.unsetenv('THESTAGE_AUTH_TOKEN')
1
+ import os
2
+
3
+ import click
4
+ import typer
5
+
6
+ from thestage.services.config_provider.config_provider import ConfigProvider
7
+ from thestage.services.core_files.config_entity import ConfigEntity
8
+ from thestage.i18n.translation import __
9
+ from thestage.entities.enums.yes_no_response import YesOrNoResponse
10
+ from thestage.services.validation_service import ValidationService
11
+
12
+
13
+ class AppConfigService:
14
+
15
+ __validation_service: ValidationService
16
+
17
+ def __init__(
18
+ self,
19
+ validation_service: ValidationService,
20
+ config_provider: ConfigProvider,
21
+ ):
22
+ self.__validation_service = validation_service
23
+ self.__config_provider = config_provider
24
+
25
+ def app_change_token(
26
+ self,
27
+ token: str,
28
+ ):
29
+ config = self.__config_provider.get_config()
30
+
31
+ if config.main.thestage_auth_token:
32
+ response: YesOrNoResponse = typer.prompt(
33
+ text=__('Do you want to change current token?'),
34
+ show_choices=True,
35
+ default=YesOrNoResponse.YES.value,
36
+ type=click.Choice([r.value for r in YesOrNoResponse]),
37
+ show_default=True,
38
+ )
39
+ if response == YesOrNoResponse.NO:
40
+ raise typer.Exit(0)
41
+
42
+ config.main.thestage_auth_token = token
43
+ self.__config_provider.update_config(updated_config=config)
44
+ self.__validation_service.check_token()
45
+ self.__config_provider.save_config()
46
+
47
+ @staticmethod
48
+ def app_remove_env():
49
+ os.unsetenv('THESTAGE_CONFIG_FILE')
50
+ os.unsetenv('THESTAGE_API_URL')
51
+ os.unsetenv('THESTAGE_LOG_FILE')
52
+ os.unsetenv('THESTAGE_AUTH_TOKEN')
File without changes
File without changes