thestage 0.5.42__py3-none-any.whl → 0.5.44__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.
thestage/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  from . import *
2
2
  __app_name__ = "thestage"
3
- __version__ = "0.5.42"
3
+ __version__ = "0.5.44"
@@ -1,5 +1,7 @@
1
1
  from enum import Enum
2
2
 
3
-
3
+ # https://rich.readthedocs.io/en/stable/appendix/colors.html
4
4
  class ColorScheme(str, Enum):
5
5
  GIT_HEADLESS = "orange_red1"
6
+ WARNING = "orange_red1"
7
+ USEFUL_INFO = "deep_sky_blue1"
@@ -183,6 +183,34 @@ def run(
183
183
  raise typer.Exit(0)
184
184
 
185
185
 
186
+ @task_app.command(name='cancel', no_args_is_help=True, help=__("Cancel a task by ID"))
187
+ def cancel_task(
188
+ task_id: Annotated[int, typer.Argument(
189
+ help=__("Task ID (required)"),
190
+ )],
191
+ ):
192
+ """
193
+ Cancels a task
194
+ """
195
+ app_logger.info(f'Start cancel task from {get_current_directory()}')
196
+
197
+ if not task_id:
198
+ typer.echo(__('Task ID is required'))
199
+ raise typer.Exit(1)
200
+
201
+ service_factory = validate_config_and_get_service_factory()
202
+ config = service_factory.get_config_provider().get_full_config()
203
+
204
+ project_service = service_factory.get_project_service()
205
+
206
+ project_service.cancel_task(
207
+ config=config,
208
+ task_id=task_id
209
+ )
210
+
211
+ raise typer.Exit(0)
212
+
213
+
186
214
  @task_app.command("ls", help=__("List tasks"))
187
215
  def list_runs(
188
216
  project_uid: Annotated[str, typer.Argument(help=__("Project unique ID. By default, project info is taken from the current directory"), metavar="OPTIONAL")] = None,
@@ -287,9 +315,9 @@ def checkout_project(
287
315
  ),
288
316
  ):
289
317
  """
290
- Initializes project in current working directory
318
+ Checkout project in current working directory
291
319
  """
292
- app_logger.info(f'Start project init from {get_current_directory()}')
320
+ app_logger.info(f'Start project checkout from {get_current_directory()}')
293
321
 
294
322
  service_factory = validate_config_and_get_service_factory(working_directory=working_directory)
295
323
  config = service_factory.get_config_provider().get_full_config()
@@ -315,11 +343,8 @@ def checkout_project(
315
343
  raise typer.Exit(0)
316
344
 
317
345
 
318
- @config_app.command(name='set-default-container', no_args_is_help=True, help=__("Set default docker container for a project installation"))
319
- def set_default_container(
320
- container_uid: Annotated[Optional[str], typer.Argument(
321
- help=__("Unique ID of the container to use by default for running tasks"),
322
- )] = None,
346
+ @app.command(name='pull', help=__("Pulls the changes from the remote project repository. Equivalent to 'git pull'."))
347
+ def pull_project(
323
348
  working_directory: Optional[str] = typer.Option(
324
349
  None,
325
350
  "--working-directory",
@@ -327,6 +352,56 @@ def set_default_container(
327
352
  help=__("Full path to working directory"),
328
353
  is_eager=False,
329
354
  ),
355
+ ):
356
+ """
357
+ Pull project in current working directory
358
+ """
359
+ app_logger.info(f'Start project pull from {get_current_directory()}')
360
+
361
+ service_factory = validate_config_and_get_service_factory(working_directory=working_directory)
362
+ config = service_factory.get_config_provider().get_full_config()
363
+
364
+ project_service = service_factory.get_project_service()
365
+
366
+ project_service.pull_project(
367
+ config=config,
368
+ )
369
+
370
+ raise typer.Exit(0)
371
+
372
+
373
+ @app.command(name='reset', help=__("Resets the current project branch to remote counterpart. All working tree changes will be lost. Equivalent to 'git fetch && git reset --hard origin/{ref}'."))
374
+ def reset_project(
375
+ working_directory: Optional[str] = typer.Option(
376
+ None,
377
+ "--working-directory",
378
+ "-wd",
379
+ help=__("Full path to working directory"),
380
+ is_eager=False,
381
+ ),
382
+ ):
383
+ """
384
+ Pull project in current working directory
385
+ """
386
+ app_logger.info(f'Start project pull from {get_current_directory()}')
387
+
388
+ service_factory = validate_config_and_get_service_factory(working_directory=working_directory)
389
+ config = service_factory.get_config_provider().get_full_config()
390
+
391
+ project_service = service_factory.get_project_service()
392
+
393
+ project_service.reset_project(
394
+ config=config
395
+ )
396
+
397
+ raise typer.Exit(0)
398
+
399
+
400
+ @config_app.command(name='set-default-container', no_args_is_help=True, help=__("Set default docker container for a project installation"))
401
+ def set_default_container(
402
+ container_uid: Annotated[Optional[str], typer.Argument(
403
+ help=__("Unique ID of the container to use by default for running tasks"),
404
+ )] = None,
330
405
  unset_default_container: Optional[bool] = typer.Option(
331
406
  False,
332
407
  "--unset",
@@ -334,6 +409,13 @@ def set_default_container(
334
409
  help=__("Unsets the default docker container"),
335
410
  is_eager=False,
336
411
  ),
412
+ working_directory: Optional[str] = typer.Option(
413
+ None,
414
+ "--working-directory",
415
+ "-wd",
416
+ help=__("Full path to working directory"),
417
+ is_eager=False,
418
+ ),
337
419
  ):
338
420
  """
339
421
  Initializes project in current working directory
thestage/main.py CHANGED
@@ -1,18 +1,19 @@
1
- # temp fix to reduce annoying warnings
2
- import warnings
3
- warnings.filterwarnings(action='ignore', module='.*paramiko.*')
4
-
5
- from . import __app_name__
1
+ def main():
2
+ try:
3
+ import warnings
4
+ warnings.filterwarnings(action='ignore', module='.*paramiko.*')
6
5
 
7
- from thestage.controllers import base_controller, container_controller, instance_controller, project_controller, \
8
- config_controller
6
+ from . import __app_name__
9
7
 
10
- base_controller.app.add_typer(container_controller.app, name="container")
11
- base_controller.app.add_typer(instance_controller.app, name="instance")
12
- base_controller.app.add_typer(project_controller.app, name="project")
13
- base_controller.app.add_typer(config_controller.app, name="config")
8
+ from thestage.controllers import base_controller, container_controller, instance_controller, project_controller, \
9
+ config_controller
14
10
 
11
+ base_controller.app.add_typer(container_controller.app, name="container")
12
+ base_controller.app.add_typer(instance_controller.app, name="instance")
13
+ base_controller.app.add_typer(project_controller.app, name="project")
14
+ base_controller.app.add_typer(config_controller.app, name="config")
15
15
 
16
- def main():
17
- import thestage.config
18
- base_controller.app(prog_name=__app_name__)
16
+ import thestage.config
17
+ base_controller.app(prog_name=__app_name__)
18
+ except KeyboardInterrupt:
19
+ print('THESTAGE: Keyboard Interrupt')
Binary file
@@ -10,6 +10,7 @@ from gitdb.exc import BadName
10
10
  from rich import print
11
11
 
12
12
  from thestage.color_scheme.color_scheme import ColorScheme
13
+ from thestage.config import THESTAGE_CONFIG_DIR
13
14
  from thestage.exceptions.git_access_exception import GitAccessException
14
15
  from thestage.git.ProgressPrinter import ProgressPrinter
15
16
  from thestage.services.filesystem_service import FileSystemServiceCore
@@ -18,7 +19,7 @@ from thestage.services.filesystem_service import FileSystemServiceCore
18
19
  class GitLocalClient:
19
20
  __base_name_remote: str = 'origin'
20
21
  __base_name_local: str = 'main'
21
- __git_ignore_thestage_line: str = '/.thestage/'
22
+ __git_ignore_thestage_line: str = f'/{THESTAGE_CONFIG_DIR}/'
22
23
 
23
24
  __special_main_branches = ['main', 'master']
24
25
 
@@ -30,6 +31,7 @@ class GitLocalClient:
30
31
  ):
31
32
  self.__file_system_service = file_system_service
32
33
 
34
+ # todo delete this fuckery
33
35
  def __get_repo(self, path: str) -> Repo:
34
36
  return git.Repo(path)
35
37
 
@@ -105,32 +107,37 @@ class GitLocalClient:
105
107
  with repo.git.custom_environment(GIT_SSH_COMMAND=git_ssh_cmd):
106
108
  remote: Remote = repo.remote(self.__base_name_remote)
107
109
  if remote:
110
+ progress = ProgressPrinter()
108
111
  try:
109
- remote.fetch()
110
- except GitCommandError as base_ex:
111
- msg = base_ex.stderr
112
- if msg and 'fatal: Could not read from remote repository' in msg:
113
- raise GitAccessException(
114
- message='You dont have access to repository, or repository not found.',
115
- url=self.build_http_repo_url(git_path=remote.url),
116
- dop_message=msg,
117
- )
118
- else:
119
- raise base_ex
120
-
121
- def git_pull(self, path: str, deploy_key_path: str, branch: Optional[str] = None):
112
+ remote.fetch(progress=progress)
113
+ except GitCommandError as ex:
114
+ for line in progress.allDroppedLines():
115
+ # returning the whole output if failed - so that user have any idea what's going on
116
+ print(f'>> {line}')
117
+ raise ex
118
+
119
+
120
+ def git_pull(self, path: str, deploy_key_path: str):
122
121
  repo = self.__get_repo(path=path)
123
122
  git_ssh_cmd = 'ssh -F /dev/null -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i %s' % deploy_key_path
124
123
 
125
124
  with repo.git.custom_environment(GIT_SSH_COMMAND=git_ssh_cmd):
126
125
  local_branch = self.__base_name_local
127
- if branch:
128
- if self.__base_name_remote in branch:
129
- local_branch = branch.replace(f"{self.__base_name_remote}/", '').strip()
130
- else:
131
- local_branch = branch
126
+ if repo.active_branch.name:
127
+ local_branch = repo.active_branch.name
132
128
 
133
- repo.git.pull(self.__base_name_remote, local_branch)
129
+ origin = repo.remote(self.__base_name_remote)
130
+
131
+ if origin:
132
+ progress = ProgressPrinter()
133
+ try:
134
+ origin.pull(refspec=local_branch, progress=progress)
135
+ typer.echo(f"Pulled remote changes to branch '{local_branch}'")
136
+ except GitCommandError as ex:
137
+ for line in progress.allDroppedLines():
138
+ # returning the whole output if failed - so that user have any idea what's going on
139
+ print(f'>> {line}')
140
+ raise ex
134
141
 
135
142
  def find_main_branch_name(self, path: str) -> Optional[str]:
136
143
  repo = self.__get_repo(path=path)
@@ -275,10 +282,16 @@ class GitLocalClient:
275
282
  if repo:
276
283
  return repo.head.is_detached
277
284
 
278
- def reset_hard(self, path: str):
285
+ def reset_hard(self, path: str, deploy_key_path: str, reset_to_origin: bool):
279
286
  repo = self.__get_repo(path=path)
280
287
  if repo:
281
- repo.git.reset('--hard')
288
+ git_ssh_cmd = 'ssh -F /dev/null -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i %s' % deploy_key_path
289
+ with repo.git.custom_environment(GIT_SSH_COMMAND=git_ssh_cmd):
290
+ if reset_to_origin:
291
+ repo.git.reset('--hard', f'origin/{repo.active_branch.name}')
292
+ typer.echo(f'Branch "{repo.active_branch.name}" is now synced to its remote counterpart')
293
+ else:
294
+ typer.echo('simple branch reset is not implemented')
282
295
 
283
296
  # refers to a "headless commit" where something was committed while in detached head state and head is pointing at that commit
284
297
  def is_head_committed_in_headless_state(self, path: str) -> bool:
@@ -297,6 +310,11 @@ class GitLocalClient:
297
310
  for branch in repo.heads:
298
311
  if branch.name == branch_name:
299
312
  return True
313
+
314
+ for ref in repo.remotes.origin.refs:
315
+ if ref.remote_head == branch_name:
316
+ typer.echo(f'Found remote branch "{branch_name}"')
317
+ return True
300
318
  return False
301
319
 
302
320
  def checkout_to_new_branch(self, path: str, branch_name: str):
@@ -361,7 +361,7 @@ class TheStageApiClient(TheStageApiClientCore):
361
361
  result = UserProfileResponse.model_validate(response) if response else None
362
362
  return result if result else None
363
363
 
364
- def stop_task_on_instance(
364
+ def cancel_task(
365
365
  self,
366
366
  token: str,
367
367
  task_id: int,
@@ -83,6 +83,7 @@ class FileSystemServiceCore:
83
83
  file.write(new_line)
84
84
  file.write('\n')
85
85
 
86
+ # TODO remove this fucking useless shit
86
87
  def check_if_path_exist(self, file: str) -> bool:
87
88
  path = self.get_path(file, auto_create=False)
88
89
  if path.exists():
@@ -151,7 +151,7 @@ class LoggingService(AbstractService):
151
151
  print_logs_task.cancel()
152
152
  if not input_task.result(): # result is only expected if ctrl+D triggered EOFError
153
153
  typer.echo(f"\rTask {task_id} will be canceled")
154
- self.__thestage_api_client.stop_task_on_instance(
154
+ self.__thestage_api_client.cancel_task(
155
155
  token=config.main.thestage_auth_token,
156
156
  task_id=task.id,
157
157
  )
@@ -148,11 +148,6 @@ class ProjectService(AbstractService):
148
148
 
149
149
  self.__git_local_client.git_fetch(path=config.runtime.working_directory, deploy_key_path=deploy_key_path)
150
150
 
151
- branch = self.__git_local_client.find_main_branch_name(path=config.runtime.working_directory, )
152
- if branch:
153
- self.__git_local_client.git_pull(path=config.runtime.working_directory, deploy_key_path=deploy_key_path,
154
- branch=branch)
155
-
156
151
  self.__git_local_client.init_gitignore(path=config.runtime.working_directory)
157
152
 
158
153
  self.__git_local_client.git_add_all(repo_path=config.runtime.working_directory)
@@ -390,7 +385,7 @@ class ProjectService(AbstractService):
390
385
  )
391
386
  if run_task_response:
392
387
  if run_task_response.message:
393
- typer.echo(run_task_response.message)
388
+ print(f"[{ColorScheme.WARNING.value}]{run_task_response.message}[{ColorScheme.WARNING.value}]")
394
389
  if run_task_response.is_success and run_task_response.task:
395
390
  typer.echo(f"Task '{run_task_response.task.title}' has been scheduled successfully. Task ID: {run_task_response.task.id}")
396
391
  return run_task_response.task
@@ -401,6 +396,19 @@ class ProjectService(AbstractService):
401
396
  typer.echo("The task failed with an error")
402
397
  raise typer.Exit(1)
403
398
 
399
+ @error_handler()
400
+ def cancel_task(self, task_id: int, config: ConfigEntity):
401
+ cancel_result = self.__thestage_api_client.cancel_task(
402
+ token=config.main.thestage_auth_token,
403
+ task_id=task_id,
404
+ )
405
+
406
+ if cancel_result.is_success:
407
+ typer.echo(f'Task {task_id} has been canceled')
408
+ else:
409
+ typer.echo(f'Task {task_id} could not be canceled: {cancel_result.message}')
410
+
411
+
404
412
  @error_handler()
405
413
  def project_run_inference_simulator(
406
414
  self,
@@ -828,6 +836,8 @@ class ProjectService(AbstractService):
828
836
  typer.echo("No main branch found")
829
837
 
830
838
 
839
+
840
+
831
841
  @error_handler()
832
842
  def set_default_container(self, config: ConfigEntity, container_uid: Optional[str]):
833
843
  project_config: ProjectConfig = self.__config_provider.read_project_config()
@@ -880,6 +890,8 @@ class ProjectService(AbstractService):
880
890
  typer.echo(f"No project found in working directory")
881
891
  raise typer.Exit(1)
882
892
 
893
+ is_deploy_key_exists = project_config.deploy_key_path and self.__file_system_service.check_if_path_exist(project_config.deploy_key_path)
894
+
883
895
  typer.echo(tabulate(
884
896
  [
885
897
  [
@@ -888,11 +900,20 @@ class ProjectService(AbstractService):
888
900
  [
889
901
  "Default docker container unique ID", project_config.default_container_uid if project_config.default_container_uid else "<None>"
890
902
  ],
903
+ [
904
+ "Deploy key path", project_config.deploy_key_path if is_deploy_key_exists else "<None>"
905
+ ],
891
906
  ],
892
907
  showindex=False,
893
908
  tablefmt="simple",
894
909
  ))
895
910
 
911
+ if is_deploy_key_exists:
912
+ typer.echo("")
913
+ typer.echo(f"You can insert the following text:")
914
+ print(f"[{ColorScheme.USEFUL_INFO.value}]GIT_SSH_COMMAND=\"ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i {project_config.deploy_key_path}\"[{ColorScheme.USEFUL_INFO.value}]")
915
+ typer.echo(f"before any regular git command to manage your local Project repository directly")
916
+
896
917
  @error_handler()
897
918
  def __get_fixed_project_config(self, config: ConfigEntity) -> Optional[ProjectConfig]:
898
919
  project_config: ProjectConfig = self.__config_provider.read_project_config()
@@ -1083,4 +1104,38 @@ class ProjectService(AbstractService):
1083
1104
 
1084
1105
  except Exception as e:
1085
1106
  typer.echo(__("Failed to deploy the inference simulator model to SageMaker: %error%", {"error": str(e)}))
1086
- raise typer.Exit(1)
1107
+ raise typer.Exit(1)
1108
+
1109
+
1110
+ @error_handler()
1111
+ def pull_project(self, config: ConfigEntity):
1112
+ project_config: ProjectConfig = self.__get_fixed_project_config(config=config)
1113
+ if not project_config:
1114
+ typer.echo(__("No project found at the path: %path%. Please initialize or clone a project first.", {"path": config.runtime.working_directory}))
1115
+ raise typer.Exit(1)
1116
+
1117
+ typer.echo("Pulling code from remote repository...")
1118
+ self.__git_local_client.git_pull(
1119
+ path=config.runtime.working_directory,
1120
+ deploy_key_path=project_config.deploy_key_path,
1121
+ )
1122
+
1123
+
1124
+ @error_handler()
1125
+ def reset_project(self, config: ConfigEntity):
1126
+ project_config: ProjectConfig = self.__get_fixed_project_config(config=config)
1127
+ if not project_config:
1128
+ typer.echo(__("No project found at the path: %path%. Please initialize or clone a project first.", {"path": config.runtime.working_directory}))
1129
+ raise typer.Exit(1)
1130
+
1131
+ typer.echo("Fetching code from remote repository...")
1132
+ self.__git_local_client.git_fetch(
1133
+ path=config.runtime.working_directory,
1134
+ deploy_key_path=project_config.deploy_key_path,
1135
+ )
1136
+ typer.echo("Resetting local branch...")
1137
+ self.__git_local_client.reset_hard(
1138
+ path=config.runtime.working_directory,
1139
+ deploy_key_path=project_config.deploy_key_path,
1140
+ reset_to_origin=True
1141
+ )
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: thestage
3
- Version: 0.5.42
3
+ Version: 0.5.44
4
4
  Summary:
5
5
  Author: TheStage AI team
6
6
  Author-email: hello@thestage.ai
@@ -10,6 +10,7 @@ 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
13
14
  Requires-Dist: aioconsole (>=0.8.0,<0.9.0)
14
15
  Requires-Dist: boto3 (>=1.35.80,<2.0.0)
15
16
  Requires-Dist: gitpython (>=3.1.40,<4.0.0)
@@ -1,7 +1,6 @@
1
- thestage/.env,sha256=e0VVlgIiJ9t4WkAN89-LEhNoNvuUpV8_dtOrK2itceo,204
2
- thestage/__init__.py,sha256=8DQOEFc-GcQ1tUrRo3xU6B3cmSvF3Za_ORmutJb4OrY,65
1
+ thestage/__init__.py,sha256=DhlhvDK-7GKoSl3QZHDW8oTMV7AnpgXhIye7Rw0LV10,65
3
2
  thestage/__main__.py,sha256=4ObdWrDRaIASaR06IxtFSsoMu58eyL0MnD64habvPj8,101
4
- thestage/color_scheme/color_scheme.py,sha256=jzdRCX0hi_XStXi4kvPHVItKlTm7dsD3fHIdeRQLeKw,87
3
+ thestage/color_scheme/color_scheme.py,sha256=qaSSS_OzPsqI7yV1TC3Ne0PnsWDWo5xqU8j_7JYG-TI,210
5
4
  thestage/config/__init__.py,sha256=RNobilYVK1WAM1utcQ8ZuATKc9Zh9M9BAjCLZTnR_TA,428
6
5
  thestage/config/env_base.py,sha256=RNBQ17yk1ieu1kdUlM7Qe7mDCoxstgGUwwhe265o4dQ,367
7
6
  thestage/controllers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -9,7 +8,7 @@ thestage/controllers/base_controller.py,sha256=lX0XsBc7ZEPD_I56cN8IBAVuWGIkOkr7J
9
8
  thestage/controllers/config_controller.py,sha256=Gzd61UeU1igFT4QUyrZ4dOo_QaNEuXuSEIroXpbBhPA,5365
10
9
  thestage/controllers/container_controller.py,sha256=C3WC-Ypeg-vpC8LyCcPZVszbiaDYf2aQzTxYC2PPG8g,15210
11
10
  thestage/controllers/instance_controller.py,sha256=pFhkO7U2Ta0_1dzskEj8hbE7Izw_7I4SDbq5O5-bfIY,9757
12
- thestage/controllers/project_controller.py,sha256=yxYBed4fHGjw9ofQSXNg2TUPobGrFj9lb5_iHATuYfA,34274
11
+ thestage/controllers/project_controller.py,sha256=GcfwJfn7_AfVBeGcm3jOVr38SOUT26yyyv91MyDX-YU,36725
13
12
  thestage/controllers/utils_controller.py,sha256=FV35yte7jTZRzy2DaL3OZCNzmlVrsNKxksC8P0FD7hM,1030
14
13
  thestage/debug_main.dist.py,sha256=UPIJ58yf-6FtXZj-FLAwxi7HononseuCYm9xb5KlxTs,783
15
14
  thestage/entities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -42,17 +41,18 @@ thestage/helpers/logger/app_logger.py,sha256=hUuxgUsj4pl9Ogjt1xJePTf71iVxKzyx46d
42
41
  thestage/helpers/ssh_util.py,sha256=JuDwddHxEGcA24Y8a-jLv339cG-jq4hEaBAl5TSVVFw,1262
43
42
  thestage/i18n/en_GB/messages.po,sha256=BuVIhd5TRQkgFkAbTGvbSRuO88lSJGpnk9TT2J9BC8E,32375
44
43
  thestage/i18n/translation.py,sha256=c62OicQ4phSMuqDe7hqGebIsk0W2-8ZJUfgfdtjjqEc,284
45
- thestage/main.py,sha256=W0Vz9qdNK44fLRQOfZoa132iHqp5spIYLdgtOE4BYqU,659
44
+ thestage/main.py,sha256=3gHKEbOmpUTT5byvD9gPgT2uoaijAJUoa7G5dSnVlbs,784
46
45
  thestage/services/.env,sha256=K2VpzFAVjD75XawAHZdR0HWmypryA_mXNY4WHNgR-wQ,184
47
46
  thestage/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
47
  thestage/services/abstract_mapper.py,sha256=_q7YLkPNRsNW5wOCqvZIu1KfpLkc7uVaAQKrMZtsGuY,218
49
48
  thestage/services/abstract_service.py,sha256=1PBkO8pFkPmNk1VxUIxED0H3ZStCqAcFw7QGBlzkoh4,3963
50
49
  thestage/services/app_config_service.py,sha256=a7zrbVCJx6XCSRCMv346AYQ_gV3fzw8g7EzunZJ-CIY,1655
50
+ thestage/services/clients/.DS_Store,sha256=EYALnKLNXhZ-2jJTMck8Fo1bIxlFCvaXGUUUf-lgHxM,6148
51
51
  thestage/services/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  thestage/services/clients/git/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
- thestage/services/clients/git/git_client.py,sha256=-5WSoDj0Fi6PJD_Eo04ne83Z6IGQ85qa4eVmIsLnpb4,11737
53
+ thestage/services/clients/git/git_client.py,sha256=2qARWz1VQBKZTG4Spdkx0wBf5oGyU3d9Hnqmeuz8Bbs,12724
54
54
  thestage/services/clients/thestage_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- thestage/services/clients/thestage_api/api_client.py,sha256=FeP9ltSZqrra5j9PTy-JBIw3S-LOWG_q9CddXsmtBV4,29596
55
+ thestage/services/clients/thestage_api/api_client.py,sha256=ZkEbYOg79-RkG9on64tWTto1zXKnG38eKgIy7aS-2lc,29586
56
56
  thestage/services/clients/thestage_api/core/api_client_abstract.py,sha256=nJ0OiT4Ecexp-3HHK332pvyzrf1JsZ1WQYdvn-aeIL8,2984
57
57
  thestage/services/clients/thestage_api/core/api_client_core.py,sha256=WwtzdTAxog-l2UU8Up40BxepgM7OTXn-XHgzlHorXT0,908
58
58
  thestage/services/clients/thestage_api/core/http_client_exception.py,sha256=JH-874Gu9T1b1_FpPBLqdyt9U0PyhpwRCe_oDc6c_jI,385
@@ -141,7 +141,7 @@ thestage/services/container/container_service.py,sha256=1ZVoGpdxQqU0dRuL-Zxh3Y6h
141
141
  thestage/services/container/mapper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
142
  thestage/services/container/mapper/container_mapper.py,sha256=ymIjBLGZnpodh0W2KwNUqRxT0VgM1hsCViNza1nhWHk,1088
143
143
  thestage/services/core_files/config_entity.py,sha256=RlTNEWEgKs7WvI7291tAXhKHb2XROgoilIR4eImqM60,1150
144
- thestage/services/filesystem_service.py,sha256=jWo2Pwfrm3EiMY6S95zrkczLPhgyS7L5_8_ZRRa4KJ8,4226
144
+ thestage/services/filesystem_service.py,sha256=UN5b5jtxeSAGM1yIDIyj3_Gfjixt_KsfqKSWG-gD49w,4270
145
145
  thestage/services/instance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
146
  thestage/services/instance/instance_service.py,sha256=AuhU__G1iBvxiHTp7OadgiRCpuOHbzcVW6ZlcsIw4ME,9270
147
147
  thestage/services/instance/mapper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -152,7 +152,7 @@ thestage/services/logging/dto/log_message.py,sha256=k2clfz2fQnQ-ycFI8g8WYJ_XOjK0
152
152
  thestage/services/logging/dto/log_type.py,sha256=a6JWnq0ZjJ-2BQrG-fKYYy3UeJS2U2ZzE5P_EXglBfE,95
153
153
  thestage/services/logging/exception/log_polling_exception.py,sha256=rKQ7AtNCGKkk5OINIyyjvLT92PU5i_yJUH-Msr9hXQw,226
154
154
  thestage/services/logging/logging_constants.py,sha256=4Gk2tglHW_-jnjB8uVIh-ds4fAVBqNW8igfQt8k7Quc,137
155
- thestage/services/logging/logging_service.py,sha256=nan5ycoaKbNyJx0lcxO99zJFVxNtV_rHfjBIqJqXQ6w,18576
155
+ thestage/services/logging/logging_service.py,sha256=V790CqOSgSMKTwMMkLzAViprtQ4e5jM1jw4Xd8v3zAU,18566
156
156
  thestage/services/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
157
  thestage/services/project/dto/inference_simulator_dto.py,sha256=5U4uGp7VC1Yr-T0fqZiSNqZUIybs4J9sV25vjBbAUxI,1312
158
158
  thestage/services/project/dto/inference_simulator_model_dto.py,sha256=j4dT-7cduzLd59QnmnfQt_aFsiUucpyJFGb-9rNx5K8,1172
@@ -161,13 +161,13 @@ thestage/services/project/mapper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
161
161
  thestage/services/project/mapper/project_inference_simulator_mapper.py,sha256=UdOu9IIF5rlNPoWSaaeSKU3ODe8E5uSMgm2V5ywMWKE,812
162
162
  thestage/services/project/mapper/project_inference_simulator_model_mapper.py,sha256=PWY0iWbXhvD-G0X0_aQZAFY2bqc0lvRJcQAyC8Y-88Q,869
163
163
  thestage/services/project/mapper/project_task_mapper.py,sha256=SHIEXjYwt4vm2B1X2QiI4sCPbBarum0bTOnmTWPOlto,813
164
- thestage/services/project/project_service.py,sha256=n11WsCCXfm8Ulyo2zpGw0ILL3LtpW83RdQJuEd1dJcg,50869
164
+ thestage/services/project/project_service.py,sha256=q8j3JE2RhzBa1NiJ6PSfgClOSbpJhzGUN4Alv2Y_7FE,53246
165
165
  thestage/services/remote_server_service.py,sha256=3VPgd9ckxXOxXGGvb3JeJ0LwuZx2gd2jWn3Pf-CxqVk,23264
166
166
  thestage/services/service_factory.py,sha256=tWbFFDO6TeOz5jSYbe-OabqTmsjR9Xs1OZmd49Aj3g0,5098
167
167
  thestage/services/task/dto/task_dto.py,sha256=PJwrUsLLAoO2uA9xvzb27b9iYAoNiBcsHSxKERh2VFo,2335
168
168
  thestage/services/validation_service.py,sha256=ABb-ok-SGITE6jm8AR1hiYHYgGZL7ri02Yi0OCXbofo,2008
169
- thestage-0.5.42.dist-info/LICENSE.txt,sha256=U9QrxfdD7Ie7r8z1FleuvOGQvgCF1m0Mjd78cFvWaHE,572
170
- thestage-0.5.42.dist-info/METADATA,sha256=XHu6klHas0lUL4FQn8QGjXi9HhOOAv9O0Gza_X3_muw,5506
171
- thestage-0.5.42.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
172
- thestage-0.5.42.dist-info/entry_points.txt,sha256=57pMhs8zaCM-jgeTffC0WVqCsh35Uq_dUDmzXR80CI4,47
173
- thestage-0.5.42.dist-info/RECORD,,
169
+ thestage-0.5.44.dist-info/LICENSE.txt,sha256=U9QrxfdD7Ie7r8z1FleuvOGQvgCF1m0Mjd78cFvWaHE,572
170
+ thestage-0.5.44.dist-info/METADATA,sha256=ZFWB66Hr0zToO8AHTYEn-EibANQG09L_dBpBh0o-yaw,5557
171
+ thestage-0.5.44.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
172
+ thestage-0.5.44.dist-info/entry_points.txt,sha256=57pMhs8zaCM-jgeTffC0WVqCsh35Uq_dUDmzXR80CI4,47
173
+ thestage-0.5.44.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.8.1
2
+ Generator: poetry-core 2.0.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
thestage/.env DELETED
@@ -1,6 +0,0 @@
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