nf-core 3.3.0__tar.gz → 3.3.2__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 (322) hide show
  1. {nf_core-3.3.0/nf_core.egg-info → nf_core-3.3.2}/PKG-INFO +4 -4
  2. {nf_core-3.3.0 → nf_core-3.3.2}/README.md +1 -1
  3. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/commands_test_datasets.py +2 -1
  4. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/components_command.py +7 -7
  5. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/components_differ.py +4 -4
  6. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/components_test.py +2 -2
  7. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/components_utils.py +9 -9
  8. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/create.py +191 -5
  9. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/info.py +20 -11
  10. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/install.py +3 -3
  11. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/lint/__init__.py +6 -6
  12. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/list.py +5 -5
  13. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/nfcore_component.py +19 -12
  14. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/module-template/main.nf +4 -0
  15. nf_core-3.3.2/nf_core/module-template/meta.yml +60 -0
  16. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/bump_versions.py +7 -7
  17. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/lint/__init__.py +96 -80
  18. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/lint/main_nf.py +4 -5
  19. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/lint/meta_yml.py +38 -46
  20. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/modules_json.py +18 -18
  21. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/modules_utils.py +4 -4
  22. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/actions/nf-test/action.yml +0 -4
  23. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/linting.yml +1 -1
  24. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/linting_comment.yml +1 -1
  25. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/nf-test.yml +30 -29
  26. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/release-announcements.yml +1 -1
  27. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.pre-commit-config.yaml +1 -1
  28. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/README.md +2 -2
  29. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/assets/schema_input.json +2 -2
  30. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/conf/base.config +1 -0
  31. nf_core-3.3.2/nf_core/pipeline-template/modules/nf-core/fastqc/environment.yml +7 -0
  32. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/modules/nf-core/fastqc/main.nf +1 -1
  33. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/modules/nf-core/fastqc/meta.yml +14 -9
  34. nf_core-3.3.2/nf_core/pipeline-template/modules/nf-core/multiqc/environment.yml +7 -0
  35. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/modules/nf-core/multiqc/main.nf +2 -2
  36. nf_core-3.3.2/nf_core/pipeline-template/modules/nf-core/multiqc/meta.yml +92 -0
  37. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/modules/nf-core/multiqc/tests/main.nf.test.snap +9 -9
  38. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/modules.json +2 -2
  39. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/nextflow.config +2 -3
  40. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/nf-test.config +1 -1
  41. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +1 -1
  42. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/tests/.nftignore +1 -0
  43. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/tests/default.nf.test +1 -1
  44. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/tests/nextflow.config +4 -2
  45. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/bump_version.py +5 -5
  46. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/__init__.py +1 -1
  47. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/create.py +40 -24
  48. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/create.tcss +4 -4
  49. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/custompipeline.py +22 -7
  50. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/nfcorepipeline.py +21 -5
  51. nf_core-3.3.2/nf_core/pipelines/create/template_features.yml +583 -0
  52. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/utils.py +11 -9
  53. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create_logo.py +8 -2
  54. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/download.py +17 -15
  55. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/__init__.py +3 -3
  56. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/actions_awsfulltest.py +1 -2
  57. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/actions_schema_validation.py +6 -6
  58. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/configs.py +8 -9
  59. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/files_exist.py +2 -2
  60. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/files_unchanged.py +9 -8
  61. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/modules_json.py +2 -2
  62. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/multiqc_config.py +4 -5
  63. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/nextflow_config.py +2 -2
  64. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/nf_test_content.py +47 -41
  65. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/nfcore_yml.py +5 -6
  66. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/plugin_includes.py +5 -6
  67. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/readme.py +1 -1
  68. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/rocrate_readme_sync.py +1 -1
  69. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/version_consistency.py +13 -3
  70. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint_utils.py +8 -8
  71. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/params_file.py +2 -2
  72. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/rocrate.py +2 -2
  73. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/sync.py +5 -4
  74. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/lint/main_nf.py +6 -7
  75. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/synced_repo.py +5 -4
  76. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/test_datasets/list.py +1 -2
  77. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/test_datasets/search.py +8 -23
  78. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/test_datasets/test_datasets_utils.py +51 -10
  79. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/utils.py +50 -40
  80. {nf_core-3.3.0 → nf_core-3.3.2/nf_core.egg-info}/PKG-INFO +4 -4
  81. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core.egg-info/SOURCES.txt +2 -0
  82. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core.egg-info/requires.txt +1 -1
  83. {nf_core-3.3.0 → nf_core-3.3.2}/pyproject.toml +3 -1
  84. {nf_core-3.3.0 → nf_core-3.3.2}/requirements.txt +1 -1
  85. {nf_core-3.3.0 → nf_core-3.3.2}/setup.py +2 -2
  86. nf_core-3.3.2/tests/conftest.py +53 -0
  87. nf_core-3.3.2/tests/modules/test_create.py +649 -0
  88. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/test_lint.py +2 -2
  89. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_rocrate_readme_sync.py +1 -1
  90. nf_core-3.3.2/tests/pipelines/lint/test_version_consistency.py +82 -0
  91. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_create.py +7 -4
  92. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_create_app.py +5 -6
  93. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_download.py +18 -11
  94. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_sync.py +9 -8
  95. {nf_core-3.3.0 → nf_core-3.3.2}/tests/test_cli.py +1 -1
  96. nf_core-3.3.2/tests/test_datasets/test_test_datasets_search.py +92 -0
  97. {nf_core-3.3.0 → nf_core-3.3.2}/tests/utils.py +2 -2
  98. nf_core-3.3.0/nf_core/module-template/meta.yml +0 -131
  99. nf_core-3.3.0/nf_core/pipeline-template/modules/nf-core/fastqc/environment.yml +0 -5
  100. nf_core-3.3.0/nf_core/pipeline-template/modules/nf-core/multiqc/environment.yml +0 -5
  101. nf_core-3.3.0/nf_core/pipeline-template/modules/nf-core/multiqc/meta.yml +0 -78
  102. nf_core-3.3.0/nf_core/pipelines/create/template_features.yml +0 -499
  103. nf_core-3.3.0/tests/modules/test_create.py +0 -164
  104. nf_core-3.3.0/tests/pipelines/lint/test_version_consistency.py +0 -19
  105. {nf_core-3.3.0 → nf_core-3.3.2}/LICENSE +0 -0
  106. {nf_core-3.3.0 → nf_core-3.3.2}/MANIFEST.in +0 -0
  107. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/.pre-commit-prettier-config.yaml +0 -0
  108. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/__init__.py +0 -0
  109. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/__main__.py +0 -0
  110. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/assets/logo/MavenPro-Bold.ttf +0 -0
  111. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/assets/logo/nf-core-repo-logo-base-darkbg.png +0 -0
  112. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/assets/logo/nf-core-repo-logo-base-lightbg.png +0 -0
  113. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/assets/logo/placeholder_logo.svg +0 -0
  114. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/commands_modules.py +0 -0
  115. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/commands_pipelines.py +0 -0
  116. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/commands_subworkflows.py +0 -0
  117. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/__init__.py +0 -0
  118. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/constants.py +0 -0
  119. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/patch.py +0 -0
  120. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/remove.py +0 -0
  121. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/components/update.py +0 -0
  122. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/module-template/environment.yml +0 -0
  123. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/module-template/tests/main.nf.test.j2 +0 -0
  124. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/__init__.py +0 -0
  125. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/create.py +0 -0
  126. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/info.py +0 -0
  127. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/install.py +0 -0
  128. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/lint/environment_yml.py +0 -0
  129. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/lint/module_changes.py +0 -0
  130. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/lint/module_deprecations.py +0 -0
  131. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/lint/module_patch.py +0 -0
  132. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/lint/module_tests.py +0 -0
  133. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/lint/module_todos.py +0 -0
  134. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/lint/module_version.py +0 -0
  135. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/list.py +0 -0
  136. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/modules_repo.py +0 -0
  137. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/patch.py +0 -0
  138. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/remove.py +0 -0
  139. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/modules/update.py +0 -0
  140. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.devcontainer/devcontainer.json +0 -0
  141. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.gitattributes +0 -0
  142. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/.dockstore.yml +0 -0
  143. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/CONTRIBUTING.md +0 -0
  144. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  145. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/ISSUE_TEMPLATE/config.yml +0 -0
  146. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  147. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  148. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/actions/get-shards/action.yml +0 -0
  149. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/awsfulltest.yml +0 -0
  150. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/awstest.yml +0 -0
  151. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/branch.yml +0 -0
  152. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/clean-up.yml +0 -0
  153. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/download_pipeline.yml +0 -0
  154. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/fix_linting.yml +0 -0
  155. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.github/workflows/template-version-comment.yml +0 -0
  156. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.gitignore +0 -0
  157. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.gitpod.yml +0 -0
  158. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.nf-core.yml +0 -0
  159. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.prettierignore +0 -0
  160. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.prettierrc.yml +0 -0
  161. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/.vscode/settings.json +0 -0
  162. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/CHANGELOG.md +0 -0
  163. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/CITATIONS.md +0 -0
  164. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/CODE_OF_CONDUCT.md +0 -0
  165. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/LICENSE +0 -0
  166. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/assets/adaptivecard.json +0 -0
  167. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/assets/email_template.html +0 -0
  168. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/assets/email_template.txt +0 -0
  169. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/assets/methods_description_template.yml +0 -0
  170. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/assets/multiqc_config.yml +0 -0
  171. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/assets/samplesheet.csv +0 -0
  172. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/assets/sendmail_template.txt +0 -0
  173. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/assets/slackreport.json +0 -0
  174. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/conf/igenomes.config +0 -0
  175. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/conf/igenomes_ignored.config +0 -0
  176. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/conf/modules.config +0 -0
  177. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/conf/test.config +0 -0
  178. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/conf/test_full.config +0 -0
  179. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/docs/README.md +0 -0
  180. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/docs/output.md +0 -0
  181. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/docs/usage.md +0 -0
  182. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/main.nf +0 -0
  183. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/modules/nf-core/fastqc/tests/main.nf.test +0 -0
  184. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/modules/nf-core/fastqc/tests/main.nf.test.snap +0 -0
  185. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/modules/nf-core/multiqc/tests/main.nf.test +0 -0
  186. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/modules/nf-core/multiqc/tests/nextflow.config +0 -0
  187. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/modules/nf-core/multiqc/tests/tags.yml +0 -0
  188. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/nextflow_schema.json +0 -0
  189. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/local/utils_nfcore_pipeline_pipeline/main.nf +0 -0
  190. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/main.nf +0 -0
  191. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml +0 -0
  192. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test +0 -0
  193. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap +0 -0
  194. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test +0 -0
  195. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config +0 -0
  196. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +0 -0
  197. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +0 -0
  198. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml +0 -0
  199. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test +0 -0
  200. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap +0 -0
  201. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test +0 -0
  202. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap +0 -0
  203. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config +0 -0
  204. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +0 -0
  205. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfschema_plugin/main.nf +0 -0
  206. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfschema_plugin/meta.yml +0 -0
  207. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +0 -0
  208. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json +0 -0
  209. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/tower.yml +0 -0
  210. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipeline-template/workflows/pipeline.nf +0 -0
  211. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/__init__.py +0 -0
  212. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/basicdetails.py +0 -0
  213. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/finaldetails.py +0 -0
  214. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/githubexit.py +0 -0
  215. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/githubrepo.py +0 -0
  216. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/githubrepoquestion.py +0 -0
  217. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/loggingscreen.py +0 -0
  218. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/pipelinetype.py +0 -0
  219. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/create/welcome.py +0 -0
  220. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/launch.py +0 -0
  221. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/actions_awstest.py +0 -0
  222. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/actions_nf_test.py +0 -0
  223. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/included_configs.py +0 -0
  224. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/local_component_structure.py +0 -0
  225. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/merge_markers.py +0 -0
  226. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/modules_structure.py +0 -0
  227. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/pipeline_if_empty_null.py +0 -0
  228. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/pipeline_name_conventions.py +0 -0
  229. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/pipeline_todos.py +0 -0
  230. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/schema_description.py +0 -0
  231. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/schema_lint.py +0 -0
  232. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/schema_params.py +0 -0
  233. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/system_exit.py +0 -0
  234. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/lint/template_strings.py +0 -0
  235. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/list.py +0 -0
  236. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/refgenie.py +0 -0
  237. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/pipelines/schema.py +0 -0
  238. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflow-template/main.nf +0 -0
  239. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflow-template/meta.yml +0 -0
  240. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflow-template/tests/main.nf.test.j2 +0 -0
  241. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/__init__.py +0 -0
  242. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/create.py +0 -0
  243. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/info.py +0 -0
  244. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/install.py +0 -0
  245. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/lint/__init__.py +0 -0
  246. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/lint/meta_yml.py +0 -0
  247. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/lint/subworkflow_changes.py +0 -0
  248. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/lint/subworkflow_if_empty_null.py +0 -0
  249. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/lint/subworkflow_tests.py +0 -0
  250. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/lint/subworkflow_todos.py +0 -0
  251. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/lint/subworkflow_version.py +0 -0
  252. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/list.py +0 -0
  253. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/patch.py +0 -0
  254. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/remove.py +0 -0
  255. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/subworkflows/update.py +0 -0
  256. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core/test_datasets/__init__.py +0 -0
  257. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core.egg-info/dependency_links.txt +0 -0
  258. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core.egg-info/entry_points.txt +0 -0
  259. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core.egg-info/not-zip-safe +0 -0
  260. {nf_core-3.3.0 → nf_core-3.3.2}/nf_core.egg-info/top_level.txt +0 -0
  261. {nf_core-3.3.0 → nf_core-3.3.2}/setup.cfg +0 -0
  262. {nf_core-3.3.0 → nf_core-3.3.2}/tests/__init__.py +0 -0
  263. {nf_core-3.3.0 → nf_core-3.3.2}/tests/components/__init__.py +0 -0
  264. {nf_core-3.3.0 → nf_core-3.3.2}/tests/components/test_components_generate_snapshot.py +0 -0
  265. {nf_core-3.3.0 → nf_core-3.3.2}/tests/components/test_components_snapshot_test.py +0 -0
  266. {nf_core-3.3.0 → nf_core-3.3.2}/tests/components/test_components_utils.py +0 -0
  267. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/__init__.py +0 -0
  268. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/test_bump_versions.py +0 -0
  269. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/test_info.py +0 -0
  270. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/test_install.py +0 -0
  271. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/test_list.py +0 -0
  272. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/test_modules_json.py +0 -0
  273. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/test_modules_utils.py +0 -0
  274. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/test_patch.py +0 -0
  275. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/test_remove.py +0 -0
  276. {nf_core-3.3.0 → nf_core-3.3.2}/tests/modules/test_update.py +0 -0
  277. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/__init__.py +0 -0
  278. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/__init__.py +0 -0
  279. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_actions_awsfulltest.py +0 -0
  280. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_actions_awstest.py +0 -0
  281. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_actions_nf_test.py +0 -0
  282. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_actions_schema_validation.py +0 -0
  283. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_configs.py +0 -0
  284. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_files_exist.py +0 -0
  285. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_files_unchanged.py +0 -0
  286. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_if_empty_null.py +0 -0
  287. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_local_component_structure.py +0 -0
  288. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_merge_markers.py +0 -0
  289. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_modules_json.py +0 -0
  290. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_multiqc_config.py +0 -0
  291. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_nextflow_config.py +0 -0
  292. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_nf_test_content.py +0 -0
  293. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_nfcore_yml.py +0 -0
  294. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_plugin_includes.py +0 -0
  295. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/lint/test_template_strings.py +0 -0
  296. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_bump_version.py +0 -0
  297. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_create_logo.py +0 -0
  298. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_launch.py +0 -0
  299. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_lint.py +0 -0
  300. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_list.py +0 -0
  301. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_params_file.py +0 -0
  302. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_refgenie.py +0 -0
  303. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_rocrate.py +0 -0
  304. {nf_core-3.3.0 → nf_core-3.3.2}/tests/pipelines/test_schema.py +0 -0
  305. {nf_core-3.3.0 → nf_core-3.3.2}/tests/subworkflows/__init__.py +0 -0
  306. {nf_core-3.3.0 → nf_core-3.3.2}/tests/subworkflows/test_create.py +0 -0
  307. {nf_core-3.3.0 → nf_core-3.3.2}/tests/subworkflows/test_info.py +0 -0
  308. {nf_core-3.3.0 → nf_core-3.3.2}/tests/subworkflows/test_install.py +0 -0
  309. {nf_core-3.3.0 → nf_core-3.3.2}/tests/subworkflows/test_lint.py +0 -0
  310. {nf_core-3.3.0 → nf_core-3.3.2}/tests/subworkflows/test_list.py +0 -0
  311. {nf_core-3.3.0 → nf_core-3.3.2}/tests/subworkflows/test_patch.py +0 -0
  312. {nf_core-3.3.0 → nf_core-3.3.2}/tests/subworkflows/test_remove.py +0 -0
  313. {nf_core-3.3.0 → nf_core-3.3.2}/tests/subworkflows/test_update.py +0 -0
  314. {nf_core-3.3.0 → nf_core-3.3.2}/tests/test_components.py +0 -0
  315. {nf_core-3.3.0 → nf_core-3.3.2}/tests/test_datasets/__init__.py +0 -0
  316. {nf_core-3.3.0 → nf_core-3.3.2}/tests/test_datasets/test_test_datasets_utils.py +0 -0
  317. {nf_core-3.3.0 → nf_core-3.3.2}/tests/test_lint_utils.py +0 -0
  318. {nf_core-3.3.0 → nf_core-3.3.2}/tests/test_modules.py +0 -0
  319. {nf_core-3.3.0 → nf_core-3.3.2}/tests/test_pipelines.py +0 -0
  320. {nf_core-3.3.0 → nf_core-3.3.2}/tests/test_subworkflows.py +0 -0
  321. {nf_core-3.3.0 → nf_core-3.3.2}/tests/test_test_utils.py +0 -0
  322. {nf_core-3.3.0 → nf_core-3.3.2}/tests/test_utils.py +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nf-core
3
- Version: 3.3.0
3
+ Version: 3.3.2
4
4
  Summary: Helper tools for use with nf-core Nextflow pipelines.
5
5
  Home-page: https://github.com/nf-core/tools
6
6
  Author: Phil Ewels
7
7
  Author-email: phil.ewels@scilifelab.se
8
8
  License: MIT
9
9
  Keywords: nf-core,nextflow,bioinformatics,workflow,pipeline,biology,sequencing,NGS,next generation sequencing
10
- Requires-Python: >=3.8, <4
10
+ Requires-Python: >=3.9, <4
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
13
  Requires-Dist: click
@@ -32,7 +32,7 @@ Requires-Dist: rich>=13.3.1
32
32
  Requires-Dist: rocrate
33
33
  Requires-Dist: repo2rocrate
34
34
  Requires-Dist: tabulate
35
- Requires-Dist: textual==2.1.2
35
+ Requires-Dist: textual==3.5.0
36
36
  Requires-Dist: trogon
37
37
  Requires-Dist: pdiff
38
38
  Requires-Dist: ruamel.yaml
@@ -85,7 +85,7 @@ conda install nf-core
85
85
  Alternatively, you can create a new environment with both nf-core/tools and nextflow:
86
86
 
87
87
  ```bash
88
- conda create --name nf-core python=3.12 nf-core nextflow
88
+ conda create --name nf-core python=3.13 nf-core nextflow
89
89
  conda activate nf-core
90
90
  ```
91
91
 
@@ -35,7 +35,7 @@ conda install nf-core
35
35
  Alternatively, you can create a new environment with both nf-core/tools and nextflow:
36
36
 
37
37
  ```bash
38
- conda create --name nf-core python=3.12 nf-core nextflow
38
+ conda create --name nf-core python=3.13 nf-core nextflow
39
39
  conda activate nf-core
40
40
  ```
41
41
 
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ from typing import Optional
2
3
 
3
4
  import click
4
5
  import rich
@@ -29,7 +30,7 @@ def test_datasets_list_remote(ctx: click.Context, branch: str, generate_nf_path:
29
30
 
30
31
 
31
32
  def test_datasets_search(
32
- ctx: click.Context, branch: str, generate_nf_path: bool, generate_dl_url: bool, query: str
33
+ ctx: click.Context, branch: str, generate_nf_path: bool, generate_dl_url: bool, query: Optional[str]
33
34
  ) -> None:
34
35
  """
35
36
  Search all files on a given branch in the remote nf-core/testdatasets repository on github
@@ -3,7 +3,7 @@ import mmap
3
3
  import os
4
4
  import shutil
5
5
  from pathlib import Path
6
- from typing import Dict, List, Optional, Union
6
+ from typing import Optional, Union
7
7
 
8
8
  import nf_core.utils
9
9
  from nf_core.modules.modules_json import ModulesJson
@@ -65,7 +65,7 @@ class ComponentCommand:
65
65
  self.default_subworkflows_path = Path("subworkflows", self.org)
66
66
  self.default_subworkflows_tests_path = Path("tests", "subworkflows", self.org)
67
67
 
68
- def get_local_components(self) -> List[str]:
68
+ def get_local_components(self) -> list[str]:
69
69
  """
70
70
  Get the local modules/subworkflows in a pipeline
71
71
  """
@@ -78,7 +78,7 @@ class ComponentCommand:
78
78
  str(path.relative_to(local_component_dir)) for path in local_component_dir.iterdir() if path.suffix == ".nf"
79
79
  ]
80
80
 
81
- def get_components_clone_modules(self) -> List[str]:
81
+ def get_components_clone_modules(self) -> list[str]:
82
82
  """
83
83
  Get the modules/subworkflows repository available in a clone of nf-core/modules
84
84
  """
@@ -142,7 +142,7 @@ class ComponentCommand:
142
142
  log.error(f"Could not remove {self.component_type[:-1]} {component_name}: {e}")
143
143
  return False
144
144
 
145
- def components_from_repo(self, install_dir: str) -> List[str]:
145
+ def components_from_repo(self, install_dir: str) -> list[str]:
146
146
  """
147
147
  Gets the modules/subworkflows installed from a certain repository
148
148
 
@@ -200,7 +200,7 @@ class ComponentCommand:
200
200
  modules/nf-core/modules/TOOL/SUBTOOL
201
201
  """
202
202
  if self.repo_type == "pipeline":
203
- wrong_location_modules: List[Path] = []
203
+ wrong_location_modules: list[Path] = []
204
204
  for directory, _, files in os.walk(Path(self.directory, "modules")):
205
205
  if "main.nf" in files:
206
206
  module_path = Path(directory).relative_to(Path(self.directory, "modules"))
@@ -263,7 +263,7 @@ class ComponentCommand:
263
263
  ][module_name]["patch"] = str(patch_path.relative_to(self.directory.resolve()))
264
264
  modules_json.dump()
265
265
 
266
- def check_if_in_include_stmts(self, component_path: str) -> Dict[str, List[Dict[str, Union[int, str]]]]:
266
+ def check_if_in_include_stmts(self, component_path: str) -> dict[str, list[dict[str, Union[int, str]]]]:
267
267
  """
268
268
  Checks for include statements in the main.nf file of the pipeline and a list of line numbers where the component is included
269
269
  Args:
@@ -272,7 +272,7 @@ class ComponentCommand:
272
272
  Returns:
273
273
  (list): A list of dictionaries, with the workflow file and the line number where the component is included
274
274
  """
275
- include_stmts: Dict[str, List[Dict[str, Union[int, str]]]] = {}
275
+ include_stmts: dict[str, list[dict[str, Union[int, str]]]] = {}
276
276
  if self.repo_type == "pipeline":
277
277
  workflow_files = Path(self.directory, "workflows").glob("*.nf")
278
278
  for workflow_file in workflow_files:
@@ -4,7 +4,7 @@ import json
4
4
  import logging
5
5
  import os
6
6
  from pathlib import Path
7
- from typing import Dict, List, Union
7
+ from typing import Union
8
8
 
9
9
  from rich import box
10
10
  from rich.console import Console, Group, RenderableType
@@ -308,7 +308,7 @@ class ComponentsDiffer:
308
308
  )
309
309
 
310
310
  @staticmethod
311
- def per_file_patch(patch_fn: Union[str, Path]) -> Dict[str, List[str]]:
311
+ def per_file_patch(patch_fn: Union[str, Path]) -> dict[str, list[str]]:
312
312
  """
313
313
  Splits a patch file for several files into one patch per file.
314
314
 
@@ -324,7 +324,7 @@ class ComponentsDiffer:
324
324
 
325
325
  patches = {}
326
326
  i = 0
327
- patch_lines: List[str] = []
327
+ patch_lines: list[str] = []
328
328
  key = "preamble"
329
329
  while i < len(lines):
330
330
  line = lines[i]
@@ -470,7 +470,7 @@ class ComponentsDiffer:
470
470
  patch_path: Union[str, Path],
471
471
  component_dir: Path,
472
472
  reverse: bool = False,
473
- ) -> Dict[str, List[str]]:
473
+ ) -> dict[str, list[str]]:
474
474
  """
475
475
  Try applying a full patch file to a module or subworkflow
476
476
 
@@ -6,7 +6,7 @@ import logging
6
6
  import os
7
7
  import re
8
8
  from pathlib import Path
9
- from typing import List, Optional
9
+ from typing import Optional
10
10
 
11
11
  import questionary
12
12
  from rich import print
@@ -79,7 +79,7 @@ class ComponentsTest(ComponentCommand): # type: ignore[misc]
79
79
  self.component_name = component_name
80
80
  self.remote_url = remote_url
81
81
  self.branch = branch
82
- self.errors: List[str] = []
82
+ self.errors: list[str] = []
83
83
  self.verbose = verbose
84
84
  self.obsolete_snapshots: bool = False
85
85
  self.update = update
@@ -1,7 +1,7 @@
1
1
  import logging
2
2
  import re
3
3
  from pathlib import Path
4
- from typing import Dict, List, Optional, Tuple, Union
4
+ from typing import Optional, Union
5
5
 
6
6
  import questionary
7
7
  import requests
@@ -22,7 +22,7 @@ yaml.preserve_quotes = True
22
22
  yaml.indent(mapping=2, sequence=2, offset=0)
23
23
 
24
24
 
25
- def get_repo_info(directory: Path, use_prompt: Optional[bool] = True) -> Tuple[Path, Optional[str], str]:
25
+ def get_repo_info(directory: Path, use_prompt: Optional[bool] = True) -> tuple[Path, Optional[str], str]:
26
26
  """
