geoseeq 0.5.6a7__tar.gz → 0.5.6a8__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/PKG-INFO +1 -1
  2. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/main.py +1 -1
  3. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/upload/upload.py +4 -2
  4. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/upload/upload_reads.py +1 -0
  5. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/file_system_cache.py +2 -2
  6. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/result/file_upload.py +108 -9
  7. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/upload_download_manager.py +6 -4
  8. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq.egg-info/PKG-INFO +1 -1
  9. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/pyproject.toml +1 -1
  10. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/LICENSE +0 -0
  11. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/README.md +0 -0
  12. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/__init__.py +0 -0
  13. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/app.py +0 -0
  14. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/blob_constructors.py +0 -0
  15. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/bulk_creators.py +0 -0
  16. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/__init__.py +0 -0
  17. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/constants.py +0 -0
  18. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/copy.py +0 -0
  19. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/detail.py +0 -0
  20. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/download.py +0 -0
  21. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/fastq_utils.py +0 -0
  22. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/get_eula.py +0 -0
  23. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/manage.py +0 -0
  24. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/progress_bar.py +0 -0
  25. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/run.py +0 -0
  26. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/search.py +0 -0
  27. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/shared_params/__init__.py +0 -0
  28. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/shared_params/common_state.py +0 -0
  29. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/shared_params/config.py +0 -0
  30. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/shared_params/id_handlers.py +0 -0
  31. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/shared_params/obj_getters.py +0 -0
  32. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/shared_params/opts_and_args.py +0 -0
  33. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/upload/__init__.py +0 -0
  34. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/upload/upload_advanced.py +0 -0
  35. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/user.py +0 -0
  36. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/utils.py +0 -0
  37. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/cli/view.py +0 -0
  38. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/constants.py +0 -0
  39. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/contrib/__init__.py +0 -0
  40. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/contrib/ncbi/__init__.py +0 -0
  41. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/contrib/ncbi/api.py +0 -0
  42. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/contrib/ncbi/bioproject.py +0 -0
  43. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/contrib/ncbi/cli.py +0 -0
  44. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/contrib/ncbi/setup_logging.py +0 -0
  45. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/id_constructors/__init__.py +0 -0
  46. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/id_constructors/from_blobs.py +0 -0
  47. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/id_constructors/from_ids.py +0 -0
  48. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/id_constructors/from_names.py +0 -0
  49. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/id_constructors/from_uuids.py +0 -0
  50. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/id_constructors/resolvers.py +0 -0
  51. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/id_constructors/utils.py +0 -0
  52. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/knex.py +0 -0
  53. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/organization.py +0 -0
  54. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/pipeline.py +0 -0
  55. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/plotting/__init__.py +0 -0
  56. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/plotting/constants.py +0 -0
  57. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/plotting/highcharts.py +0 -0
  58. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/plotting/map/__init__.py +0 -0
  59. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/plotting/map/base_layer.py +0 -0
  60. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/plotting/map/map.py +0 -0
  61. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/plotting/map/overlay.py +0 -0
  62. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/plotting/selectable.py +0 -0
  63. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/project.py +0 -0
  64. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/remote_object.py +0 -0
  65. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/result/__init__.py +0 -0
  66. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/result/bioinfo.py +0 -0
  67. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/result/file_download.py +0 -0
  68. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/result/result_file.py +0 -0
  69. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/result/result_folder.py +0 -0
  70. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/result/utils.py +0 -0
  71. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/sample.py +0 -0
  72. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/search.py +0 -0
  73. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/user.py +0 -0
  74. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/utils.py +0 -0
  75. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/vc/__init__.py +0 -0
  76. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/vc/checksum.py +0 -0
  77. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/vc/cli.py +0 -0
  78. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/vc/clone.py +0 -0
  79. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/vc/constants.py +0 -0
  80. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/vc/vc_cache.py +0 -0
  81. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/vc/vc_dir.py +0 -0
  82. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/vc/vc_sample.py +0 -0
  83. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/vc/vc_stub.py +0 -0
  84. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq/work_orders.py +0 -0
  85. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq.egg-info/SOURCES.txt +0 -0
  86. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq.egg-info/dependency_links.txt +0 -0
  87. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq.egg-info/entry_points.txt +0 -0
  88. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/geoseeq.egg-info/top_level.txt +0 -0
  89. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/setup.cfg +0 -0
  90. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/setup.py +0 -0
  91. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/tests/__init__.py +0 -0
  92. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/tests/test_api_client.py +0 -0
  93. {geoseeq-0.5.6a7 → geoseeq-0.5.6a8}/tests/test_plotting.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geoseeq
3
- Version: 0.5.6a7
3
+ Version: 0.5.6a8
4
4
  Summary: GeoSeeq command line tools and python API
5
5
  Author: David C. Danko
6
6
  Author-email: "David C. Danko" <dcdanko@biotia.io>
@@ -53,7 +53,7 @@ def version():
53
53
  Use of this tool implies acceptance of the GeoSeeq End User License Agreement.
54
54
  Run `geoseeq eula show` to view the EULA.
55
55
  """
56
- click.echo('0.5.6a7') # remember to update setup
56
+ click.echo('0.5.6a8') # remember to update setup
57
57
 
58
58
 
59
59
  @main.group('advanced')
@@ -107,7 +107,8 @@ def cli_upload_file(state, cores, yes, private, link_type, recursive, hidden, ge
107
107
  link_type=link_type,
108
108
  progress_tracker_factory=PBarManager().get_new_bar,
109
109
  log_level=state.log_level,
110
- overwrite=True
110
+ overwrite=True,
111
+ use_cache=state.use_cache,
111
112
  )
112
113
  for geoseeq_file_name, file_path in name_pairs:
113
114
  if isfile(file_path):
@@ -140,7 +141,8 @@ def cli_upload_folder(state, cores, yes, private, recursive, hidden, project_or_
140
141
  link_type='upload',
141
142
  progress_tracker_factory=PBarManager().get_new_bar,
142
143
  log_level=logging.INFO,
143
- overwrite=True
144
+ overwrite=True,
145
+ use_cache=state.use_cache,
144
146
  )
145
147
  for folder_name in folder_names:
146
148
  result_folder = root_obj.result_folder(folder_name).idem()
@@ -95,6 +95,7 @@ def _do_upload(groups, module_name, link_type, lib, filepaths, overwrite, cores,
95
95
  log_level=state.log_level,
96
96
  overwrite=overwrite,
97
97
  progress_tracker_factory=PBarManager().get_new_bar,
98
+ use_cache=state.use_cache,
98
99
  )
99
100
  for group in groups:
100
101
  sample = lib.sample(group['sample_name']).idem()
@@ -15,7 +15,7 @@ CACHE_DIR = join(
15
15
  "geoseeq"
16
16
  )
17
17
  USE_GEOSEEQ_CACHE = None
18
-
18
+ GEOSEEQ_CACHE_DIR = abspath(f'{CACHE_DIR}/geoseeq_api_cache/v1/')
19
19
 
20
20
  def hash_obj(obj):
21
21
  val = obj
@@ -41,7 +41,7 @@ class FileSystemCache:
41
41
 
42
42
  @property
43
43
  def cache_dir_path(self):
44
- return abspath(f'{CACHE_DIR}/geoseeq_api_cache/v1/')
44
+ return GEOSEEQ_CACHE_DIR
45
45
 
46
46
  def setup(self):
47
47
  if self.no_cache:
@@ -1,7 +1,8 @@
1
1
 
2
2
  import time
3
3
  import json
4
- from os.path import basename, getsize
4
+ import os
5
+ from os.path import basename, getsize, join, dirname, isfile
5
6
  from pathlib import Path
6
7
 
7
8
  import requests
@@ -11,7 +12,7 @@ from geoseeq.constants import FIVE_MB
11
12
  from geoseeq.utils import md5_checksum
12
13
  from concurrent.futures import ThreadPoolExecutor, as_completed
13
14
  from .utils import *
14
-
15
+ from geoseeq.file_system_cache import GEOSEEQ_CACHE_DIR
15
16
 
16
17
  class FileChunker:
17
18
 
@@ -38,6 +39,77 @@ class FileChunker:
38
39
  def get_chunk_size(self, num):
39
40
  self.load_all_chunks()
40
41
  return len(self.loaded_parts[num])
42
+
43
+
44
+ class ResumableUploadTracker:
45
+
46
+ def __init__(self, filepath, chunk_size, tracker_file_prefix="gs_resumable_upload_tracker"):
47
+ self.open, self.upload_started = True, False
48
+ self.upload_id, self.urls = None, None
49
+ self.filepath = filepath
50
+ self.tracker_file = join(
51
+ GEOSEEQ_CACHE_DIR, 'upload',
52
+ tracker_file_prefix + f".{chunk_size}." + basename(filepath)
53
+ )
54
+ try:
55
+ os.makedirs(dirname(self.tracker_file), exist_ok=True)
56
+ except Exception as e:
57
+ logger.warning(f'Could not create resumable upload tracker directory. {e}')
58
+ self.open = False
59
+ self._loaded_parts = {}
60
+ self._load_parts_from_file()
61
+
62
+ def start_upload(self, upload_id, urls):
63
+ if not self.open:
64
+ return
65
+ if self.upload_started:
66
+ raise GeoseeqGeneralError("Upload has already started.")
67
+ blob = dict(upload_id=upload_id, urls=urls)
68
+ serialized = json.dumps(blob)
69
+ with open(self.tracker_file, "w") as f:
70
+ f.write(serialized + "\n")
71
+ self.upload_id, self.urls = upload_id, urls
72
+ self.upload_started = True
73
+
74
+ def add_part(self, part_upload_info):
75
+ if not self.open:
76
+ return
77
+ part_id = part_upload_info["PartNumber"]
78
+ serialized = json.dumps(part_upload_info)
79
+ with open(self.tracker_file, "a") as f:
80
+ f.write(serialized + "\n")
81
+ self._loaded_parts[part_id] = part_upload_info
82
+ if len(self._loaded_parts) == len(self.urls):
83
+ self.cleanup()
84
+ self.open = False
85
+
86
+ def _load_parts_from_file(self):
87
+ if not isfile(self.tracker_file):
88
+ return
89
+ with open(self.tracker_file, "r") as f:
90
+ header_blob = json.loads(f.readline())
91
+ self.upload_id, self.urls = header_blob["upload_id"], header_blob["urls"]
92
+ self.upload_started = True
93
+ for line in f:
94
+ blob = json.loads(line)
95
+ part_id = blob["PartNumber"]
96
+ self._loaded_parts[part_id] = blob
97
+
98
+ def part_has_been_uploaded(self, part_number):
99
+ if not self.open:
100
+ return False
101
+ return part_number in self._loaded_parts
102
+
103
+ def get_part_info(self, part_number):
104
+ return self._loaded_parts[part_number]
105
+
106
+ def cleanup(self):
107
+ if not self.open:
108
+ return
109
+ try:
110
+ os.remove(self.tracker_file)
111
+ except FileNotFoundError:
112
+ pass
41
113
 
42
114
 
43
115
  class ResultFileUpload:
@@ -74,7 +146,10 @@ class ResultFileUpload:
74
146
  urls = response
75
147
  return upload_id, urls
76
148
 
77
- def _upload_one_part(self, file_chunker, url, num, max_retries, session=None):
149
+ def _upload_one_part(self, file_chunker, url, num, max_retries, session=None, resumable_upload_tracker=None):
150
+ if resumable_upload_tracker and resumable_upload_tracker.part_has_been_uploaded(num + 1):
151
+ logger.info(f"Part {num + 1} has already been uploaded. Skipping.")
152
+ return resumable_upload_tracker.get_part_info(num + 1)
78
153
  file_chunk = file_chunker.get_chunk(num)
79
154
  attempts = 0
80
155
  while attempts < max_retries:
@@ -94,7 +169,12 @@ class ResultFileUpload:
94
169
  if attempts == max_retries:
95
170
  raise
96
171
  time.sleep(10**attempts) # exponential backoff, (10 ** 2)s default max
97
- return {"ETag": http_response.headers["ETag"], "PartNumber": num + 1}
172
+ etag = http_response.headers["ETag"].replace('"', "")
173
+ blob = {"ETag": etag, "PartNumber": num + 1}
174
+ if resumable_upload_tracker:
175
+ # TODO technically not thread safe, but should be fine for now
176
+ resumable_upload_tracker.add_part(blob)
177
+ return blob
98
178
 
99
179
  def _finish_multipart_upload(self, upload_id, complete_parts):
100
180
  response = self.knex.post(
@@ -108,12 +188,12 @@ class ResultFileUpload:
108
188
  )
109
189
  response.raise_for_status()
110
190
 
111
- def _upload_parts(self, file_chunker, urls, max_retries, session, progress_tracker, threads):
191
+ def _upload_parts(self, file_chunker, urls, max_retries, session, progress_tracker, threads, resumable_upload_tracker=None):
112
192
  if threads == 1:
113
193
  logger.info(f"Uploading parts in series for {file_chunker.filepath}")
114
194
  complete_parts = []
115
195
  for num, url in enumerate(list(urls.values())):
116
- response_part = self._upload_one_part(file_chunker, url, num, max_retries, session)
196
+ response_part = self._upload_one_part(file_chunker, url, num, max_retries, session, resumable_upload_tracker)
117
197
  complete_parts.append(response_part)
118
198
  if progress_tracker: progress_tracker.update(file_chunker.get_chunk_size(num))
119
199
  logger.info(f'Uploaded part {num + 1} of {len(urls)} for "{file_chunker.filepath}"')
@@ -124,7 +204,7 @@ class ResultFileUpload:
124
204
  futures = []
125
205
  for num, url in enumerate(list(urls.values())):
126
206
  future = executor.submit(
127
- self._upload_one_part, file_chunker, url, num, max_retries, session
207
+ self._upload_one_part, file_chunker, url, num, max_retries, session, resumable_upload_tracker
128
208
  )
129
209
  futures.append(future)
130
210
  complete_parts = []
@@ -148,15 +228,34 @@ class ResultFileUpload:
148
228
  session=None,
149
229
  progress_tracker=None,
150
230
  threads=1,
231
+ use_cache=True,
151
232
  ):
152
233
  """Upload a file to S3 using the multipart upload process."""
153
234
  logger.info(f"Uploading {filepath} to S3 using multipart upload.")
154
- upload_id, urls = self._prep_multipart_upload(filepath, file_size, chunk_size, optional_fields)
235
+ resumable_upload_tracker = None
236
+ if use_cache and file_size > 10 * FIVE_MB: # only use resumable upload tracker for larger files
237
+ resumable_upload_tracker = ResumableUploadTracker(filepath, chunk_size)
238
+ if resumable_upload_tracker and resumable_upload_tracker.upload_started:
239
+ upload_id, urls = resumable_upload_tracker.upload_id, resumable_upload_tracker.urls
240
+ logger.info(f'Resuming upload for "{filepath}", upload_id: "{upload_id}"')
241
+ else:
242
+ upload_id, urls = self._prep_multipart_upload(filepath, file_size, chunk_size, optional_fields)
243
+ if resumable_upload_tracker:
244
+ logger.info(f'Creating new resumable upload for "{filepath}", upload_id: "{upload_id}"')
245
+ resumable_upload_tracker.start_upload(upload_id, urls)
155
246
  logger.info(f'Starting upload for "{filepath}"')
156
247
  complete_parts = []
157
248
  file_chunker = FileChunker(filepath, chunk_size).load_all_chunks()
158
249
  if progress_tracker: progress_tracker.set_num_chunks(file_chunker.file_size)
159
- complete_parts = self._upload_parts(file_chunker, urls, max_retries, session, progress_tracker, threads)
250
+ complete_parts = self._upload_parts(
251
+ file_chunker,
252
+ urls,
253
+ max_retries,
254
+ session,
255
+ progress_tracker,
256
+ threads,
257
+ resumable_upload_tracker=resumable_upload_tracker
258
+ )
160
259
  self._finish_multipart_upload(upload_id, complete_parts)
161
260
  logger.info(f'Finished Upload for "{filepath}"')
162
261
  return self
@@ -19,12 +19,12 @@ def _make_in_process_logger(log_level):
19
19
 
20
20
 
21
21
  def _upload_one_file(args):
22
- result_file, filepath, session, progress_tracker, link_type, overwrite, log_level, parallel_uploads = args
22
+ result_file, filepath, session, progress_tracker, link_type, overwrite, log_level, parallel_uploads, use_cache = args
23
23
  if parallel_uploads:
24
24
  _make_in_process_logger(log_level)
25
25
  if link_type == 'upload':
26
26
  # TODO: check checksums to see if the file is the same
27
- result_file.upload_file(filepath, session=session, overwrite=overwrite, progress_tracker=progress_tracker, threads=4)
27
+ result_file.upload_file(filepath, session=session, overwrite=overwrite, progress_tracker=progress_tracker, threads=4, use_cache=use_cache)
28
28
  else:
29
29
  result_file.link_file(link_type, filepath)
30
30
  return result_file
@@ -38,7 +38,8 @@ class GeoSeeqUploadManager:
38
38
  link_type='upload',
39
39
  progress_tracker_factory=None,
40
40
  log_level=logging.WARNING,
41
- overwrite=True):
41
+ overwrite=True,
42
+ use_cache=True):
42
43
  self.session = session
43
44
  self.n_parallel_uploads = n_parallel_uploads
44
45
  self.progress_tracker_factory = progress_tracker_factory if progress_tracker_factory else lambda x: None
@@ -46,6 +47,7 @@ class GeoSeeqUploadManager:
46
47
  self.link_type = link_type
47
48
  self.overwrite = overwrite
48
49
  self._result_files = []
50
+ self.use_cache = use_cache
49
51
 
50
52
  def add_result_file(self, result_file, local_path):
51
53
  self._result_files.append((result_file, local_path))
@@ -70,7 +72,7 @@ class GeoSeeqUploadManager:
70
72
  result_file, local_path,
71
73
  self.session, self.progress_tracker_factory(local_path),
72
74
  self.link_type, self.overwrite, self.log_level,
73
- self.n_parallel_uploads > 1
75
+ self.n_parallel_uploads > 1, self.use_cache
74
76
  ) for result_file, local_path in self._result_files
75
77
  ]
76
78
  out = []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geoseeq
3
- Version: 0.5.6a7
3
+ Version: 0.5.6a8
4
4
  Summary: GeoSeeq command line tools and python API
5
5
  Author: David C. Danko
6
6
  Author-email: "David C. Danko" <dcdanko@biotia.io>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "geoseeq"
7
- version = "0.5.6a7"
7
+ version = "0.5.6a8"
8
8
  authors = [
9
9
  { name="David C. Danko", email="dcdanko@biotia.io" },
10
10
  ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes