ghga-transpiler 1.2.0__py3-none-any.whl → 2.0.0__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.
@@ -15,4 +15,13 @@
15
15
 
16
16
  """Short description of package""" # Please adapt to package
17
17
 
18
- __version__ = "1.2.0"
18
+ from importlib.metadata import version
19
+
20
+ from openpyxl.xml import DEFUSEDXML
21
+
22
+ __version__ = version(__package__)
23
+
24
+ if not DEFUSEDXML:
25
+ raise RuntimeError(
26
+ "The 'defusedxml' package must be present to safely run ghga-transpiler."
27
+ )
ghga_transpiler/cli.py CHANGED
@@ -13,21 +13,27 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- """ CLI-specific wrappers around core functions."""
16
+ """CLI-specific wrappers around core functions."""
17
17
  import sys
18
18
  from pathlib import Path
19
19
  from typing import Optional
20
20
 
21
21
  import typer
22
22
 
23
- from ghga_transpiler import io
24
-
23
+ from . import __version__, io
25
24
  from .config.exceptions import UnknownVersionError
26
- from .core import convert_workbook
25
+ from .core import InvalidSematicVersion, convert_workbook
27
26
 
28
27
  cli = typer.Typer()
29
28
 
30
29
 
30
+ def version_callback(value: bool):
31
+ """Prints the package version"""
32
+ if value:
33
+ print(__version__)
34
+ raise typer.Exit()
35
+
36
+
31
37
  @cli.command()
