geoseeq 0.6.13.dev1__py3-none-any.whl → 0.6.14.dev1__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/__init__.py CHANGED
@@ -32,4 +32,5 @@ from .work_orders import (
32
32
  )
33
33
  from .app import App
34
34
  from .id_constructors import *
35
- from .upload_download_manager import GeoSeeqDownloadManager, GeoSeeqUploadManager
35
+ from .upload_download_manager import GeoSeeqDownloadManager, GeoSeeqUploadManager
36
+ from .smart_table import SmartTable
@@ -0,0 +1,19 @@
1
+ import click
2
+ from geoseeq.id_constructors import resolve_id
3
+ from .shared_params import (
4
+ use_common_state,
5
+ )
6
+
7
+
8
+ @click.command('find-grn')
9
+ @use_common_state
10
+ @click.argument('grn')
11
+ def cli_find_grn(state, grn):
12
+ """Find objects by id"""
13
+ kind, obj = resolve_id(state.get_knex(), grn)
14
+ print(obj)
15
+ parent = getattr(obj, 'parent', None)
16
+ while parent:
17
+ print(parent)
18
+ parent = getattr(parent, 'parent', None)
19
+
geoseeq/cli/main.py CHANGED
@@ -18,7 +18,7 @@ from .shared_params.opts_and_args import overwrite_option, yes_option
18
18
  from .detail import cli_detail
19
19
  from .run import cli_app
20
20
  from .get_eula import cli_eula
21
-
21
+ from .find_grn import cli_find_grn
22
22
 
23
23
  logger = logging.getLogger('geoseeq_api')
24
24
  handler = logging.StreamHandler()
@@ -44,6 +44,7 @@ main.add_command(cli_view)
44
44
  main.add_command(cli_search)
45
45
  main.add_command(cli_app)
46
46
  main.add_command(cli_eula)
47
+ main.add_command(cli_find_grn)
47
48
 
48
49
  @main.command()
49
50
  def version():
@@ -54,7 +55,7 @@ def version():
54
55
  Use of this tool implies acceptance of the GeoSeeq End User License Agreement.
55
56
  Run `geoseeq eula show` to view the EULA.
