Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

style: Sort environment.yml dependencies #7085

Merged
merged 10 commits into from
Feb 3, 2025
124 changes: 124 additions & 0 deletions .github/scripts/conda_env_sorter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
#!/usr/bin/env python3
# /// script
# requires-python = ">=3.10"
# dependencies = [
# "ruamel.yaml",
# ]
# ///

"""Sort dependencies in conda environment files."""
# Test with
# uv run --with pytest -- pytest -v .github/scripts/conda_env_sorter.py

import argparse
from pathlib import Path
from typing import Optional, Sequence
import ruamel.yaml
import sys

# Add pytest imports conditionally
if 'pytest' in sys.modules:
import pytest
from tempfile import NamedTemporaryFile

yaml = ruamel.yaml.YAML()
yaml.indent(mapping=2, sequence=2, offset=2) # Set indentation to 2 spaces


def main(argv: Optional[Sequence[str]] = None) -> None:
"""Sort dependencies in conda environment files."""
parser = argparse.ArgumentParser()
parser.add_argument("paths", nargs="*", type=Path)
args = parser.parse_args(argv)
for path in args.paths:
# Read the entire file content
with path.open() as f:
lines = f.readlines()

# Define the schema lines to be added if missing
schema_lines = [
"---\n",
"# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json\n",
]

# Check if the first two lines match the expected schema lines
if lines[:2] == schema_lines:
content = "".join(lines[2:]) # Skip schema lines when reading content
else:
content = "".join(lines) # Use all content if no schema lines present

# Parse the YAML content
doc = yaml.load(content)
dicts = []
others = []

for term in doc["dependencies"]:
if isinstance(term, dict):
dicts.append(term)
else:
others.append(term)
others.sort(key=str)
for dict_term in dicts:
for value in dict_term.values():
if isinstance(value, list):
value.sort(key=str)
dicts.sort(key=str)
doc["dependencies"].clear()
doc["dependencies"].extend(others)
doc["dependencies"].extend(dicts)

# Write back to file with headers
with path.open("w") as f:
# Always write schema lines first
f.writelines(schema_lines)
# Then dump the sorted YAML
yaml.dump(doc, f)


if __name__ == "__main__":
main()

# Pytest tests (only loaded when running pytest)
if 'pytest' in sys.modules:
@pytest.mark.parametrize("input_content,expected", [
# Test basic sorting
(
"dependencies:\n - zlib\n - python\n",
["python", "zlib"]
),
# Test dict sorting
(
"dependencies:\n - pip:\n - b\n - a\n - python\n",
["python", {"pip": ["a", "b"]}]
),
# Test existing headers
(
"---\n# yaml-language-server: $schema=...\ndependencies:\n - b\n - a\n",
["a", "b"]
)
])
def test_conda_sorter(tmp_path, input_content, expected):
test_file = tmp_path / "environment.yml"
test_file.write_text(input_content)

# Run our sorter on the test file
main([str(test_file)])

# Read back the sorted file
result = test_file.read_text()

# Check schema headers are present
assert result.startswith("---\n# yaml-language-server: $schema=")

# Parse the sorted content (skip first 2 header lines)
parsed = yaml.load("".join(result.splitlines(True)[2:]))

# Compare the actual dependencies structure
assert parsed["dependencies"] == expected

def test_invalid_file(tmp_path):
test_file = tmp_path / "bad.yml"
test_file.write_text("invalid: yaml: here")