32
38
  def transpile(
33
39
  spread_sheet: Path = typer.Argument(
@@ -43,15 +49,24 @@ def transpile(
43
49
  force: bool = typer.Option(
44
50
  False, "--force", "-f", help="Override output file if it exists."
45
51
  ),
52
+ version: bool = typer.Option(
53
+ False,
54
+ "--version",
55
+ "-v",
56
+ callback=version_callback,
57
+ is_eager=True,
58
+ help="Print package version",
59
+ ),
46
60
  ):
47
61
  """ghga-transpiler is a command line utility to transpile the official GHGA
48
62
  metadata XLSX workbooks to JSON. Please note that ghga-transpiler does not
49
63
  validate that the provided metadata is compliant with the GHGA Metadata
50
64
  Schema. This can be achieved by running ghga-validator on the JSON data
51
- generated by the ghga-transpiler."""
65
+ generated by the ghga-transpiler.
66
+ """
52
67
  try:
53
68
  ghga_workbook = io.read_workbook(spread_sheet)
54
- except (SyntaxError, UnknownVersionError) as exc:
69
+ except (SyntaxError, UnknownVersionError, InvalidSematicVersion) as exc:
55
70
  sys.exit(f"Unable to parse input file '{spread_sheet}': {exc}")
56
71
 
57
72
  converted = convert_workbook(ghga_workbook)
@@ -21,7 +21,7 @@ from importlib import resources
21
21
  from typing import Callable, Optional
22
22
 
23
23
  import yaml
24
- from pydantic import BaseModel, root_validator
24
+ from pydantic import BaseModel, model_validator
25
25
 
26
26
  from .exceptions import DuplicatedName, UnknownVersionError
27
27
 
@@ -40,11 +40,11 @@ class WorksheetSettings(BaseModel):
40
40
  """A data model for the per-worksheet settings of a transpiler config"""
41
41
 
42
42
  name: str
43
- header_row: Optional[int]
44
- start_row: Optional[int]
45
- start_column: Optional[int]
46
- end_column: Optional[int]
47
- transformations: Optional[dict[str, Callable]]
43
+ header_row: Optional[int] = None
44
+ start_row: Optional[int] = None
45
+ start_column: Optional[int] = None
46
+ end_column: Optional[int] = None
47
+ transformations: Optional[dict[str, Callable]] = None
48
48
 
49
49
 
50
50
  class Worksheet(BaseModel):
@@ -61,21 +61,21 @@ class Config(BaseModel):
61
61
  default_settings: DefaultSettings
62
62
  worksheets: list[Worksheet]
63
63
 
64
- @root_validator(pre=False)
65
- def get_param(cls, values): # pylint: disable=no-self-argument
64
+ @model_validator(mode="after")
65
+ def get_param(cls, values): # noqa
66
66
  """Function to manage parameters of global and worksheet specific configuration"""
67
- for sheet in values.get("worksheets"):
68
- for key in values.get("default_settings").__dict__:
67
+ for sheet in values.worksheets:
68
+ for key in values.default_settings.__dict__:
69
69
  if getattr(sheet.settings, key) is None:
70
- val = getattr(values.get("default_settings"), key)
70
+ val = getattr(values.default_settings, key)
71
71
  setattr(sheet.settings, key, val)
72
72
  return values
73
73
 
74
- @root_validator(pre=False)
75
- def check_name(cls, values): # pylint: disable=no-self-argument
74
+ @model_validator(mode="after")
75
+ def check_name(cls, values): # noqa
76
76
  """Function to ensure that each worksheets has a unique sheet_name and name attributes."""
77
77
  # Check for duplicate attribute names
78
- attrs_counter = Counter(ws.settings.name for ws in values["worksheets"])
78
+ attrs_counter = Counter(ws.settings.name for ws in values.worksheets)
79
79
  dup_attrs = [name for name, count in attrs_counter.items() if count > 1]
80
80
  if dup_attrs:
81
81
  raise DuplicatedName(
@@ -83,7 +83,7 @@ class Config(BaseModel):
83
83
  )
84
84
 
85
85
  # Check for duplicate worksheet names
86
- attrs_counter = Counter(ws.sheet_name for ws in values["worksheets"])
86
+ attrs_counter = Counter(ws.sheet_name for ws in values.worksheets)
87
87
  dup_ws_names = [name for name, count in attrs_counter.items() if count > 1]
88
88
  if dup_ws_names:
89
89
  raise DuplicatedName(
@@ -94,11 +94,10 @@ class Config(BaseModel):
94
94
 
95
95
  def load_config(version: str, package: resources.Package) -> Config:
96
96
  """Reads configuration yaml file from default location and creates a Config object"""
97
-
98
97
  config_resource = resources.files(package).joinpath(f"{version}.yaml")
99
98
  try:
100
99
  config_str = config_resource.read_text(encoding="utf8")
101
100
  except FileNotFoundError:
102
101
  # pylint: disable=raise-missing-from
103
- raise UnknownVersionError(f"Unknown metadata version: {version}")
104
- return Config.parse_obj(yaml.load(config_str, yaml.Loader)) # nosec
102
+ raise UnknownVersionError(f"Unknown metadata version: {version}") from None
103
+ return Config.model_validate(yaml.load(config_str, yaml.Loader)) # noqa # nosec
ghga_transpiler/core.py CHANGED
@@ -15,16 +15,17 @@
15
15
  #
16
16
 
17
17
  """This module contains functionalities for processing excel sheets into json object."""
18
- import re
19
18
  from importlib import resources
20
19
  from typing import Callable, Optional, Union
21
20
 
21
+ import semver
22
22
  from openpyxl import Workbook
23
23
 
24
- from ghga_transpiler import config
24
+ from . import config
25
25
 
26
- # pylint: disable=line-too-long
27
- SEMVER_REGEX = r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$"
26
+
27
+ class InvalidSematicVersion(Exception):
28
+ """Raised when a version string is invalid."""
28
29
 
29
30
 
30
31
  class GHGAWorkbook:
@@ -33,20 +34,28 @@ class GHGAWorkbook:
33
34
  def __init__(self, workbook: Workbook, configs_package: resources.Package):
34
35
  """Create a new GHGAWorkbook object from an XLSX workbook"""
35
36
  self.workbook = workbook
36
- self.version = GHGAWorkbook._get_version(workbook)
37
- self.config = config.load_config(self.version, configs_package)
37
+ self.wb_version = GHGAWorkbook._get_version(workbook)
38
+ self.config = config.load_config(self.major_minor_version, configs_package)
38
39
 
39
40
  @staticmethod
40
41
  def _get_version(workbook):
41
42
  """Function to get workbook version from the worksheet _properties"""
42
43
  if "__properties" in workbook.sheetnames:
43
- version = str(workbook["__properties"].cell(1, 1).value)
44
- if re.fullmatch(SEMVER_REGEX, version):
45
- return version
44
+ try:
45
+ return semver.Version.parse(workbook["__properties"].cell(1, 1).value)
46
+ except ValueError:
47
+ raise InvalidSematicVersion(
48
+ "Unable to extract metadata model version from the provided workbook (not a valid semantic version)."
49
+ ) from None
46
50
  raise SyntaxError(
47
- "Unable to extract metadata version from the provided workbook."
51
+ "Unable to extract metadata model version from the provided workbook (missing)."
48
52
  )
49
53
 
54
+ @property
55
+ def major_minor_version(self):
56
+ """Returns only major and minor version numbers"""
57
+ return f"{self.wb_version.major}.{self.wb_version.minor}"
58
+
50
59
 
51
60
  def get_worksheet_rows(
52
61
  worksheet,
@@ -81,7 +90,8 @@ def get_header(
81
90
 
82
91
  def convert_rows(header, rows) -> list[dict]:
83
92
  """Function to return list of dictionaries, rows as worksheet row values and
84
- column names as keys"""
93
+ column names as keys
94
+ """
85
95
  return [
86
96
  {
87
97
  key: value
ghga_transpiler/io.py CHANGED
@@ -24,15 +24,13 @@ from typing import Optional, TextIO
24
24
 
25
25
  from openpyxl import load_workbook
26
26
 
27
- from ghga_transpiler.core import GHGAWorkbook
27
+ from .core import GHGAWorkbook
28
28
 
29
29
 
30
30
  def read_workbook(
31
31
  path: Path, configs_package: resources.Package = "ghga_transpiler.configs"
32
32
  ) -> GHGAWorkbook:
33
- """
34
- Function to read-in a workbook
35
- """
33
+ """Function to read-in a workbook"""
36
34
  return GHGAWorkbook(load_workbook(path), configs_package=configs_package)
37
35
 
38
36
 
@@ -43,7 +41,8 @@ def _write_json(data: dict, file: TextIO):
43
41
 
44
42
  def write_json(data: dict, path: Optional[Path], force: bool) -> None:
45
43
  """Write the data provided as a dictionary to the specified output path or
46
- to stdout if the path is None."""
44
+ to stdout if the path is None.
45
+ """
47
46
  if path is None:
48
47
  _write_json(data, sys.stdout)
49
48
  elif path.exists() and not force:
@@ -38,7 +38,28 @@ def to_attributes() -> Callable:
38
38
  return dict(zip(("key", "value"), splitted))
39
39
 
40
40
  def split_mult(value: str) -> list[dict]:
41
- """Function to convert string to attributes"""
41
+ """Converts string to attributes"""
42
42
  return [split_one(elem) for elem in split_by_semicolon(value)]
43
43
 
44
44
  return split_mult
45
+
46
+
47
+ def snake_case(cv: str) -> str:
48
+ """Converts format of a string to SNAKE_CASE"""
49
+ return cv.replace(" ", "_").upper()
50
+
51
+
52
+ def to_snake_case() -> Callable:
53
+ """Returns a function that converts a string to SNAKE_CASE"""
54
+ return snake_case
55
+
56
+
57
+ def snake_case_list(value: str) -> list[str]:
58
+ """Combines the functions to split_by_semicolon and convert_to_snake_case"""
59
+ list_to_convert = split_by_semicolon(value)
60
+ return [snake_case(elem) for elem in list_to_convert]
61
+
62
+
63
+ def to_snake_case_list() -> Callable:
64
+ """Returns a function that converts a semicolon separated string into a list of snake-cased strings"""
65
+ return snake_case_list
@@ -1,33 +1,36 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ghga-transpiler
3
- Version: 1.2.0
4
- Summary: GHGA-Transpiler - GHGA metadata XLSX to JSON transpilation
5
- Home-page: https://github.com/ghga-de/ghga-transpiler
6
- Author: German Human Genome Phenome Archive (GHGA)
7
- Author-email: contact@ghga.de
3
+ Version: 2.0.0
4
+ Summary: GHGA-Transpiler - excel to JSON converter
5
+ Author-email: "German Human Genome Phenome Archive (GHGA)" <contact@ghga.de>
8
6
  License: Apache 2.0
7
+ Project-URL: Repository, https://github.com/ghga-de/ghga-transpiler
8
+ Classifier: Development Status :: 1 - Planning
9
9
  Classifier: Operating System :: POSIX :: Linux
10
10
  Classifier: Programming Language :: Python :: 3.9
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
11
13
  Classifier: License :: OSI Approved :: Apache Software License
12
14
  Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
13
- Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
15
+ Classifier: Topic :: Software Development :: Libraries
16
+ Classifier: Intended Audience :: Developers
14
17
  Requires-Python: >=3.9
15
- Description-Content-Type: text/markdown; charset=UTF-8
18
+ Description-Content-Type: text/markdown
16
19
  License-File: LICENSE
17
- Requires-Dist: typer (==0.7.0)
18
- Requires-Dist: pydantic (==1.10.6)
19
- Requires-Dist: openpyxl (==3.1.2)
20
- Requires-Dist: defusedxml (==0.7.1)
21
- Requires-Dist: PyYAML (==6.0)
22
- Provides-Extra: all
20
+ Requires-Dist: typer ~=0.9.0
21
+ Requires-Dist: openpyxl ==3.*,>=3.1.2
22
+ Requires-Dist: defusedxml ==0.*,>=0.7
23
+ Requires-Dist: pydantic <3,>=2
24
+ Requires-Dist: PyYAML ~=6.0
25
+ Requires-Dist: semver ==3.*
23
26
 
24
27
 
25
- [![tests](https://github.com/ghga-de/ghga-transpiler/actions/workflows/unit_and_int_tests.yaml/badge.svg)](https://github.com/ghga-de/ghga-transpiler/actions/workflows/unit_and_int_tests.yaml)
28
+ [![tests](https://github.com/ghga-de/ghga-transpiler/actions/workflows/tests.yaml/badge.svg)](https://github.com/ghga-de/ghga-transpiler/actions/workflows/unit_and_int_tests.yaml)
26
29
  [![Coverage Status](https://coveralls.io/repos/github/ghga-de/ghga-transpiler/badge.svg?branch=main)](https://coveralls.io/github/ghga-de/ghga-transpiler?branch=main)
27
30
 
28
31
  # Ghga Transpiler
29
32
 
30
- GHGA-Transpiler - GHGA metadata XLSX to JSON transpilation
33
+ GHGA-Transpiler - excel to JSON converter
31
34
 
32
35
  ## Description
33
36
 
@@ -0,0 +1,16 @@
1
+ ghga_transpiler/__init__.py,sha256=5TNi3CUUdk2qXfeDjKHtqG5zre2GuLv9YAFOydRAE4k,993
2
+ ghga_transpiler/__main__.py,sha256=NgajDXhJ36WPA6MR5Rb44Qqmogie16_kr0HRL-umGxc,848
3
+ ghga_transpiler/cli.py,sha256=haVokV0xVTRET1oQZw0B_4r3V-kEUcypbrLEACPLWBs,2522
4
+ ghga_transpiler/core.py,sha256=L-L3BkU8PfuBUWq9scA-o065rMhMKlNHqtDqg2ZwkPo,5246
5
+ ghga_transpiler/io.py,sha256=MJwXmFC2xsgq7exlG623pnKhCxiJ-EBI9uIV0G46frU,1783
6
+ ghga_transpiler/transformations.py,sha256=up9Yday5Hg-ECKvfzmqcvv8XlevnYz5mufwbZuK3Lm4,2214
7
+ ghga_transpiler/config/__init__.py,sha256=IKlzAd82ta9a0_aEps3f4I3GLRSJeyV1QImFcHvBLE0,818
8
+ ghga_transpiler/config/config.py,sha256=3N3ozWlqIdtBNlNZI5dPjDunGGxlF7-APplgzx9MSn0,3807
9
+ ghga_transpiler/config/exceptions.py,sha256=_A8wMX9t0YkLw4tk2IhOVdKoGoZxP2pXsEaZwrgkXhw,1091
10
+ ghga_transpiler/configs/__init__.py,sha256=uGpTS9l2diw93p053atk09DuObDZ7eDZJoADCmuYX0g,687
11
+ ghga_transpiler-2.0.0.dist-info/LICENSE,sha256=a2nPPnhGY9QGdkfGrseHGDVj62fh8o5DoHsUpQp3GzA,11452
12
+ ghga_transpiler-2.0.0.dist-info/METADATA,sha256=n2ziI2Q_Kyhzk03xwGq9_EoCSHpAPtls4S7a44XuYjk,4460
13
+ ghga_transpiler-2.0.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
14
+ ghga_transpiler-2.0.0.dist-info/entry_points.txt,sha256=Fr_VQJynZZl95NXjrQW2gE0bCocgjKVNEZQpaLls8po,65
15
+ ghga_transpiler-2.0.0.dist-info/top_level.txt,sha256=TksRpDO3Y4mvK-B09UhQU3ceZpG19fljNlVDGTfjg8o,16
16
+ ghga_transpiler-2.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.0)
2
+ Generator: bdist_wheel (0.42.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,3 +1 @@
1
1
  ghga_transpiler
2
- scripts
3
- tests
@@ -1,109 +0,0 @@
1
- ghga_metadata_version: 0.10.0
2
- default_settings:
3
- header_row: 1
4
- start_row: 7
5
- start_column: 1
6
- transformations:
7
- attributes: !!python/object/apply:ghga_transpiler.transformations.to_attributes []
8
- worksheets:
9
- - settings:
10
- end_column: 6
11
- name: analyses
12
- sheet_name: Analysis
13
- - settings:
14
- end_column: 8
15
- name: analysis_process_output_files
16
- sheet_name: AnalysisProcessOutputFile
17
- - settings:
18
- end_column: 5
19
- name: analysis_processes
20
- transformations:
21
- study_input_files: !!python/object/apply:ghga_transpiler.transformations.to_list []
22
- sample_input_files: !!python/object/apply:ghga_transpiler.transformations.to_list []
23
- sequencing_process_input_files: !!python/object/apply:ghga_transpiler.transformations.to_list []
24
- sheet_name: AnalysisProcess
25
- - settings:
26
- end_column: 9
27
- name: biospecimens
28
- sheet_name: Biospecimen
29
- - settings:
30
- end_column: 9
31
- name: conditions
32
- sheet_name: Condition
33
- - settings:
34
- end_column: 3
35
- name: data_access_committees
36
- sheet_name: DataAccessCommittee
37
- - settings:
38
- end_column: 8
39
- name: data_access_policies
40
- transformations:
41
- data_use_modifiers: !!python/object/apply:ghga_transpiler.transformations.to_list []
42
- sheet_name: DataAccessPolicy
43
- - settings:
44
- end_column: 5
45
- name: datasets
46
- transformations:
47
- types: !!python/object/apply:ghga_transpiler.transformations.to_list []
48
- sheet_name: Dataset
49
- - settings:
50
- end_column: 8
51
- name: individuals
52
- transformations:
53
- ancestries: !!python/object/apply:ghga_transpiler.transformations.to_list []
54
- phenotypic_features: !!python/object/apply:ghga_transpiler.transformations.to_list []
55
- sheet_name: Individual
56
- - settings:
57
- end_column: 14
58
- name: library_preparation_protocols
59
- transformations:
60
- target_regions: !!python/object/apply:ghga_transpiler.transformations.to_list []
61
- attributes: !!python/object/apply:ghga_transpiler.transformations.to_attributes []
62
- sheet_name: LibraryPreparationProtocol
63
- - settings:
64
- end_column: 9
65
- name: publications
66
- transformations:
67
- xref: !!python/object/apply:ghga_transpiler.transformations.to_list []
68
- sheet_name: Publication
69
- - settings:
70
- end_column: 8
71
- name: sample_files
72
- sheet_name: SampleFile
73
- - settings:
74
- end_column: 10
75
- name: samples
76
- transformations:
77
- xref: !!python/object/apply:ghga_transpiler.transformations.to_list []
78
- sheet_name: Sample
79
- - settings:
80
- end_column: 7
81
- name: sequencing_experiments
82
- sheet_name: SequencingExperiment
83
- - settings:
84
- end_column: 8
85
- name: sequencing_process_files
86
- sheet_name: SequencingProcessFile
87
- - settings:
88
- end_column: 10
89
- name: sequencing_processes
90
- sheet_name: SequencingProcess
91
- - settings:
92
- end_column: 20
93
- name: sequencing_protocols
94
- sheet_name: SequencingProtocol
95
- - settings:
96
- end_column: 6
97
- name: studies
98
- transformations:
99
- affiliations: !!python/object/apply:ghga_transpiler.transformations.to_list []
100
- attributes: !!python/object/apply:ghga_transpiler.transformations.to_attributes []
101
- sheet_name: Study
102
- - settings:
103
- end_column: 8
104
- name: study_files
105
- sheet_name: StudyFile
106
- - settings:
107
- end_column: 4
108
- name: trios
109
- sheet_name: Trio
@@ -1,109 +0,0 @@
1
- ghga_metadata_version: 1.0.0
2
- default_settings:
3
- header_row: 1
4
- start_row: 7
5
- start_column: 1
6
- transformations:
7
- attributes: !!python/object/apply:ghga_transpiler.transformations.to_attributes []
8
- worksheets:
9
- - settings:
10
- end_column: 6
11
- name: analyses
12
- sheet_name: Analysis
13
- - settings:
14
- end_column: 9
15
- name: analysis_process_output_files
16
- sheet_name: AnalysisProcessOutputFile
17
- - settings:
18
- end_column: 5
19
- name: analysis_processes
20
- transformations:
21
- study_input_files: !!python/object/apply:ghga_transpiler.transformations.to_list []
22
- sample_input_files: !!python/object/apply:ghga_transpiler.transformations.to_list []
23
- sequencing_process_input_files: !!python/object/apply:ghga_transpiler.transformations.to_list []
24
- sheet_name: AnalysisProcess
25
- - settings:
26
- end_column: 10
27
- name: biospecimens
28
- sheet_name: Biospecimen
29
- - settings:
30
- end_column: 9
31
- name: conditions
32
- sheet_name: Condition
33
- - settings:
34
- end_column: 3
35
- name: data_access_committees
36
- sheet_name: DataAccessCommittee
37
- - settings:
38
- end_column: 8
39
- name: data_access_policies
40
- transformations:
41
- data_use_modifiers: !!python/object/apply:ghga_transpiler.transformations.to_list []
42
- sheet_name: DataAccessPolicy
43
- - settings:
44
- end_column: 5
45
- name: datasets
46
- transformations:
47
- types: !!python/object/apply:ghga_transpiler.transformations.to_list []
48
- sheet_name: Dataset
49
- - settings:
50
- end_column: 6
51
- name: individuals
52
- transformations:
53
- ancestries: !!python/object/apply:ghga_transpiler.transformations.to_list []
54
- phenotypic_features: !!python/object/apply:ghga_transpiler.transformations.to_list []
55
- sheet_name: Individual
56
- - settings:
57
- end_column: 14
58
- name: library_preparation_protocols
59
- transformations:
60
- target_regions: !!python/object/apply:ghga_transpiler.transformations.to_list []
61
- attributes: !!python/object/apply:ghga_transpiler.transformations.to_attributes []
62
- sheet_name: LibraryPreparationProtocol
63
- - settings:
64
- end_column: 9
65
- name: publications
66
- transformations:
67
- xref: !!python/object/apply:ghga_transpiler.transformations.to_list []
68
- sheet_name: Publication
69
- - settings:
70
- end_column: 9
71
- name: sample_files
72
- sheet_name: SampleFile
73
- - settings:
74
- end_column: 10
75
- name: samples
76
- transformations:
77
- xref: !!python/object/apply:ghga_transpiler.transformations.to_list []
78
- sheet_name: Sample
79
- - settings:
80
- end_column: 7
81
- name: sequencing_experiments
82
- sheet_name: SequencingExperiment
83
- - settings:
84
- end_column: 9
85
- name: sequencing_process_files
86
- sheet_name: SequencingProcessFile
87
- - settings:
88
- end_column: 12
89
- name: sequencing_processes
90
- sheet_name: SequencingProcess
91
- - settings:
92
- end_column: 17
93
- name: sequencing_protocols
94
- sheet_name: SequencingProtocol
95
- - settings:
96
- end_column: 6
97
- name: studies
98
- transformations:
99
- affiliations: !!python/object/apply:ghga_transpiler.transformations.to_list []
100
- attributes: !!python/object/apply:ghga_transpiler.transformations.to_attributes []
101
- sheet_name: Study
102
- - settings:
103
- end_column: 9
104
- name: study_files
105
- sheet_name: StudyFile
106
- - settings:
107
- end_column: 4
108
- name: trios
109
- sheet_name: Trio