56
57
  """
57
- click.echo('0.6.13dev1') # remember to update pyproject.toml
58
+ click.echo('0.6.14dev1') # remember to update pyproject.toml
58
59
 
59
60
 
60
61
  @main.group('advanced')
@@ -5,7 +5,10 @@ from geoseeq.knex import with_knex
5
5
  @with_knex
6
6
  def org_from_blob(knex, blob, already_fetched=True, modified=False):
7
7
  """Return an Organization object from a blob."""
8
- from geoseeq.organization import Organization # import here to avoid circular import
8
+ from geoseeq.organization import (
9
+ Organization, # import here to avoid circular import
10
+ )
11
+
9
12
  org = Organization(knex, blob["name"])
10
13
  org.load_blob(blob)
11
14
  org._already_fetched = already_fetched
@@ -17,9 +20,13 @@ def org_from_blob(knex, blob, already_fetched=True, modified=False):
17
20
  def project_from_blob(knex, blob, already_fetched=True, modified=False):
18
21
  """Return a Project object from a blob."""
19
22
  org = org_from_blob(
20
- knex, blob["organization_obj"], already_fetched=already_fetched, modified=modified
23
+ knex,
24
+ blob["organization_obj"],
25
+ already_fetched=already_fetched,
26
+ modified=modified,
21
27
  )
22
28
  from geoseeq.project import Project # import here to avoid circular import
29
+
23
30
  grp = Project(knex, org, blob["name"], is_library=blob["is_library"])
24
31
  grp.load_blob(blob)
25
32
  grp._already_fetched = already_fetched
@@ -37,6 +44,7 @@ def sample_from_blob(knex, blob, already_fetched=True, modified=False):
37
44
  knex, blob["library_obj"], already_fetched=already_fetched, modified=modified
38
45
  )
39
46
  from geoseeq.sample import Sample # import here to avoid circular import
47
+
40
48
  sample = Sample(knex, lib, blob["name"], metadata=blob["metadata"])
41
49
  sample.load_blob(blob)
42
50
  sample._already_fetched = already_fetched
@@ -48,11 +56,21 @@ def sample_from_blob(knex, blob, already_fetched=True, modified=False):
48
56
  def project_result_folder_from_blob(knex, blob, already_fetched=True, modified=False):
49
57
  """Return a ProjectResultFolder object from a blob."""
50
58
  group = project_from_blob(
51
- knex, blob["sample_group_obj"], already_fetched=already_fetched, modified=modified
59
+ knex,
60
+ blob["sample_group_obj"],
61
+ already_fetched=already_fetched,
62
+ modified=modified,
52
63
  )
53
- from geoseeq.result import ProjectResultFolder # import here to avoid circular import
64
+ from geoseeq.result import (
65
+ ProjectResultFolder, # import here to avoid circular import
66
+ )
67
+
54
68
  ar = ProjectResultFolder(
55
- knex, group, blob["module_name"], replicate=blob["replicate"], metadata=blob["metadata"]
69
+ knex,
70
+ group,
71
+ blob["module_name"],
72
+ replicate=blob["replicate"],
73
+ metadata=blob["metadata"],
56
74
  )
57
75
  ar.load_blob(blob)
58
76
  ar._already_fetched = already_fetched
@@ -69,9 +87,16 @@ def sample_result_folder_from_blob(knex, blob, already_fetched=True, modified=Fa
69
87
  sample = sample_from_blob(
70
88
  knex, blob["sample_obj"], already_fetched=already_fetched, modified=modified
71
89
  )
72
- from geoseeq.result import SampleResultFolder # import here to avoid circular import
90
+ from geoseeq.result import (
91
+ SampleResultFolder, # import here to avoid circular import
92
+ )
93
+
73
94
  ar = SampleResultFolder(
74
- knex, sample, blob["module_name"], replicate=blob["replicate"], metadata=blob["metadata"]
95
+ knex,
96
+ sample,
97
+ blob["module_name"],
98
+ replicate=blob["replicate"],
99
+ metadata=blob["metadata"],
75
100
  )
76
101
  ar.load_blob(blob)
77
102
  ar._already_fetched = already_fetched
@@ -86,9 +111,13 @@ sample_ar_from_blob = sample_result_folder_from_blob # Alias
86
111
  def sample_result_file_from_blob(knex, blob, already_fetched=True, modified=False):
87
112
  """Return a SampleResultFile object from a blob."""
88
113
  ar = sample_result_folder_from_blob(
89
- knex, blob["analysis_result_obj"], already_fetched=already_fetched, modified=modified
114
+ knex,
115
+ blob["analysis_result_obj"],
116
+ already_fetched=already_fetched,
117
+ modified=modified,
90
118
  )
91
119
  from geoseeq.result import SampleResultFile # import here to avoid circular import
120
+
92
121
  arf = SampleResultFile(knex, ar, blob["name"], data=blob["stored_data"])
93
122
  arf.load_blob(blob)
94
123
  ar._already_fetched = already_fetched
@@ -104,9 +133,13 @@ sample_ar_field_from_blob = sample_result_file_from_blob # Alias
104
133
  def project_result_file_from_blob(knex, blob, already_fetched=True, modified=False):
105
134
  """Return a ProjectResultFile object from a blob."""
106
135
  ar = project_result_folder_from_blob(
107
- knex, blob["analysis_result_obj"], already_fetched=already_fetched, modified=modified
136
+ knex,
137
+ blob["analysis_result_obj"],
138
+ already_fetched=already_fetched,
139
+ modified=modified,
108
140
  )
109
141
  from geoseeq.result import ProjectResultFile # import here to avoid circular import
142
+
110
143
  arf = ProjectResultFile(knex, ar, blob["name"], data=blob["stored_data"])
111
144
  arf.load_blob(blob)
112
145
  ar._already_fetched = already_fetched
@@ -136,12 +169,14 @@ def result_file_from_blob(knex, blob, already_fetched=True, modified=False):
136
169
  def pipeline_from_blob(knex, blob, already_fetched=True, modified=False):
137
170
  """Return a Pipeline object from a blob."""
138
171
  from geoseeq.pipeline import Pipeline # import here to avoid circular import
172
+
139
173
  pipeline = Pipeline(knex, blob["name"])
140
174
  pipeline.load_blob(blob)
141
175
  pipeline._already_fetched = already_fetched
142
176
  pipeline._modified = modified
143
177
  return pipeline
144
178
 
179
+
145
180
  app_from_blob = pipeline_from_blob # Alias
146
181
 
147
182
 
@@ -149,6 +184,7 @@ app_from_blob = pipeline_from_blob # Alias
149
184
  def pipeline_run_from_blob(knex, blob, already_fetched=True, modified=False):
150
185
  """Return a Pipeline run object from a blob."""
151
186
  from geoseeq.pipeline import PipelineRun # import here to avoid circular import
187
+
152
188
  pipeline_run = PipelineRun(
153
189
  knex,
154
190
  blob["sample_group"],
@@ -160,3 +196,15 @@ def pipeline_run_from_blob(knex, blob, already_fetched=True, modified=False):
160
196
  pipeline_run._already_fetched = already_fetched
161
197
  pipeline_run._modified = modified
162
198
  return pipeline_run
199
+
200
+
201
+ @with_knex
202
+ def smart_table_from_blob(knex, blob, already_fetched=True, modified=False):
203
+ """Return a smart tavle object from a blob."""
204
+ from geoseeq.smart_table import SmartTable # import here to avoid circular import
205
+
206
+ tbl = SmartTable(knex, name=blob["name"])
207
+ tbl.load_blob(blob)
208
+ tbl._already_fetched = already_fetched
209
+ tbl._modified = modified
210
+ return tbl
@@ -1,4 +1,5 @@
1
1
  from geoseeq import GeoseeqNotFoundError
2
+ import logging
2
3
  from .from_uuids import (
3
4
  org_from_uuid,
4
5
  project_from_uuid,
@@ -24,10 +25,12 @@ from .from_names import (
24
25
  from .utils import is_grn_or_uuid, is_name
25
26
  from geoseeq.knex import with_knex
26
27
 
28
+ logger = logging.getLogger("geoseeq_api") # Same name as calling module
29
+
27
30
 
28
31
  def _generic_from_id(knex, id, from_uuid_func, from_name_func):
29
32
  """Return the object which the id points to."""
30
- logger.info(f'Getting object from id: {id}, knex: {knex}, from_uuid_func: {from_uuid_func}, from_name_func: {from_name_func}')
33
+ logger.debug(f'Getting object from id: {id}, knex: {knex}, from_uuid_func: {from_uuid_func}, from_name_func: {from_name_func}')
31
34
  if is_grn_or_uuid(id):
32
35
  id = id.split(':')[-1] # if this is a GRN, get the UUID. Won't hurt if it's already a UUID.
33
36
  return from_uuid_func(knex, id)
@@ -1,5 +1,6 @@
1
1
  from geoseeq import GeoseeqNotFoundError
2
2
  from geoseeq.knex import with_knex
3
+
3
4
  from .from_blobs import *
4
5
 
5
6
 
@@ -115,3 +116,11 @@ def pipeline_run_from_uuid(knex, uuid):
115
116
  blob = knex.get(f"app_runs/{uuid}")
116
117
  pipeline_run = pipeline_run_from_blob(knex, blob)
117
118
  return pipeline_run
119
+
120
+
121
+ @with_knex
122
+ def smart_table_from_uuid(knex, uuid):
123
+ """Return a smart table object which the uuid points to."""
124
+ blob = knex.get(f"table/{uuid}")
125
+ table = smart_table_from_blob(knex, blob)
126
+ return table
geoseeq/knex.py CHANGED
@@ -222,20 +222,20 @@ class Knex:
222
222
  def with_knex(func):
223
223
  def wrapper(*args, **kwargs):
224
224
  # check if any of the arguments are a knex instance
225
- logger.info(f"Checking for knex in args: {args}, kwargs: {kwargs}")
225
+ logger.debug(f"Checking for knex in args: {args}, kwargs: {kwargs}")
226
226
  any_knex = any([isinstance(arg, Knex) for arg in args])
227
227
  if any_knex:
228
- logger.info("knex found in args")
228
+ logger.debug("knex found in args args: {args}, kwargs: {kwargs}")
229
229
  return func(*args, **kwargs)
230
230
  else:
231
- logger.info("knex not found in args")
231
+ logger.debug("knex not found in args args: {args}, kwargs: {kwargs}")
232
232
  varnames = [
233
233
  varname for varname in func.__code__.co_varnames
234
234
  if varname != "knex"
235
235
  ]
236
236
  kwargs.update(zip(varnames, args))
237
237
  if "knex" not in kwargs:
238
- logger.info("knex not found in kwargs")
238
+ logger.debug("knex not found in kwargs args: {args}, kwargs: {kwargs}")
239
239
  profile = kwargs.pop("profile", "")
240
240
  kwargs['knex'] = Knex.load_profile(profile=profile)
241
241
  # reorder kwargs to match the function signature
geoseeq/smart_table.py ADDED
@@ -0,0 +1,180 @@
1
+ import math
2
+ from typing import Literal
3
+
4
+ import pandas as pd
5
+
6
+ from geoseeq.id_constructors.from_blobs import smart_table_from_blob
7
+ from geoseeq.id_constructors.from_uuids import (
8
+ project_result_file_from_uuid,
9
+ result_file_from_uuid,
10
+ sample_result_file_from_uuid,
11
+ )
12
+ from geoseeq.remote_object import RemoteObject
13
+ from geoseeq.result.result_folder import ProjectResultFolder, SampleResultFolder
14
+
15
+
16
+ def convert_pandas_col_type_to_geoseeq_type(col_type: str):
17
+ if col_type == "int64":
18
+ return "number"
19
+ elif col_type == "float64":
20
+ return "number"
21
+ elif col_type == "category":
22
+ return None
23
+ return None
24
+
25
+
26
+ class SmartTable(RemoteObject):
27
+ remote_fields = [
28
+ "uuid",
29
+ "description",
30
+ "created_at",
31
+ "updated_at",
32
+ "sample_group",
33
+ "columns",
34
+ "connected_file_id",
35
+ ]
36
+ parent_field = None
37
+
38
+ def __init__(self, knex, name, connected_file_id=None, description=""):
39
+ super().__init__(self)
40
+ self.knex = knex
41
+ self.name = name
42
+ self.description = description
43
+ self.connected_file_id = connected_file_id
44
+
45
+ def create(
46
+ self,
47
+ result_folder,
48
+ description="",
49
+ without_default_columns=True,
50
+ ):
51
+ """
52
+ Creating a smart table includes creating a file for it in the selected result folder
53
+
54
+ without_default_columns: if False the server creates 3 example columns.
55
+ """
56
+
57
+ data = {
58
+ "name": self.name,
59
+ "folder_id": result_folder.uuid,
60
+ "description": description,
61
+ }
62
+ url = f"table?without_default_columns={without_default_columns}"
63
+ blob = self.knex.post(url, json=data)
64
+ result_file = result_file_from_uuid(self.knex, blob["connected_file_id"])
65
+ result_file.upload_json({"__type__": "smartTable", "tableId": blob["uuid"]})
66
+ self.load_blob(blob)
67
+ return self
68
+
69
+ def refetch(self):
70
+ """After operations like import create column, columns in not in the response so we have to update"""
71
+ if not self.uuid:
72
+ return
73
+ blob = self.knex.get(f"table/{self.uuid}")
74
+ self.load_blob(blob, allow_overwrite=True)
75
+ return self
76
+
77
+ def import_data(
78
+ self, column_names, rows, column_types={}, id_column=None, overwrite=False
79
+ ):
80
+ url = f"table/{self.uuid}/import"
81
+ rowLimit = math.ceil(10000 / len(column_names))
82
+ roundsNeeded = math.ceil(len(rows) / rowLimit)
83
+ round = 0
84
+ while round < roundsNeeded:
85
+ data = {
86
+ "columns": column_names,
87
+ "rows": rows[round * rowLimit : (round + 1) * rowLimit],
88
+ "column_types": column_types,
89
+ }
90
+ self.knex.put(url, json=data, json_response=False)
91
+ round += 1
92
+ self.refetch() # columns attribute has to be updated
93
+
94
+ def import_dataframe(self, df: pd.DataFrame, column_types={}):
95
+ df_column_types = {
96
+ col_name: convert_pandas_col_type_to_geoseeq_type(col_type)
97
+ for col_name, col_type in df.dtypes.items()
98
+ if convert_pandas_col_type_to_geoseeq_type(col_type) is not None
99
+ }
100
+ my_column_types = {**df_column_types, **column_types}
101
+ df_dict = df.to_dict(orient="split")
102
+ self.import_data(
103
+ column_names=df_dict["columns"],
104
+ rows=df_dict["data"],
105
+ column_types=my_column_types,
106
+ )
107
+
108
+ def import_csv(self, file_path, column_types={}, **kwargs):
109
+ df = pd.read_csv(file_path, **kwargs)
110
+ df_dict = df.to_dict(orient="split")
111
+ self.import_data(
112
+ column_names=df_dict["columns"],
113
+ rows=df_dict["data"],
114
+ column_types=column_types,
115
+ )
116
+
117
+ def delete(self):
118
+ """Delete the table record and also the connected file."""
119
+
120
+ # The server deletes the table record also if the connected file is deleted
121
+ if self.connected_file_id:
122
+ result_file = result_file_from_uuid(self.connected_file_id)
123
+ result_file.delete()
124
+
125
+ def create_column(
126
+ self,
127
+ name,
128
+ data_type="string",
129
+ description=None,
130
+ select_options=None,
131
+ hidden=False,
132
+ ):
133
+ """Create a new column for the table"""
134
+
135
+ data = {
136
+ "table": self.uuid,
137
+ "name": name,
138
+ "data_type": data_type,
139
+ "description": description,
140
+ "select_options": select_options,
141
+ "hidden": hidden,
142
+ }
143
+ blob = self.knex.post(f"table/{self.uuid}/columns", data)
144
+ self.refetch() # columns attribute has to be updated
145
+
146
+ def order_columns(self, ordered_column_names):
147
+ """Set the order of table's columns based on the input column name list"""
148
+
149
+ data = {"columns": []}
150
+ unordered_col_count = 0
151
+ for column in sorted(self.columns, key=lambda col: col["order"]):
152
+ if column["name"] in ordered_column_names:
153
+ order = ordered_column_names.index(column["name"])
154
+ else:
155
+ order = len(ordered_column_names) + unordered_col_count
156
+ unordered_col_count += 1
157
+
158
+ data["columns"].append({"uuid": column["uuid"], "order": order})
159
+
160
+ self.knex.put(f"table/{self.uuid}/columns", json=data, json_response=False)
161
+ self.refetch() # Update columns attribute
162
+
163
+ def hide_columns(self, column_names):
164
+ """Set the input columns hidden by default when table is opened"""
165
+
166
+ data = {"columns": []}
167
+ for column in sorted(self.columns, key=lambda col: col["order"]):
168
+ if column["name"] in column_names:
169
+ data["columns"].append({"uuid": column["uuid"], "hidden": True})
170
+ else:
171
+ continue
172
+
173
+ self.knex.put(f"table/{self.uuid}/columns", json=data, json_response=False)
174
+ self.refetch()
175
+
176
+ def __str__(self):
177
+ return f"<Geoseeq::SmartTable {self.name} {self.uuid} />"
178
+
179
+ def __repr__(self):
180
+ return f"<Geoseeq::SmartTable {self.name} {self.uuid} />"
@@ -138,7 +138,7 @@ def _download_one_file(args):
138
138
  local_path = download_url(url, filename=file_path, progress_tracker=pbar, head=head)
