geoseeq 0.7.3.dev1__py3-none-any.whl → 0.7.3.dev3__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.
- geoseeq/dashboard/dashboard.py +38 -26
- geoseeq/project.py +172 -54
- geoseeq/sample.py +11 -6
- {geoseeq-0.7.3.dev1.dist-info → geoseeq-0.7.3.dev3.dist-info}/METADATA +1 -1
- {geoseeq-0.7.3.dev1.dist-info → geoseeq-0.7.3.dev3.dist-info}/RECORD +8 -8
- {geoseeq-0.7.3.dev1.dist-info → geoseeq-0.7.3.dev3.dist-info}/WHEEL +0 -0
- {geoseeq-0.7.3.dev1.dist-info → geoseeq-0.7.3.dev3.dist-info}/entry_points.txt +0 -0
- {geoseeq-0.7.3.dev1.dist-info → geoseeq-0.7.3.dev3.dist-info}/licenses/LICENSE +0 -0
geoseeq/dashboard/dashboard.py
CHANGED
@@ -5,6 +5,7 @@ from geoseeq import ProjectResultFile
|
|
5
5
|
from geoseeq.id_constructors import result_file_from_blob
|
6
6
|
from geoseeq.id_constructors.from_ids import result_file_from_id
|
7
7
|
from geoseeq.remote_object import RemoteObject
|
8
|
+
from geoseeq import GeoseeqNotFoundError
|
8
9
|
|
9
10
|
logger = logging.getLogger("geoseeq_api")
|
10
11
|
|
@@ -13,17 +14,22 @@ class Dashboard(RemoteObject):
|
|
13
14
|
parent_field = "project"
|
14
15
|
remote_fields = ["is_default"]
|
15
16
|
|
16
|
-
def __init__(
|
17
|
+
def __init__(
|
18
|
+
self, knex, project, title="Default dashboard", default=False, tiles=[]
|
19
|
+
):
|
17
20
|
super().__init__(self)
|
18
21
|
self.knex = knex
|
19
22
|
self.project = project
|
20
|
-
self.
|
21
|
-
self.
|
22
|
-
self.
|
23
|
+
self.title = title
|
24
|
+
self._original_title = title
|
25
|
+
self.tiles = tiles
|
26
|
+
self.default = default
|
23
27
|
|
24
28
|
def _get(self, allow_overwrite=False):
|
25
29
|
blob = self.knex.get(f"sample_groups/{self.project.uuid}/dashboard-list")
|
26
|
-
|
30
|
+
if self.title not in blob["dashboard_data"].keys():
|
31
|
+
raise GeoseeqNotFoundError(f"Dashboard '{self.title}' not found.")
|
32
|
+
blob = blob["dashboard_data"][self.title]
|
27
33
|
for tile_blob in blob["tiles"]:
|
28
34
|
tile = DashboardTile.from_blob(self, tile_blob)
|
29
35
|
self.tiles.append(tile)
|
@@ -31,56 +37,62 @@ class Dashboard(RemoteObject):
|
|
31
37
|
self.load_blob(blob, allow_overwrite=allow_overwrite)
|
32
38
|
|
33
39
|
def save(self):
|
40
|
+
put_data = {
|
41
|
+
"name": self._original_title,
|
42
|
+
"is_default": self.default,
|
43
|
+
"new_name": self.title,
|
44
|
+
}
|
45
|
+
self.knex.put(
|
46
|
+
f"sample_groups/{self.project.uuid}/dashboard-list",
|
47
|
+
json=put_data,
|
48
|
+
json_response=False,
|
49
|
+
)
|
50
|
+
self._original_title = self.title
|
34
51
|
self.save_tiles()
|
35
52
|
|
36
53
|
def save_tiles(self):
|
37
54
|
post_data = {"tiles": [tile._get_post_data() for tile in self.tiles]}
|
38
|
-
|
39
|
-
f"sample_groups/{self.project.uuid}/dashboard/{self.
|
55
|
+
self.knex.post(
|
56
|
+
f"sample_groups/{self.project.uuid}/dashboard/{self._original_title}/tiles",
|
40
57
|
json=post_data,
|
41
58
|
json_response=False,
|
42
59
|
)
|
43
|
-
print(blob)
|
44
60
|
|
45
61
|
def _create(self):
|
46
|
-
post_data = {"name": self.
|
47
|
-
|
48
|
-
f"sample_groups/{self.project.uuid}/dashboard", json=post_data
|
62
|
+
post_data = {"name": self.title, "is_default": self.default}
|
63
|
+
self.knex.post(
|
64
|
+
f"sample_groups/{self.project.uuid}/dashboard-list", json=post_data
|
49
65
|
)
|
50
|
-
self.load_blob(blob)
|
51
66
|
|
52
|
-
def
|
67
|
+
def add_tile(
|
53
68
|
self,
|
54
|
-
title,
|
55
69
|
result_file,
|
56
|
-
|
70
|
+
title,
|
71
|
+
width: Literal["hafl", "full"] = "half",
|
57
72
|
):
|
73
|
+
style = "col-span-1" if width == "half" else "col-span-2"
|
58
74
|
result_file.get()
|
59
75
|
tile = DashboardTile(self.knex, self, title, result_file, style=style)
|
60
76
|
self.tiles.append(tile)
|
61
77
|
self._modified = True
|
62
|
-
return tile
|
63
|
-
|
64
|
-
def add_tile(self, tile):
|
65
|
-
self.tiles.append(tile)
|
66
|
-
self._modified = True
|
67
78
|
|
68
|
-
|
69
|
-
|
70
|
-
|
79
|
+
def delete(self):
|
80
|
+
self.knex.delete(
|
81
|
+
f"sample_groups/{self.project.uuid}/dashboard-list?name={self._original_title}"
|
82
|
+
)
|
71
83
|
|
72
84
|
def __str__(self):
|
73
|
-
return f'<Geoseeq Dashboard: {self.project.grn} "{self.
|
85
|
+
return f'<Geoseeq Dashboard: {self.project.grn} "{self._original_title}"/>'
|
74
86
|
|
75
87
|
def __repr__(self):
|
76
88
|
return str(self)
|
77
89
|
|
78
90
|
@property
|
79
91
|
def grn(self):
|
80
|
-
return f'grn:dashboard:{self.project.uuid}:"{self.
|
92
|
+
return f'grn:dashboard:{self.project.uuid}:"{self._original_title}"'
|
81
93
|
|
82
94
|
def pre_hash(self):
|
83
|
-
return "DASH" + self.project.uuid + self.
|
95
|
+
return "DASH" + self.project.uuid + self._original_title
|
84
96
|
|
85
97
|
|
86
98
|
class DashboardTile:
|
geoseeq/project.py
CHANGED
@@ -3,6 +3,7 @@ import urllib
|
|
3
3
|
|
4
4
|
import pandas as pd
|
5
5
|
|
6
|
+
|
6
7
|
from .pipeline import Pipeline
|
7
8
|
from .remote_object import RemoteObject
|
8
9
|
from .result import ProjectResultFolder
|
@@ -59,11 +60,23 @@ class Project(RemoteObject):
|
|
59
60
|
self._modified = True
|
60
61
|
|
61
62
|
def get_post_data(self):
|
62
|
-
data = {
|
63
|
+
data = {
|
64
|
+
field: getattr(self, field)
|
65
|
+
for field in self.remote_fields
|
66
|
+
if hasattr(self, field)
|
67
|
+
}
|
63
68
|
data["organization"] = self.org.uuid
|
64
|
-
data[
|
65
|
-
|
66
|
-
|
69
|
+
data["description"] = (
|
70
|
+
self.description
|
71
|
+
if hasattr(self, "description") and self.description
|
72
|
+
else self.name
|
73
|
+
)
|
74
|
+
data["privacy_level"] = (
|
75
|
+
self.privacy_level
|
76
|
+
if hasattr(self, "privacy_level") and self.privacy_level
|
77
|
+
else "private"
|
78
|
+
)
|
79
|
+
data["storage_provider_name"] = self.storage_provider
|
67
80
|
if self.new_org:
|
68
81
|
if isinstance(self.new_org, RemoteObject):
|
69
82
|
data["organization"] = self.new_org.uuid
|
@@ -90,7 +103,9 @@ class Project(RemoteObject):
|
|
90
103
|
url = f"sample_groups/{self.uuid}/samples"
|
91
104
|
chunk_size = 100
|
92
105
|
for i in range(0, len(sample_uuids), chunk_size):
|
93
|
-
self.knex.post(
|
106
|
+
self.knex.post(
|
107
|
+
url, json={"sample_uuids": sample_uuids[i : i + chunk_size]}
|
108
|
+
)
|
94
109
|
self._sample_cache = []
|
95
110
|
|
96
111
|
def _delete_sample_list(self):
|
@@ -126,7 +141,7 @@ class Project(RemoteObject):
|
|
126
141
|
json=post_data,
|
127
142
|
)
|
128
143
|
self.load_blob(blob)
|
129
|
-
|
144
|
+
|
130
145
|
def add_sample_uuids(self, sample_uuids):
|
131
146
|
"""Return this group and add a sample to this group.
|
132
147
|
|
@@ -166,7 +181,7 @@ class Project(RemoteObject):
|
|
166
181
|
|
167
182
|
def analysis_result(self, *args, **kwargs):
|
168
183
|
"""Return a ProjectResultFolder object for this project.
|
169
|
-
|
184
|
+
|
170
185
|
Alias for result_folder."""
|
171
186
|
return self.result_folder(*args, **kwargs)
|
172
187
|
|
@@ -177,7 +192,9 @@ class Project(RemoteObject):
|
|
177
192
|
yield sample
|
178
193
|
return
|
179
194
|
url = f"sample_groups/{self.uuid}/samples-list?page=1&page_size=100"
|
180
|
-
for sample_blob in paginated_iterator(
|
195
|
+
for sample_blob in paginated_iterator(
|
196
|
+
self.knex, url, error_handler=error_handler
|
197
|
+
):
|
181
198
|
sample = self.sample(sample_blob["name"])
|
182
199
|
sample.uuid = sample_blob["uuid"]
|
183
200
|
sample.metadata = sample_blob["metadata"]
|
@@ -199,12 +216,16 @@ class Project(RemoteObject):
|
|
199
216
|
yield sample.uuid
|
200
217
|
return
|
201
218
|
url = f"sample_groups/{self.uuid}/samples-list?page=1"
|
202
|
-
for sample_blob in paginated_iterator(
|
203
|
-
|
219
|
+
for sample_blob in paginated_iterator(
|
220
|
+
self.knex, url, error_handler=error_handler
|
221
|
+
):
|
222
|
+
yield sample_blob["uuid"]
|
204
223
|
|
205
224
|
def _batch_sample_uuids(self, batch_size, input_sample_uuids=[]):
|
206
225
|
"""Yield batches of sample uuids."""
|
207
|
-
uuids_to_batch =
|
226
|
+
uuids_to_batch = (
|
227
|
+
input_sample_uuids if input_sample_uuids else self.get_sample_uuids()
|
228
|
+
)
|
208
229
|
sample_uuids = []
|
209
230
|
for sample_uuid in uuids_to_batch:
|
210
231
|
sample_uuids.append(sample_uuid)
|
@@ -216,7 +237,7 @@ class Project(RemoteObject):
|
|
216
237
|
|
217
238
|
def get_analysis_results(self, cache=True):
|
218
239
|
"""Yield ProjectResultFolder objects for this project fetched from the server.
|
219
|
-
|
240
|
+
|
220
241
|
Alias for get_result_folders."""
|
221
242
|
return self.get_result_folders(cache=cache)
|
222
243
|
|
@@ -262,24 +283,25 @@ class Project(RemoteObject):
|
|
262
283
|
rows.extend(blob["results"])
|
263
284
|
url = blob["next"]
|
264
285
|
return pd.DataFrame(rows)
|
265
|
-
|
266
|
-
|
286
|
+
|
267
287
|
@property
|
268
288
|
def n_samples(self):
|
269
289
|
"""Return the number of samples in this project."""
|
270
|
-
if hasattr(self,
|
290
|
+
if hasattr(self, "samples_count") and self.samples_count is not None:
|
271
291
|
return self.samples_count
|
272
292
|
return len(list(self.get_sample_uuids()))
|
273
|
-
|
274
|
-
def bulk_find_files(
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
293
|
+
|
294
|
+
def bulk_find_files(
|
295
|
+
self,
|
296
|
+
sample_uuids=[],
|
297
|
+
sample_name_includes=[],
|
298
|
+
folder_types="all",
|
299
|
+
folder_names=[],
|
300
|
+
file_names=[],
|
301
|
+
extensions=[],
|
302
|
+
with_versions=False,
|
303
|
+
use_batches_cutoff=500,
|
304
|
+
):
|
283
305
|
"""Return a dict with links to download files that match the given criteria.
|
284
306
|
|
285
307
|
Options:
|
@@ -291,36 +313,48 @@ class Project(RemoteObject):
|
|
291
313
|
- extensions: list of strings; finds files with these file extensions
|
292
314
|
- with_versions: bool; if True, include all versions of files in results
|
293
315
|
"""
|
316
|
+
|
294
317
|
def _my_bulk_find(sample_uuids=None): # curry to save typing
|
295
|
-
return self._bulk_find_files_batch(
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
318
|
+
return self._bulk_find_files_batch(
|
319
|
+
sample_uuids=sample_uuids or [],
|
320
|
+
sample_name_includes=sample_name_includes,
|
321
|
+
folder_types=folder_types,
|
322
|
+
folder_names=folder_names,
|
323
|
+
file_names=file_names,
|
324
|
+
extensions=extensions,
|
325
|
+
with_versions=with_versions,
|
326
|
+
)
|
327
|
+
|
302
328
|
n_samples = len(sample_uuids) if sample_uuids else self.n_samples
|
303
329
|
if n_samples < use_batches_cutoff:
|
304
330
|
logger.debug(f"Using single batch bulk_find for {n_samples} samples")
|
305
331
|
return _my_bulk_find(sample_uuids=sample_uuids)
|
306
332
|
else:
|
307
333
|
logger.debug(f"Using multi batch bulk_find for {n_samples} samples")
|
308
|
-
merged_response = {
|
309
|
-
|
334
|
+
merged_response = {
|
335
|
+
"file_size_bytes": 0,
|
336
|
+
"links": {},
|
337
|
+
"no_size_info_count": 0,
|
338
|
+
}
|
339
|
+
for batch in self._batch_sample_uuids(
|
340
|
+
use_batches_cutoff - 1, input_sample_uuids=sample_uuids
|
341
|
+
):
|
310
342
|
response = _my_bulk_find(sample_uuids=batch)
|
311
|
-
merged_response[
|
312
|
-
merged_response[
|
313
|
-
merged_response[
|
343
|
+
merged_response["file_size_bytes"] += response["file_size_bytes"]
|
344
|
+
merged_response["links"].update(response["links"])
|
345
|
+
merged_response["no_size_info_count"] += response["no_size_info_count"]
|
314
346
|
return merged_response
|
315
|
-
|
316
|
-
def _bulk_find_files_batch(
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
347
|
+
|
348
|
+
def _bulk_find_files_batch(
|
349
|
+
self,
|
350
|
+
sample_uuids=None,
|
351
|
+
sample_name_includes=None,
|
352
|
+
folder_types=None,
|
353
|
+
folder_names=None,
|
354
|
+
file_names=None,
|
355
|
+
extensions=None,
|
356
|
+
with_versions=False,
|
357
|
+
):
|
324
358
|
data = {
|
325
359
|
"sample_uuids": sample_uuids or [],
|
326
360
|
"sample_names": sample_name_includes or [],
|
@@ -328,22 +362,105 @@ class Project(RemoteObject):
|
|
328
362
|
"folder_names": folder_names or [],
|
329
363
|
"file_names": file_names or [],
|
330
364
|
"extensions": extensions or [],
|
331
|
-
"with_versions": with_versions
|
365
|
+
"with_versions": with_versions,
|
332
366
|
}
|
333
367
|
url = f"sample_groups/{self.uuid}/download"
|
334
368
|
response = self.knex.post(url, data)
|
335
369
|
return response
|
336
|
-
|
370
|
+
|
337
371
|
def run_app(self, app: Pipeline, input_parameters=None):
|
338
372
|
"""Run an app on this group."""
|
339
373
|
if not input_parameters:
|
340
374
|
input_parameters = app.get_input_parameters()
|
341
375
|
params = {
|
342
|
-
|
343
|
-
|
344
|
-
|
376
|
+
"pipeline_id": app.uuid,
|
377
|
+
"sample_uuids": list(self.get_sample_uuids()),
|
378
|
+
"input_parameters": input_parameters,
|
345
379
|
}
|
346
|
-
self.knex.post(
|
380
|
+
self.knex.post(
|
381
|
+
f"sample_groups/{self.uuid}/run_app", json=params, json_response=False
|
382
|
+
)
|
383
|
+
|
384
|
+
def create_dashboard(self, title="Default dashboard", default=False):
|
385
|
+
"""Create a dashboard for this project."""
|
386
|
+
from geoseeq.dashboard.dashboard import Dashboard
|
387
|
+
|
388
|
+
post_data = {"name": title, "is_default": default}
|
389
|
+
self.knex.post(f"sample_groups/{self.uuid}/dashboard-list", json=post_data)
|
390
|
+
|
391
|
+
return Dashboard(knex=self.knex, project=self, title=title, default=default)
|
392
|
+
|
393
|
+
def get_default_dashboard(self):
|
394
|
+
"""Get the default dashboard for this project."""
|
395
|
+
from geoseeq.dashboard.dashboard import Dashboard, DashboardTile
|
396
|
+
|
397
|
+
resp = self.knex.get(f"sample_groups/{self.uuid}/dashboard-list")
|
398
|
+
try:
|
399
|
+
dashboard_name = [
|
400
|
+
name
|
401
|
+
for name, data in resp["dashboard_data"].items()
|
402
|
+
if data["is_default"] == True
|
403
|
+
][0]
|
404
|
+
blob = resp["dashboard_data"][dashboard_name]
|
405
|
+
tiles = []
|
406
|
+
for tile_blob in blob["tiles"]:
|
407
|
+
tile = DashboardTile.from_blob(self, tile_blob)
|
408
|
+
tiles.append(tile)
|
409
|
+
dashboard = Dashboard(
|
410
|
+
self.knex,
|
411
|
+
project=self,
|
412
|
+
title=dashboard_name,
|
413
|
+
default=blob["is_default"],
|
414
|
+
tiles=tiles,
|
415
|
+
)
|
416
|
+
return dashboard
|
417
|
+
except IndexError:
|
418
|
+
logger.warning("Default dashboard not found.")
|
419
|
+
pass
|
420
|
+
return None
|
421
|
+
|
422
|
+
def get_or_create_default_dashboard(self):
|
423
|
+
"""Get the default dashboard for this project or create it if does not exist."""
|
424
|
+
default_dashboard = self.get_default_dashboard()
|
425
|
+
if default_dashboard:
|
426
|
+
return default_dashboard
|
427
|
+
else:
|
428
|
+
return self.create_dashboard(default=True)
|
429
|
+
|
430
|
+
def get_dashboard_by_title(self, title):
|
431
|
+
"""Get dashboard for this project by the title of the dashboard."""
|
432
|
+
from geoseeq.dashboard.dashboard import Dashboard, DashboardTile
|
433
|
+
|
434
|
+
resp = self.knex.get(f"sample_groups/{self.uuid}/dashboard-list")
|
435
|
+
try:
|
436
|
+
dashboard_name = [
|
437
|
+
name for name in resp["dashboard_data"].keys() if name == title
|
438
|
+
][0]
|
439
|
+
blob = resp["dashboard_data"][dashboard_name]
|
440
|
+
tiles = []
|
441
|
+
for tile_blob in blob["tiles"]:
|
442
|
+
tile = DashboardTile.from_blob(self, tile_blob)
|
443
|
+
tiles.append(tile)
|
444
|
+
dashboard = Dashboard(
|
445
|
+
knex=self.knex,
|
446
|
+
project=self,
|
447
|
+
title=dashboard_name,
|
448
|
+
default=blob["is_default"],
|
449
|
+
tiles=tiles,
|
450
|
+
)
|
451
|
+
return dashboard
|
452
|
+
except IndexError:
|
453
|
+
logger.warning(f"Dashboard {title} not found.")
|
454
|
+
pass
|
455
|
+
return None
|
456
|
+
|
457
|
+
def get_or_create_dashboard_by_title(self, title: str):
|
458
|
+
"""Get dashboard by title for this project or create it if does not exist."""
|
459
|
+
default_dashboard = self.get_dashboard_by_title(title)
|
460
|
+
if default_dashboard:
|
461
|
+
return default_dashboard
|
462
|
+
else:
|
463
|
+
return self.create_dashboard(title=title, default=False)
|
347
464
|
|
348
465
|
def __str__(self):
|
349
466
|
return f"<Geoseeq::Project {self.name} {self.uuid} />"
|
@@ -353,7 +470,7 @@ class Project(RemoteObject):
|
|
353
470
|
|
354
471
|
def pre_hash(self):
|
355
472
|
return "PROJ" + self.name + self.org.pre_hash()
|
356
|
-
|
473
|
+
|
357
474
|
@property
|
358
475
|
def grn(self):
|
359
476
|
return f"grn::project:{self.uuid}"
|
@@ -363,4 +480,5 @@ class Project(RemoteObject):
|
|
363
480
|
self._modified = True
|
364
481
|
return self
|
365
482
|
|
366
|
-
|
483
|
+
|
484
|
+
SampleGroup = Project # alias for backwards compatibility
|
geoseeq/sample.py
CHANGED
@@ -233,6 +233,7 @@ class Sample(RemoteObject):
|
|
233
233
|
return file, blob["read_type"]
|
234
234
|
|
235
235
|
def create_dashboard(self, title="Default dashboard", default=False):
|
236
|
+
"Create a new dashboard for the sample"
|
236
237
|
from geoseeq.dashboard.dashboard import SampleDashboard
|
237
238
|
|
238
239
|
post_data = {
|
@@ -248,7 +249,8 @@ class Sample(RemoteObject):
|
|
248
249
|
dashboard._already_fetched = True
|
249
250
|
return dashboard
|
250
251
|
|
251
|
-
def
|
252
|
+
def get_default_dashboard(self):
|
253
|
+
"""Get the default dashboard for this sample."""
|
252
254
|
from geoseeq.dashboard.dashboard import SampleDashboard
|
253
255
|
|
254
256
|
dashboard_resp = self.knex.get(f"samples/{self.uuid}/dashboards")
|
@@ -265,14 +267,16 @@ class Sample(RemoteObject):
|
|
265
267
|
pass
|
266
268
|
return None
|
267
269
|
|
268
|
-
def
|
269
|
-
|
270
|
+
def get_or_create_default_dashboard(self):
|
271
|
+
"""Get the default dashboard for this sample or create it if does not exist."""
|
272
|
+
default_dashboard = self.get_default_dashboard()
|
270
273
|
if default_dashboard:
|
271
274
|
return default_dashboard
|
272
275
|
else:
|
273
276
|
return self.create_dashboard(default=True)
|
274
277
|
|
275
|
-
def
|
278
|
+
def get_dashboard_by_title(self, title):
|
279
|
+
"""Get dashboard by title for this sample."""
|
276
280
|
from geoseeq.dashboard.dashboard import SampleDashboard
|
277
281
|
|
278
282
|
dashboard_resp = self.knex.get(f"samples/{self.uuid}/dashboards")
|
@@ -289,8 +293,9 @@ class Sample(RemoteObject):
|
|
289
293
|
pass
|
290
294
|
return None
|
291
295
|
|
292
|
-
def
|
293
|
-
|
296
|
+
def get_or_create_dashboard_by_title(self, title):
|
297
|
+
"""Get dashboard by title for this sample or create it if does not exist."""
|
298
|
+
default_dashboard = self.get_dashboard_by_title(title)
|
294
299
|
if default_dashboard:
|
295
300
|
return default_dashboard
|
296
301
|
else:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: geoseeq
|
3
|
-
Version: 0.7.3.
|
3
|
+
Version: 0.7.3.dev3
|
4
4
|
Summary: GeoSeeq command line tools and python API
|
5
5
|
Project-URL: Homepage, https://github.com/biotia/geoseeq_api_client
|
6
6
|
Project-URL: Issues, https://github.com/biotia/geoseeq_api_client/issues
|
@@ -7,9 +7,9 @@ geoseeq/file_system_cache.py,sha256=HzVZWtwLD2fjWWSo_UfWmGeBltm9He4lP_OqzKwNGWg,
|
|
7
7
|
geoseeq/knex.py,sha256=zcjafsmUn9SC3LlRnvvaXpr-pHYZ0IXk7LpzuUoE3MI,8312
|
8
8
|
geoseeq/organization.py,sha256=bJkYL8_D-k6IYAaii2ZbxjwYnXy6lvu6iLXscxKlA3w,2542
|
9
9
|
geoseeq/pipeline.py,sha256=89mhWaecsKnm6tyRkdkaVp4dmZh62_v42Ze0oXf8OTY,9873
|
10
|
-
geoseeq/project.py,sha256=
|
10
|
+
geoseeq/project.py,sha256=Ji9eoDxlbMlmYA8O2ZdZoi_e_rY9Wlr8PxmaNDZdWyA,17068
|
11
11
|
geoseeq/remote_object.py,sha256=GYN6PKU7Zz3htIdpFjfZiFejzGqqJHbJyKlefM1Eixk,7151
|
12
|
-
geoseeq/sample.py,sha256=
|
12
|
+
geoseeq/sample.py,sha256=LeLJytRYERY5dkMIOWqANTPTun9wqei393qeNlPBw1U,10895
|
13
13
|
geoseeq/search.py,sha256=gawad6Cx5FxJBPlYkXWb-UKAO-UC0_yhvyU9Ca1kaNI,3388
|
14
14
|
geoseeq/smart_table.py,sha256=rihMsFUIn-vn4w6ukVZTHI9bjDSEr8xHExBfX8mwCHM,6169
|
15
15
|
geoseeq/smart_tree.py,sha256=bSjDlwmOuNXutYJhytA1RovwRCHV6ZxXXJPiIGFhPaA,1825
|
@@ -52,7 +52,7 @@ geoseeq/contrib/ncbi/api.py,sha256=WQeLoGA_-Zha-QeSO8_i7HpvXyD8UkV0qc5okm11KiA,1
|
|
52
52
|
geoseeq/contrib/ncbi/bioproject.py,sha256=_oThTd_iLDOC8cLOlJKAatSr362OBYZCEV3YrqodhFg,4341
|
53
53
|
geoseeq/contrib/ncbi/cli.py,sha256=j9zEcaZPTryK3a4xluRxigcJKDhRpRxbp3KZSx-Bfhk,2400
|
54
54
|
geoseeq/contrib/ncbi/setup_logging.py,sha256=Tp1bY1U0f-o739aHpvVYriG2qdd1lFvCYBXZeXQgt-w,175
|
55
|
-
geoseeq/dashboard/dashboard.py,sha256=
|
55
|
+
geoseeq/dashboard/dashboard.py,sha256=mIlaqrSdy0C2EqpJVFvUKJkU1EiHluAT1DqfO0wvHb8,8336
|
56
56
|
geoseeq/file_system/filesystem_download.py,sha256=8bcnxjWltekmCvb5N0b1guBIjLp4-CL2VtsEok-snv4,16963
|
57
57
|
geoseeq/file_system/main.py,sha256=4HgYGq7WhlF96JlVIf16iFBTDujlBpxImmtoh4VCzDA,3627
|
58
58
|
geoseeq/id_constructors/__init__.py,sha256=w5E0PNQ9UuAxBeZbDI7KBnUoERd85gGz3nScz45bd2o,126
|
@@ -92,8 +92,8 @@ geoseeq/vc/vc_cache.py,sha256=P4LXTbq2zOIv1OhP7Iw5MmypR2vXuy29Pq5K6gRvi-M,730
|
|
92
92
|
geoseeq/vc/vc_dir.py,sha256=A9CLTh2wWCRzZjiLyqXD1vhtsWZGD3OjaMT5KqlfAXI,457
|
93
93
|
geoseeq/vc/vc_sample.py,sha256=qZeioWydXvfu4rGMs20nICfNcp46y_XkND-bHdV6P5M,3850
|
94
94
|
geoseeq/vc/vc_stub.py,sha256=IQr8dI0zsWKVAeY_5ybDD6n49_3othcgfHS3P0O9tuY,3110
|
95
|
-
geoseeq-0.7.3.
|
96
|
-
geoseeq-0.7.3.
|
97
|
-
geoseeq-0.7.3.
|
98
|
-
geoseeq-0.7.3.
|
99
|
-
geoseeq-0.7.3.
|
95
|
+
geoseeq-0.7.3.dev3.dist-info/METADATA,sha256=V4yLbxReqp0ItzHzsgLOCTjBOHBTt8-PmQEvRycdTvw,5415
|
96
|
+
geoseeq-0.7.3.dev3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
97
|
+
geoseeq-0.7.3.dev3.dist-info/entry_points.txt,sha256=yF-6KDM8zXib4Al0qn49TX-qM7PUkWUIcYtsgt36rjM,45
|
98
|
+
geoseeq-0.7.3.dev3.dist-info/licenses/LICENSE,sha256=IuhIl1XCxXLPLJT_coN1CNqQU4Khlq7x4IdW7ioOJD8,1067
|
99
|
+
geoseeq-0.7.3.dev3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|