pybiolib 1.1.2090__tar.gz → 1.1.2109__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 (116) hide show
  1. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/PKG-INFO +1 -1
  2. pybiolib-1.1.2109/biolib/cli/data_record.py +79 -0
  3. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/cli/lfs.py +4 -0
  4. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/executors/docker_executor.py +8 -3
  5. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/pyproject.toml +1 -1
  6. pybiolib-1.1.2090/biolib/cli/data_record.py +0 -44
  7. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/LICENSE +0 -0
  8. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/README.md +0 -0
  9. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/__init__.py +0 -0
  10. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_data_record/data_record.py +0 -0
  11. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/__init__.py +0 -0
  12. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/data_record/__init__.py +0 -0
  13. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/data_record/data_record.py +0 -0
  14. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/data_record/remote_storage_endpoint.py +0 -0
  15. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/file_utils.py +0 -0
  16. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/fuse_mount/__init__.py +0 -0
  17. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/fuse_mount/experiment_fuse_mount.py +0 -0
  18. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/http_client.py +0 -0
  19. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/lfs/__init__.py +0 -0
  20. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/lfs/cache.py +0 -0
  21. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/libs/__init__.py +0 -0
  22. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/libs/fusepy/__init__.py +0 -0
  23. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/push_application.py +0 -0
  24. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/runtime.py +0 -0
  25. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_internal/utils/__init__.py +0 -0
  26. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/_runtime/runtime.py +0 -0
  27. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/api/__init__.py +0 -0
  28. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/api/client.py +0 -0
  29. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/app/__init__.py +0 -0
  30. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/app/app.py +0 -0
  31. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/app/search_apps.py +0 -0
  32. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_api_client/__init__.py +0 -0
  33. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_api_client/api_client.py +0 -0
  34. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_api_client/app_types.py +0 -0
  35. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_api_client/auth.py +0 -0
  36. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_api_client/biolib_app_api.py +0 -0
  37. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_api_client/biolib_job_api.py +0 -0
  38. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_api_client/common_types.py +0 -0
  39. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_api_client/job_types.py +0 -0
  40. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_api_client/lfs_types.py +0 -0
  41. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_api_client/user_state.py +0 -0
  42. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/__init__.py +0 -0
  43. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/base_bbf_package.py +0 -0
  44. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/file_in_container.py +0 -0
  45. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/module_input.py +0 -0
  46. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/module_output_v2.py +0 -0
  47. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/remote_endpoints.py +0 -0
  48. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/remote_stream_seeker.py +0 -0
  49. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/saved_job.py +0 -0
  50. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/stdout_and_stderr.py +0 -0
  51. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/system_exception.py +0 -0
  52. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/system_status_update.py +0 -0
  53. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_binary_format/utils.py +0 -0
  54. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_docker_client/__init__.py +0 -0
  55. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_download_container.py +0 -0
  56. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_errors.py +0 -0
  57. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/biolib_logging.py +0 -0
  58. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/cli/__init__.py +0 -0
  59. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/cli/auth.py +0 -0
  60. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/cli/download_container.py +0 -0
  61. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/cli/init.py +0 -0
  62. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/cli/push.py +0 -0
  63. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/cli/run.py +0 -0
  64. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/cli/runtime.py +0 -0
  65. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/cli/start.py +0 -0
  66. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/.gitignore +0 -0
  67. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/__init__.py +0 -0
  68. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/cloud_utils/__init__.py +0 -0
  69. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/cloud_utils/cloud_utils.py +0 -0
  70. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/__init__.py +0 -0
  71. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/cache_state.py +0 -0
  72. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/cache_types.py +0 -0
  73. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/docker_image_cache.py +0 -0
  74. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/executors/__init__.py +0 -0
  75. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/executors/docker_types.py +0 -0
  76. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/executors/tars/__init__.py +0 -0
  77. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/executors/types.py +0 -0
  78. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/job_legacy_input_wait_timeout_thread.py +0 -0
  79. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/job_max_runtime_timer_thread.py +0 -0
  80. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/job_storage.py +0 -0
  81. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/job_worker.py +0 -0
  82. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/large_file_system.py +0 -0
  83. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/mappings.py +0 -0
  84. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/utilization_reporter_thread.py +0 -0
  85. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/job_worker/utils.py +0 -0
  86. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/remote_host_proxy.py +0 -0
  87. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/socker_listener_thread.py +0 -0
  88. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/socket_sender_thread.py +0 -0
  89. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/utils.py +0 -0
  90. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/webserver/__init__.py +0 -0
  91. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/webserver/gunicorn_flask_application.py +0 -0
  92. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/webserver/webserver.py +0 -0
  93. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/webserver/webserver_types.py +0 -0
  94. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/webserver/webserver_utils.py +0 -0
  95. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/compute_node/webserver/worker_thread.py +0 -0
  96. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/experiments/__init__.py +0 -0
  97. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/experiments/experiment.py +0 -0
  98. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/experiments/types.py +0 -0
  99. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/jobs/__init__.py +0 -0
  100. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/jobs/job.py +0 -0
  101. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/jobs/job_result.py +0 -0
  102. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/jobs/types.py +0 -0
  103. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/runtime/__init__.py +0 -0
  104. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/sdk/__init__.py +0 -0
  105. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/tables.py +0 -0
  106. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/templates/__init__.py +0 -0
  107. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/templates/example_app.py +0 -0
  108. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/typing_utils.py +0 -0
  109. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/user/__init__.py +0 -0
  110. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/user/sign_in.py +0 -0
  111. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/utils/__init__.py +0 -0
  112. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/utils/app_uri.py +0 -0
  113. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/utils/cache_state.py +0 -0
  114. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/utils/multipart_uploader.py +0 -0
  115. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/utils/seq_util.py +0 -0
  116. {pybiolib-1.1.2090 → pybiolib-1.1.2109}/biolib/utils/zip/remote_zip.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pybiolib
3
- Version: 1.1.2090
3
+ Version: 1.1.2109
4
4
  Summary: BioLib Python Client
5
5
  Home-page: https://github.com/biolib
6
6
  License: MIT
@@ -0,0 +1,79 @@
1
+ import json
2
+ import logging
3
+ import os
4
+ from typing import Dict, List
5
+
6
+ import click
7
+
8
+ from biolib._data_record.data_record import DataRecord
9
+ from biolib.biolib_logging import logger, logger_no_user_data
10
+ from biolib.typing_utils import Optional
11
+
12
+
13
+ @click.group(help='Data Records')
14
+ def data_record() -> None:
15
+ logger.configure(default_log_level=logging.INFO)
16
+ logger_no_user_data.configure(default_log_level=logging.INFO)
17
+
18
+
19
+ @data_record.command(help='Create a Data Record')
20
+ @click.argument('uri', required=True)
21
+ @click.option('--data-path', required=True, type=click.Path(exists=True))
22
+ def create(uri: str, data_path: str) -> None:
23
+ DataRecord.create(destination=uri, data_path=data_path)
24
+
25
+
26
+ @data_record.command(help='Update a Data Record')
27
+ @click.argument('uri', required=True)
28
+ @click.option('--data-path', required=True, type=click.Path(exists=True))
29
+ @click.option('--chunk-size', default=None, required=False, type=click.INT, help='The size of each chunk (In MB)')
30
+ def update(uri: str, data_path: str, chunk_size: Optional[int]) -> None:
31
+ DataRecord.get_by_uri(uri=uri).update(data_path=data_path, chunk_size_in_mb=chunk_size)
32
+
33
+
34
+ @data_record.command(help='Download files from a Data Record')
35
+ @click.argument('uri', required=True)
36
+ @click.option('--file', required=False, type=str)
37
+ @click.option('--path-filter', required=False, type=str, hide_input=True)
38
+ def download(uri: str, file: Optional[str], path_filter: Optional[str]) -> None:
39
+ record = DataRecord.get_by_uri(uri=uri)
40
+ if file is not None:
41
+ try:
42
+ file_obj = [file_obj for file_obj in record.list_files() if file_obj.path == file][0]
43
+ except IndexError:
44
+ raise Exception('File not found in data record') from None
45
+
46
+ assert not os.path.exists(file_obj.name), 'File already exists in current directory'
47
+ with open(file_obj.name, 'wb') as file_handle:
48
+ file_handle.write(file_obj.get_data())
49
+
50
+ else:
51
+ assert not os.path.exists(record.name), f'Directory with name {record.name} already exists in current directory'
52
+ record.save_files(output_dir=record.name, path_filter=path_filter)
53
+
54
+
55
+ @data_record.command(help='Describe a Data Record')
56
+ @click.argument('uri', required=True)
57
+ @click.option('--json', 'output_as_json', is_flag=True, default=False, required=False, help='Format output as JSON')
58
+ def describe(uri: str, output_as_json: bool) -> None:
59
+ record = DataRecord.get_by_uri(uri)
60
+ files_info: List[Dict] = []
61
+ total_size_in_bytes = 0
62
+ for file in record.list_files():
63
+ files_info.append({'path': file.path, 'size_bytes': file.length})
64
+ total_size_in_bytes += file.length
65
+
66
+ if output_as_json:
67
+ print(
68
+ json.dumps(
69
+ obj={'uri': record.uri, 'size_bytes': total_size_in_bytes, 'files': files_info},
70
+ indent=4,
71
+ )
72
+ )
73
+ else:
74
+ print(f'Data Record {record.uri}\ntotal {total_size_in_bytes} bytes\n')
75
+ print('size bytes path')
76
+ for file_info in files_info:
77
+ size_string = str(file_info['size_bytes'])
78
+ leading_space_string = ' ' * (10 - len(size_string))
79
+ print(f"{leading_space_string}{size_string} {file_info['path']}")
@@ -21,6 +21,7 @@ def lfs() -> None:
21
21
  @lfs.command(help='Create a Large File System')
22
22
  @click.argument('uri', required=True)
23
23
  def create(uri: str) -> None:
24
+ logger.warning('This is command deprecated, please use "biolib data-record create" instead.')
24
25
  logger.configure(default_log_level=logging.INFO)
25
26
  logger_no_user_data.configure(default_log_level=logging.INFO)
26
27
  DataRecord.create(destination=uri)
@@ -31,6 +32,7 @@ def create(uri: str) -> None:
31
32
  @click.option('--path', required=True, type=click.Path(exists=True))
32
33
  @click.option('--chunk-size', default=None, required=False, type=click.INT, help='The size of each chunk (In MB)')
33
34
  def push(uri: str, path: str, chunk_size: Optional[int]) -> None:
35
+ logger.warning('This is command deprecated, please use "biolib data-record update" instead.')
34
36
  logger.configure(default_log_level=logging.INFO)
35
37
  logger_no_user_data.configure(default_log_level=logging.INFO)
36
38
  try:
@@ -44,6 +46,7 @@ def push(uri: str, path: str, chunk_size: Optional[int]) -> None:
44
46
  @click.argument('uri', required=True)
45
47
  @click.option('--file-path', required=True, type=str)
46
48
  def download_file(uri: str, file_path: str) -> None:
49
+ logger.warning('This is command deprecated, please use "biolib data-record download" instead.')
47
50
  logger.configure(default_log_level=logging.INFO)
48
51
  logger_no_user_data.configure(default_log_level=logging.INFO)
49
52
  try:
@@ -66,6 +69,7 @@ def download_file(uri: str, file_path: str) -> None:
66
69
  @click.argument('uri', required=True)
67
70
  @click.option('--json', 'output_as_json', is_flag=True, default=False, required=False, help='Format output as JSON')
68
71
  def describe(uri: str, output_as_json: bool) -> None:
72
+ logger.warning('This is command deprecated, please use "biolib data-record describe" instead.')
69
73
  data_record = DataRecord.get_by_uri(uri)
70
74
  files_info: List[Dict] = []
71
75
  total_size_in_bytes = 0
@@ -270,6 +270,8 @@ class DockerExecutor:
270
270
  # TODO: type this method
271
271
  def _initialize_docker_container(self, module_input):
272
272
  try:
