eva-sub-cli 0.4.11__tar.gz → 0.4.12__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.
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/PKG-INFO +2 -2
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/_version.py +2 -2
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/etc/eva_schema.json +1 -1
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/executables/evidence_type_checker.py +15 -5
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/executables/samples_checker.py +1 -27
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/file_utils.py +24 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/nextflow/validation.nf +3 -2
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/validators/docker_validator.py +1 -1
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli.egg-info/PKG-INFO +2 -2
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli.egg-info/requires.txt +1 -1
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/requirements.txt +1 -1
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/build_and_test_docker_locally.py +13 -8
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_docker_validator.py +1 -1
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_evidence_type_checker.py +11 -7
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_submit.py +2 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/.github/workflows/publish.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/.github/workflows/publish_docs.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/.github/workflows/publish_packages.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/.github/workflows/tests.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/.github/workflows/trigger-eva-sub-cli-integration-tests.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/.gitignore +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/LICENSE +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/README.md +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/conda/build.sh +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/conda/meta.yaml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/docker/Dockerfile +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/docs/README.md +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/docs/_config.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/docs/how_to_submit.md +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/docs/input_file_overview.md +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/docs/installation.md +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/docs/using_nextflow.md +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/docs/validation_overview.md +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/__init__.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/auth.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/date_utils.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/etc/EVA_Submission_Example.xlsx +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/etc/EVA_Submission_template.xlsx +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/etc/eva-biosamples.json +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/etc/eva_logo.png +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/etc/spreadsheet2json_conf.yaml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/exceptions/__init__.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/exceptions/invalid_file_type_exception.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/exceptions/metadata_template_version_exception.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/exceptions/submission_not_found_exception.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/exceptions/submission_status_exception.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/executables/__init__.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/executables/check_fasta_insdc.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/executables/check_metadata_semantics.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/executables/cli.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/executables/trim_down.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/executables/xlsx2json.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/fasta_check.html +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/file_validation.html +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/metadata_validation.html +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/project_details.html +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/report.html +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/sample_name_check.html +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/shallow_validation.html +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/fasta_check.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/file_validation.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/metadata_validation.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/project_details.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/report.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/sample_name_check.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/shallow_validation.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/metadata.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/orchestrator.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/report.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/semantic_metadata.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/submission_ws.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/submit.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/validators/__init__.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/validators/native_validator.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/validators/validation_results_parsers.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/validators/validator.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli.egg-info/SOURCES.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli.egg-info/dependency_links.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli.egg-info/entry_points.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli.egg-info/top_level.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/pyproject.toml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/pytest.ini +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/setup.cfg +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/setup.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/ignore_test_nextflow_validation.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/EVA_Submission_Docker_Test.xlsx +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/EVA_Submission_test.json +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/EVA_Submission_test.xlsx +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/EVA_Submission_test_fails.xlsx +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/EVA_Submission_test_version_missing.xlsx +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/EVA_Submission_test_with_asm_report.json +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/assembly_check/invalid.vcf.assembly_check.log +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/assembly_check/invalid.vcf.text_assembly_report.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/assembly_reports/input_passed.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/fasta_files/Saccharomyces_cerevisiae_I.fa +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/fasta_files/input_passed.fa +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/fasta_files/multi_seq.fa +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/metadata_with_filename.json +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/sample_checker/example1.vcf.gz +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/sample_checker/example2.vcf +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/sample_checker/example3.vcf +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/sample_checker/metadata.json +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/expected_report_metadata_json.html +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/expected_report_metadata_json.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/expected_report_metadata_xlsx.html +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/expected_report_metadata_xlsx.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/expected_shallow_metadata_xlsx_report.html +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/expected_shallow_metadata_xlsx_report.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/assembly_check/input_passed.vcf.assembly_check.log +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/assembly_check/input_passed.vcf.text_assembly_report.1680102476700.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/assembly_check/input_passed.vcf.valid_assembly_report.1680102476700.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/other_validations/evidence_type_checker.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/other_validations/input_passed.fa_check.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/other_validations/metadata_conversion_errors.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/other_validations/metadata_semantic_check.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/other_validations/metadata_validation.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/other_validations/sample_checker.yml +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/vcf_format/input_passed.vcf.errors.1680102476854.db +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/vcf_format/input_passed.vcf.errors.1680102476854.txt +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/validation_reports/validation_output/vcf_format/input_passed.vcf.vcf_format.log +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/vcf_files/example2.vcf.gz +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/vcf_files/input_passed.vcf +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_auth.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_check_fasta_insdc.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_cli.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_file_utils.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_metadata.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_orchestrator.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_report.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_samples_checker.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_semantic_metadata.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_trim_down.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_utils.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_validaton_results_parsers.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_validator.py +0 -0
- {eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/test_xlsx2json.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eva_sub_cli
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.12
|
|
4
4
|
Summary: EBI EVA - validation and submission command line tool
|
|
5
5
|
Classifier: Development Status :: 5 - Production/Stable
|
|
6
6
|
Classifier: Environment :: Console
|
|
@@ -19,7 +19,7 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
19
19
|
Requires-Python: >=3.6
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENSE
|
|
22
|
-
Requires-Dist: ebi_eva_common_pyutils==0.*,>=0.7.
|
|
22
|
+
Requires-Dist: ebi_eva_common_pyutils==0.*,>=0.7.4
|
|
23
23
|
Requires-Dist: jinja2==3.*,>=3.0.0
|
|
24
24
|
Requires-Dist: jsonschema==4.*
|
|
25
25
|
Requires-Dist: openpyxl==3.*
|
|
@@ -330,7 +330,7 @@
|
|
|
330
330
|
"$ref": "eva-biosamples.json"
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
|
-
"$ref": "https://www.ebi.ac.uk/biosamples/schema
|
|
333
|
+
"$ref": "https://www.ebi.ac.uk/biosamples/schema-store/registry/schemas/ERC000011"
|
|
334
334
|
},
|
|
335
335
|
{
|
|
336
336
|
"$ref": "https://www.ebi.ac.uk/biosamples/schemas/certification/plant-miappe.json"
|
|
@@ -3,22 +3,30 @@ import argparse
|
|
|
3
3
|
import yaml
|
|
4
4
|
from ebi_eva_common_pyutils.logger import logging_config
|
|
5
5
|
|
|
6
|
-
from eva_sub_cli.file_utils import detect_vcf_evidence_type
|
|
6
|
+
from eva_sub_cli.file_utils import detect_vcf_evidence_type, associate_vcf_path_with_analysis
|
|
7
7
|
from eva_sub_cli.metadata import EvaMetadataJson
|
|
8
8
|
|
|
9
9
|
logger = logging_config.get_logger(__name__)
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
def check_evidence_type(metadata_json, output_yaml):
|
|
12
|
+
def check_evidence_type(metadata_json, vcf_files, output_yaml):
|
|
13
13
|
metadata = EvaMetadataJson(metadata_json)
|
|
14
|
+
file_path_per_analysis = associate_vcf_path_with_analysis(metadata, vcf_files)
|
|
15
|
+
|
|
14
16
|
results_per_analysis_alias = {}
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
all_analysis_alias = set(metadata.files_per_analysis) | set(file_path_per_analysis)
|
|
19
|
+
for analysis_alias in all_analysis_alias:
|
|
17
20
|
results_per_analysis_alias[analysis_alias] = {
|
|
18
21
|
'evidence_type': None,
|
|
19
22
|
'errors': None
|
|
20
23
|
}
|
|
21
|
-
vcf_files = list(
|
|
24
|
+
vcf_files = list(file_path_per_analysis.get(analysis_alias, []))
|
|
25
|
+
|
|
26
|
+
if not vcf_files:
|
|
27
|
+
results_per_analysis_alias[analysis_alias]['errors'] = f'No VCF file found for the analysis'
|
|
28
|
+
continue
|
|
29
|
+
|
|
22
30
|
evidence_types_for_vcf_files = [detect_vcf_evidence_type(vcf_file) for vcf_file in vcf_files]
|
|
23
31
|
|
|
24
32
|
if len(set(evidence_types_for_vcf_files)) == 1 and None not in evidence_types_for_vcf_files:
|
|
@@ -43,9 +51,11 @@ def main():
|
|
|
43
51
|
arg_parser = argparse.ArgumentParser(description='Check the evidence type in the VCF files for all analysis')
|
|
44
52
|
arg_parser.add_argument('--metadata_json', required=True, dest='metadata_json',
|
|
45
53
|
help='EVA metadata json file')
|
|
54
|
+
arg_parser.add_argument('--vcf_files', dest='vcf_files', nargs='+',
|
|
55
|
+
help='Path to the vcf files to compare to the metadata')
|
|
46
56
|
arg_parser.add_argument('--output_yaml', required=True, dest='output_yaml',
|
|
47
57
|
help='Path to the location of the results')
|
|
48
58
|
|
|
49
59
|
args = arg_parser.parse_args()
|
|
50
60
|
logging_config.add_stdout_handler()
|
|
51
|
-
check_evidence_type(args.metadata_json, args.output_yaml)
|
|
61
|
+
check_evidence_type(args.metadata_json, args.vcf_files, args.output_yaml)
|
|
@@ -5,7 +5,7 @@ from ebi_eva_common_pyutils.logger import logging_config
|
|
|
5
5
|
|
|
6
6
|
import yaml
|
|
7
7
|
|
|
8
|
-
from eva_sub_cli.file_utils import open_gzip_if_required, detect_vcf_evidence_type
|
|
8
|
+
from eva_sub_cli.file_utils import open_gzip_if_required, detect_vcf_evidence_type, associate_vcf_path_with_analysis
|
|
9
9
|
from eva_sub_cli.metadata import EvaMetadataJson
|
|
10
10
|
|
|
11
11
|
logger = logging_config.get_logger(__name__)
|
|
@@ -99,32 +99,6 @@ def need_to_check_samples(sample_name_per_file):
|
|
|
99
99
|
return True
|
|
100
100
|
|
|
101
101
|
|
|
102
|
-
def associate_vcf_path_with_analysis(metadata, vcf_files):
|
|
103
|
-
"""
|
|
104
|
-
Match the files names associated with analysis provided in the metadata with the file path given on the command
|
|
105
|
-
line.
|
|
106
|
-
:param vcf_files the list of full path to the vcf files
|
|
107
|
-
:param files_per_analysis: dictionary of the analysis and their associated VCF file names
|
|
108
|
-
:returns dictionary of analysis and their associated vcf file path
|
|
109
|
-
"""
|
|
110
|
-
result_files_per_analysis = dict()
|
|
111
|
-
for analysis in metadata.files_per_analysis:
|
|
112
|
-
result_files_per_analysis[analysis] = []
|
|
113
|
-
for vcf_file in vcf_files:
|
|
114
|
-
analysis_aliases = metadata.get_analysis_for_vcf_file(vcf_file)
|
|
115
|
-
if len(analysis_aliases) == 1:
|
|
116
|
-
result_files_per_analysis[analysis_aliases[0]].append(vcf_file)
|
|
117
|
-
elif len(analysis_aliases) == 0:
|
|
118
|
-
logger.error(f'No analysis found for vcf {vcf_file}')
|
|
119
|
-
if 'No analysis' not in result_files_per_analysis:
|
|
120
|
-
result_files_per_analysis['No analysis'] = []
|
|
121
|
-
result_files_per_analysis['No analysis'].append(vcf_file)
|
|
122
|
-
else:
|
|
123
|
-
logger.error(f'More than one analysis were match to vcf {vcf_file}')
|
|
124
|
-
|
|
125
|
-
return result_files_per_analysis
|
|
126
|
-
|
|
127
|
-
|
|
128
102
|
def write_result_yaml(output_yaml, overall_differences, results_per_analysis_alias):
|
|
129
103
|
with open(output_yaml, 'w') as open_yaml:
|
|
130
104
|
yaml.safe_dump(data={
|
|
@@ -35,6 +35,30 @@ def is_vcf_file(file_path):
|
|
|
35
35
|
return file_path.endswith('.vcf') or file_path.endswith('.vcf.gz')
|
|
36
36
|
return False
|
|
37
37
|
|
|
38
|
+
def associate_vcf_path_with_analysis(metadata, vcf_files):
|
|
39
|
+
"""
|
|
40
|
+
Match the files names associated with analysis provided in the metadata with the given file path
|
|
41
|
+
|
|
42
|
+
:param vcf_files the list of full path to the vcf files
|
|
43
|
+
:param files_per_analysis: dictionary of the analysis and their associated VCF file names
|
|
44
|
+
:returns dictionary of analysis and their associated vcf file path
|
|
45
|
+
"""
|
|
46
|
+
result_files_per_analysis = dict()
|
|
47
|
+
for analysis in metadata.files_per_analysis:
|
|
48
|
+
result_files_per_analysis[analysis] = []
|
|
49
|
+
for vcf_file in vcf_files:
|
|
50
|
+
analysis_aliases = metadata.get_analysis_for_vcf_file(vcf_file)
|
|
51
|
+
if len(analysis_aliases) == 1:
|
|
52
|
+
result_files_per_analysis[analysis_aliases[0]].append(vcf_file)
|
|
53
|
+
elif len(analysis_aliases) == 0:
|
|
54
|
+
logger.error(f'No analysis found for vcf {vcf_file}')
|
|
55
|
+
if 'No analysis' not in result_files_per_analysis:
|
|
56
|
+
result_files_per_analysis['No analysis'] = []
|
|
57
|
+
result_files_per_analysis['No analysis'].append(vcf_file)
|
|
58
|
+
else:
|
|
59
|
+
logger.error(f'More than one analysis were match to vcf {vcf_file}')
|
|
60
|
+
|
|
61
|
+
return result_files_per_analysis
|
|
38
62
|
|
|
39
63
|
def detect_vcf_evidence_type(vcf_file):
|
|
40
64
|
"""
|
|
@@ -100,7 +100,7 @@ workflow {
|
|
|
100
100
|
metadata_json_validation(metadata_json)
|
|
101
101
|
metadata_semantic_check(metadata_json)
|
|
102
102
|
sample_name_concordance(metadata_json, vcf_files.collect())
|
|
103
|
-
evidence_type_check(metadata_json)
|
|
103
|
+
evidence_type_check(metadata_json, vcf_files.collect())
|
|
104
104
|
insdc_checker(metadata_json, fasta_to_vcfs)
|
|
105
105
|
}
|
|
106
106
|
}
|
|
@@ -274,6 +274,7 @@ process evidence_type_check {
|
|
|
274
274
|
|
|
275
275
|
input:
|
|
276
276
|
path(metadata_json)
|
|
277
|
+
path(vcf_files)
|
|
277
278
|
|
|
278
279
|
output:
|
|
279
280
|
path "evidence_type_checker.yml", emit: evidence_type_checker_yml
|
|
@@ -281,7 +282,7 @@ process evidence_type_check {
|
|
|
281
282
|
|
|
282
283
|
script:
|
|
283
284
|
"""
|
|
284
|
-
$params.python_scripts.evidence_type_checker --metadata_json $metadata_json --output_yaml evidence_type_checker.yml > evidence_type_checker.log 2>&1
|
|
285
|
+
$params.python_scripts.evidence_type_checker --metadata_json $metadata_json --vcf_files $vcf_files --output_yaml evidence_type_checker.yml > evidence_type_checker.log 2>&1
|
|
285
286
|
"""
|
|
286
287
|
}
|
|
287
288
|
|
|
@@ -12,7 +12,7 @@ from eva_sub_cli.validators.validator import Validator
|
|
|
12
12
|
logger = logging_config.get_logger(__name__)
|
|
13
13
|
|
|
14
14
|
default_container_image = 'ebivariation/eva-sub-cli'
|
|
15
|
-
default_container_tag = 'v0.0.
|
|
15
|
+
default_container_tag = 'v0.0.6'
|
|
16
16
|
container_validation_dir = '/opt/vcf_validation'
|
|
17
17
|
container_validation_output_dir = 'vcf_validation_output'
|
|
18
18
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eva_sub_cli
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.12
|
|
4
4
|
Summary: EBI EVA - validation and submission command line tool
|
|
5
5
|
Classifier: Development Status :: 5 - Production/Stable
|
|
6
6
|
Classifier: Environment :: Console
|
|
@@ -19,7 +19,7 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
19
19
|
Requires-Python: >=3.6
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENSE
|
|
22
|
-
Requires-Dist: ebi_eva_common_pyutils==0.*,>=0.7.
|
|
22
|
+
Requires-Dist: ebi_eva_common_pyutils==0.*,>=0.7.4
|
|
23
23
|
Requires-Dist: jinja2==3.*,>=3.0.0
|
|
24
24
|
Requires-Dist: jsonschema==4.*
|
|
25
25
|
Requires-Dist: openpyxl==3.*
|
|
@@ -141,13 +141,14 @@ class TestDockerValidator(TestCase):
|
|
|
141
141
|
expected_metadata_val = 'Validation passed successfully.'
|
|
142
142
|
expected_semantic_val = {'description': 'SAME123 does not exist or is private',
|
|
143
143
|
'property': '/sample/0/bioSampleAccession'}
|
|
144
|
+
expected_evidence_type_val = {'AA': {'evidence_type': 'genotype', 'errors': None}}
|
|
144
145
|
expected_metadata_files_json = [
|
|
145
146
|
{'analysisAlias': 'AA', 'fileName': 'input_passed.vcf', 'fileType': 'vcf',
|
|
146
147
|
'md5': '96a80c9368cc3c37095c86fbe6044fb2', 'fileSize': 45050}
|
|
147
148
|
]
|
|
148
149
|
|
|
149
150
|
self.assert_validation_results(self.validator, expected_sample_checker, expected_metadata_files_json,
|
|
150
|
-
expected_metadata_val, expected_semantic_val)
|
|
151
|
+
expected_metadata_val, expected_semantic_val, expected_evidence_type_val)
|
|
151
152
|
|
|
152
153
|
def test_validate_with_xlsx(self):
|
|
153
154
|
self.xlsx_validator.validate()
|
|
@@ -156,13 +157,14 @@ class TestDockerValidator(TestCase):
|
|
|
156
157
|
expected_metadata_val = 'Validation passed successfully.'
|
|
157
158
|
expected_semantic_val = {'description': 'SAME123 does not exist or is private',
|
|
158
159
|
'property': '/sample/0/bioSampleAccession'}
|
|
160
|
+
expected_evidence_type_val = {'AA': {'evidence_type': 'genotype', 'errors': None}}
|
|
159
161
|
expected_metadata_files_json = [
|
|
160
162
|
{'analysisAlias': 'AA', 'fileName': 'input_passed.vcf',
|
|
161
163
|
'md5': '96a80c9368cc3c37095c86fbe6044fb2', 'fileSize': 45050}
|
|
162
164
|
]
|
|
163
165
|
|
|
164
166
|
self.assert_validation_results(self.xlsx_validator, expected_sample_checker, expected_metadata_files_json,
|
|
165
|
-
expected_metadata_val, expected_semantic_val)
|
|
167
|
+
expected_metadata_val, expected_semantic_val, expected_evidence_type_val)
|
|
166
168
|
|
|
167
169
|
def get_submission_json_metadata(self):
|
|
168
170
|
return {
|
|
@@ -230,7 +232,7 @@ class TestDockerValidator(TestCase):
|
|
|
230
232
|
return docker_cmd
|
|
231
233
|
|
|
232
234
|
def assert_validation_results(self, validator, expected_sample_checker, expected_metadata_files_json,
|
|
233
|
-
expected_metadata_val, expected_semantic_val):
|
|
235
|
+
expected_metadata_val, expected_semantic_val, expected_evidence_type_val):
|
|
234
236
|
vcf_format_dir = os.path.join(validator.output_dir, 'vcf_format')
|
|
235
237
|
self.assertTrue(os.path.exists(vcf_format_dir))
|
|
236
238
|
|
|
@@ -260,7 +262,10 @@ class TestDockerValidator(TestCase):
|
|
|
260
262
|
self.assertEqual('[info] Percentage of matches: 100%\n', assembly_check_logs[5])
|
|
261
263
|
|
|
262
264
|
# Assert Samples concordance
|
|
263
|
-
self.
|
|
265
|
+
self.assert_yaml_file(validator._sample_check_yaml, expected_sample_checker)
|
|
266
|
+
|
|
267
|
+
# assert evidence type check
|
|
268
|
+
self.assert_yaml_file(validator._evidence_type_check_yaml, expected_evidence_type_val)
|
|
264
269
|
|
|
265
270
|
with open(validator.metadata_json_post_validation) as open_file:
|
|
266
271
|
json_data = json.load(open_file)
|
|
@@ -278,10 +283,10 @@ class TestDockerValidator(TestCase):
|
|
|
278
283
|
semantic_output = yaml.safe_load(open_yaml)
|
|
279
284
|
assert semantic_output[0] == expected_semantic_val
|
|
280
285
|
|
|
281
|
-
def
|
|
282
|
-
self.assertTrue(os.path.isfile(
|
|
283
|
-
with open(
|
|
284
|
-
self.assert_same_dict_and_unordered_list(yaml.safe_load(open_yaml),
|
|
286
|
+
def assert_yaml_file(self, yaml_file, expected_data):
|
|
287
|
+
self.assertTrue(os.path.isfile(yaml_file))
|
|
288
|
+
with open(yaml_file) as open_yaml:
|
|
289
|
+
self.assert_same_dict_and_unordered_list(yaml.safe_load(open_yaml), expected_data)
|
|
285
290
|
|
|
286
291
|
def assert_same_dict_and_unordered_list(self, o1, o2):
|
|
287
292
|
if isinstance(o1, dict) and isinstance(o2, dict):
|
|
@@ -158,7 +158,7 @@ class TestDockerValidator(TestCase):
|
|
|
158
158
|
{'analysisAlias': 'AA', 'fileName': 'input_passed.vcf', 'fileType': 'vcf',
|
|
159
159
|
'md5': '96a80c9368cc3c37095c86fbe6044fb2', 'fileSize': 45050}
|
|
160
160
|
]
|
|
161
|
-
expected_metadata_val = 'must match pattern "^PRJ(
|
|
161
|
+
expected_metadata_val = 'must match pattern "^PRJ(E|D|N)[A-Z][0-9]+$"'
|
|
162
162
|
expected_semantic_val = {'description': 'SAME123 does not exist or is private',
|
|
163
163
|
'property': '/sample/0/bioSampleAccession'}
|
|
164
164
|
|
|
@@ -21,7 +21,12 @@ class TestEvidenceTypeChecker(TestCase):
|
|
|
21
21
|
metadata_json = os.path.join(working_dir, 'metadata.json')
|
|
22
22
|
# Change to working_dir so filenames in metadata.json are resolvable
|
|
23
23
|
os.chdir(working_dir)
|
|
24
|
-
|
|
24
|
+
vcf_files = [
|
|
25
|
+
os.path.join(working_dir, file_name)
|
|
26
|
+
for file_name in ['example1.vcf.gz', 'example2.vcf', 'example3.vcf']
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
self.run_and_assert_evidence_type_check(metadata_json, vcf_files)
|
|
25
30
|
|
|
26
31
|
def test_evidence_check_absolute_paths(self):
|
|
27
32
|
working_dir = os.path.join(self.resource_dir, 'sample_checker')
|
|
@@ -39,18 +44,17 @@ class TestEvidenceTypeChecker(TestCase):
|
|
|
39
44
|
updated_metadata = os.path.join(working_dir, 'updated_metadata.json')
|
|
40
45
|
metadata.write(updated_metadata)
|
|
41
46
|
|
|
42
|
-
self.run_and_assert_evidence_type_check(updated_metadata)
|
|
47
|
+
self.run_and_assert_evidence_type_check(updated_metadata, vcf_files)
|
|
43
48
|
|
|
44
49
|
if os.path.exists(updated_metadata):
|
|
45
50
|
os.remove(updated_metadata)
|
|
46
51
|
|
|
47
|
-
def run_and_assert_evidence_type_check(self, metadata_json):
|
|
48
|
-
check_evidence_type(metadata_json, self.output_yaml)
|
|
49
|
-
failing_vcf = os.path.join(self.resource_dir,'sample_checker','example1.vcf.gz.tbi')
|
|
52
|
+
def run_and_assert_evidence_type_check(self, metadata_json, vcf_files):
|
|
53
|
+
check_evidence_type(metadata_json, vcf_files, self.output_yaml)
|
|
50
54
|
expected_results = {
|
|
51
55
|
'VD1': {
|
|
52
|
-
'
|
|
53
|
-
'
|
|
56
|
+
'evidence_type': 'genotype',
|
|
57
|
+
'errors': None
|
|
54
58
|
},
|
|
55
59
|
'VD2': {
|
|
56
60
|
'evidence_type': 'genotype',
|
|
@@ -79,8 +79,10 @@ class TestSubmit(unittest.TestCase):
|
|
|
79
79
|
assert is_submission_dir_writable(self.test_sub_dir)
|
|
80
80
|
assert not os.path.exists(self.config_file)
|
|
81
81
|
sub_config = WritableConfig(self.config_file, version='version1.0')
|
|
82
|
+
sub_config.set('metadata_json', value=os.path.join(self.resource_dir, 'EVA_Submission_test.json'))
|
|
82
83
|
sub_config.set(READY_FOR_SUBMISSION_TO_EVA, value=True)
|
|
83
84
|
sub_config.write()
|
|
85
|
+
self.submitter = StudySubmitter(submission_dir=self.test_sub_dir, submission_config=sub_config)
|
|
84
86
|
|
|
85
87
|
test_submission_ws_client = SubmissionWSClient()
|
|
86
88
|
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/exceptions/invalid_file_type_exception.py
RENAMED
|
File without changes
|
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/exceptions/submission_not_found_exception.py
RENAMED
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/exceptions/submission_status_exception.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/executables/check_metadata_semantics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/file_validation.html
RENAMED
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/metadata_validation.html
RENAMED
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/project_details.html
RENAMED
|
File without changes
|
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/sample_name_check.html
RENAMED
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/html/shallow_validation.html
RENAMED
|
File without changes
|
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/file_validation.txt
RENAMED
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/metadata_validation.txt
RENAMED
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/project_details.txt
RENAMED
|
File without changes
|
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/sample_name_check.txt
RENAMED
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/jinja_templates/text/shallow_validation.txt
RENAMED
|
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
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/eva_sub_cli/validators/validation_results_parsers.py
RENAMED
|
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
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/EVA_Submission_test_version_missing.xlsx
RENAMED
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/EVA_Submission_test_with_asm_report.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{eva_sub_cli-0.4.11 → eva_sub_cli-0.4.12}/tests/resources/fasta_files/Saccharomyces_cerevisiae_I.fa
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|