139
139
  try:
140
140
  if callback is not None:
141
- callback_result = callback(local_path)
141
+ callback_result = callback(key, local_path)
142
142
  else:
143
143
  callback_result = None
144
144
  return local_path, key, callback_result
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: geoseeq
3
- Version: 0.6.13.dev1
3
+ Version: 0.6.14.dev1
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>
@@ -1,17 +1,18 @@
1
- geoseeq/__init__.py,sha256=4_5QIXLt29gDwxjDLtyJY6y5Yi5p0usvKnAuJkkmECY,946
1
+ geoseeq/__init__.py,sha256=YqYqeHbqjgWI5OBIxkPXNvLISOjVWaNwVFy6AGJ7uwc,982
2
2
  geoseeq/app.py,sha256=Y6d1UzxFLfE3RNccATbFCVi6kH3eFmzwoUbeR2Ry09A,2387
3
3
  geoseeq/blob_constructors.py,sha256=AkWpDQY0EdGMxF1p6eRspyHKubcUdiW4it-_Q7S2QWk,188
4
4
  geoseeq/bulk_creators.py,sha256=pdn-Dv7yv5SFv-PfDuQbuOnw2W4-BfIfRJVRAhM8U6s,2115
5
5
  geoseeq/constants.py,sha256=z_ninEd7WsS5DaLntdR-sqAFib6Ie22jlhPKzLvLerw,449
6
6
  geoseeq/file_system_cache.py,sha256=HzVZWtwLD2fjWWSo_UfWmGeBltm9He4lP_OqzKwNGWg,4138
7
- geoseeq/knex.py,sha256=42ZTb4I2Qm11HicUM5eG5YD1u4zRD2q0UabZixjPUAw,8215
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
10
  geoseeq/project.py,sha256=kN6m1N4Tlud7saU03Sbir-oIBnXet_Cwi2OVVdaeag0,13929
11
11
  geoseeq/remote_object.py,sha256=GYN6PKU7Zz3htIdpFjfZiFejzGqqJHbJyKlefM1Eixk,7151
12
12
  geoseeq/sample.py,sha256=nlvmSy2WmiOMamkulNRloFPX7E9jVs34m1vO1PSOrHU,8336
13
13
  geoseeq/search.py,sha256=gawad6Cx5FxJBPlYkXWb-UKAO-UC0_yhvyU9Ca1kaNI,3388
14
- geoseeq/upload_download_manager.py,sha256=TCdTKtQTPIakVuvpXa0OHgOBy7mtV0gHBqHDJYc2UO0,9361
14
+ geoseeq/smart_table.py,sha256=X1y9nBr8BkMNcBqdaiXtlqLCTfgc7lvdjSlAGxppvLo,6098
15
+ geoseeq/upload_download_manager.py,sha256=jEEVDZa9kS5v1g20Vz30azwdP4kEd0A6WBOb8GDdB8Y,9366
15
16
  geoseeq/user.py,sha256=tol8i1UGLRrbMw5jeJDnna1ikRgrCDd50Jxz0a1lSgg,690