27
27
  Determine whether this is a pipeline repository or a clone of
28
28
  nf-core/modules
@@ -147,12 +147,12 @@ def prompt_component_version_sha(
147
147
 
148
148
  def get_components_to_install(
149
149
  subworkflow_dir: Union[str, Path],
150
- ) -> Tuple[List[Dict[str, str]], List[Dict[str, str]]]:
150
+ ) -> tuple[list[dict[str, str]], list[dict[str, str]]]:
151
151
  """
152
152
  Parse the subworkflow main.nf file to retrieve all imported modules and subworkflows.
153
153
  """
154
- modules: Dict[str, Dict[str, str]] = {}
155
- subworkflows: Dict[str, Dict[str, str]] = {}
154
+ modules: dict[str, dict[str, str]] = {}
155
+ subworkflows: dict[str, dict[str, str]] = {}
156
156
 
157
157
  with open(Path(subworkflow_dir, "main.nf")) as fh:
158
158
  for line in fh:
@@ -165,7 +165,7 @@ def get_components_to_install(
165
165
  if link.startswith("../../../"):
166
166
  name_split = name.lower().split("_")
167
167
  component_name = "/".join(name_split)
168
- component_dict: Dict[str, str] = {
168
+ component_dict: dict[str, str] = {
169
169
  "name": component_name,
170
170
  }
171
171
  modules[component_name] = component_dict
@@ -198,7 +198,7 @@ def get_components_to_install(
198
198
  return list(modules.values()), list(subworkflows.values())
199
199
 
200
200
 
201
- def get_biotools_response(tool_name: str) -> Optional[Dict]:
201
+ def get_biotools_response(tool_name: str) -> Optional[dict]:
202
202
  """
203
203
  Try to get bio.tools information for 'tool'
204
204
  """
@@ -232,12 +232,12 @@ def get_biotools_id(data: dict, tool_name: str) -> str:
232
232
  return ""
233
233
 
234
234
 
235
- DictWithStrAndTuple = Dict[str, Tuple[List[str], List[str], List[str]]]
235
+ DictWithStrAndTuple = dict[str, tuple[list[str], list[str], list[str]]]
236
236
 
237
237
 
238
238
  def get_channel_info_from_biotools(
239
239
  data: dict, tool_name: str
240
- ) -> Optional[Tuple[DictWithStrAndTuple, DictWithStrAndTuple]]:
240
+ ) -> Optional[tuple[DictWithStrAndTuple, DictWithStrAndTuple]]:
241
241
  """
242
242
  Try to find input and output channels and the respective EDAM ontology terms
243
243
 
@@ -9,13 +9,13 @@ import re
9
9
  import shutil
10
10
  import subprocess
11
11
  from pathlib import Path
12
- from typing import Dict, Optional
12
+ from typing import Optional, Union
13
13
 
14
14
  import jinja2
15
15
  import questionary
16
16
  import rich
17
17
  import rich.prompt
18
- import yaml
18
+ import ruamel.yaml
19
19
  from packaging.version import parse as parse_version
20
20
 
21
21
  import nf_core
@@ -26,6 +26,14 @@ from nf_core.pipelines.lint_utils import run_prettier_on_file
26
26
 
27
27
  log = logging.getLogger(__name__)
28
28
 
29
+ # Set yaml options for meta.yml files
30
+ ruamel.yaml.representer.RoundTripRepresenter.ignore_aliases = (
31
+ lambda x, y: True
32
+ ) # Fix to not print aliases. https://stackoverflow.com/a/64717341
33
+ yaml = ruamel.yaml.YAML()
34
+ yaml.preserve_quotes = True
35
+ yaml.indent(mapping=2, sequence=2, offset=0)
36
+
29
37
 
30
38
  class ComponentCreate(ComponentCommand):
31
39
  def __init__(
@@ -59,7 +67,7 @@ class ComponentCreate(ComponentCommand):
59
67
  self.bioconda = None
60
68
  self.singularity_container = None
61
69
  self.docker_container = None
62
- self.file_paths: Dict[str, Path] = {}
70
+ self.file_paths: dict[str, Path] = {}
63
71
  self.not_empty_template = not empty_template
64
72
  self.migrate_pytest = migrate_pytest
65
73
  self.tool_identifier = ""
@@ -175,6 +183,10 @@ class ComponentCreate(ComponentCommand):
175
183
  assert self._render_template()
176
184
  log.info(f"Created component template: '{self.component_name}'")
177
185
 
186
+ if self.component_type == "modules":
187
+ # Generate meta.yml inputs and outputs
188
+ self.generate_meta_yml_file()
189
+
178
190
  if self.migrate_pytest:
179
191
  self._copy_old_files(component_old_path)
180
192
  log.info("Migrate pytest tests: Copied original module files to new module")
@@ -357,7 +369,7 @@ class ComponentCreate(ComponentCommand):
357
369
  elif self.component_type == "subworkflows":
358
370
  self.component = rich.prompt.Prompt.ask("[violet]Name of subworkflow").strip()
359
371
 
360
- def _get_component_dirs(self) -> Dict[str, Path]:
372
+ def _get_component_dirs(self) -> dict[str, Path]:
361
373
  """Given a directory and a tool/subtool or subworkflow, set the file paths and check if they already exist
362
374
 
363
375
  Returns dict: keys are relative paths to template files, vals are target paths.
@@ -501,10 +513,184 @@ class ComponentCreate(ComponentCommand):
501
513
  # Delete tags from pytest_modules.yml
502
514
  modules_yml = Path(self.directory, "tests", "config", "pytest_modules.yml")
503
515
  with open(modules_yml) as fh:
504
- yml_file = yaml.safe_load(fh)
516
+ yml_file = yaml.load(fh)
505
517
  yml_key = str(self.component_dir) if self.component_type == "modules" else f"subworkflows/{self.component_dir}"
506
518
  if yml_key in yml_file:
507
519
  del yml_file[yml_key]
508
520
  with open(modules_yml, "w") as fh:
509
521
  yaml.dump(yml_file, fh)
510
522
  run_prettier_on_file(modules_yml)
523
+
524
+ def generate_meta_yml_file(self) -> None:
525
+ """
526
+ Generate the meta.yml file.
527
+ """
528
+ # TODO: The meta.yml could be handled with a Pydantic model. The reason it is not implemented is because we want to maintain comments in the meta.yml file.
529
+ with open(self.file_paths["meta.yml"]) as fh:
530
+ meta_yml: ruamel.yaml.comments.CommentedMap = yaml.load(fh)
531
+
532
+ versions: dict[str, list[dict[str, dict]]] = {
533
+ "versions": [
534
+ {
535
+ "versions.yml": {
536
+ "type": "file",
537
+ "description": "File containing software versions",
538
+ "pattern": "versions.yml",
539
+ "ontologies": [
540
+ ruamel.yaml.comments.CommentedMap({"edam": "http://edamontology.org/format_3750"})
541
+ ],
542
+ }
543
+ }
544
+ ]
545
+ }
546
+ versions["versions"][0]["versions.yml"]["ontologies"][0].yaml_add_eol_comment("YAML", "edam")
547
+
548
+ if self.not_empty_template:
549
+ meta_yml.yaml_set_comment_before_after_key(
550
+ "name", before="# TODO nf-core: Add a description of the module and list keywords"
551
+ )
552
+ meta_yml["tools"][0].yaml_set_start_comment(
553
+ "## TODO nf-core: Add a description and other details for the software below"
554
+ )
555
+ meta_yml["input"].yaml_set_start_comment(
556
+ "### TODO nf-core: Add a description of all of the variables used as input", indent=2
557
+ )
558
+ meta_yml["output"].yaml_set_start_comment(
559
+ "### TODO nf-core: Add a description of all of the variables used as output", indent=2
560
+ )
561
+
562
+ if hasattr(self, "inputs"):
563
+ inputs_array: list[Union[dict, list[dict]]] = []
564
+ for i, (input_name, ontologies) in enumerate(self.inputs.items()):
565
+ channel_entry: dict[str, dict] = {
566
+ input_name: {
567
+ "type": "file",
568
+ "description": f"{input_name} file",
569
+ "pattern": f"*.{{{','.join(ontologies[2])}}}",
570
+ "ontologies": [
571
+ ruamel.yaml.comments.CommentedMap({"edam": f"{ont_id}"}) for ont_id in ontologies[0]
572
+ ],
573
+ }
574
+ }
575
+ for j, ont_desc in enumerate(ontologies[1]):
576
+ channel_entry[input_name]["ontologies"][j].yaml_add_eol_comment(ont_desc, "edam")
577
+ if self.has_meta:
578
+ meta_suffix = str(i + 1) if i > 0 else ""
579
+ meta_entry: dict[str, dict] = {
580
+ f"meta{meta_suffix}": {
581
+ "type": "map",
582
+ "description": "Groovy Map containing sample information. e.g. `[ id:'sample1' ]`",
583
+ }
584
+ }
585
+ inputs_array.append([meta_entry, channel_entry])
586
+ else:
587
+ inputs_array.append(channel_entry)
588
+ meta_yml["input"] = ruamel.yaml.comments.CommentedSeq(inputs_array)
589
+ meta_yml["input"].yaml_set_start_comment(
590
+ "# TODO nf-core: Update the information obtained from bio.tools and make sure that it is correct"
591
+ )
592
+ elif not self.has_meta:
593
+ meta_yml["input"] = [
594
+ {
595
+ "bam": {
596
+ "type": "file",
597
+ "description": "Sorted BAM/CRAM/SAM file",
598
+ "pattern": "*.{bam,cram,sam}",
599
+ "ontologies": [
600
+ ruamel.yaml.comments.CommentedMap({"edam": "http://edamontology.org/format_2572"}),
601
+ ruamel.yaml.comments.CommentedMap({"edam": "http://edamontology.org/format_2573"}),
602
+ ruamel.yaml.comments.CommentedMap({"edam": "http://edamontology.org/format_3462"}),
603
+ ],
604
+ }
605
+ }
606
+ ]
607
+ meta_yml["input"][0]["bam"]["ontologies"][0].yaml_add_eol_comment("BAM", "edam")
608
+ meta_yml["input"][0]["bam"]["ontologies"][1].yaml_add_eol_comment("CRAM", "edam")
609
+ meta_yml["input"][0]["bam"]["ontologies"][2].yaml_add_eol_comment("SAM", "edam")
610
+
611
+ if hasattr(self, "outputs"):
612
+ outputs_dict: dict[str, Union[list, dict]] = {}
613
+ for i, (output_name, ontologies) in enumerate(self.outputs.items()):
614
+ channel_contents: list[Union[list[dict], dict]] = []
615
+ if self.has_meta:
616
+ channel_contents.append(
617
+ [
618
+ {
619
+ "meta": {
620
+ "type": "map",
621
+ "description": "Groovy Map containing sample information. e.g. `[ id:'sample1' ]`",
622
+ }
623
+ }
624
+ ]
625
+ )
626
+ pattern = f"*.{{{','.join(ontologies[2])}}}"
627
+ file_entry: dict[str, dict] = {
628
+ pattern: {
629
+ "type": "file",
630
+ "description": f"{output_name} file",
631
+ "pattern": pattern,
632
+ "ontologies": [
633
+ ruamel.yaml.comments.CommentedMap({"edam": f"{ont_id}"}) for ont_id in ontologies[0]
634
+ ],
635
+ }
636
+ }
637
+ for j, ont_desc in enumerate(ontologies[1]):
638
+ file_entry[pattern]["ontologies"][j].yaml_add_eol_comment(ont_desc, "edam")
639
+ if self.has_meta:
640
+ if isinstance(channel_contents[0], list): # for mypy
641
+ channel_contents[0].append(file_entry)
642
+ else:
643
+ channel_contents.append(file_entry)
644
+ outputs_dict[output_name] = channel_contents
645
+ outputs_dict.update(versions)
646
+ meta_yml["output"] = ruamel.yaml.comments.CommentedMap(outputs_dict)
647
+ meta_yml["output"].yaml_set_start_comment(
648
+ "# TODO nf-core: Update the information obtained from bio.tools and make sure that it is correct"
649
+ )
650
+ elif not self.has_meta:
651
+ meta_yml["output"] = {
652
+ "bam": [
653
+ {
654
+ "*.bam": {
655
+ "type": "file",
656
+ "description": "Sorted BAM/CRAM/SAM file",
657
+ "pattern": "*.{bam,cram,sam}",
658
+ "ontologies": [
659
+ ruamel.yaml.comments.CommentedMap({"edam": "http://edamontology.org/format_2572"}),
660
+ ruamel.yaml.comments.CommentedMap({"edam": "http://edamontology.org/format_2573"}),
661
+ ruamel.yaml.comments.CommentedMap({"edam": "http://edamontology.org/format_3462"}),
662
+ ],
663
+ }
664
+ }
665
+ ]
666
+ }
667
+ meta_yml["output"]["bam"][0]["*.bam"]["ontologies"][0].yaml_add_eol_comment("BAM", "edam")
668
+ meta_yml["output"]["bam"][0]["*.bam"]["ontologies"][1].yaml_add_eol_comment("CRAM", "edam")
669
+ meta_yml["output"]["bam"][0]["*.bam"]["ontologies"][2].yaml_add_eol_comment("SAM", "edam")
670
+ meta_yml["output"].update(versions)
671
+
672
+ else:
673
+ input_entry: list[dict] = [
674
+ {"input": {"type": "file", "description": "", "pattern": "", "ontologies": [{"edam": ""}]}}
675
+ ]
676
+ output_entry: list[dict] = [
677
+ {"*": {"type": "file", "description": "", "pattern": "", "ontologies": [{"edam": ""}]}}
678
+ ]
679
+ if self.has_meta:
680
+ empty_meta_entry: list[dict] = [
681
+ {
682
+ "meta": {
683
+ "type": "map",
684
+ "description": "Groovy Map containing sample information. e.g. `[ id:'sample1' ]`",
685
+ }
686
+ }
687
+ ]
688
+ meta_yml["input"] = [empty_meta_entry + input_entry]
689
+ meta_yml["output"] = {"output": [empty_meta_entry + output_entry]}
690
+ else:
691
+ meta_yml["input"] = input_entry
692
+ meta_yml["output"] = {"output": output_entry}
693
+ meta_yml["output"].update(versions)
694
+
695
+ with open(self.file_paths["meta.yml"], "w") as fh:
696
+ yaml.dump(meta_yml, fh)
@@ -1,7 +1,7 @@
1
1
  import logging
2
2
  import os
3
3
  from pathlib import Path
4
- from typing import Dict, List, Optional, Tuple, Union
4
+ from typing import Optional, Union
5
5
 
6
6
  import questionary
7
7
  import yaml
@@ -66,7 +66,7 @@ class ComponentInfo(ComponentCommand):
66
66
  no_pull: bool = False,
67
67
  ):
68
68
  super().__init__(component_type, pipeline_dir, remote_url, branch, no_pull)
69
- self.meta: Optional[Dict] = None
69
+ self.meta: Optional[dict] = None
70
70
  self.local_path: Optional[Path] = None
71
71
  self.remote_location: Optional[str] = None
72
72
  self.local: bool = False
@@ -106,7 +106,7 @@ class ComponentInfo(ComponentCommand):
106
106
  components = self.get_components_clone_modules()
107
107
  elif self.repo_type == "pipeline":
108
108
  assert self.modules_json is not None # mypy
109
- all_components: List[Tuple[str, str]] = self.modules_json.get_all_components(
109
+ all_components: list[tuple[str, str]] = self.modules_json.get_all_components(
110
110
  self.component_type
111
111
  ).get(self.modules_repo.remote_url, [])
112
112
 
@@ -170,7 +170,7 @@ class ComponentInfo(ComponentCommand):
170
170
 
171
171
  return self.generate_component_info_help()
172
172
 
173
- def get_local_yaml(self) -> Optional[Dict]:
173
+ def get_local_yaml(self) -> Optional[dict]:
174
174
  """Attempt to get the meta.yml file from a locally installed module/subworkflow.
175
175
 
176
176
  Returns:
@@ -213,7 +213,7 @@ class ComponentInfo(ComponentCommand):
213
213
 
214
214
  return {}
215
215
 
216
- def get_remote_yaml(self) -> Optional[Dict]:
216
+ def get_remote_yaml(self) -> Optional[dict]:
217
217
  """Attempt to get the meta.yml file from a remote repo.
218
218
 
219
219
  Returns:
@@ -320,18 +320,27 @@ class ComponentInfo(ComponentCommand):
320
320
  # Outputs
321
321
  if self.meta.get("output"):
322
322
  outputs_table = self.generate_params_table("Outputs")
323
- for output in self.meta["output"]:
324
- if self.component_type == "modules":
325
- for ch_name, elements in output.items():
326
- outputs_table.add_row(f"{ch_name}", "", "")
327
- for element in elements:
323
+ if self.component_type == "modules":
324
+ for ch_name, elements in self.meta["output"].items():
325
+ outputs_table.add_row(f"{ch_name}", "", "")
326
+ for element in elements:
327
+ if isinstance(element, list):
328
+ for ch in element:
329
+ for key, info in ch.items():
330
+ outputs_table.add_row(
331
+ f"[orange1 on black] {key} [/][dim i] ({info['type']})",
332
+ Markdown(info["description"] if info["description"] else ""),
333
+ info.get("pattern", ""),
334
+ )
335
+ elif isinstance(element, dict):
328
336
  for key, info in element.items():
329
337
  outputs_table.add_row(
330
338
  f"[orange1 on black] {key} [/][dim i] ({info['type']})",
331
339
  Markdown(info["description"] if info["description"] else ""),
332
340
  info.get("pattern", ""),
333
341
  )
334
- elif self.component_type == "subworkflows":
342
+ elif self.component_type == "subworkflows":
343
+ for output in self.meta["output"]:
335
344
  for key, info in output.items():
336
345
  outputs_table.add_row(
337
346
  f"[orange1 on black] {key} [/][dim i]",
@@ -1,7 +1,7 @@
1
1
  import logging
2
2
  import os
3
3
  from pathlib import Path
4
- from typing import Dict, List, Optional, Union
4
+ from typing import Optional, Union
5
5
 
6
6
  import questionary
7
7
  from rich import print
@@ -38,7 +38,7 @@ class ComponentInstall(ComponentCommand):
38
38
  remote_url: Optional[str] = None,
39
39
  branch: Optional[str] = None,
40
40
  no_pull: bool = False,
41
- installed_by: Optional[List[str]] = None,
41
+ installed_by: Optional[list[str]] = None,
42
42
  ):
43
43
  super().__init__(component_type, pipeline_dir, remote_url, branch, no_pull)
44
44
  self.current_remote = ModulesRepo(remote_url, branch)
@@ -52,7 +52,7 @@ class ComponentInstall(ComponentCommand):
52
52
  else:
53
53
  self.installed_by = [self.component_type]
54
54
 
55
- def install(self, component: Union[str, Dict[str, str]], silent: bool = False) -> bool:
55
+ def install(self, component: Union[str, dict[str, str]], silent: bool = False) -> bool:
56
56
  if isinstance(component, dict):
57
57
  # Override modules_repo when the component to install is a dependency from a subworkflow.
58
58
  remote_url = component.get("git_remote", self.current_remote.remote_url)
@@ -7,7 +7,7 @@ import logging
7
7
  import operator
8
8
  import os
9
9
  from pathlib import Path
10
- from typing import List, Optional, Tuple, Union
10
+ from typing import Optional, Union
11
11
 
12
12
  import rich.box
13
13
  import rich.console
@@ -75,10 +75,10 @@ class ComponentLint(ComponentCommand):
75
75
 
76
76
  self.fail_warned = fail_warned
77
77
  self.fix = fix
78
- self.passed: List[LintResult] = []
79
- self.warned: List[LintResult] = []
80
- self.failed: List[LintResult] = []
81
- self.all_local_components: List[NFCoreComponent] = []
78
+ self.passed: list[LintResult] = []
79
+ self.warned: list[LintResult] = []
80
+ self.failed: list[LintResult] = []
81
+ self.all_local_components: list[NFCoreComponent] = []
82
82
 
83
83
  self.lint_config: Optional[NFCoreYamlLintConfig] = None
84
84
  self.modules_json: Optional[ModulesJson] = None
@@ -96,7 +96,7 @@ class ComponentLint(ComponentCommand):
96
96
  if self.repo_type == "pipeline":
97
97
  modules_json = ModulesJson(self.directory)
98
98
  modules_json.check_up_to_date()
99
- self.all_remote_components: List[NFCoreComponent] = []
99
+ self.all_remote_components: list[NFCoreComponent] = []
100
100
  for repo_url, components in modules_json.get_all_components(self.component_type).items():
101
101
  if remote_url is not None and remote_url != repo_url:
102
102
  continue
@@ -1,7 +1,7 @@
1
1
  import json
2
2
  import logging
3
3
  from pathlib import Path
4
- from typing import Dict, List, Optional, Union, cast
4
+ from typing import Optional, Union, cast
5
5
 
6
6
  import rich.table
7
7
 
@@ -35,7 +35,7 @@ class ComponentList(ComponentCommand):
35
35
  return super()._configure_repo_and_paths(nf_dir_req)
36
36
 
37
37
  def list_components(
38
- self, keywords: Optional[List[str]] = None, print_json: bool = False
38
+ self, keywords: Optional[list[str]] = None, print_json: bool = False
39
39
  ) -> Union[rich.table.Table, str]:
40
40
  keywords = keywords or []
41
41
  """
@@ -48,9 +48,9 @@ class ComponentList(ComponentCommand):
48
48
  # Initialise rich table
49
49
  table: rich.table.Table = rich.table.Table()
50
50
  table.add_column(f"{self.component_type[:-1].capitalize()} Name")
51
- components: List[str] = []
51
+ components: list[str] = []
52
52
 
53
- def pattern_msg(keywords: List[str]) -> str:
53
+ def pattern_msg(keywords: list[str]) -> str:
54
54
  if len(keywords) == 0:
55
55
  return ""
56
56
  if len(keywords) == 1:
@@ -122,7 +122,7 @@ class ComponentList(ComponentCommand):
122
122
  modules_json_file = modules_json.modules_json
123
123
 
124
124
  for repo_url, component_with_dir in sorted(repos_with_comps.items()):
125
- repo_entry: Dict[str, Dict[str, Dict[str, ModulesJsonModuleEntry]]]
125
+ repo_entry: dict[str, dict[str, dict[str, ModulesJsonModuleEntry]]]
126
126
  if modules_json_file is None:
127
127
  log.warning(f"Modules JSON file '{modules_json.modules_json_path}' is missing. ")
128
128
  continue