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,103 +1,97 @@
1
- from typing import Optional
2
-
3
- from thestage.services.connect.connect_service import ConnectService
4
- from thestage.services.filesystem_service import FileSystemService
5
- from thestage.services.logging.logging_service import LoggingService
6
- from thestage.services.project.project_service import ProjectService
7
- from thestage.services.remote_server_service import RemoteServerService
8
- from thestage.services.container.container_service import ContainerService
9
- from thestage.services.instance.instance_service import InstanceService
10
- from thestage.services.app_config_service import AppConfigService
11
- from thestage.services.clients.git.git_client import GitLocalClient
12
- from thestage.services.clients.thestage_api.api_client import TheStageApiClient
13
- from thestage.services.config_provider.config_provider import ConfigProvider
14
- from thestage.services.validation_service import ValidationService
15
-
16
-
17
- class ServiceFactory:
18
- __config_provider: Optional[ConfigProvider] = None
19
- __thestage_api_client: Optional[TheStageApiClient] = None
20
- __git_local_client: Optional[GitLocalClient] = None
21
- __file_system_service: Optional[FileSystemService] = None
22
-
23
- def __init__(
24
- self,
25
- config_provider: Optional[ConfigProvider] = None,
26
- ):
27
- self.__config_provider = config_provider
28
-
29
- def get_config_provider(self) -> ConfigProvider:
30
- return self.__config_provider
31
-
32
- def get_validation_service(self, config_provider: Optional[ConfigProvider] = None,) -> ValidationService:
33
- return ValidationService(
34
- thestage_api_client=self.get_thestage_api_client(),
35
- config_provider=config_provider if config_provider else self.__config_provider,
36
- )
37
-
38
- def get_instance_service(self, config_provider: Optional[ConfigProvider] = None) -> InstanceService:
39
- return InstanceService(
40
- thestage_api_client=self.get_thestage_api_client(),
41
- config_provider=config_provider if config_provider else self.__config_provider,
42
- remote_server_service=self.get_remote_server_service(),
43
- )
44
-
45
- def get_container_service(self, config_provider: Optional[ConfigProvider] = None) -> ContainerService:
46
- return ContainerService(
47
- thestage_api_client=self.get_thestage_api_client(),
48
- config_provider=config_provider if config_provider else self.__config_provider,
49
- remote_server_service=self.get_remote_server_service(),
50
- file_system_service=self.get_file_system_service(),
51
- )
52
-
53
- def get_connect_service(self, config_provider: Optional[ConfigProvider] = None) -> ConnectService:
54
- return ConnectService(
55
- config_provider=config_provider if config_provider else self.__config_provider,
56
- thestage_api_client=self.get_thestage_api_client(),
57
- instance_service=self.get_instance_service(),
58
- container_service=self.get_container_service(),
59
- logging_service=self.get_logging_service(),
60
- )
61
-
62
- def get_project_service(self, config_provider: Optional[ConfigProvider] = None) -> ProjectService:
63
- return ProjectService(
64
- thestage_api_client=self.get_thestage_api_client(),
65
- config_provider=config_provider if config_provider else self.__config_provider,
66
- remote_server_service=self.get_remote_server_service(),
67
- file_system_service=self.get_file_system_service(),
68
- git_local_client=self.get_git_local_client(),
69
- )
70
-
71
- def get_remote_server_service(self) -> RemoteServerService:
72
- return RemoteServerService(
73
- config_provider=self.get_config_provider(),
74
- file_system_service=self.get_file_system_service(),
75
- )
76
-
77
- def get_thestage_api_client(self) -> TheStageApiClient:
78
- if not self.__thestage_api_client:
79
- self.__thestage_api_client = TheStageApiClient(api_url=self.__config_provider.get_full_config().main.thestage_api_url)
80
- return self.__thestage_api_client
81
-
82
- def get_git_local_client(self):
83
- if not self.__git_local_client:
84
- self.__git_local_client = GitLocalClient(file_system_service=self.get_file_system_service())
85
- return self.__git_local_client
86
-
87
- def get_file_system_service(self) -> FileSystemService:
88
- if not self.__file_system_service:
89
- self.__file_system_service = FileSystemService()
90
- return self.__file_system_service
91
-
92
- def get_app_config_service(self, config_provider: Optional[ConfigProvider] = None,) -> AppConfigService:
93
- return AppConfigService(
94
- validation_service=self.get_validation_service(config_provider),
95
- config_provider=config_provider if config_provider else self.__config_provider,
96
- )
97
-
98
- def get_logging_service(self, config_provider: Optional[ConfigProvider] = None) -> LoggingService:
99
- return LoggingService(
100
- thestage_api_client=self.get_thestage_api_client(),
101
- config_provider=config_provider if config_provider else self.__config_provider,
102
- )
103
-
1
+ from typing import Optional
2
+
3
+ from thestage.services.config_provider.config_provider import ConfigProvider
4
+ from thestage.services.connect.connect_service import ConnectService
5
+ from thestage.services.filesystem_service import FileSystemService
6
+ from thestage.services.logging.logging_service import LoggingService
7
+ from thestage.services.project.project_service import ProjectService
8
+ from thestage.services.remote_server_service import RemoteServerService
9
+ from thestage.services.container.container_service import ContainerService
10
+ from thestage.services.instance.instance_service import InstanceService
11
+ from thestage.services.app_config_service import AppConfigService
12
+ from thestage.services.clients.git.git_client import GitLocalClient
13
+ from thestage.services.clients.thestage_api.api_client import TheStageApiClient
14
+ from thestage.services.validation_service import ValidationService
15
+
16
+
17
+ class ServiceFactory:
18
+ __thestage_api_client: Optional[TheStageApiClient] = None
19
+ __git_local_client: Optional[GitLocalClient] = None
20
+ __file_system_service: Optional[FileSystemService] = None
21
+ __config_provider: Optional[ConfigProvider] = None
22
+
23
+
24
+ def get_validation_service(self) -> ValidationService:
25
+ return ValidationService(
26
+ thestage_api_client=self.get_thestage_api_client(),
27
+ config_provider=self.get_config_provider(),
28
+ )
29
+
30
+ def get_instance_service(self) -> InstanceService:
31
+ return InstanceService(
32
+ thestage_api_client=self.get_thestage_api_client(),
33
+ remote_server_service=self.get_remote_server_service(),
34
+ config_provider=self.get_config_provider(),
35
+ )
36
+
37
+ def get_container_service(self) -> ContainerService:
38
+ return ContainerService(
39
+ thestage_api_client=self.get_thestage_api_client(),
40
+ remote_server_service=self.get_remote_server_service(),
41
+ file_system_service=self.get_file_system_service(),
42
+ config_provider=self.get_config_provider(),
43
+ )
44
+
45
+ def get_connect_service(self) -> ConnectService:
46
+ return ConnectService(
47
+ thestage_api_client=self.get_thestage_api_client(),
48
+ instance_service=self.get_instance_service(),
49
+ container_service=self.get_container_service(),
50
+ logging_service=self.get_logging_service(),
51
+ )
52
+
53
+ def get_project_service(self) -> ProjectService:
54
+ return ProjectService(
55
+ thestage_api_client=self.get_thestage_api_client(),
56
+ remote_server_service=self.get_remote_server_service(),
57
+ file_system_service=self.get_file_system_service(),
58
+ git_local_client=self.get_git_local_client(),
59
+ config_provider=self.get_config_provider(),
60
+ )
61
+
62
+ def get_remote_server_service(self) -> RemoteServerService:
63
+ return RemoteServerService(
64
+ file_system_service=self.get_file_system_service(),
65
+ config_provider=self.get_config_provider(),
66
+ )
67
+
68
+ def get_thestage_api_client(self) -> TheStageApiClient:
69
+ if not self.__thestage_api_client:
70
+ self.__thestage_api_client = TheStageApiClient(config_provider=self.get_config_provider())
71
+ return self.__thestage_api_client
72
+
73
+ def get_git_local_client(self):
74
+ if not self.__git_local_client:
75
+ self.__git_local_client = GitLocalClient(file_system_service=self.get_file_system_service())
76
+ return self.__git_local_client
77
+
78
+ def get_file_system_service(self) -> FileSystemService:
79
+ if not self.__file_system_service:
80
+ self.__file_system_service = FileSystemService()
81
+ return self.__file_system_service
82
+
83
+ def get_app_config_service(self) -> AppConfigService:
84
+ return AppConfigService(
85
+ config_provider=self.get_config_provider(),
86
+ validation_service=self.get_validation_service(),
87
+ )
88
+
89
+ def get_logging_service(self) -> LoggingService:
90
+ return LoggingService(
91
+ thestage_api_client=self.get_thestage_api_client(),
92
+ )
93
+
94
+ def get_config_provider(self) -> ConfigProvider:
95
+ if not self.__config_provider:
96
+ self.__config_provider = ConfigProvider(self.get_file_system_service())
97
+ return self.__config_provider
@@ -1,40 +1,40 @@
1
- from typing import Optional
2
-
3
- from pydantic import BaseModel, ConfigDict, Field
4
-
5
- from thestage.services.clients.thestage_api.dtos.container_response import DockerContainerDto
6
- from thestage.services.clients.thestage_api.dtos.frontend_status import FrontendStatusDto
7
- from thestage.services.clients.thestage_api.dtos.instance_rented_response import InstanceRentedDto
8
- from thestage.services.clients.thestage_api.dtos.selfhosted_instance_response import SelfHostedInstanceDto
9
-
10
-
11
- class TaskDto(BaseModel):
12
- model_config = ConfigDict(use_enum_values=True)
13
-
14
- id: Optional[int] = Field(None, alias='id')
15
- instance_rented_id: Optional[int] = Field(None, alias='instanceRentedId')
16
- selfhosted_instance_id: Optional[int] = Field(None, alias='selfhostedInstanceId')
17
- docker_container_id: Optional[int] = Field(None, alias='dockerContainerId')
18
- description: Optional[str] = Field(None, alias='description')
19
- title: Optional[str] = Field(None, alias='title')
20
- source_path: Optional[str] = Field(None, alias='sourcePath')
21
- source_target_path: Optional[str] = Field(None, alias='sourceTargetPath')
22
- data_path: Optional[str] = Field(None, alias='dataPath')
23
- result_destination_path: Optional[str] = Field(None, alias='resultDestinationPath')
24
- run_command: Optional[str] = Field(None, alias='runCommand')
25
- commit_hash: Optional[str] = Field(None, alias='commitHash')
26
- ordinal_number_for_sketch: Optional[int] = Field(None, alias='ordinalNumberForSketch')
27
- user_id: Optional[int] = Field(None, alias='userId')
28
- frontend_status: FrontendStatusDto = Field(None, alias='frontendStatus')
29
- created_at: Optional[str] = Field(None, alias='createdAt')
30
- updated_at: Optional[str] = Field(None, alias='updatedAt')
31
- started_at: Optional[str] = Field(None, alias='startedAt')
32
- finished_at: Optional[str] = Field(None, alias='finishedAt')
33
- client_id: Optional[int] = Field(None, alias='clientId')
34
-
35
- instance_rented: Optional[InstanceRentedDto] = Field(None, alias='instanceRented')
36
- selfhosted_instance: Optional[SelfHostedInstanceDto] = Field(None, alias='selfhostedInstance')
37
- docker_container: Optional[DockerContainerDto] = Field(None, alias='dockerContainer')
38
-
39
- exit_code: Optional[int] = Field(None, alias='exitCode')
40
- failure_reason: Optional[str] = Field(None, alias='failureReason')
1
+ from typing import Optional
2
+
3
+ from pydantic import BaseModel, ConfigDict, Field
4
+
5
+ from thestage.services.clients.thestage_api.dtos.container_response import DockerContainerDto
6
+ from thestage.services.clients.thestage_api.dtos.frontend_status import FrontendStatusDto
7
+ from thestage.services.clients.thestage_api.dtos.instance_rented_response import InstanceRentedDto
8
+ from thestage.services.clients.thestage_api.dtos.selfhosted_instance_response import SelfHostedInstanceDto
9
+
10
+
11
+ class TaskDto(BaseModel):
12
+ model_config = ConfigDict(use_enum_values=True)
13
+
14
+ id: Optional[int] = Field(None, alias='id')
15
+ instance_rented_id: Optional[int] = Field(None, alias='instanceRentedId')
16
+ selfhosted_instance_id: Optional[int] = Field(None, alias='selfhostedInstanceId')
17
+ docker_container_id: Optional[int] = Field(None, alias='dockerContainerId')
18
+ description: Optional[str] = Field(None, alias='description')
19
+ title: Optional[str] = Field(None, alias='title')
20
+ source_path: Optional[str] = Field(None, alias='sourcePath')
21
+ source_target_path: Optional[str] = Field(None, alias='sourceTargetPath')
22
+ data_path: Optional[str] = Field(None, alias='dataPath')
23
+ result_destination_path: Optional[str] = Field(None, alias='resultDestinationPath')
24
+ run_command: Optional[str] = Field(None, alias='runCommand')
25
+ commit_hash: Optional[str] = Field(None, alias='commitHash')
26
+ ordinal_number_for_sketch: Optional[int] = Field(None, alias='ordinalNumberForSketch')
27
+ user_id: Optional[int] = Field(None, alias='userId')
28
+ frontend_status: FrontendStatusDto = Field(None, alias='frontendStatus')
29
+ created_at: Optional[str] = Field(None, alias='createdAt')
30
+ updated_at: Optional[str] = Field(None, alias='updatedAt')
31
+ started_at: Optional[str] = Field(None, alias='startedAt')
32
+ finished_at: Optional[str] = Field(None, alias='finishedAt')
33
+ client_id: Optional[int] = Field(None, alias='clientId')
34
+
35
+ instance_rented: Optional[InstanceRentedDto] = Field(None, alias='instanceRented')
36
+ selfhosted_instance: Optional[SelfHostedInstanceDto] = Field(None, alias='selfhostedInstance')
37
+ docker_container: Optional[DockerContainerDto] = Field(None, alias='dockerContainer')
38
+
39
+ exit_code: Optional[int] = Field(None, alias='exitCode')
40
+ failure_reason: Optional[str] = Field(None, alias='failureReason')
@@ -1,56 +1,61 @@
1
- import typer
2
-
3
- from thestage.i18n.translation import __
4
- from thestage.services.config_provider.config_provider import ConfigProvider
5
- from thestage.services.clients.thestage_api.api_client import TheStageApiClient
6
- from thestage.services.core_files.config_entity import ConfigEntity
7
-
8
-
9
- class ValidationService:
10
- _thestage_api_client: TheStageApiClient = None
11
-
12
- def __init__(
13
- self,
14
- thestage_api_client: TheStageApiClient,
15
- config_provider: ConfigProvider,
16
- ):
17
- self._thestage_api_client = thestage_api_client
18
- self._config_provider = config_provider
19
-
20
-
21
- def check_token(
22
- self,
23
- config: ConfigEntity,
24
- ):
25
- token = config.main.thestage_auth_token
26
- if not token:
27
- token: str = typer.prompt(
28
- text=f'Authenticate using valid TheStage AI API token ({config.main.thestage_api_url})',
29
- show_choices=False,
30
- type=str,
31
- show_default=False,
32
- )
33
-
34
- # TODO this fails with 503 error - AttributeError("'bytes' object has no attribute 'text'") from _parse_api_response method in core
35
- is_valid: bool = False
36
- if token:
37
- is_valid = self._thestage_api_client.validate_token(token=token)
38
- if not is_valid:
39
- typer.echo(__(
40
- 'API token is invalid: generate API token using TheStage AI WebApp'
41
- ))
42
- raise typer.Exit(1)
43
-
44
- config.main.thestage_auth_token = token
45
-
46
-
47
- @staticmethod
48
- def is_present_token(config: ConfigEntity) -> bool:
49
- present_token = True
50
- if not config:
51
- present_token = False
52
- else:
53
- if not config.main.thestage_auth_token:
54
- present_token = False
55
-
56
- return present_token
1
+ import typer
2
+
3
+ from thestage.i18n.translation import __
4
+ # from thestage.main import update_allowed_commands
5
+ from thestage.services.clients.thestage_api.api_client import TheStageApiClient
6
+ from thestage.services.config_provider.config_provider import ConfigProvider
7
+ from thestage.services.core_files.config_entity import ConfigEntity
8
+
9
+
10
+ class ValidationService:
11
+ _thestage_api_client: TheStageApiClient = None
12
+ _config_provider: ConfigProvider = None
13
+
14
+ def __init__(
15
+ self,
16
+ thestage_api_client: TheStageApiClient,
17
+ config_provider: ConfigProvider,
18
+ ):
19
+ self._thestage_api_client = thestage_api_client
20
+ self._config_provider = config_provider
21
+
22
+
23
+ def check_token(self):
24
+ config = self._config_provider.get_config()
25
+ token = config.main.thestage_auth_token
26
+ if not token:
27
+ token: str = typer.prompt(
28
+ text=f'Authenticate using valid TheStage AI API token ({config.main.thestage_api_url})',
29
+ show_choices=False,
30
+ type=str,
31
+ show_default=False,
32
+ )
33
+
34
+ # TODO this fails with 503 error - AttributeError("'bytes' object has no attribute 'text'") from _parse_api_response method in core
35
+ if not token:
36
+ return
37
+
38
+ token_validate_response = self._thestage_api_client.validate_token(token=token)
39
+ is_valid = token_validate_response.is_success if token_validate_response else False
40
+ if not is_valid:
41
+ typer.echo(__(
42
+ 'API token is invalid: generate API token using TheStage AI WebApp'
43
+ ))
44
+ raise typer.Exit(1)
45
+
46
+ if config.main.thestage_auth_token != token:
47
+ config.main.thestage_auth_token = token
48
+ self._config_provider.update_config(updated_config=config)
49
+ self._config_provider.update_allowed_commands_and_is_token_valid(validate_token_response=token_validate_response)
50
+
51
+
52
+ @staticmethod
53
+ def is_present_token(config: ConfigEntity) -> bool:
54
+ present_token = True
55
+ if not config:
56
+ present_token = False
57
+ else:
58
+ if not config.main.thestage_auth_token:
59
+ present_token = False
60
+
61
+ return present_token
@@ -1,13 +1,13 @@
1
- Copyright 2024 TheStage AI. All rights reserved.
2
-
3
- Licensed under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License.
5
- You may obtain a copy of the License at
6
-
7
- http://www.apache.org/licenses/LICENSE-2.0
8
-
9
- Unless required by applicable law or agreed to in writing, software
10
- distributed under the License is distributed on an "AS IS" BASIS,
11
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- See the License for the specific language governing permissions and
1
+ Copyright 2024 TheStage AI. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
13
  limitations under the License.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.1
2
2
  Name: thestage
3
- Version: 0.5.46
3
+ Version: 0.5.49
4
4
  Summary:
5
5
  Author: TheStage AI team
6
6
  Author-email: hello@thestage.ai
@@ -10,12 +10,11 @@ Classifier: Programming Language :: Python :: 3.9
10
10
  Classifier: Programming Language :: Python :: 3.10
11
11
  Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
- Classifier: Programming Language :: Python :: 3.13
14
13
  Requires-Dist: aioconsole (>=0.8.0,<0.9.0)
15
14
  Requires-Dist: boto3 (>=1.35.80,<2.0.0)
16
15
  Requires-Dist: gitpython (>=3.1.40,<4.0.0)
17
16
  Requires-Dist: httpx (>=0.27.2,<0.28.0)
18
- Requires-Dist: paramiko (>=3.4.0,<4.0.0)
17
+ Requires-Dist: paramiko (>=3.5.1,<4.0.0)
19
18
  Requires-Dist: pydantic (>=2.4.2,<3.0.0)
20
19
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
21
20
  Requires-Dist: python-gettext-translations (>=1.1.0,<2.0.0)