16
17
  geoseeq/utils.py,sha256=ZXpWb2MetUIeLrExiXb7IaOXYrW1pvrdP3o0KWzbwCs,4035
17
18
  geoseeq/work_orders.py,sha256=5uLVVfdKE8qh4gGaHkdBpXJGRTujuSg59knWCqEET4A,8071
@@ -21,8 +22,9 @@ geoseeq/cli/copy.py,sha256=02U9kdrAIbbM8MlRMLL6p-LMYFSuRObE3h5jyvcL__M,2275
21
22
  geoseeq/cli/detail.py,sha256=q8Suu-j2k18knfSVFG-SWWGNsKM-n8y9RMA3LcIIi9Y,4132
22
23
  geoseeq/cli/download.py,sha256=W3OswqpHg1thzW6CJ7IcSS0Te2LA2WfgYISQMSl4GQg,18921
23
24
  geoseeq/cli/fastq_utils.py,sha256=-bmeQLaiMBm57zWOF0R5OlWTU0_3sh1JBC1RYw2BOFM,3083
25
+ geoseeq/cli/find_grn.py,sha256=oMDxkzGQBQb2_cCuvmwoeHOsFHqyO9RLeJzrB6bAe5M,439
24
26
  geoseeq/cli/get_eula.py,sha256=79mbUwyiF7O1r0g6UTxG9kJGQEqKuH805E6eLkPC6Y4,997
25
- geoseeq/cli/main.py,sha256=96NtlJGhOFRKQTRaH15JhDKekkuEug15ir2G-jsd_Os,3922
27
+ geoseeq/cli/main.py,sha256=Jlq_tB7Djxeqg0Ftxq4VMm4Ku0sISwv_K7VwwQFJ9kc,3987
26
28
  geoseeq/cli/manage.py,sha256=wGXAcVaXqE5JQEU8Jh6OlHr02nB396bpS_SFcOZdrEo,5929
27
29
  geoseeq/cli/progress_bar.py,sha256=p1Xl01nkYxSBZCB30ue2verIIi22W93m3ZAMAxipD0g,738
28
30
  geoseeq/cli/project.py,sha256=V5SdXm2Hwo2lxrkpwRDedw-mAE4XnM2uwT-Gj1D90VQ,3030
@@ -49,10 +51,10 @@ geoseeq/contrib/ncbi/bioproject.py,sha256=_oThTd_iLDOC8cLOlJKAatSr362OBYZCEV3Yrq
49
51
  geoseeq/contrib/ncbi/cli.py,sha256=j9zEcaZPTryK3a4xluRxigcJKDhRpRxbp3KZSx-Bfhk,2400
50
52
  geoseeq/contrib/ncbi/setup_logging.py,sha256=Tp1bY1U0f-o739aHpvVYriG2qdd1lFvCYBXZeXQgt-w,175
