geoseeq 0.6.14.dev7__tar.gz → 0.6.15.dev1__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 (103) hide show
  1. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/PKG-INFO +1 -1
  2. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/main.py +1 -1
  3. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/upload/__init__.py +4 -0
  4. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/upload/upload.py +114 -0
  5. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/result/result_file.py +2 -1
  6. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/result/result_folder.py +8 -0
  7. geoseeq-0.6.15.dev1/geoseeq/result/smart_objects.py +40 -0
  8. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/smart_table.py +3 -2
  9. geoseeq-0.6.15.dev1/geoseeq/smart_tree.py +57 -0
  10. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq.egg-info/PKG-INFO +1 -1
  11. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq.egg-info/SOURCES.txt +2 -0
  12. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/pyproject.toml +1 -1
  13. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/LICENSE +0 -0
  14. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/README.md +0 -0
  15. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/__init__.py +0 -0
  16. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/app.py +0 -0
  17. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/blob_constructors.py +0 -0
  18. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/bulk_creators.py +0 -0
  19. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/__init__.py +0 -0
  20. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/constants.py +0 -0
  21. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/copy.py +0 -0
  22. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/detail.py +0 -0
  23. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/download.py +0 -0
  24. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/fastq_utils.py +0 -0
  25. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/find_grn.py +0 -0
  26. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/get_eula.py +0 -0
  27. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/manage.py +0 -0
  28. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/progress_bar.py +0 -0
  29. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/project.py +0 -0
  30. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/raw.py +0 -0
  31. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/run.py +0 -0
  32. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/search.py +0 -0
  33. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/shared_params/__init__.py +0 -0
  34. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/shared_params/common_state.py +0 -0
  35. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/shared_params/config.py +0 -0
  36. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/shared_params/id_handlers.py +0 -0
  37. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/shared_params/obj_getters.py +0 -0
  38. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/shared_params/opts_and_args.py +0 -0
  39. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/upload/upload_advanced.py +0 -0
  40. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/upload/upload_reads.py +0 -0
  41. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/user.py +0 -0
  42. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/utils.py +0 -0
  43. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/cli/view.py +0 -0
  44. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/constants.py +0 -0
  45. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/contrib/__init__.py +0 -0
  46. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/contrib/ncbi/__init__.py +0 -0
  47. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/contrib/ncbi/api.py +0 -0
  48. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/contrib/ncbi/bioproject.py +0 -0
  49. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/contrib/ncbi/cli.py +0 -0
  50. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/contrib/ncbi/setup_logging.py +0 -0
  51. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/file_system_cache.py +0 -0
  52. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/id_constructors/__init__.py +0 -0
  53. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/id_constructors/from_blobs.py +0 -0
  54. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/id_constructors/from_ids.py +0 -0
  55. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/id_constructors/from_names.py +0 -0
  56. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/id_constructors/from_uuids.py +0 -0
  57. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/id_constructors/resolvers.py +0 -0
  58. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/id_constructors/utils.py +0 -0
  59. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/knex.py +0 -0
  60. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/organization.py +0 -0
  61. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/pipeline.py +0 -0
  62. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/plotting/__init__.py +0 -0
  63. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/plotting/constants.py +0 -0
  64. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/plotting/highcharts.py +0 -0
  65. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/plotting/map/__init__.py +0 -0
  66. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/plotting/map/base_layer.py +0 -0
  67. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/plotting/map/map.py +0 -0
  68. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/plotting/map/overlay.py +0 -0
  69. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/plotting/selectable.py +0 -0
  70. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/project.py +0 -0
  71. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/remote_object.py +0 -0
  72. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/result/__init__.py +0 -0
  73. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/result/bioinfo.py +0 -0
  74. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/result/file_chunker.py +0 -0
  75. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/result/file_download.py +0 -0
  76. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/result/file_upload.py +0 -0
  77. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/result/resumable_download_tracker.py +0 -0
  78. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/result/resumable_upload_tracker.py +0 -0
  79. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/result/utils.py +0 -0
  80. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/sample.py +0 -0
  81. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/search.py +0 -0
  82. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/upload_download_manager.py +0 -0
  83. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/user.py +0 -0
  84. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/utils.py +0 -0
  85. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/vc/__init__.py +0 -0
  86. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/vc/checksum.py +0 -0
  87. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/vc/cli.py +0 -0
  88. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/vc/clone.py +0 -0
  89. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/vc/constants.py +0 -0
  90. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/vc/vc_cache.py +0 -0
  91. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/vc/vc_dir.py +0 -0
  92. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/vc/vc_sample.py +0 -0
  93. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/vc/vc_stub.py +0 -0
  94. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq/work_orders.py +0 -0
  95. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq.egg-info/dependency_links.txt +0 -0
  96. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq.egg-info/entry_points.txt +0 -0
  97. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq.egg-info/requires.txt +0 -0
  98. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/geoseeq.egg-info/top_level.txt +0 -0
  99. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/setup.cfg +0 -0
  100. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/setup.py +0 -0
  101. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/tests/__init__.py +0 -0
  102. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/tests/test_api_client.py +0 -0
  103. {geoseeq-0.6.14.dev7 → geoseeq-0.6.15.dev1}/tests/test_plotting.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: geoseeq
3
- Version: 0.6.14.dev7
3
+ Version: 0.6.15.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>
@@ -55,7 +55,7 @@ def version():
55
55
  Use of this tool implies acceptance of the GeoSeeq End User License Agreement.
56
56
  Run `geoseeq eula show` to view the EULA.
57
57
  """
58
- click.echo('0.6.14dev7') # remember to update pyproject.toml
58
+ click.echo('0.6.15dev1') # remember to update pyproject.toml
59
59
 
60
60
 
61
61
  @main.group('advanced')
@@ -4,6 +4,8 @@ from .upload import (
4
4
  cli_upload_file,
5
5
  cli_upload_folder,
6
6
  cli_metadata,
7
+ cli_upload_smart_table,
8
+ cli_upload_smart_tree,
7
9
  )
8
10
  from .upload_reads import cli_upload_reads_wizard
9
11
  from .upload_advanced import cli_find_urls_for_reads
@@ -17,6 +19,8 @@ cli_upload.add_command(cli_upload_reads_wizard)
17
19
  cli_upload.add_command(cli_upload_file)
18
20
  cli_upload.add_command(cli_upload_folder)
19
21
  cli_upload.add_command(cli_metadata)
22
+ cli_upload.add_command(cli_upload_smart_table)
23
+ cli_upload.add_command(cli_upload_smart_tree)
20
24
 
21
25
  @click.group('upload')
22
26
  def cli_upload_advanced():
@@ -263,3 +263,117 @@ def cli_metadata(state, overwrite, yes, private, create, index_col, encoding, pr
263
263
  sample.metadata = new_meta
264
264
  sample.idem()
265
265
  click.echo(f'Wrote metadata for {len(samples)} samples')
266
+
267
+
268
+ @click.command('smart-table')
269
+ @use_common_state
270
+ @overwrite_option
271
+ @yes_option
272
+ @private_option
273
+ @click.option('-n', '--geoseeq-file-name', default=None,
274
+ help='Specify a different name for the file on GeoSeeq than the local file name.',
275
+ show_default=True)
276
+ @folder_id_arg
277
+ @click.argument('file_path', type=click.Path(exists=True), nargs=1)
278
+ def cli_upload_smart_table(state, overwrite, yes, private, folder_id, geoseeq_file_name, file_path):
279
+ """Upload a smart table to GeoSeeq.
280
+
281
+ This command uploads a smart table to a project or sample on GeoSeeq. It can be used to upload
282
+ a single file to a folder at once.
283
+
284
+ ---
285
+
286
+ Example Usage:
287
+
288
+ \b
289
+ # Upload a smart table from a file
290
+ $ geoseeq upload smart-table "My Org/My Project/My Sample/My Folder" /path/to/my_table.csv
291
+
292
+ \b
293
+ # Upload a smart table from a file but name it "My Smart Table" on GeoSeeq
294
+ $ geoseeq upload smart-table "My Org/My Project/My Sample/My Folder" /path/to/my_table.csv -n "My Smart Table"
295
+
296
+ ---
297
+
298
+ Command Arguments:
299
+
300
+ [FOLDER_ID] Can be a folder UUID, GeoSeeq Resource Number (GRN), or an
301
+ names for an org, project, sample, folder separated by a slash. Can exclude
302
+ the sample name if the folder is for a project.
303
+
304
+ [FILE_PATH] A path to a file on your local machine.
305
+
306
+ ---
307
+ """
308
+ knex = state.get_knex()
309
+ result_folder = handle_folder_id(knex, folder_id, yes=yes, private=private)
310
+
311
+ if not geoseeq_file_name:
312
+ geoseeq_file_name = basename(file_path)
313
+
314
+ if not overwrite and result_folder.result_file(geoseeq_file_name).exists():
315
+ raise click.UsageError(f'{geoseeq_file_name} already exists in {result_folder}. Use --overwrite to overwrite it.')
316
+
317
+ result_file = result_folder.result_file(geoseeq_file_name)
318
+ smart_table = result_file.as_smart_table()
319
+ smart_table.import_csv(file_path)
320
+
321
+
322
+ @click.command('smart-tree')
323
+ @use_common_state
324
+ @click.option('-m/-nm', '--make-name-map/--no-name-map', default=True, help="Create a sample name map with all samples currently in the project.")
325
+ @overwrite_option
326
+ @yes_option
327
+ @private_option
328
+ @click.option('-n', '--geoseeq-file-name', default=None,
329
+ help='Specify a different name for the file on GeoSeeq than the local file name.',
330
+ show_default=True)
331
+ @folder_id_arg
332
+ @click.argument('newick_file_path', type=click.Path(exists=True), nargs=1)
333
+ def cli_upload_smart_tree(state, make_name_map, overwrite, yes, private, folder_id, geoseeq_file_name, newick_file_path):
334
+ """Upload a smart tree to GeoSeeq.
335
+
336
+ This command uploads a smart tree to a project or sample on GeoSeeq. It can be used to upload
337
+ a single file to a folder at once.
338
+
339
+ ---
340
+
341
+ Example Usage:
342
+
343
+ \b
344
+ # Upload a smart tree from a file
345
+ $ geoseeq upload smart-tree "My Org/My Project/My Sample/My Folder" /path/to/my_tree.nwk
346
+
347
+ \b
348
+ # Upload a smart tree from a file but name it "My Smart Tree" on GeoSeeq
349
+ $ geoseeq upload smart-tree "My Org/My Project/My Sample/My Folder" /path/to/my_tree.nwk -n "My Smart Tree"
350
+
351
+ ---
352
+
353
+ Command Arguments:
354
+
355
+ [FOLDER_ID] Can be a folder UUID, GeoSeeq Resource Number (GRN), or an
356
+ names for an org, project, sample, folder separated by a slash. Can exclude
357
+ the sample name if the folder is for a project.
358
+
359
+ [NEWICK_FILE_PATH] A path to a newick file on your local machine.
360
+
361
+ ---
362
+ """
363
+ knex = state.get_knex()
364
+ result_folder = handle_folder_id(knex, folder_id, yes=yes, private=private)
365
+
366
+ if not geoseeq_file_name:
367
+ geoseeq_file_name = basename(newick_file_path)
368
+
369
+ if not overwrite and result_folder.result_file(geoseeq_file_name).exists():
370
+ raise click.UsageError(f'{geoseeq_file_name} already exists in {result_folder}. Use --overwrite to overwrite it.')
371
+
372
+ result_file = result_folder.result_file(geoseeq_file_name)
373
+ smart_tree = result_file.as_smart_tree()
374
+ with open(newick_file_path) as f:
375
+ newick_str = f.read()
376
+ smart_tree.create_from_newick(newick_str)
377
+ if make_name_map:
378
+ smart_tree.add_all_samples_to_map(result_folder.project)
379
+ smart_tree.idem()
@@ -18,9 +18,10 @@ from geoseeq.knex import GeoseeqOtherError
18
18
  from .utils import *
19
19
  from .file_upload import ResultFileUpload
20
20
  from .file_download import ResultFileDownload
21
+ from .smart_objects import ResultFileSmartObjects
21
22
 
22
23
 
23
- class ResultFile(RemoteObject, ResultFileUpload, ResultFileDownload):
24
+ class ResultFile(RemoteObject, ResultFileUpload, ResultFileDownload, ResultFileSmartObjects):
24
25
  remote_fields = [
25
26
  "uuid",
26
27
  "created_at",
@@ -225,6 +225,10 @@ class SampleResultFolder(ResultFolder, SampleBioInfoFolder):
225
225
 
226
226
  def get_fields(self, *args, **kwargs):
227
227
  return self.get_result_files(*args, **kwargs)
228
+
229
+ @property
230
+ def project(self):
231
+ return self.sample.project
228
232
 
229
233
  def __str__(self):
230
234
  return f"<Geoseeq::SampleResultFolder {self.module_name} {self.replicate} {self.uuid} />"
@@ -288,6 +292,10 @@ class ProjectResultFolder(ResultFolder):
288
292
 
289
293
  def get_fields(self, *args, **kwargs):
290
294
  return self.get_result_files(*args, **kwargs)
295
+
296
+ @property
297
+ def project(self):
298
+ return self.grp
291
299
 
292
300
  def __str__(self):
293
301
  return f"<Geoseeq::ProjectResultFolder {self.module_name} {self.replicate} {self.uuid} />"
@@ -0,0 +1,40 @@
1
+
2
+
3
+ class ResultFileSmartObjects:
4
+ """Interface for ResultFiles to easily create and use smart objects like tables"""
5
+
6
+ def is_smart_table(self):
7
+ """Return True iff this ResultFile is a smart table."""
8
+ return self.stored_data.get("__type__") == "smartTable"
9
+
10
+ def as_smart_table(self, description=""):
11
+ """Return a SmartTable object for this ResultFile. Will create a new SmartTable if it doesn't exist yet."""
12
+ if self.exists() and not self.is_smart_table():
13
+ raise ValueError("ResultFile exists but is not a smart table")
14
+ from geoseeq.smart_table import SmartTable # import here to avoid circular import
15
+ if self.exists(): # already a smart table
16
+ smart_table = SmartTable(self.knex, self.name, connected_file_id=self.uuid).get()
17
+ else: # create a new smart table
18
+ smart_table = SmartTable(self.knex, self.name, connected_file_id=self.uuid, description=description)
19
+ smart_table.create(self.parent)
20
+ return smart_table
21
+
22
+ def is_smart_tree(self):
23
+ """Return True iff this ResultFile is a smart tree."""
24
+ return self.stored_data.get("__type__") == "phylodynamics"
25
+
26
+ def as_smart_tree(self, newick_str=None, sample_name_id_map=None):
27
+ """Return a SmartTree object for this ResultFile. Will create a new SmartTree if it doesn't exist yet."""
28
+ if self.exists() and not self.is_smart_tree():
29
+ raise ValueError("ResultFile exists but is not a smart tree")
30
+ from geoseeq.smart_tree import SmartTree # import here to avoid circular import
31
+ if self.exists(): # already a smart tree
32
+ smart_tree = SmartTree.from_blob(self, self.stored_data)
33
+ else: # create a new smart tree
34
+ smart_tree = SmartTree(self)
35
+ if newick_str is not None:
36
+ smart_tree.create_from_newick(newick_str, sample_name_id_map)
37
+ smart_tree.create()
38
+ return smart_tree
39
+
40
+
@@ -53,11 +53,12 @@ class SmartTable(RemoteObject):
53
53
 
