eva-sub-cli 0.6.6__tar.gz → 0.7.0__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 (178) hide show
  1. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/.github/workflows/trigger-eva-sub-cli-integration-tests.yml +1 -1
  2. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/PKG-INFO +1 -1
  3. eva_sub_cli-0.7.0/docs/common_metadata_errors.md +116 -0
  4. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/docs/how_to_submit.md +0 -1
  5. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/docs/input_file_overview.md +11 -0
  6. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/_version.py +3 -3
  7. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/auth.py +5 -1
  8. eva_sub_cli-0.7.0/eva_sub_cli/etc/EVA_Submission_Example.xlsx +0 -0
  9. eva_sub_cli-0.7.0/eva_sub_cli/etc/EVA_Submission_template.xlsx +0 -0
  10. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/etc/eva_schema.json +114 -88
  11. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/etc/spreadsheet2json_conf.yaml +9 -0
  12. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/exceptions.py +36 -0
  13. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/executables/cli.py +47 -27
  14. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/executables/xlsx2json.py +30 -5
  15. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/file_utils.py +3 -5
  16. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/metadata.py +3 -1
  17. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/orchestrator.py +16 -10
  18. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/semantic_metadata.py +34 -5
  19. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/submit.py +3 -2
  20. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/validators/docker_validator.py +13 -10
  21. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/validators/native_validator.py +3 -1
  22. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/validators/validator.py +28 -7
  23. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli.egg-info/PKG-INFO +1 -1
  24. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli.egg-info/SOURCES.txt +3 -0
  25. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli.egg-info/scm_file_list.json +3 -0
  26. eva_sub_cli-0.7.0/eva_sub_cli.egg-info/scm_version.json +8 -0
  27. eva_sub_cli-0.7.0/tests/resources/EVA_Submission_Docker_Test.xlsx +0 -0
  28. eva_sub_cli-0.7.0/tests/resources/EVA_Submission_test.xlsx +0 -0
  29. eva_sub_cli-0.7.0/tests/resources/EVA_Submission_test_fails.xlsx +0 -0
  30. eva_sub_cli-0.7.0/tests/resources/EVA_Submission_test_version_missing.xlsx +0 -0
  31. eva_sub_cli-0.7.0/tests/resources/EVA_Submission_test_with_formula.xlsx +0 -0
  32. eva_sub_cli-0.7.0/tests/resources/EVA_Submission_test_with_links.xlsx +0 -0
  33. eva_sub_cli-0.7.0/tests/resources/EVA_Submission_test_with_non_vcf_files.xlsx +0 -0
  34. eva_sub_cli-0.7.0/tests/resources/EVA_Submission_test_with_project_accession.xlsx +0 -0
  35. eva_sub_cli-0.7.0/tests/resources/EVA_Submission_test_without_data_acknowledgement_sheet.xlsx +0 -0
  36. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_cli.py +9 -9
  37. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_metadata.py +2 -1
  38. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_orchestrator.py +3 -3
  39. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_semantic_metadata.py +97 -13
  40. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_validator.py +32 -0
  41. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_xlsx2json.py +105 -7
  42. eva_sub_cli-0.6.6/eva_sub_cli/etc/EVA_Submission_Example.xlsx +0 -0
  43. eva_sub_cli-0.6.6/eva_sub_cli/etc/EVA_Submission_template.xlsx +0 -0
  44. eva_sub_cli-0.6.6/eva_sub_cli.egg-info/scm_version.json +0 -8
  45. eva_sub_cli-0.6.6/tests/resources/EVA_Submission_Docker_Test.xlsx +0 -0
  46. eva_sub_cli-0.6.6/tests/resources/EVA_Submission_test.xlsx +0 -0
  47. eva_sub_cli-0.6.6/tests/resources/EVA_Submission_test_fails.xlsx +0 -0
  48. eva_sub_cli-0.6.6/tests/resources/EVA_Submission_test_version_missing.xlsx +0 -0
  49. eva_sub_cli-0.6.6/tests/resources/EVA_Submission_test_with_links.xlsx +0 -0
  50. eva_sub_cli-0.6.6/tests/resources/EVA_Submission_test_with_non_vcf_files.xlsx +0 -0
  51. eva_sub_cli-0.6.6/tests/resources/EVA_Submission_test_with_project_accession.xlsx +0 -0
  52. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/.github/workflows/integration-tests.yml +0 -0
  53. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/.github/workflows/publish.yml +0 -0
  54. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/.github/workflows/publish_docs.yml +0 -0
  55. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/.github/workflows/tests.yml +0 -0
  56. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/.gitignore +0 -0
  57. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/LICENSE +0 -0
  58. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/README.md +0 -0
  59. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/conda/build.sh +0 -0
  60. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/conda/meta.yaml +0 -0
  61. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/docker/Dockerfile +0 -0
  62. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/docs/README.md +0 -0
  63. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/docs/_config.yml +0 -0
  64. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/docs/common_vcf_errors.md +0 -0
  65. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/docs/installation.md +0 -0
  66. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/docs/using_nextflow.md +0 -0
  67. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/docs/validation_overview.md +0 -0
  68. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/__init__.py +0 -0
  69. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/call_home.py +0 -0
  70. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/date_utils.py +0 -0
  71. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/etc/call_home_payload_schema.json +0 -0
  72. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/etc/eva-biosamples.json +0 -0
  73. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/etc/eva_logo.png +0 -0
  74. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/etc/spreadsheet2json_conf_V2.yaml +0 -0
  75. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/executables/__init__.py +0 -0
  76. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/executables/check_fasta_insdc.py +0 -0
  77. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/executables/check_metadata_semantics.py +0 -0
  78. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/executables/evidence_type_checker.py +0 -0
  79. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/executables/format_metadata.py +0 -0
  80. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/executables/samples_checker.py +0 -0
  81. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/executables/trim_down.py +0 -0
  82. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/html/fasta_check.html +0 -0
  83. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/html/file_validation.html +0 -0
  84. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/html/metadata_validation.html +0 -0
  85. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/html/project_details.html +0 -0
  86. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/html/report.html +0 -0
  87. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/html/sample_name_check.html +0 -0
  88. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/html/shallow_validation.html +0 -0
  89. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/text/fasta_check.txt +0 -0
  90. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/text/file_validation.txt +0 -0
  91. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/text/metadata_validation.txt +0 -0
  92. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/text/project_details.txt +0 -0
  93. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/text/report.txt +0 -0
  94. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/text/sample_name_check.txt +0 -0
  95. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/jinja_templates/text/shallow_validation.txt +0 -0
  96. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/nextflow/validation.nf +0 -0
  97. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/report.py +0 -0
  98. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/submission_ws.py +0 -0
  99. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/utils.py +0 -0
  100. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/validators/__init__.py +0 -0
  101. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli/validators/validation_results_parsers.py +0 -0
  102. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli.egg-info/dependency_links.txt +0 -0
  103. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli.egg-info/entry_points.txt +0 -0
  104. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli.egg-info/requires.txt +0 -0
  105. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/eva_sub_cli.egg-info/top_level.txt +0 -0
  106. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/pyproject.toml +0 -0
  107. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/pytest.ini +0 -0
  108. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/requirements.txt +0 -0
  109. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/setup.cfg +0 -0
  110. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/setup.py +0 -0
  111. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/build_and_test_docker_locally.py +0 -0
  112. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/ignore_test_nextflow_validation.yml +0 -0
  113. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/EVA_Submission_test.json +0 -0
  114. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/EVA_Submission_test_V2.xlsx +0 -0
  115. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/EVA_Submission_test_with_asm_report.json +0 -0
  116. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/EVA_Submission_test_with_non_vcf_files.json +0 -0
  117. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/EVA_Submission_test_with_project_accession.json +0 -0
  118. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/assembly_check/invalid.vcf.assembly_check.log +0 -0
  119. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/assembly_check/invalid.vcf.text_assembly_report.txt +0 -0
  120. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/assembly_reports/input_passed.txt +0 -0
  121. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/fasta_files/Saccharomyces_cerevisiae_I.fa +0 -0
  122. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/fasta_files/input_passed.fa +0 -0
  123. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/fasta_files/multi_seq.fa +0 -0
  124. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/metadata_with_filename.json +0 -0
  125. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_checker/evidence_type.yaml +0 -0
  126. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_checker/example1.vcf.gz +0 -0
  127. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_checker/example2.vcf +0 -0
  128. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_checker/example3.vcf +0 -0
  129. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_checker/metadata.json +0 -0
  130. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_in_vcf_check/allele_freq.vcf +0 -0
  131. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_in_vcf_check/fake_fasta.fa +0 -0
  132. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_in_vcf_check/genotype.vcf +0 -0
  133. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_in_vcf_check/metadata_af_no_sample_in_vcf.json +0 -0
  134. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_in_vcf_check/metadata_af_with_sample_in_vcf.json +0 -0
  135. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_in_vcf_check/metadata_genotype_no_sample_in_vcf.json +0 -0
  136. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/sample_in_vcf_check/metadata_genotype_with_sample_in_vcf.json +0 -0
  137. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/expected_metadata_json_report.html +0 -0
  138. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/expected_metadata_json_report.txt +0 -0
  139. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/expected_metadata_xlsx_report.html +0 -0
  140. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/expected_metadata_xlsx_report.txt +0 -0
  141. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/expected_report_metadata_json_crashed.html +0 -0
  142. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/expected_report_metadata_json_crashed.txt +0 -0
  143. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/expected_report_metadata_json_process_not_run.html +0 -0
  144. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/expected_report_metadata_json_process_not_run.txt +0 -0
  145. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/expected_shallow_metadata_xlsx_report.html +0 -0
  146. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/expected_shallow_metadata_xlsx_report.txt +0 -0
  147. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/assembly_check/input_passed.vcf.assembly_check.log +0 -0
  148. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/assembly_check/input_passed.vcf.text_assembly_report.1680102476700.txt +0 -0
  149. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/assembly_check/input_passed.vcf.valid_assembly_report.1680102476700.txt +0 -0
  150. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/metadata.json +0 -0
  151. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/other_validations/evidence_type_checker.yml +0 -0
  152. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/other_validations/file_info.txt +0 -0
  153. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/other_validations/input_passed.fa_check.yml +0 -0
  154. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/other_validations/input_passed_trim_down.yml +0 -0
  155. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/other_validations/metadata_conversion_errors.yml +0 -0
  156. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/other_validations/metadata_semantic_check.yml +0 -0
  157. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/other_validations/metadata_validation.txt +0 -0
  158. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/other_validations/sample_checker.yml +0 -0
  159. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/vcf_format/input_passed.vcf.errors.1680102476854.db +0 -0
  160. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/vcf_format/input_passed.vcf.errors.1680102476854.txt +0 -0
  161. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/validation_reports/validation_output/vcf_format/input_passed.vcf.vcf_format.log +0 -0
  162. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/vcf_files/example2.vcf.gz +0 -0
  163. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/vcf_files/example2.vcf.gz.tbi +0 -0
  164. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/resources/vcf_files/input_passed.vcf +0 -0
  165. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_auth.py +0 -0
  166. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_call_home.py +0 -0
  167. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_check_fasta_insdc.py +0 -0
  168. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_docker_validator.py +0 -0
  169. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_evidence_type_checker.py +0 -0
  170. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_file_utils.py +0 -0
  171. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_format_metadata.py +0 -0
  172. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_native_validator_sample_in_vcf.py +0 -0
  173. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_report.py +0 -0
  174. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_samples_checker.py +0 -0
  175. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_submit.py +0 -0
  176. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_trim_down.py +0 -0
  177. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_utils.py +0 -0
  178. {eva_sub_cli-0.6.6 → eva_sub_cli-0.7.0}/tests/test_validaton_results_parsers.py +0 -0
@@ -12,7 +12,7 @@ jobs:
12
12
  runs-on: ubuntu-latest
13
13
  steps:
14
14
  - name: Trigger eva sub cli integration tests
15
- uses: peter-evans/repository-dispatch@v2
15
+ uses: peter-evans/repository-dispatch@v4
16
16
  with:
17
17
  token: ${{ secrets.WORKFLOW_ACCESS_TOKEN }}
18
18
  repository: EBIvariation/eva-integration-tests
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eva_sub_cli
3
- Version: 0.6.6
3
+ Version: 0.7.0
4
4
  Summary: EBI EVA - validation and submission command line tool
5
5
  Classifier: Development Status :: 5 - Production/Stable
6
6
  Classifier: Environment :: Console
@@ -0,0 +1,116 @@
1
+ # **Frequently encountered metadata errors**
2
+
3
+ This section provides a curated overview of some of the common metadata errors. Each error is illustrated with a real validation output example, followed by a brief description of the error and the expected resolution for EVA submissions.
4
+
5
+ ## 1. Missing mandatory metadata
6
+
7
+ **Example Validation Error**
8
+
9
+ | **Sheet** | **Row** | **Column** | **Description** |
10
+ |---|---:|---|---|
11
+ | **Submitter Details** | **2** | **Center** | Column "Center" is not populated |
12
+
13
+ **Description**
14
+
15
+ The Center field is required but has been left empty in the Submitter Details sheet.
16
+
17
+ **Resolution**
18
+
19
+ Populate all mandatory fields indicated in bold. EVA expects these fields to contain a valid value and not be left blank.
20
+
21
+ For the Center field, provide the name of the submitting center/institution.
22
+
23
+ ## 2. Invalid metadata values
24
+
25
+ **Example Validation Error**
26
+
27
+ | Sheet | Row | Column | Description |
28
+ |---|---:|---|---|
29
+ | **Sample** | **3** | **Scientific Name** | Species *Homo sapens* does not match taxonomy 9606 (*Homo sapiens*). |
30
+
31
+ **Description**
32
+
33
+ The Scientific Name does not match the species associated with the submitted Taxonomy ID. In the above example, taxonomy ID 9606 corresponds to Homo sapiens and not Homo sapens.
34
+
35
+ **Resolution**
36
+
37
+ Check that the metadata value is valid and follows the expected format or controlled vocabulary.
38
+
39
+ ## 3. Invalid metadata format
40
+
41
+ **Example Validation Error**
42
+
43
+ | Sheet | Row | Column | Description |
44
+ | --- | --- | --- | --- |
45
+ | **Submitter Details** | **2** | **Email Address** | Must match the `email` format. |
46
+
47
+ **Description**
48
+
49
+ The email address provided in the Submitter Details sheet does not match the expected email address format.
50
+
51
+ **Resolution**
52
+
53
+ Enter a valid email address in the Email Address field, for example, name@example.com.
54
+
55
+ For similar metadata validation errors, check the value against the format or allowed values expected by EVA and correct the metadata accordingly.
56
+
57
+ ## 4. Project or Sample Not Publicly Accessible
58
+
59
+ **Example Validation Error**
60
+
61
+ ```text
62
+ Exception: PRJEBXXXXXX does not exist in ENA or is private
63
+
64
+ SAMNXXXXXXXX does not exist or is private
65
+
66
+ ```
67
+
68
+ **Description**
69
+
70
+ The submitted project or sample accession cannot be found in ENA or is not publicly accessible. This may occur when the accession is incorrect, does not exist, or the corresponding object is still private.
71
+
72
+ **Resolution**
73
+
74
+ EVA cannot add to, validate, or access private objects. Make sure the project or sample has been released publicly before submitting it to EVA for validation.
75
+
76
+ ## 5. BioSamples issued by NCBI : geographic location/collection date issue
77
+
78
+ **Example Validation Error**
79
+
80
+ | Sheet | Row | Column | Description |
81
+ |---|---:|---|---|
82
+ | **Sample** | **4** | **Sample Accession** | Error validating existing sample SAMN47377199: must have required property **'collection date'**. |
83
+ | **Sample** | **4** | **Sample Accession** | Error validating existing sample SAMN47377199: must have required property **'geographic location (country and/or sea)'**. |
84
+
85
+ **Description**
86
+
87
+ This error is due to a difference in reporting geographical location and collection date between NCBI BioSamples and ENA BioSamples. NCBI BioSamples uses property names "geo_loc_name" and "collection_date", whereas ENA uses "geographic location (country and/or sea)" and "collection date". EVA validates BioSamples against ENA's definition, which makes reusing NCBI BioSamples in a submission to EVA difficult to automate at the moment.
88
+
89
+ **Resolution**
90
+
91
+ Once you have validated the rest of the data, contact eva-helpdesk@ebi.ac.uk to submit the data, as this will require manual intervention. Both NCBI and ENA are aware of this issue and we are working towards fixing this.
92
+
93
+ ## 6. Either/Or Fields Completed Incorrectly
94
+
95
+ **Description**
96
+
97
+ Some metadata fields are highlighted in green to indicate an either/or requirement. Only one of the specified options should be completed.
98
+
99
+ For example, in the Project tab, the submitter should complete either the Pre-registered Project section or the New Project section. Both sections should not be completed.
100
+
101
+ **Resolution**
102
+
103
+ When fields are highlighted in green, check the available options and complete only the section that applies to the submission. Leave the other option blank.
104
+
105
+
106
+ ## 7. Publication Field Not Completed Correctly
107
+
108
+ **Description**
109
+
110
+ The Publication(s) field is optional, but when provided, the publication must be and given in the expected DB format. An example valid entry would be: PubMed:23128226
111
+
112
+ **Resolution**
113
+
114
+ If publications related to the project are available, enter them using the required DB format, for example, PubMed:23128226. Multiple publications should be separated by commas. For example: PubMed:23128226, PubMed:223445.
115
+
116
+ If there are no relevant publications, the field can be left blank and can be added later by contacting the EVA helpdesk team.
@@ -71,7 +71,6 @@ This can be useful if you want to avoid re-running long-running validations that
71
71
  Note that all validation tasks must pass in order to submit. The report will aggregate the results of previous runs and new ones.