51
53
  geoseeq/id_constructors/__init__.py,sha256=w5E0PNQ9UuAxBeZbDI7KBnUoERd85gGz3nScz45bd2o,126
52
- geoseeq/id_constructors/from_blobs.py,sha256=aj7M7NRpKGs3u3xUvuFJwmJdFeIcJPmaI2_bhwbFfEs,5702
53
- geoseeq/id_constructors/from_ids.py,sha256=m1J3cN7s_Oncz1MsxjbesxNJm5L4b8CKLpWtI1Uo3gg,3282
54
+ geoseeq/id_constructors/from_blobs.py,sha256=wZp6P6m7X0lhZAQxorHKJQn1CTBvKyfANzu2VFexp44,6315
55
+ geoseeq/id_constructors/from_ids.py,sha256=vwv_R1uZ5hdeUvpKmNLOTz02PCvwfd6yQ7aAXqi0hZo,3372
54
56
  geoseeq/id_constructors/from_names.py,sha256=RqgFjDsAwQcidMkZwX7oB00OvBAKTiilHYetTPogJ40,4174
55
- geoseeq/id_constructors/from_uuids.py,sha256=5NrQoRBNBfiB48SIB6QFZvO0lxNrxAHbu1MDkNRSu_4,3305
57
+ geoseeq/id_constructors/from_uuids.py,sha256=loqTeZqDZuvfVVHpS7m-Y_spNaY3h9VRjt0wDiMxHbs,3522
56
58
  geoseeq/id_constructors/resolvers.py,sha256=8hp5xJSCoZrAXtMT54Hp4okt63l909XqJU3IQx-VCgc,2676
57
59
  geoseeq/id_constructors/utils.py,sha256=CKlZHGMiqi1b6r1KtgD3czSAomH99Gdfx5ziqaahz-0,723
58
60
  geoseeq/plotting/__init__.py,sha256=RkGoXxgu7jEfK0B7NmdalPS2AbU7I7dZwDbi4rn9CKM,154
@@ -85,9 +87,9 @@ geoseeq/vc/vc_stub.py,sha256=IQr8dI0zsWKVAeY_5ybDD6n49_3othcgfHS3P0O9tuY,3110
85
87
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
88
  tests/test_api_client.py,sha256=TS5njc5pcPP_Ycy-ljcfPVT1hQRBsFVdQ0lCqBmoesU,12810
87
89
  tests/test_plotting.py,sha256=TcTu-2ARr8sxZJ7wPQxmbs3-gHw7uRvsgrhhhg0qKik,784
88
- geoseeq-0.6.13.dev1.dist-info/LICENSE,sha256=IuhIl1XCxXLPLJT_coN1CNqQU4Khlq7x4IdW7ioOJD8,1067
89
- geoseeq-0.6.13.dev1.dist-info/METADATA,sha256=GFWZaxBpvGLLgzX34ETHyeSCt40B7sXmuVrNzovwkGs,4937
90
- geoseeq-0.6.13.dev1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
91
- geoseeq-0.6.13.dev1.dist-info/entry_points.txt,sha256=yF-6KDM8zXib4Al0qn49TX-qM7PUkWUIcYtsgt36rjM,45
92
- geoseeq-0.6.13.dev1.dist-info/top_level.txt,sha256=zZk7mmeaqAYqFJG8nq2DTgSQPbflRjJwkDIhNURPDEU,14
93
- geoseeq-0.6.13.dev1.dist-info/RECORD,,
90
+ geoseeq-0.6.14.dev1.dist-info/LICENSE,sha256=IuhIl1XCxXLPLJT_coN1CNqQU4Khlq7x4IdW7ioOJD8,1067
91
+ geoseeq-0.6.14.dev1.dist-info/METADATA,sha256=hIU7mXdtjBBN7V-EoEy9NblQxH4_Eg3CozkpjFZ3HAs,4937
92
+ geoseeq-0.6.14.dev1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
93
+ geoseeq-0.6.14.dev1.dist-info/entry_points.txt,sha256=yF-6KDM8zXib4Al0qn49TX-qM7PUkWUIcYtsgt36rjM,45
94
+ geoseeq-0.6.14.dev1.dist-info/top_level.txt,sha256=zZk7mmeaqAYqFJG8nq2DTgSQPbflRjJwkDIhNURPDEU,14
95
+ geoseeq-0.6.14.dev1.dist-info/RECORD,,