54
54
  without_default_columns: if False the server creates 3 example columns.
55
55
  """
56
-
56
+ if description:
57
+ self.description = description
57
58
  data = {
58
59
  "name": self.name,
59
60
  "folder_id": result_folder.uuid,
60
- "description": description,
61
+ "description": self.description,
61
62
  }
62
63
  url = f"table?without_default_columns={without_default_columns}"
63
64
  blob = self.knex.post(url, json=data)
@@ -0,0 +1,57 @@
1
+ class SmartTree:
2
+
3
+ def __init__(self, result_file):
4
+ self.result_file = result_file # the result file that contains the smart tree
5
+ self.content = None
6
+
7
+ def create_from_newick(self, newick_str, sample_name_id_map=None):
8
+ self.content = {
9
+ "__type__": "phylodynamics",
10
+ "version": "1.0",
11
+ "tree": {
12
+ "value": newick_str,
13
+ "kind": "newick",
14
+ "sampleNameIdMap": {} if sample_name_id_map is None else sample_name_id_map,
15
+ }
16
+ }
17
+ return self
18
+
19
+ def add_sample_to_map(self, sample):
20
+ if self.content is None:
21
+ raise ValueError("Must create tree before adding samples")
22
+ self.content["tree"]["sampleNameIdMap"][sample.name] = sample.uuid
23
+ return self
24
+
25
+ def add_all_samples_to_map(self, project):
26
+ for sample in project.get_samples():
27
+ self.add_sample_to_map(sample)
28
+
29
+ @classmethod
30
+ def from_blob(cls, result_file, blob):
31
+ smart_tree = cls(result_file)
32
+ smart_tree.content = blob
33
+ return smart_tree
34
+
35
+ def save(self):
36
+ if self.content is None:
37
+ raise ValueError("Must create tree before saving")
38
+ self.result_file.upload_json(self.content)
39
+ return self
40
+
41
+ def idem(self):
42
+ if self.content is None:
43
+ raise ValueError("Must create tree before saving")
44
+ self.result_file.upload_json(self.content)
45
+ return self
46
+
47
+ def get(self):
48
+ self.result_file.get()
49
+ self.content = self.result_file.stored_data
50
+ return self
51
+
52
+ def create(self):
53
+ if self.content is None:
54
+ raise ValueError("Must create tree before saving")
55
+ self.result_file.upload_json(self.content)
56
+ return self
57
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: geoseeq
3
- Version: 0.6.14.dev7
3
+ Version: 0.6.15.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>
@@ -16,6 +16,7 @@ geoseeq/remote_object.py
16
16
  geoseeq/sample.py
17
17
  geoseeq/search.py
18
18
  geoseeq/smart_table.py
19
+ geoseeq/smart_tree.py
19
20
  geoseeq/upload_download_manager.py
20
21
  geoseeq/user.py
21
22
  geoseeq/utils.py
@@ -84,6 +85,7 @@ geoseeq/result/result_file.py
84
85
  geoseeq/result/result_folder.py
85
86
  geoseeq/result/resumable_download_tracker.py
86
87
  geoseeq/result/resumable_upload_tracker.py
88
+ geoseeq/result/smart_objects.py
87
89
  geoseeq/result/utils.py
88
90
  geoseeq/vc/__init__.py
89
91
  geoseeq/vc/checksum.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "geoseeq"
7
- version = "0.6.14dev7"
7
+ version = "0.6.15dev1"
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