with pytest.raises(ruamel.yaml.scanner.ScannerError):
main([str(test_file)])
18 changes: 18 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
repos:
- repo: local
hooks:
- id: conda-env-sorter
name: Sort dependencies in conda environment files.
entry: ./.github/scripts/conda_env_sorter.py
language: python
files: environment
types: [yaml]
additional_dependencies: ["ruamel.yaml"]
- repo: https://github.com/pre-commit/mirrors-prettier
rev: "v3.1.0"
hooks:
Expand All @@ -25,6 +34,15 @@ repos:
args: ["--schemafile", "subworkflows/yaml-schema.json"]
- id: check-github-workflows
- id: check-github-actions
- repo: local
hooks:
- id: conda-env-sorter
name: Sort dependencies in conda environment files.
entry: ./.github/scripts/conda_env_sorter.py
language: python
files: environment
types: [yaml]
additional_dependencies: ["ruamel.yaml"]
# use ruff for python files
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.7.3
Expand Down
3 changes: 0 additions & 3 deletions modules/nf-core/basicpy/environment.yml

This file was deleted.

4 changes: 2 additions & 2 deletions modules/nf-core/bowtie/align/environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ channels:
- conda-forge
- bioconda
dependencies:
# renovate: datasource=conda depName=bioconda/bowtie
- bioconda::bowtie=1.3.1
# renovate: datasource=conda depName=bioconda/samtools
- bioconda::samtools=1.20
# renovate: datasource=conda depName=bioconda/bowtie
- bioconda::bowtie=1.3.1
3 changes: 0 additions & 3 deletions modules/nf-core/cellrangeratac/count/environment.yml

This file was deleted.

3 changes: 0 additions & 3 deletions modules/nf-core/cellrangeratac/mkfastq/environment.yml

This file was deleted.

3 changes: 0 additions & 3 deletions modules/nf-core/cellrangeratac/mkref/environment.yml

This file was deleted.

2 changes: 0 additions & 2 deletions modules/nf-core/ensemblvep/environment.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# You can use this file to create a conda environment for this module:
# conda env create -f environment.yml
channels:
- conda-forge
- bioconda
Expand Down
3 changes: 0 additions & 3 deletions modules/nf-core/fastk/histex/environment.yml

This file was deleted.

3 changes: 0 additions & 3 deletions modules/nf-core/fastk/merge/environment.yml

This file was deleted.

3 changes: 0 additions & 3 deletions modules/nf-core/fcs/fcsgx/environment.yml

This file was deleted.

2 changes: 1 addition & 1 deletion modules/nf-core/gatk4/variantstotable/environment.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json

---
# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json
channels:
- conda-forge
- bioconda
Expand Down
3 changes: 0 additions & 3 deletions modules/nf-core/genescopefk/environment.yml

This file was deleted.

2 changes: 2 additions & 0 deletions modules/nf-core/hlala/preparegraph/environment.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
channels:
- conda-forge
- bioconda
dependencies:
- bioconda::hla-la=1.0.4
3 changes: 0 additions & 3 deletions modules/nf-core/ilastik/multicut/environment.yml

This file was deleted.

3 changes: 0 additions & 3 deletions modules/nf-core/ilastik/pixelclassification/environment.yml

This file was deleted.

3 changes: 0 additions & 3 deletions modules/nf-core/merquryfk/katcomp/environment.yml

This file was deleted.

3 changes: 0 additions & 3 deletions modules/nf-core/merquryfk/katgc/environment.yml

This file was deleted.

3 changes: 1 addition & 2 deletions modules/nf-core/regtools/junctionsextract/environment.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json
channels:
- conda-forge
- bioconda
dependencies:
- "bioconda::regtools=1.0.0"
- bioconda::regtools=1.0.0
5 changes: 3 additions & 2 deletions modules/nf-core/snpeff/environment.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# You can use this file to create a conda environment for this module:
# conda env create -f environment.yml
# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json

---
channels:
- conda-forge
- bioconda
Expand Down
2 changes: 2 additions & 0 deletions modules/nf-core/trgt/merge/environment.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json

---
channels:
- conda-forge
- bioconda
Expand Down
2 changes: 2 additions & 0 deletions modules/nf-core/trgt/plot/environment.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json

---
channels:
- conda-forge
- bioconda
Expand Down
3 changes: 0 additions & 3 deletions modules/nf-core/universc/environment.yml

This file was deleted.

Loading