273
+ job_uuid = self._options['job']['public_id']
274
+ logger_no_user_data.debug(f'Job "{job_uuid}" initializing Docker container...')
273
275
  module = self._options['module']
274
276
  logger.debug(f"Initializing docker container with command: {module['command']}")
275
277
 
@@ -314,6 +316,7 @@ class DockerExecutor:
314
316
  }
315
317
  )
316
318
 
319
+ logger_no_user_data.debug(f'Job "{job_uuid}" initializing Docker container. Getting IPs for proxies...')
317
320
  for proxy in self._options['remote_host_proxies']:
318
321
  proxy_ip = proxy.get_ip_address_on_network(internal_network)
319
322
  if proxy.is_app_caller_proxy:
@@ -332,6 +335,7 @@ class DockerExecutor:
332
335
  else:
333
336
  extra_hosts[proxy.hostname] = proxy_ip
334
337
 
338
+ logger_no_user_data.debug(f'Job "{job_uuid}" initializing Docker container. Constructing container args...')
335
339
  create_container_args = {
336
340
  'environment': environment_vars,
337
341
  'extra_hosts': extra_hosts,
@@ -368,9 +372,10 @@ class DockerExecutor:
368
372
  if docker_runtime is not None:
369
373
  create_container_args['runtime'] = docker_runtime
370
374
 
371
- self._docker_container = BiolibDockerClient.get_docker_client().containers.create(**create_container_args)
372
-
373
- logger_no_user_data.debug('Finished initializing docker container')
375
+ docker_client = BiolibDockerClient.get_docker_client()
376
+ logger_no_user_data.debug(f'Job "{job_uuid}" initializing Docker container. Creating container...')
377
+ self._docker_container = docker_client.containers.create(**create_container_args)
378
+ logger_no_user_data.debug(f'Job "{job_uuid}" finished initializing Docker container.')
374
379
  except Exception as exception:
375
380
  raise ComputeProcessException(
376
381
  exception, SystemExceptionCodes.FAILED_TO_START_COMPUTE_CONTAINER.value, self._send_system_exception
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pybiolib"
3
- version = "1.1.2090"
3
+ version = "1.1.2109"
4
4
  description = "BioLib Python Client"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,44 +0,0 @@
1
- import logging
2
- import os
3
-
4
- import click
5
-
6
- from biolib._data_record.data_record import DataRecord
7
- from biolib.biolib_logging import logger, logger_no_user_data
8
- from biolib.sdk import create_data_record
9
- from biolib.typing_utils import Optional
10
-
11
-
12
- @click.group(help='Data Records')
13
- def data_record() -> None:
14
- logger.configure(default_log_level=logging.INFO)
15
- logger_no_user_data.configure(default_log_level=logging.INFO)
16
-
17
-
18
- @data_record.command(help='Create a Data Record')
19
- @click.option('--destination', type=str, required=True)
20
- @click.option('--data-path', required=True, type=click.Path(exists=True))
21
- @click.option('--name', type=str, required=False)
22
- def create(destination: str, data_path: str, name: Optional[str] = None) -> None:
23
- create_data_record(destination=destination, data_path=data_path, name=name)
24
-
25
-
26
- @data_record.command(help='Download files from a Data Record')
27
- @click.argument('uri', required=True)
28
- @click.option('--file', required=False, type=str)
29
- @click.option('--path-filter', required=False, type=str, hide_input=True)
30
- def download(uri: str, file: Optional[str], path_filter: Optional[str]) -> None:
31
- record = DataRecord.get_by_uri(uri=uri)
32
- if file is not None:
33
- try:
34
- file_obj = [file_obj for file_obj in record.list_files() if file_obj.path == file][0]
35
- except IndexError:
36
- raise Exception('File not found in data record') from None
37
-
38
- assert not os.path.exists(file_obj.name), 'File already exists in current directory'
39
- with open(file_obj.name, 'wb') as file_handle:
40
- file_handle.write(file_obj.get_data())
41
-
42
- else:
43
- assert not os.path.exists(record.name), f'Directory with name {record.name} already exists in current directory'
44
- record.save_files(output_dir=record.name, path_filter=path_filter)
File without changes
File without changes