thestage 0.5.40__tar.gz → 0.5.42__tar.gz

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 (174) hide show
  1. {thestage-0.5.40 → thestage-0.5.42}/PKG-INFO +1 -1
  2. {thestage-0.5.40 → thestage-0.5.42}/pyproject.toml +1 -1
  3. thestage-0.5.42/thestage/.env +6 -0
  4. {thestage-0.5.40 → thestage-0.5.42}/thestage/__init__.py +1 -1
  5. {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/config_controller.py +3 -1
  6. {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/project_controller.py +40 -0
  7. {thestage-0.5.40 → thestage-0.5.42}/thestage/helpers/error_handler.py +2 -1
  8. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/git/git_client.py +5 -1
  9. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/api_client.py +4 -0
  10. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_start_inference_simulator_request.py +3 -1
  11. thestage-0.5.42/thestage/services/logging/exception/log_polling_exception.py +6 -0
  12. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/logging/logging_service.py +12 -2
  13. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/project_service.py +11 -6
  14. thestage-0.5.40/thestage/.env +0 -5
  15. thestage-0.5.40/thestage/services/clients/.DS_Store +0 -0
  16. {thestage-0.5.40 → thestage-0.5.42}/LICENSE.txt +0 -0
  17. {thestage-0.5.40 → thestage-0.5.42}/README.md +0 -0
  18. {thestage-0.5.40 → thestage-0.5.42}/thestage/__main__.py +0 -0
  19. {thestage-0.5.40 → thestage-0.5.42}/thestage/color_scheme/color_scheme.py +0 -0
  20. {thestage-0.5.40 → thestage-0.5.42}/thestage/config/__init__.py +0 -0
  21. {thestage-0.5.40 → thestage-0.5.42}/thestage/config/env_base.py +0 -0
  22. {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/__init__.py +0 -0
  23. {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/base_controller.py +0 -0
  24. {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/container_controller.py +0 -0
  25. {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/instance_controller.py +0 -0
  26. {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/utils_controller.py +0 -0
  27. {thestage-0.5.40 → thestage-0.5.42}/thestage/debug_main.dist.py +0 -0
  28. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/__init__.py +0 -0
  29. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/container.py +0 -0
  30. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/enums/__init__.py +0 -0
  31. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/enums/order_direction_type.py +0 -0
  32. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/enums/shell_type.py +0 -0
  33. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/enums/tail_output_type.py +0 -0
  34. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/enums/yes_no_response.py +0 -0
  35. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/file_item.py +0 -0
  36. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/project_inference_simulator.py +0 -0
  37. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/project_inference_simulator_model.py +0 -0
  38. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/project_task.py +0 -0
  39. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/rented_instance.py +0 -0
  40. {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/self_hosted_instance.py +0 -0
  41. {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/__init__.py +0 -0
  42. {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/auth_exception.py +0 -0
  43. {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/base_exception.py +0 -0
  44. {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/business_logic_exception.py +0 -0
  45. {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/config_exception.py +0 -0
  46. {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/file_system_exception.py +0 -0
  47. {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/git_access_exception.py +0 -0
  48. {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/http_error_exception.py +0 -0
  49. {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/remote_server_exception.py +0 -0
  50. {thestage-0.5.40 → thestage-0.5.42}/thestage/git/ProgressPrinter.py +0 -0
  51. {thestage-0.5.40 → thestage-0.5.42}/thestage/helpers/__init__.py +0 -0
  52. {thestage-0.5.40 → thestage-0.5.42}/thestage/helpers/logger/__init__.py +0 -0
  53. {thestage-0.5.40 → thestage-0.5.42}/thestage/helpers/logger/app_logger.py +0 -0
  54. {thestage-0.5.40 → thestage-0.5.42}/thestage/helpers/ssh_util.py +0 -0
  55. {thestage-0.5.40 → thestage-0.5.42}/thestage/i18n/en_GB/messages.po +0 -0
  56. {thestage-0.5.40 → thestage-0.5.42}/thestage/i18n/translation.py +0 -0
  57. {thestage-0.5.40 → thestage-0.5.42}/thestage/main.py +0 -0
  58. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/.env +0 -0
  59. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/__init__.py +0 -0
  60. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/abstract_mapper.py +0 -0
  61. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/abstract_service.py +0 -0
  62. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/app_config_service.py +0 -0
  63. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/__init__.py +0 -0
  64. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/git/__init__.py +0 -0
  65. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/__init__.py +0 -0
  66. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/core/api_client_abstract.py +0 -0
  67. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/core/api_client_core.py +0 -0
  68. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/core/http_client_exception.py +0 -0
  69. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/__init__.py +0 -0
  70. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/base_response.py +0 -0
  71. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/cloud_provider_region.py +0 -0
  72. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/container_param_request.py +0 -0
  73. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/container_response.py +0 -0
  74. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/docker_container_assigned_device.py +0 -0
  75. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/docker_container_controller/docker_container_list_request.py +0 -0
  76. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/docker_container_controller/docker_container_list_response.py +0 -0
  77. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/docker_container_mapping.py +0 -0
  78. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/entity_filter_request.py +0 -0
  79. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/__init__.py +0 -0
  80. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/container_pending_action.py +0 -0
  81. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/container_status.py +0 -0
  82. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/cpu_type.py +0 -0
  83. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/currency_type.py +0 -0
  84. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/daemon_status.py +0 -0
  85. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/disk_type.py +0 -0
  86. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/drive_type.py +0 -0
  87. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/gpu_name.py +0 -0
  88. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/inference_model_status.py +0 -0
  89. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/inference_simulator_status.py +0 -0
  90. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/instance_rented_status.py +0 -0
  91. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/instance_type.py +0 -0
  92. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/location_region.py +0 -0
  93. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/power_status.py +0 -0
  94. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/provider_name.py +0 -0
  95. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/selfhosted_status.py +0 -0
  96. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/task_execution_status.py +0 -0
  97. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/task_status.py +0 -0
  98. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/frontend_status.py +0 -0
  99. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_instance_request.py +0 -0
  100. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_instance_response.py +0 -0
  101. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_sagemaker_request.py +0 -0
  102. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_sagemaker_response.py +0 -0
  103. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/get_inference_simulator_request.py +0 -0
  104. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/get_inference_simulator_response.py +0 -0
  105. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_list_for_project_request.py +0 -0
  106. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_list_for_project_response.py +0 -0
  107. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_model_list_for_project_request.py +0 -0
  108. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_model_list_for_project_response.py +0 -0
  109. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_simulator_model_response.py +0 -0
  110. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_simulator_response.py +0 -0
  111. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/installed_service.py +0 -0
  112. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/instance_detected_gpus.py +0 -0
  113. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/instance_rented_response.py +0 -0
  114. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/docker_container_log_stream_request.py +0 -0
  115. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/log_polling_request.py +0 -0
  116. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/log_polling_response.py +0 -0
  117. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/task_log_stream_request.py +0 -0
  118. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/user_logs_query_request.py +0 -0
  119. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/user_logs_query_response.py +0 -0
  120. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/paginated_entity_list.py +0 -0
  121. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/pagination_data.py +0 -0
  122. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/price_definition.py +0 -0
  123. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_get_deploy_ssh_key_request.py +0 -0
  124. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_get_deploy_ssh_key_response.py +0 -0
  125. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_push_inference_simulator_model_request.py +0 -0
  126. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_push_inference_simulator_model_response.py +0 -0
  127. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_run_task_request.py +0 -0
  128. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_run_task_response.py +0 -0
  129. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_start_inference_simulator_response.py +0 -0
  130. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_response.py +0 -0
  131. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/selfhosted_instance_response.py +0 -0
  132. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/sftp_path_helper.py +0 -0
  133. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_key_to_user_request.py +0 -0
  134. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_key_to_user_response.py +0 -0
  135. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_public_key_to_instance_request.py +0 -0
  136. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_public_key_to_instance_response.py +0 -0
  137. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/is_user_has_public_ssh_key_request.py +0 -0
  138. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/is_user_has_public_ssh_key_response.py +0 -0
  139. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/task_controller/task_list_for_project_request.py +0 -0
  140. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/task_controller/task_list_for_project_response.py +0 -0
  141. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/task_controller/task_status_localized_map_response.py +0 -0
  142. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/task_controller/task_view_response.py +0 -0
  143. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/user_profile.py +0 -0
  144. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/config_provider/__init__.py +0 -0
  145. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/config_provider/config_provider.py +0 -0
  146. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/connect/connect_service.py +0 -0
  147. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/connect/dto/remote_server_config.py +0 -0
  148. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/container/__init__.py +0 -0
  149. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/container/container_service.py +0 -0
  150. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/container/mapper/__init__.py +0 -0
  151. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/container/mapper/container_mapper.py +0 -0
  152. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/core_files/config_entity.py +0 -0
  153. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/filesystem_service.py +0 -0
  154. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/instance/__init__.py +0 -0
  155. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/instance/instance_service.py +0 -0
  156. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/instance/mapper/__init__.py +0 -0
  157. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/instance/mapper/instance_mapper.py +0 -0
  158. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/instance/mapper/selfhosted_mapper.py +0 -0
  159. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/logging/byte_print_style.py +0 -0
  160. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/logging/dto/log_message.py +0 -0
  161. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/logging/dto/log_type.py +0 -0
  162. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/logging/logging_constants.py +0 -0
  163. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/__init__.py +0 -0
  164. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/dto/inference_simulator_dto.py +0 -0
  165. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/dto/inference_simulator_model_dto.py +0 -0
  166. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/dto/project_config.py +0 -0
  167. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/mapper/__init__.py +0 -0
  168. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/mapper/project_inference_simulator_mapper.py +0 -0
  169. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/mapper/project_inference_simulator_model_mapper.py +0 -0
  170. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/mapper/project_task_mapper.py +0 -0
  171. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/remote_server_service.py +0 -0
  172. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/service_factory.py +0 -0
  173. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/task/dto/task_dto.py +0 -0
  174. {thestage-0.5.40 → thestage-0.5.42}/thestage/services/validation_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: thestage
3
- Version: 0.5.40
3
+ Version: 0.5.42
4
4
  Summary:
5
5
  Author: TheStage AI team
6
6
  Author-email: hello@thestage.ai
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "thestage"
3
- version = "0.5.40"
3
+ version = "0.5.42"
4
4
  description = ""
5
5
  authors = ["TheStage AI team <hello@thestage.ai>"]
6
6
  readme = "README.md"
@@ -0,0 +1,6 @@
1
+ THESTAGE_CONFIG_DIR=.thestage
2
+ THESTAGE_CONFIG_FILE=config.json
3
+ THESTAGE_CLI_ENV=DEV
4
+ THESTAGE_API_URL=https://backend-staging.thestage.ai
5
+ THESTAGE_API_URL=https://backend.thestage.ai
6
+ LOG_FILE=thestage.log
@@ -1,3 +1,3 @@
1
1
  from . import *
2
2
  __app_name__ = "thestage"
3
- __version__ = "0.5.40"
3
+ __version__ = "0.5.42"
@@ -6,7 +6,7 @@ from thestage.services.core_files.config_entity import ConfigEntity
6
6
 
7
7
  from thestage.entities.enums.yes_no_response import YesOrNoResponse
8
8
  from thestage.i18n.translation import __
9
- from thestage.helpers.logger.app_logger import app_logger
9
+ from thestage.helpers.logger.app_logger import app_logger, get_log_path_from_os
10
10
  from thestage.services.config_provider.config_provider import ConfigProvider
11
11
  from thestage.services.connect.connect_service import ConnectService
12
12
  from thestage.services.service_factory import ServiceFactory
@@ -40,6 +40,8 @@ def config_get():
40
40
  if config.runtime.config_global_path:
41
41
  typer.echo(__('CONFIG PATH: %path%', {'path': str(config.runtime.config_global_path or '') + f'/config.json'}))
42
42
 
43
+ typer.echo(__('APPLICATION LOGS PATH: %path%', {'path': str(get_log_path_from_os())}))
44
+
43
45
  raise typer.Exit(0)
44
46
 
45
47
 
@@ -1,7 +1,9 @@
1
1
  import time
2
+ from pathlib import Path
2
3
  from typing import Optional, List
3
4
 
4
5
  import re
6
+
5
7
  import typer
6
8
  from typing_extensions import Annotated
7
9
 
@@ -425,6 +427,13 @@ def run_inference_simulator(
425
427
  help=__("Disable real-time log streaming"),
426
428
  is_eager=False,
427
429
  ),
430
+ is_skip_installation: Optional[bool] = typer.Option(
431
+ False,
432
+ "--skip-installation",
433
+ "-si",
434
+ help=__("Skip installing dependencies from requirements.txt and install.sh"),
435
+ is_eager=False,
436
+ ),
428
437
  ):
429
438
  """
430
439
  Run an inference simulator within a project
@@ -438,6 +447,35 @@ def run_inference_simulator(
438
447
  service_factory = validate_config_and_get_service_factory(working_directory=working_directory)
439
448
  config = service_factory.get_config_provider().get_full_config()
440
449
 
450
+ working_dir_path = Path(working_directory) if working_directory else Path(config.runtime.working_directory)
451
+ inference_files = list(working_dir_path.rglob("inference.py"))
452
+ if not inference_files:
453
+ typer.echo("No inference.py file found in the project directory.")
454
+ raise typer.Exit(1)
455
+ elif len(inference_files) == 1:
456
+ selected_inference = inference_files[0]
457
+ else:
458
+ choices = [str(path.relative_to(working_dir_path)) for path in inference_files]
459
+ typer.echo("Multiple inference.py files found:")
460
+ for idx, choice in enumerate(choices, start=1):
461
+ typer.echo(f"{idx}) {choice}")
462
+ choice_str = typer.prompt("Choose which inference.py to use")
463
+ try:
464
+ choice_index = int(choice_str)
465
+ except ValueError:
466
+ raise typer.BadParameter("Invalid input. Please enter a number.")
467
+ if not (1 <= choice_index <= len(choices)):
468
+ raise typer.BadParameter("Choice out of range.")
469
+ selected_inference = inference_files[choice_index - 1]
470
+
471
+ relative_inference = selected_inference.relative_to(working_dir_path)
472
+ parent_dir = relative_inference.parent
473
+ if parent_dir == Path("."):
474
+ inference_dir = "/"
475
+ else:
476
+ inference_dir = f"{parent_dir.as_posix()}/"
477
+ typer.echo(f"Selected inference file relative path: {inference_dir}")
478
+
441
479
  project_service = service_factory.get_project_service()
442
480
 
443
481
  project_service.project_run_inference_simulator(
@@ -446,6 +484,8 @@ def run_inference_simulator(
446
484
  slug=unique_id,
447
485
  rented_instance_unique_id=rented_instance_unique_id,
448
486
  self_hosted_instance_unique_id=self_hosted_instance_unique_id,
487
+ inference_dir=inference_dir,
488
+ is_skip_installation=is_skip_installation,
449
489
  )
450
490
 
451
491
  if enable_log_stream:
@@ -107,7 +107,8 @@ def error_handler() -> Callable:
107
107
  else:
108
108
  typer.echo(__('Undefined error occurred'))
109
109
  # typer.echo(e100.__class__.__name__)
110
- print(traceback.format_exc())
110
+ # print(traceback.format_exc())
111
+ # TODO send all exceptions to backend?
111
112
  app_logger.info(f'{traceback.format_exc()}')
112
113
  raise typer.Exit(1)
113
114
  return wrapper
@@ -6,6 +6,7 @@ from typing import Optional, List
6
6
  import git
7
7
  import typer
8
8
  from git import Remote, Repo, GitCommandError, Commit
9
+ from gitdb.exc import BadName
9
10
  from rich import print
10
11
 
11
12
  from thestage.color_scheme.color_scheme import ColorScheme
@@ -227,7 +228,10 @@ class GitLocalClient:
227
228
  def get_commit_by_hash(self, path: str, commit_hash: str) -> Optional[Commit]:
228
229
  repo = self.__get_repo(path=path)
229
230
  if repo:
230
- return repo.commit(commit_hash)
231
+ try:
232
+ return repo.commit(commit_hash)
233
+ except BadName as ex:
234
+ return None
231
235
  else:
232
236
  return None
233
237
 
@@ -603,6 +603,8 @@ class TheStageApiClient(TheStageApiClientCore):
603
603
  commit_hash: Optional[str] = None,
604
604
  rented_instance_unique_id: Optional[str] = None,
605
605
  self_hosted_instance_unique_id: Optional[str] = None,
606
+ inference_dir: Optional[str] = None,
607
+ is_skip_installation: Optional[bool] = False,
606
608
  ) -> Optional[ProjectStartInferenceSimulatorResponse]:
607
609
  request = ProjectStartInferenceSimulatorRequest(
608
610
  projectSlug=project_slug,
@@ -610,6 +612,8 @@ class TheStageApiClient(TheStageApiClientCore):
610
612
  slug=slug,
611
613
  instanceRentedUId=rented_instance_unique_id,
612
614
  selfhostedInstanceUId=self_hosted_instance_unique_id,
615
+ inferenceDir=inference_dir,
616
+ isSkipInstallation=is_skip_installation,
613
617
  )
614
618
 
615
619
  response = self._request(
@@ -10,4 +10,6 @@ class ProjectStartInferenceSimulatorRequest(BaseModel):
10
10
  instanceRentedUId: Optional[str] = Field(None, alias='instanceRentedUId')
11
11
  selfhostedInstanceUId: Optional[str] = Field(None, alias='selfhostedInstanceUId')
12
12
  commitHash: Optional[str] = Field(None, alias='commitHash')
13
- slug: Optional[str] = Field(None, alias='slug')
13
+ slug: Optional[str] = Field(None, alias='slug')
14
+ inferenceDir: Optional[str] = Field(None, alias='inferenceDir')
15
+ isSkipInstallation: Optional[bool] = Field(False, alias='isSkipInstallation')
@@ -0,0 +1,6 @@
1
+ from thestage.exceptions.base_exception import BaseAbstractException
2
+
3
+
4
+ class LogPollingException(BaseAbstractException):
5
+ def __init__(self, message: str):
6
+ super(LogPollingException, self).__init__(message=message)
@@ -9,6 +9,7 @@ import typer
9
9
  from httpx import ReadTimeout, ConnectError, ConnectTimeout
10
10
  from requests.exceptions import ChunkedEncodingError
11
11
 
12
+ from thestage.helpers.logger.app_logger import app_logger
12
13
  from thestage.services.clients.thestage_api.dtos.enums.container_status import DockerContainerStatus
13
14
  from thestage.services.core_files.config_entity import ConfigEntity
14
15
  from thestage.services.clients.thestage_api.dtos.enums.inference_simulator_status import InferenceSimulatorStatus
@@ -27,6 +28,7 @@ from thestage.services.clients.thestage_api.api_client import TheStageApiClient
27
28
  from thestage.services.config_provider.config_provider import ConfigProvider
28
29
  from rich import print
29
30
 
31
+ from thestage.services.logging.exception.log_polling_exception import LogPollingException
30
32
  from thestage.services.logging.logging_constants import LOG_MESSAGE_CODE_TASK_FINISHED, \
31
33
  LOG_MESSAGE_CODE_INFERENCE_SIMULATOR_FAILED
32
34
 
@@ -302,6 +304,11 @@ class LoggingService(AbstractService):
302
304
  last_log_id=last_log_id
303
305
  )
304
306
 
307
+ if not logs_response.is_success:
308
+ app_logger.info(f'Polling logs error: {logs_response.message}')
309
+ raise LogPollingException('')
310
+
311
+
305
312
  if consecutive_error_count > 0:
306
313
  consecutive_error_count = 0
307
314
  errors_started_at = None
@@ -323,10 +330,13 @@ class LoggingService(AbstractService):
323
330
 
324
331
  if is_no_more_logs:
325
332
  break
326
- except (ReadTimeout, ConnectError, ConnectTimeout) as e:
333
+ except (ReadTimeout, ConnectError, ConnectTimeout, LogPollingException) as e:
327
334
  consecutive_error_count += 1
328
335
  if consecutive_error_count == 1:
329
- print_nonblocking("Network issues, attempting to re-establish connection...", writer, BytePrintStyle.ORANGE)
336
+ if isinstance(e, LogPollingException):
337
+ print_nonblocking("Some problems raised while getting logs...", writer, BytePrintStyle.ORANGE)
338
+ else:
339
+ print_nonblocking("Network issues, attempting to re-establish connection...", writer, BytePrintStyle.ORANGE)
330
340
  if not errors_started_at:
331
341
  errors_started_at = datetime.utcnow()
332
342
 
@@ -367,13 +367,14 @@ class ProjectService(AbstractService):
367
367
  commit = self.__git_local_client.get_current_commit(path=config.runtime.working_directory)
368
368
  if commit and isinstance(commit, Commit):
369
369
  commit_hash = commit.hexsha
370
- if not task_title:
371
- task_title = commit.message.strip()
372
- else: # if commit_hash is defined
370
+
371
+ commit = self.__git_local_client.get_commit_by_hash(path=config.runtime.working_directory, commit_hash=commit_hash)
372
+ if commit and isinstance(commit, Commit):
373
373
  if not task_title:
374
- commit = self.__git_local_client.get_commit_by_hash(path=config.runtime.working_directory, commit_hash=commit_hash)
375
- if commit and isinstance(commit, Commit):
376
- task_title = commit.message.strip()
374
+ task_title = commit.message.strip()
375
+ else:
376
+ print(f'[red]Error: commit \'{commit_hash}\' was not found in the local repository[/red]')
377
+ raise typer.Exit(0)
377
378
 
378
379
  if not task_title: # should not happen but maybe git allows some kind of empty messages
379
380
  task_title = f'Task_{commit_hash}'
@@ -408,6 +409,8 @@ class ProjectService(AbstractService):
408
409
  commit_hash: Optional[str] = None,
409
410
  rented_instance_unique_id: Optional[str] = None,
410
411
  self_hosted_instance_unique_id: Optional[str] = None,
412
+ inference_dir: Optional[str] = None,
413
+ is_skip_installation: Optional[bool] = False,
411
414
  ) -> Optional[InferenceSimulatorDto]:
412
415
  project_config: ProjectConfig = self.__get_fixed_project_config(config=config)
413
416
  if not project_config:
@@ -542,6 +545,8 @@ class ProjectService(AbstractService):
542
545
  slug=slug,
543
546
  rented_instance_unique_id=rented_instance_unique_id,
544
547
  self_hosted_instance_unique_id=self_hosted_instance_unique_id,
548
+ inference_dir=inference_dir,
549
+ is_skip_installation=is_skip_installation,
545
550
  )
546
551
  if start_inference_simulator_response:
547
552
  if start_inference_simulator_response.message:
@@ -1,5 +0,0 @@
1
- THESTAGE_CONFIG_DIR=.thestage
2
- THESTAGE_CONFIG_FILE=config.json
3
- THESTAGE_API_URL=https://backend-staging3.thestage.ai
4
- THESTAGE_API_URL=http://localhost:8100
5
- LOG_FILE=thestage.log
File without changes
File without changes
File without changes