72
72
  The possible tasks are:
73
73
  * [`vcf_check`](validation_overview.md#vcf-checks) - includes syntax validation and other checks on VCF files
74
- ${CODE_ROOT}/env/bin/upload_to_gcloud.py --input-file evidence.json.gz --destination-folder pharmacogenomics
75
74
  * [`assembly_check`](validation_overview.md#assembly-checks) - includes all checks involving the FASTA file
76
75
  * [`metadata_check`](validation_overview.md#metadata-check) - includes syntactic and semantic checks on metadata
77
76
  * [`sample_check`](validation_overview.md#sample-name-concordance-check) - includes sample coherence checks between VCF files and metadata
@@ -87,6 +87,17 @@ One important column to note is the Hold Date, which is the date until which the
87
87
  release the data automatically after this date. If it is missing, the default value is three days after the date of
88
88
  submission.
89
89
 
90
+ ### Statements
91
+
92
+ This sheet contains statements that the submitter must agree to before submitting data. Please read each
93
+ statement carefully and confirm your agreement before submitting.
94
+
95
+ Additional information about the Access and Benefit-Sharing statement is available in our
96
+ [submission FAQs](https://www.ebi.ac.uk/eva/?Help#submissionPanel&link=confirm-data-shared-openly).
97
+
98
+ NOTE: To use your Webin account, you must also log in to your account and do a one time confirmation of the Access and
99
+ Benefit-Sharing acknowledgement there. [Webin login](https://www.ebi.ac.uk/ena/submit/webin/login) => Manage Account => Tick the box => Save.
100
+
90
101
  ### Analysis
91
102
 
92
103
  For EVA, an analysis is a grouping of samples and data files. This sheet allows us to link VCF files to a project and
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.6.6'
22
- __version_tuple__ = version_tuple = (0, 6, 6)
21
+ __version__ = version = '0.7.0'
22
+ __version_tuple__ = version_tuple = (0, 7, 0)
23
23
 
24
- __commit_id__ = commit_id = 'gdb6448e77'
24
+ __commit_id__ = commit_id = 'g3d76f3cd1'
@@ -8,6 +8,7 @@ from ebi_eva_common_pyutils.logger import AppLogger
8
8
  from urllib3.exceptions import ResponseError
9
9
 
10
10
  from eva_sub_cli import LSRI_CLIENT_ID, ENA_WEBIN_ACCOUNT_VAR, ENA_WEBIN_PASSWORD_VAR
11
+ from eva_sub_cli.exceptions import WebinBadCredentialsException
11
12
 
12
13
  ENA_AUTH_URL = "https://www.ebi.ac.uk/ena/submit/webin/auth/token"
13
14
  LSRI_AUTH_URL = "https://www.ebi.ac.uk/eva/v1/submission/auth/lsri"
@@ -69,8 +70,11 @@ class WebinAuth(AppLogger):
69
70
  if response.status_code == 200:
70
71
  self.info("Webin authentication successful!")
71
72
  return response.text
73
+ elif response.status_code == 401:
74
+ raise WebinBadCredentialsException('Could not authenticate with ENA Webin. Please check your credentials '
75
+ 'and try again.')
72
76
  else:
73
- raise ResponseError('Webin Authentication Error')
77
+ raise ResponseError(f'Could not authenticate with ENA Webin: {response.status_code}, {response.text}')
74
78
 
75
79
  def _get_webin_username_password(self):
76
80
  username = self.cmd_line_username
@@ -63,87 +63,110 @@
63
63
  }
64
64
  }
65
65
  },
66
+ "statements": {
67
+ "type": "array",
68
+ "description": "Submitter acknowledgements of various EVA data statements",
69
+ "items": {
70
+ "type": "object",
71
+ "required": ["acknowledgement", "statement"],
72
+ "additionalProperties": false,
73
+ "properties": {
74
+ "acknowledgement": {
75
+ "type": "boolean",
76
+ "description": "Whether the submitter confirmed this statement"
77
+ },
78
+ "statement": {
79
+ "type": "string",
80
+ "description": "Full text of the statement as presented to the submitter"
81
+ }
82
+ }
83
+ }
84
+ },
66
85
  "project": {
67
- "oneOf": [
68
- {
69
- "type": "object",
70
- "required": [
71
- "projectAccession"
72
- ],
73
- "properties": {
74
- "projectAccession": {
75
- "$ref": "#/definitions/projectAccession"
76
- }
86
+ "type": "object",
87
+ "if": {
88
+ "required": [
89
+ "projectAccession"
90
+ ]
91
+ },
92
+ "then": {
93
+ "properties": {
94
+ "projectAccession": {
95
+ "$ref": "#/definitions/projectAccession"
77
96
  }
78
- },
79
- {
80
- "type": "object",
81
- "description": "General information about the Project",
82
- "required": [
83
- "title",
84
- "description",
85
- "taxId",
86
- "centre"
87
- ],
88
- "properties": {
89
- "title": {
90
- "type": "string",
91
- "description": "Title of the project",
92
- "minLength": 20,
93
- "maxLength": 250
94
- },
95
- "description": {
96
- "type": "string",
97
- "description": "Description of the project",
98
- "minLength": 20,
99
- "maxLength": 4000
100
- },
101
- "centre": {
102
- "type": "string",
103
- "description": "Centre, institute or company submitting the project"
104
- },
105
- "taxId": {
106
- "type": "number",
107
- "description": "Taxonomy ID of the species associated with the project (found here: http://www.ncbi.nlm.nih.gov/taxonomy)"
108
- },
109
- "publications": {
110
- "type": "array",
111
- "items": {
112
- "type": "string",
113
- "pattern": "^[^:,]+?:[^:,]+?$"
114
- }
115
- },
116
- "parentProject": {
117
- "$ref": "#/definitions/projectAccession"
118
- },
119
- "childProjects": {
120
- "type": "array",
121
- "items": {
122
- "$ref": "#/definitions/projectAccession"
123
- }
124
- },
125
- "peerProjects": {
126
- "type": "array",
127
- "items": {
128
- "$ref": "#/definitions/projectAccession"
129
- }
130
- },
131
- "links": {
132
- "type": "array",
133
- "items": {
134
- "type": "string"
135
- }
136
- },
137
- "holdDate": {
97
+ }
98
+ },
99
+ "else": {
100
+ "description": "General information about the Project",
101
+ "required": [
102
+ "title",
103
+ "description",
104
+ "taxId",
105
+ "centre"
106
+ ],
107
+ "properties": {
108
+ "title": {
109
+ "type": "string",
110
+ "description": "Title of the project",
111
+ "minLength": 20,
112
+ "maxLength": 250
113
+ },
114
+ "description": {
115
+ "type": "string",
116
+ "description": "Description of the project",
117
+ "minLength": 20,
118
+ "maxLength": 4000
119
+ },
120
+ "centre": {
121
+ "type": "string",
122
+ "description": "Centre, institute or company submitting the project"
123
+ },
124
+ "taxId": {
125
+ "type": "number",
126
+ "description": "Taxonomy ID of the species associated with the project (found here: http://www.ncbi.nlm.nih.gov/taxonomy)"
127
+ },
128
+ "publications": {
129
+ "type": "array",
130
+ "description": "Publications associated with the project, each given as <database>:<identifier>",
131
+ "items": {
138
132
  "type": "string",
139
- "format": "date",
133
+ "pattern": "^[^:,]+?:[^:,]+?$",
140
134
  "examples": [
141
- "2018-11-13"
135
+ "DOI:10.1093/nar/gkw1121",
136
+ "PMID:24565421"
142
137
  ]
143
138
  }
139
+ },
140
+ "parentProject": {
141
+ "$ref": "#/definitions/projectAccession"
142
+ },
143
+ "childProjects": {
144
+ "type": "array",
145
+ "items": {
146
+ "$ref": "#/definitions/projectAccession"
147
+ }
148
+ },
149
+ "peerProjects": {
150
+ "type": "array",
151
+ "items": {
152
+ "$ref": "#/definitions/projectAccession"
153
+ }
154
+ },
155
+ "links": {
156
+ "type": "array",
157
+ "items": {
158
+ "type": "string"
159
+ }
160
+ },
161
+ "holdDate": {
162
+ "type": "string",
163
+ "format": "date",
164
+ "examples": [
165
+ "2018-11-13"
166
+ ]
144
167
  }
145
168
  }
146
- ]
169
+ }
147
170
  },
148
171
  "analysis": {
149
172
  "type": "array",
@@ -309,21 +332,24 @@
309
332
  "minItems": 1,
310
333
  "items": {
311
334
  "type": "object",
312
- "oneOf": [
313
- {
314
- "required": [
315
- "analysisAlias",
316
- "sampleInVCF",
317
- "bioSampleAccession"
318
- ]
319
- },
320
- {
321
- "required": [
322
- "analysisAlias",
323
- "bioSampleObject"
324
- ]
325
- }
326
- ],
335
+ "if": {
336
+ "required": [
337
+ "bioSampleAccession"
338
+ ]
339
+ },
340
+ "then": {
341
+ "required": [
342
+ "analysisAlias",
343
+ "sampleInVCF",
344
+ "bioSampleAccession"
345
+ ]
346
+ },
347
+ "else": {
348
+ "required": [
349
+ "analysisAlias",
350
+ "bioSampleObject"
351
+ ]
352
+ },
327
353
  "properties": {
328
354
  "analysisAlias": {
329
355
  "type": "array",
@@ -11,6 +11,7 @@
11
11
  # List of worksheets to be parsed.
12
12
  worksheets:
13
13
  Submitter Details: submitterDetails
14
+ Statements: statements
14
15
  Project: project
15
16
  Analysis: analysis
16
17
  Sample: sample
@@ -26,6 +27,14 @@ Submitter Details:
26
27
  optional:
27
28
  Address: address
28
29
 
30
+ Statements:
31
+ header_row: 2
32
+ required:
33
+ Acknowledgement: acknowledgement
34
+ Statement: statement
35
+ cast:
36
+ Acknowledgement: boolean
37
+
29
38
  # List of field for Projects
30
39
  Project:
31
40
  header_row: 3
@@ -38,3 +38,39 @@ class SubmissionUploadException(Exception):
38
38
  def __init__(self, message):
39
39
  self.message = message
40
40
  super().__init__(self.message)
41
+
42
+
43
+ class DirLockError(Exception):
44
+ def __init__(self, message):
45
+ self.message = message
46
+ super().__init__(self.message)
47
+
48
+
49
+ class UserFileNotFoundException(Exception):
50
+ def __init__(self, message):
51
+ self.message = message
52
+ super().__init__(self.message)
53
+
54
+
55
+ class DependencyNotFoundException(Exception):
56
+ def __init__(self, message):
57
+ self.message = message
58
+ super().__init__(self.message)
59
+
60
+
61
+ class WebinBadCredentialsException(Exception):
62
+ def __init__(self, message):
63
+ self.message = message
64
+ super().__init__(self.message)
65
+
66
+
67
+ class InvalidSubmissionException(Exception):
68
+ def __init__(self, message):
69
+ self.message = message
70
+ super().__init__(self.message)
71
+
72
+
73
+ class DockerValidatorException(Exception):
74
+ def __init__(self, message):
75
+ self.message = message
76
+ super().__init__(self.message)
@@ -15,7 +15,9 @@ import eva_sub_cli
15
15
  from eva_sub_cli import ENA_WEBIN_ACCOUNT_VAR, ENA_WEBIN_PASSWORD_VAR
16
16
  from eva_sub_cli import orchestrator
17
17
  from eva_sub_cli.exceptions import MetadataTemplateVersionException, MetadataTemplateVersionNotFoundException, \
18
- SubmissionStatusException, SubmissionNotFoundException, SubmissionUploadException, NoVcfsFoundException
18
+ SubmissionStatusException, SubmissionNotFoundException, SubmissionUploadException, NoVcfsFoundException, \
19
+ UserFileNotFoundException, DependencyNotFoundException, WebinBadCredentialsException, InvalidFileTypeError, \
20
+ InvalidSubmissionException, DockerValidatorException
19
21
  from eva_sub_cli.call_home import CallHomeClient
20
22
  from eva_sub_cli.file_utils import is_submission_dir_writable, DirLockError, DirLock
21
23
  from eva_sub_cli.orchestrator import VALIDATE, SUBMIT, DOCKER, NATIVE
@@ -126,51 +128,69 @@ def main():
126
128
  logging_config.add_file_handler(os.path.join(args.submission_dir, 'eva_submission.log'), logging.DEBUG)
127
129
  # Pass on all the arguments to the orchestrator
128
130
  orchestrator.orchestrate_process(call_home=call_home, **args.__dict__)
131
+
132
+ # User errors: not displayed as exceptions, call-home records as failure with no exception
129
133
  except DirLockError as dle:
130
- logger.exception(f'Could not acquire the lock file for {args.submission_dir} because another process is using '
131
- f'this directory or a previous process did not terminate correctly. '
132
- f'If the problem persists, remove the lock file manually.')
133
- caught_exception = dle
134
- exit_status = 65
134
+ print(f'Could not acquire the lock file for {args.submission_dir} because another process is using this '
135
+ f'directory or a previous process did not terminate correctly. If the problem persists, remove the lock '
136
+ f'file manually.')
137
+ exit_status = 101
138
+ except NoVcfsFoundException as nvfe:
139
+ print(nvfe.message)
140
+ exit_status = 102
141
+ except MetadataTemplateVersionException as mte:
142
+ print(mte.message)
143
+ exit_status = 103
144
+ except MetadataTemplateVersionNotFoundException as mte:
145
+ print(mte.message)
146
+ exit_status = 104
147
+ except UserFileNotFoundException as ufne:
148
+ print(ufne.message)
149
+ exit_status = 105
150
+ except InvalidFileTypeError as ife:
151
+ print(ife.message)
152
+ exit_status = 106
153
+ except DependencyNotFoundException as dnfe:
154
+ print(dnfe.message)
155
+ exit_status = 107
156
+ except WebinBadCredentialsException as wae:
157
+ print(wae.message)
158
+ exit_status = 108
159
+ except InvalidSubmissionException as ise:
160
+ print(ise.message)
161
+ exit_status = 109
162
+
163
+ # Process errors: displayed as exceptions and sent to call-home
135
164
  except FileNotFoundError as fne:
136
165
  logger.exception(fne)
137
166
  caught_exception = fne
138
- exit_status = 66
139
- except NoVcfsFoundException as nvfe:
140
- logger.exception(f'{nvfe}. Please ensure that you have listed VCF files in the metadata (.vcf or .vcf.gz file '
141
- f'extension), and that you have not modified the metadata template in any way.')
142
- caught_exception = nvfe
143
- exit_status = 67
167
+ exit_status = 201
144
168
  except SubmissionNotFoundException as snfe:
145
- logger.exception(f'{snfe}. Please contact EVA Helpdesk')
169
+ logger.exception(snfe)
146
170
  caught_exception = snfe
147
- exit_status = 68
171
+ exit_status = 202
148
172
  except SubmissionStatusException as sse:
149
- logger.exception(f'{sse}. Please try again later. If the problem persists, please contact EVA Helpdesk')
173
+ logger.exception(sse)
150
174
  caught_exception = sse
151
- exit_status = 69
152
- except MetadataTemplateVersionException as mte:
153
- logger.exception(mte)
154
- caught_exception = mte
155
- exit_status = 70
156
- except MetadataTemplateVersionNotFoundException as mte:
157
- logger.exception(mte)
158
- caught_exception = mte
159
- exit_status = 71
175
+ exit_status = 203
160
176
  except SubmissionUploadException as sue:
161
177
  logger.exception(sue)
162
178
  caught_exception = sue
163
- exit_status = 72
179
+ exit_status = 204
164
180
  except HTTPError as http_err:
165
181
  logger.exception(http_err)
166
182
  if http_err.response is not None and http_err.response.text:
167
183
  print(http_err.response.text)
168
184
  caught_exception = http_err
169
- exit_status = 73
185
+ exit_status = 205
186
+ except DockerValidatorException as dve:
187
+ logger.exception(dve)
188
+ caught_exception = dve
189
+ exit_status = 206
170
190
  except Exception as ex:
171
191
  logger.exception(ex)
172
192
  caught_exception = ex
173
- exit_status = 74
193
+ exit_status = 299
174
194
 
175
195
  if call_home is not None:
176
196
  if exit_status == 0: