diff --git a/.github/scripts/validate_schema_completeness.py b/.github/scripts/validate_schema_completeness.py index d55bccc..93a3d93 100644 --- a/.github/scripts/validate_schema_completeness.py +++ b/.github/scripts/validate_schema_completeness.py @@ -83,11 +83,11 @@ "state_dir", # Exposed via negated CLI flag --no-slack "slack_enabled", - # Deacon tuning (set via params-file or preset) - "deacon_kmer_size", - "deacon_window_size", - "deacon_abs_threshold", - "deacon_rel_threshold", + # Host index/depletion tuning (set via params-file or preset) + "host_kmer_size", + "host_window_size", + "host_abs_threshold", + "host_rel_threshold", } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 23f9a95..4f90203 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -113,16 +113,18 @@ jobs: echo "✅ Config syntax valid for ${{ matrix.profile }} profile" - - name: Verify required parameters exist + - name: Verify expected top-level parameters exist run: | - # Check that critical parameters are defined - for param in samplesheet experiment_id tools results; do + # Check that stable top-level parameters are defined in the rendered config. + # The v3 pipeline has a single main workflow, so there is no public + # `tools` selector parameter to validate here. + for param in samplesheet experiment_id results; do if ! grep -q "^\s*${param}\s*=" config_output.txt; then - echo "::error::Required parameter '${param}' not found in config" + echo "::error::Expected parameter '${param}' not found in config" exit 1 fi done - echo "✅ All required parameters present" + echo "✅ All expected top-level parameters present" validate-config-includes: name: Validate Config File Includes diff --git a/.gitignore b/.gitignore index b1859a7..09261ed 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,7 @@ # assets !/assets !/assets/example_samplesheet.csv +!/assets/test_samplesheet.csv # docs !/docs @@ -90,3 +91,7 @@ !/.vscode/extensions.json !/.vscode/settings.json +# testing data +!/tests +!/tests/data +!/tests/data/* \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index d8d3413..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# Pre-commit hooks for NVD -# Install with: pre-commit install -# Run manually: pre-commit run --all-files - -repos: - # Local hooks (no external repo needed) - - repo: local - hooks: - - id: update-fingerprint - name: Update pipeline fingerprint - entry: pixi run fingerprint - language: system - files: ^(main\.nf|nextflow\.config)$ - pass_filenames: false diff --git a/Containerfile b/Containerfile index 86e3e86..35e15a9 100644 --- a/Containerfile +++ b/Containerfile @@ -15,7 +15,7 @@ ENV ~=/opt # run a few apt installs RUN apt-get update && \ - apt-get install -y curl wget git gcc g++ cmake util-linux && \ + apt-get install -y curl util-linux && \ rm -rf /var/lib/apt/lists/* && \ mkdir /dependencies && \ dpkg -l > /dependencies/apt-get.lock @@ -39,8 +39,7 @@ ENV PATH=$PATH:$HOME/.pixi/bin # 4) install everything else with pixi RUN cd $HOME && \ script -q -c "pixi install --frozen" && \ - script -q -c "pixi clean cache --assume-yes" && \ - script -q -c "pixi add cxx-compiler cmake make" + script -q -c "pixi clean cache --assume-yes" # 5) Add pixi environment to PATH (works in Docker, Podman, AND Apptainer) ENV PATH=$PATH:/opt/.pixi/envs/default/bin @@ -49,41 +48,5 @@ ENV PATH=$PATH:/opt/.pixi/envs/default/bin ENV NXF_CACHE_DIR=/scratch ENV NXF_HOME=/scratch -# ----------------------------------------------------------------------------------- # - -# Copy necessary ncbi files -COPY conf/user-settings.mkfg /.ncbi/user-settings.mkfg - -# Install NCBI tools and configure environment -RUN mkdir -p /.ncbi && \ - chmod 777 /.ncbi/user-settings.mkfg && \ - mkdir /build && cd /build && \ - git config --global http.sslVerify false && \ - git clone -b 3.2.0 https://github.com/ncbi/ngs-tools.git && \ - git clone -b 3.2.1 https://github.com/ncbi/ncbi-vdb.git && \ - git clone -b 3.2.1 https://github.com/ncbi/sra-tools.git && \ - sed -i 's/cmake_minimum_required[[:space:]]*([[:space:]]*VERSION[[:space:]]*2\.8\.12[[:space:]]*)/cmake_minimum_required(VERSION 3.5)/' /build/ngs-tools/CMakeLists.txt && \ - echo "Verifying CMake version change:" && \ - grep "cmake_minimum_required" /build/ngs-tools/CMakeLists.txt - -# Build ncbi-vdb, sra-tools and ngs-tools -RUN cd /build/ncbi-vdb && \ - ./configure --relative-build-out-dir && \ - make -j$(nproc) && \ - cd /build/sra-tools && \ - ./configure --relative-build-out-dir && \ - make -j$(nproc) && \ - cd /build/ngs-tools && \ - ./configure --relative-build-out-dir && \ - make -j$(nproc) && \ - # Copy built binaries and clean up in the same layer - find /build/OUTDIR -type f -executable -exec cp {} /usr/local/bin/ \; && \ - cd / && rm -rf /build - -# remove now unnecessary compilers and clean the PyPI and conda caches -RUN cd $HOME && pixi remove rust cxx-compiler cmake make && pixi clean cache --yes - # Fix snakemake permission issue RUN mkdir /.cache; chmod a+rwX /.cache - - diff --git a/assets/test_samplesheet.csv b/assets/test_samplesheet.csv new file mode 100644 index 0000000..2dc02d9 --- /dev/null +++ b/assets/test_samplesheet.csv @@ -0,0 +1,4 @@ +sample_id,srr,platform,fastq1,fastq2 +water,,illumina,tests/data/water_R1.fastq.gz,tests/data/water_R2.fastq.gz +hits_only,,illumina,tests/data/hits_only_R1.fastq.gz,tests/data/hits_only_R2.fastq.gz +water_plus_hits,,illumina,tests/data/water_plus_hits_R1.fastq.gz,tests/data/water_plus_hits_R2.fastq.gz diff --git a/bin/check_run_state.py b/bin/check_run_state.py index dcc9dfb..baf7a4e 100755 --- a/bin/check_run_state.py +++ b/bin/check_run_state.py @@ -466,10 +466,6 @@ def parse_args() -> argparse.Namespace: "--blast-db-version", help="BLAST database version (ignored - now passed to register_hits.py)", ) - parser.add_argument( - "--stat-db-version", - help="STAT database version (ignored - now passed to register_hits.py)", - ) parser.add_argument( "--lock-ttl", type=int, @@ -479,7 +475,7 @@ def parse_args() -> argparse.Namespace: parser.add_argument( "--upload-types", help="Comma-separated upload types to check for duplicate detection " - "(e.g., 'blast,blast_fasta' or 'gottcha2,gottcha2_fasta'). " + "(e.g., 'blast,blast_fasta'). " "When set, only uploads matching these types count as 'already uploaded'.", ) parser.add_argument( diff --git a/bin/extract_taxa_spots.py b/bin/extract_taxa_spots.py deleted file mode 100755 index a70b4b6..0000000 --- a/bin/extract_taxa_spots.py +++ /dev/null @@ -1,299 +0,0 @@ -#!/usr/bin/env python3 -# /// script -# requires-python = ">=3.11" -# dependencies = [ -# "snakemake", -# ] -# /// - -""" -Taxonomic Read Filter for Snakemake - -This script filters reads based on taxonomic classifications, specifically tailored for -identifying reads potentially originating from human viruses. It includes (whitelist) -reads that match specified taxonomic groups, with adjustable stringency. -This script is designed to be used with Snakemake's script directive. -""" - -import argparse -import logging -import sys -from collections import Counter -from contextlib import redirect_stderr -from pathlib import Path -from typing import Literal - -from py_nvd import taxonomy - -logger = logging.getLogger("taxonomic_read_filter") - -# snakemake setup, if applicable -MODE: Literal["snakemake", "commandline"] -if "snakemake" in globals(): - from snakemake.script import snakemake - - MODE = "snakemake" -else: - MODE = "commandline" - - -def resolve_taxa(taxa_list: list[str], tax) -> set[int]: - """ - Resolve the input taxa list to a set of valid taxonomic IDs. - - Looks up scientific names in the taxonomy database and returns - corresponding taxids. - - Args: - taxa_list: List of scientific names to resolve - tax: TaxonomyDB instance - - Returns: - Set of resolved taxids - """ - count = tax.taxon_count - logger.info(f"Taxonomy database contains {count} taxa") - if count == 0: - logger.error("Taxonomy database is empty — cannot resolve any taxa") - return set() - - resolved_taxa = set() - for taxon_name in taxa_list: - taxon = tax.get_taxon_by_name(taxon_name) - if taxon: - resolved_taxa.add(taxon.tax_id) - else: - logger.warning(f"Taxon '{taxon_name}' not found in database.") - return resolved_taxa - - -def is_in_target_lineage( - tax_id: int, - target_taxa: set[int], - tax, - include_children: bool, -) -> bool: - """ - Check if a given tax_id is in the target lineage based on the filtering options. - - Args: - tax_id: The taxid to check - target_taxa: Set of target taxids - tax: TaxonomyDB instance - include_children: If True, check if any ancestor is in target_taxa - - Returns: - True if the taxid matches the filter criteria - """ - if include_children: - # Check if any taxid in the lineage is in target_taxa - lineage_ids = tax.get_lineage_ids(tax_id) - return any(tid in target_taxa for tid in lineage_ids) - return tax_id in target_taxa - - -def process_input( - input_file: str, - output_file: str, - target_taxa: set[int], - tax, - include_children: bool, - stringency: float, -) -> None: - """Process the input file, apply filtering, and write results to the output file.""" - total_spots = 0 - filtered_spots = 0 - - try: - with open(input_file) as infile: - first_line = infile.readline().strip() - if not first_line: - logger.warning("Input file is empty. No spots to process.") - Path(output_file).touch() - return - - # Reset file pointer to the beginning of the file - infile.seek(0) - - with open(output_file, "w") as outfile: - for line in infile: - total_spots += 1 - parts = line.strip().split("\t") - spot = parts[0] - - tax_counts = Counter() - for hit in parts[1:]: - tax_id, count = hit.split("x") if "x" in hit else (hit, "1") - tax_id = int(tax_id) - count = int(count) - tax_counts[tax_id] += count - - total_hits = sum(tax_counts.values()) - target_hits = sum( - count - for tax_id, count in tax_counts.items() - if is_in_target_lineage( - tax_id, - target_taxa, - tax, - include_children, - ) - ) - - if total_hits == 0: - continue - - target_ratio = target_hits / total_hits - - if target_ratio >= stringency: - filtered_spots += 1 - outfile.write(f"{spot}\n") - - except FileNotFoundError: - logger.exception(f"Input file {input_file} not found. Exiting.") - return - - logger.info(f"Total spots processed: {total_spots}") - logger.info(f"Spots after filtering: {filtered_spots}") - logger.info( - f"Filtering rate: {filtered_spots / total_spots:.2%}" - if total_spots > 0 - else "No spots processed.", - ) - - -def parse_command_line_args() -> argparse.Namespace: - """Parse command-line arguments.""" - parser = argparse.ArgumentParser(description="Taxa filtering pipeline") - # Keep --gettax_sqlite_path for backward compatibility with Nextflow, - # but it's no longer used (taxonomy.open() handles DB location) - parser.add_argument( - "--gettax_sqlite_path", - required=False, - default=None, - help="(Deprecated) Path to SQLite taxonomy DB - now handled automatically", - ) - parser.add_argument("--hits_file", required=True, help="Path to hits file") - parser.add_argument( - "--output_file", - required=True, - help="Where to write filtered results", - ) - parser.add_argument( - "--taxa", - required=True, - nargs="+", - help="List of taxa to include", - ) - parser.add_argument( - "--stringency", - type=float, - default=0.9, - help="Stringency threshold", - ) - parser.add_argument( - "--include_children", - action="store_true", - help="Include child taxa in filter", - ) - parser.add_argument( - "--state-dir", - required=False, - default=None, - help="State directory containing taxonomy cache (default: NVD_STATE_DIR or ~/.nvd/)", - ) - parser.add_argument( - "--taxonomy-dir", - required=False, - default=None, - help="Explicit taxonomy directory (takes precedence over --state-dir)", - ) - parser.add_argument( - "--sync", - action="store_true", - help="Require pre-cached taxonomy database (fail if unavailable)", - ) - - return parser.parse_args() - - -def execute( - hits_file: str, - output_file: str, - taxa: list[str], - stringency: float, - include_children: bool, - state_dir: str | None = None, - taxonomy_dir: str | None = None, - sync: bool = False, -) -> None: - """Execute the taxa filtering pipeline.""" - try: - with taxonomy.open( - state_dir=state_dir, - taxonomy_dir=taxonomy_dir, - sync=sync, - ) as tax: - resolved_taxa = resolve_taxa(taxa, tax) - if not resolved_taxa: - logger.error("No valid taxa specified. Exiting.") - msg = "No valid taxa specified" - raise ValueError(msg) - - logger.info(f"Filtering based on the following taxa: {resolved_taxa}") - logger.info(f"Using stringency threshold: {stringency}") - - process_input( - hits_file, - output_file, - resolved_taxa, - tax, - include_children, - stringency, - ) - except Exception: - logger.exception("An error occurred. Detailed traceback:") - raise - - -def main() -> None: - """Main entry point.""" - if MODE == "snakemake": - with open(snakemake.log[0], "w") as log_file, redirect_stderr(log_file): - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s - %(levelname)s - %(message)s", - stream=sys.stderr, - ) - # gettax_sqlite_path from snakemake is ignored - taxonomy.open() handles it - execute( - hits_file=snakemake.input.hits, - output_file=snakemake.output.filtered, - taxa=snakemake.params.taxa, - stringency=snakemake.params.stringency, - include_children=snakemake.params.include_children, - ) - return - - args = parse_command_line_args() - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s - %(levelname)s - %(message)s", - stream=sys.stderr, - ) - - # args.gettax_sqlite_path is ignored - taxonomy.open() handles DB location - execute( - hits_file=args.hits_file, - output_file=args.output_file, - taxa=args.taxa, - stringency=args.stringency, - include_children=args.include_children, - state_dir=args.state_dir, - taxonomy_dir=args.taxonomy_dir, - sync=args.sync, - ) - - -if __name__ == "__main__": - main() diff --git a/bin/filter_gottcha_fasta.py b/bin/filter_gottcha_fasta.py deleted file mode 100755 index 72858d3..0000000 --- a/bin/filter_gottcha_fasta.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import re -from collections import defaultdict - - -def filter_fasta_strain_or_species(input_fasta: str) -> str: - lines = input_fasta.strip().splitlines() - record_map = defaultdict(dict) # {read_id: {level: [(header, seq_lines)]}} - - current_header = None - current_seq = [] - - for line in lines: - if line.startswith(">"): - if current_header: - read_id = current_header.split("|")[0] # everything up to first | - level_match = re.search(r"LEVEL=(\w+)", current_header) - if level_match: - level = level_match.group(1).lower() - record_map[read_id].setdefault(level, []).append( - (current_header, current_seq), - ) - current_header = line.strip() - current_seq = [] - else: - current_seq.append(line.strip()) - - if current_header: - read_id = current_header.split("|")[0] - level_match = re.search(r"LEVEL=(\w+)", current_header) - if level_match: - level = level_match.group(1).lower() - record_map[read_id].setdefault(level, []).append( - (current_header, current_seq), - ) - - output_lines = [] - for levels in record_map.values(): - if "strain" in levels: - selected = levels["strain"] - elif "species" in levels: - selected = levels["species"] - else: - continue - for header, seq_lines in selected: - output_lines.append(header) - output_lines.extend(seq_lines) - - return "\n".join(output_lines) - - -def main(): - parser = argparse.ArgumentParser( - description="Filter a GOTTCHA2-style FASTA to strain/species only.", - ) - parser.add_argument("-i", "--input", required=True, help="Input FASTA file") - parser.add_argument( - "-o", - "--output", - required=True, - help="Output FASTA file (filtered)", - ) - - args = parser.parse_args() - - with open(args.input) as infile: - fasta_data = infile.read() - - filtered = filter_fasta_strain_or_species(fasta_data) - - with open(args.output, "w") as outfile: - outfile.write(filtered) - - -if __name__ == "__main__": - main() diff --git a/bin/generate_tax_list.py b/bin/generate_tax_list.py deleted file mode 100755 index 4ec9e4e..0000000 --- a/bin/generate_tax_list.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python3 -# /// script -# requires-python = ">=3.11" -# dependencies = [ -# "snakemake", -# ] -# /// - -import argparse -from collections import defaultdict -from contextlib import redirect_stderr -from pathlib import Path -from typing import Literal - -# snakemake setup, if applicable -MODE: Literal["snakemake", "commandline"] -if "snakemake" in globals(): - from snakemake.script import snakemake - - MODE = "snakemake" -else: - MODE = "commandline" - - -def parse_taxids(hits_file: str | Path, output_file: str | Path) -> None: - # Dictionary to store the count of each tax_id - tax_hits = defaultdict(int) - - # Open and read the hits file - with open(hits_file) as f: - for line in f: - _spot_id, spot_hits = line.strip().split("\t", 1) - for tax_id in spot_hits.split(): - tax_id_int = int(tax_id.split("x")[0]) - tax_hits[tax_id_int] += 1 - - # Write the unique list of taxids to the output file - with open(output_file, "w") as tax_list: - for tax_id in tax_hits: - tax_list.write(f"{tax_id}\n") - tax_list.flush() - - -def main() -> None: - # Check if the script is being run by Snakemake or from the command line - if "snakemake" in globals() and MODE == "snakemake": - # Snakemake provides the `snakemake` object - hits_file = str(snakemake.input.first_pass_stat_file) - output_file = str(snakemake.output.tax_list) - log_file = str(snakemake.log[0]) - - # Redirect stderr to the log file - with open(log_file, "w") as log, redirect_stderr(log): - parse_taxids(hits_file, output_file) - - # early return to reduce nesting below - return - - # Set up argument parsing for command-line usage - parser = argparse.ArgumentParser(description="Parse taxids from hits file") - parser.add_argument("hits_file", help="Path to the hits file") - parser.add_argument("output_file", help="Path to the output file") - args = parser.parse_args() - - hits_file = args.hits_file - output_file = args.output_file - - # Run the main function - parse_taxids(hits_file, output_file) - - -if __name__ == "__main__": - main() diff --git a/bin/hits_to_report.py b/bin/hits_to_report.py deleted file mode 100755 index b30241d..0000000 --- a/bin/hits_to_report.py +++ /dev/null @@ -1,500 +0,0 @@ -#!/usr/bin/env python3 -# /// script -# requires-python = ">=3.11" -# dependencies = [ -# "lxml", -# "snakemake", -# ] -# /// - -import argparse -import collections -import logging -import sys -from typing import Literal - -from lxml.builder import E -from py_nvd import __version__, taxonomy - -# snakemake setup -MODE: Literal["snakemake", "commandline"] -if "snakemake" in globals(): - from snakemake.script import snakemake - - MODE = "snakemake" -else: - MODE = "commandline" - -# Configuration -PROGRESS_GRANULARITY = 100000 - -# Set up logging -logger = logging.getLogger("tax_analysis") - - -def parse_input(file, tax, args): - """Parse input file and count taxids.""" - counter = collections.Counter() - counter[1] = 0 # explicitly add root - for tax_id in args.include_tax_id: - counter[tax_id] = 0 - - if args.wgs_mode: - parse_wgs_mode(file, counter) - else: - parse_standard_mode(file, counter, tax, args.compact, args.collated) - - return counter - - -def parse_wgs_mode(file, counter): - """Parse WGS mode input format.""" - for line in file: - parts = line.strip().split("\t") - if len(parts) < 2: - logger.warning(f"Skipping malformed line: {line}") - continue - hits = parts[1:] - if not hits: - logger.warning(f"No hits for spot: {parts[0]}") - continue - for hit in hits: - if "x" in hit: - tax_id, count = map(int, hit.split("x")) - else: - tax_id, count = int(hit), 1 - counter[tax_id] += count - - -def parse_standard_mode(file, counter, tax, compact, collated): - """Parse standard mode input format.""" - iterator = iterate_merged_spots_compact if compact else iterate_merged_spots - for hits, copies in iterator(file, collated): - if not hits: - logger.warning("Empty hits set encountered") - continue - tax_id = deduce_tax_id(hits, tax) - if tax_id is None: - logger.warning(f"Could not deduce tax_id for hits: {hits}") - continue - counter[tax_id] += copies - - -def iterate_merged_spots(file, collated): - """Iterate over merged spots in standard format.""" - last_spot = None - last_hits = None - for line in file: - parts = line.split("\t") - if len(parts) < 2: - logger.warning(f"Skipping malformed line: {line}") - continue - spot = parts[0] - try: - hits = set(int(p.split("x")[0]) for p in parts[1:]) - except ValueError as e: - logger.warning(f"Error parsing hits in line: {line}. Error: {e}") - continue - if not hits: - logger.warning(f"No hits for spot: {spot}") - continue - if collated: - yield hits, 1 - elif spot == last_spot: - last_hits |= hits # ty:ignore[unsupported-operator] - else: - if last_spot: - yield last_hits, 1 - last_spot = spot - last_hits = hits - if last_spot: - yield last_hits, 1 - - -def iterate_merged_spots_compact(file, collated): - """Iterate over merged spots in compact format.""" - last_spot = None - last_hits = None - for line in file: - if not line.strip(): - continue - if line[0] != "\t": - if last_spot: - last_spot = None - yield last_hits, 1 - parts = line.split("\t") - if len(parts) < 2: - logger.warning(f"Skipping malformed line: {line}") - continue - try: - copies = int(parts[0]) - hits = set(int(p.split("x")[0]) for p in parts[1:]) - except ValueError as e: - logger.warning(f"Error parsing line: {line}. Error: {e}") - continue - yield hits, copies - else: - line = line[1:] - parts = line.split("\t") - if len(parts) < 2: - logger.warning(f"Skipping malformed line: {line}") - continue - spot = parts[0] - try: - hits = set(int(p.split("x")[0]) for p in parts[1:]) - except ValueError as e: - logger.warning(f"Error parsing hits in line: {line}. Error: {e}") - continue - if not hits: - logger.warning(f"No hits for spot: {spot}") - continue - if collated: - yield hits, 1 - elif spot == last_spot: - last_hits |= hits # ty:ignore[unsupported-operator] - else: - if last_spot: - yield last_hits, 1 - last_spot = spot - last_hits = hits - if last_spot: - yield last_hits, 1 - - -def deduce_tax_id(hits, tax): - """ - Deduce the consensus taxid for a set of hits using LCA. - - Args: - hits: Set of taxids from BLAST hits - tax: TaxonomyDB instance - - Returns: - The LCA taxid, or None if no valid taxids - """ - if len(hits) == 1: - return next(iter(hits)) - - # Use taxonomy module's find_lca for consistency with annotate_blast_lca.py - return tax.find_lca(list(hits)) - - -def build_tree(counter, tax): - """Build XML tree from taxid counts.""" - logger.info("Building XML tree") - nodes = {} - while counter: - tax_id = next(iter(counter)) - get_or_add_node(nodes, counter, tax, tax_id) - - root = nodes[1] - logger.info("Calculating totals") - calculate_total_counts(root) - return root - - -def get_or_add_node(nodes, counter, tax, tax_id): - """Get or create a node in the tree.""" - if tax_id in nodes: - return nodes[tax_id] - - count = counter.pop(tax_id, 0) - node = E.taxon(tax_id=str(tax_id), self_count=str(count)) - - tax_info = tax.get_taxon(tax_id) - if tax_info: - if tax_info.rank: - node.attrib["rank"] = tax_info.rank - node.attrib["name"] = tax_info.scientific_name - parent_tax_id = tax_info.parent_tax_id - else: - node.attrib["name"] = "unknown" - parent_tax_id = 1 - - nodes[tax_id] = node - if tax_id != 1: - parent_node = get_or_add_node(nodes, counter, tax, parent_tax_id) - parent_node.append(node) - return node - - -def calculate_total_counts(node): - """Calculate total counts for each node in the tree.""" - total_count = int(node.attrib["self_count"]) - for child in node: - calculate_total_counts(child) - total_count += int(child.attrib["total_count"]) - node[:] = sorted( - node, - key=lambda child: int(child.attrib["total_count"]), - reverse=True, - ) - node.attrib["total_count"] = str(total_count) - - -def format_tax_tree(tree, args): - """Format the taxonomy tree for output.""" - if len(tree) == 0: - return "Tree is empty" - root = tree[0] - total_count = int(root.attrib["total_count"]) - - res = [ - format_node(node, total_count, "", args) - for node in sorted( - root, - key=lambda x: int(x.attrib["total_count"]), - reverse=True, - ) - ] - res = list(flatten(res)) - if args.no_padding: - res = [ - f"{name}{args.separator}{stats}" - for name, stats in ( - line.split("\t", 1) for line in res if isinstance(line, str) - ) - ] - else: - res = list(pad_tree(res, args.separator)) - return "\n".join(res) - - -def format_node(node, grand_total, offset, args): - """Format a single node for output.""" - self_count = int(node.attrib["self_count"]) - if len(node) == 1 and check_cutoff(self_count, grand_total, args): - if args.skip == "none": - skip = False - elif args.skip == "unranked": - skip = node.attrib.get("rank") is None - elif args.skip == "all": - skip = True - else: - assert False - if skip: - for subnode in sorted( - node, - key=lambda x: int(x.attrib["total_count"]), - reverse=True, - ): - yield from format_node(subnode, grand_total, offset, args) - return - - name = node.attrib["name"] - total_count = int(node.attrib["total_count"]) - - if check_cutoff(total_count, grand_total, args): - return - - rate = float(total_count) / grand_total - percent = rate * 100 - - if args.no_padding: - percent_precision = f".{args.precision}" - hits_precision = "" - else: - percent_precision = f"{args.precision + 3}.{args.precision}" - hits_precision = str(len(str(grand_total))) - - pattern = f"%s%s\t%{percent_precision}f%% (%{hits_precision}d hits)" - yield pattern % (offset, name, percent, total_count) - - for subnode in sorted( - node, - key=lambda x: int(x.attrib["total_count"]), - reverse=True, - ): - yield from format_node(subnode, grand_total, offset + args.indent, args) - - -def check_cutoff(value, total, args): - """Check if a value is below the cutoff threshold.""" - if value < args.cutoff_hit_count: - return True - rate = float(value) / total - percent = rate < args.cutoff_percent - return percent - - -def flatten(iterable): - """Flatten nested iterables.""" - for item in iterable: - if isinstance(item, (list, tuple)) or ( - hasattr(item, "__iter__") and not isinstance(item, str) - ): - yield from flatten(item) - else: - yield item - - -def pad_tree(lines: list[str], separator: str): - """Pad tree lines for aligned output.""" - lines = list(lines) - split_lines = [line.split("\t", 1) for line in lines if isinstance(line, str)] - if not split_lines: - return [] - max_name_len = max(len(name) for name, _ in split_lines) - for name, stats in split_lines: - yield name.ljust(max_name_len) + separator + stats - - -def parse_arguments() -> argparse.Namespace: - """Parse command-line arguments.""" - parser = argparse.ArgumentParser(description="Taxonomic analysis tool") - parser.add_argument( - "-v", - "--verbose", - action="store_true", - help="Enable verbose mode", - ) - # Keep --sqlite-cache for backward compatibility with Nextflow, - # but it's no longer used (taxonomy.open() handles DB location) - parser.add_argument( - "-c", - "--sqlite-cache", - default=None, - help="(Deprecated) Path to SQLite cache file - now handled automatically", - ) - parser.add_argument( - "-i", - "--include-tax-id", - type=int, - action="append", - default=[], - help="Include taxon into tax tree even if it has no hits", - ) - parser.add_argument( - "--compact", - action="store_true", - help="Use compact input format", - ) - parser.add_argument( - "--wgs-mode", - action="store_true", - help="Use WGS mode for parsing", - ) - parser.add_argument("--collated", action="store_true", help="The input is collated") - parser.add_argument( - "--indent", - default=" ", - help="Indentation string, default is two spaces", - ) - parser.add_argument( - "--separator", - default=" ", - help="Name/stats separator string, default is four spaces", - ) - parser.add_argument( - "--no-padding", - action="store_true", - help="Disable tree padding", - ) - parser.add_argument( - "--precision", - type=int, - default=2, - help="Number of digits after decimal point, default is 2", - ) - parser.add_argument( - "--cutoff-percent", - type=float, - default=0.01, - help="Cutoff percent, default is 0.01", - ) - parser.add_argument( - "--cutoff-hit-count", - type=int, - default=0, - help="Cutoff hit count, disabled by default", - ) - parser.add_argument( - "--skip", - choices=["all", "unranked", "none"], - default="all", - help="Skip nodes with only one child and less than cutoff exact hits", - ) - parser.add_argument("input_file", nargs="?", help="Path to the input file") - parser.add_argument("output_file", nargs="?", help="Path to the output file") - parser.add_argument( - "--state-dir", - default=None, - help="State directory containing taxonomy cache (default: NVD_STATE_DIR or ~/.nvd/)", - ) - parser.add_argument( - "--taxonomy-dir", - default=None, - help="Explicit taxonomy directory (takes precedence over --state-dir)", - ) - parser.add_argument( - "--sync", - action="store_true", - help="Require pre-cached taxonomy database (fail if unavailable)", - ) - return parser.parse_args() - - -def main() -> None: - """Main entry point.""" - args = parse_arguments() - logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO) - - if "snakemake" in globals() and MODE == "snakemake": - # Running within Snakemake - # args.sqlite_cache from snakemake is ignored - taxonomy.open() handles it - input_file = snakemake.input[0] - output_file = snakemake.output[0] - else: - # Running from the command line - if not args.input_file or not args.output_file: - logger.error( - "Input and output files must be specified when running from the command line", - ) - sys.exit(1) - input_file = args.input_file - output_file = args.output_file - - # Get state_dir, taxonomy_dir, and sync from args (None/False in snakemake mode) - state_dir = getattr(args, "state_dir", None) - taxonomy_dir = getattr(args, "taxonomy_dir", None) - sync = getattr(args, "sync", False) - - try: - with taxonomy.open( - state_dir=state_dir, - taxonomy_dir=taxonomy_dir, - sync=sync, - ) as tax: - logger.info(f"Reading {input_file}") - with open(input_file) as f: - counter = parse_input(f, tax, args) - - if not counter: - logger.warning("No valid data found in input. Creating empty output.") - with open(output_file, "w") as f: - f.write("") - return - - xml_tree = build_tree(counter, tax) - if xml_tree is None: - logger.warning("No data to build tree. Creating empty output.") - with open(output_file, "w") as f: - f.write("") - return - - xml_root = E.taxon_tree(xml_tree, parser_version=__version__) - formatted_tree = format_tax_tree(xml_root, args) - - logger.info(f"Writing output to {output_file}") - with open(output_file, "w") as f: - f.write(formatted_tree) - - except (KeyboardInterrupt, SystemExit): - raise - except Exception: - logger.exception("An unexpected error occurred. Detailed traceback:") - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/bin/labkey_upload_gottcha2_fasta.py b/bin/labkey_upload_gottcha2_fasta.py deleted file mode 100755 index 0ed7d68..0000000 --- a/bin/labkey_upload_gottcha2_fasta.py +++ /dev/null @@ -1,391 +0,0 @@ -#!/usr/bin/env python3 -# ruff: noqa: TC003 -""" -labkey_upload_gottcha_fasta.py — keep one taxonomic level per read: STRAIN if present, else SPECIES - -Why this shape? ---------------- -GOTTCHA2 duplicates each hit across multiple taxonomy levels using the *same read header*. -We just want all the reads, but only at the lowest relevant level: - - If a read has any STRAIN entries -> keep *only* those STRAIN entries for that read - - Else, if it has SPECIES -> keep those SPECIES entries - - Ignore other levels - -This script: - 1) Reads a plain-text FASTA (file path only; no stdin, no compression). - 2) Keeps only LEVEL ∈ {species, strain}, selecting per-read as above. - 3) Writes a LabKey TSV with columns: - "Experiment", "Sample Id", "Header", "Sequence", "Notes", "Snakemake Run Id", "Upload Type" - (Header is the FASTA header without the leading '>') - 4) Uploads TSV rows to a LabKey list in **batches** (unless --no_upload). -""" - -from __future__ import annotations - -import argparse -import csv -import os -import re -import sys -from collections.abc import Generator, Iterable, Sequence -from typing import TextIO - -# Lazy import so --no_upload works without LabKey client installed -try: - from labkey.api_wrapper import APIWrapper -except Exception: - APIWrapper = None # ty:ignore[invalid-assignment] - - -# ----------------------------- FASTA parsing ----------------------------- - - -def iterate_fasta(handle: TextIO) -> Generator[tuple[str, list[str]], None, None]: - """ - Yield (header_line_including_>, [sequence_lines]) for each FASTA record. - """ - current_header: str | None = None - current_seq: list[str] = [] - for raw in handle: - line = raw.rstrip("\r\n") - if line.startswith(">"): - if current_header is not None: - yield current_header, current_seq - current_header = line - current_seq = [] - else: - if current_header is None: - continue # ignore stray sequence lines before first header - current_seq.append(line) - if current_header is not None: - yield current_header, current_seq - - -LEVEL_RE = re.compile(r"LEVEL=(\w+)", re.IGNORECASE) - - -def extract_level(header: str) -> str | None: - """ - Return 'species' or 'strain' if present as LEVEL=..., else None. - """ - m = LEVEL_RE.search(header) - return m.group(1).lower() if m else None - - -def read_key_from_header(header: str) -> str: - """ - GOTTCHA2 duplicates the SAME read across levels with the same leading token. - Read key is everything after '>' up to the first '|'. - """ - h = header.lstrip(">") - return h.split("|", 1)[0] - - -# ------------------------ Selection (per-read) --------------------------- - - -def select_records_for_upload(fasta_path: str) -> list[tuple[str, str]]: - """ - Parse the FASTA and return a list of (header_without_gt, concatenated_sequence) - keeping ONLY species/strain entries and preferring strain per read. - - Algorithm: - - Map: read_key -> {'strain': [(hdr, seq)], 'species': [(hdr, seq)]} - - For each read_key: - if any 'strain' -> take ALL 'strain' entries for that read - elif any 'species' -> take ALL 'species' entries - else -> take nothing - """ - per_read: dict[str, dict[str, list[tuple[str, str]]]] = {} - - # 1) Build the map - with open(fasta_path, encoding="utf-8") as fh: - for header, seq_lines in iterate_fasta(fh): - level = extract_level(header) - if level not in {"species", "strain"}: - continue # ignore other taxonomic levels entirely - - read_key = read_key_from_header(header) - seq = "".join(seq_lines) - if not seq: - continue - - bucket = per_read.setdefault(read_key, {"strain": [], "species": []}) - bucket[level].append((header.lstrip(">"), seq)) - - # 2) For each read, keep only the desired level - selected: list[tuple[str, str]] = [] - for bucket in per_read.values(): - if bucket["strain"]: - selected.extend(bucket["strain"]) - elif bucket["species"]: - selected.extend(bucket["species"]) - # else: neither level present -> nothing for this read - - return selected - - -# --------------------------- LabKey batching ----------------------------- - - -def upload_in_batches( - lk: APIWrapper, - list_name: str, - rows_iterable: Iterable[dict], - batch_size: int, -) -> tuple[int, int]: - """ - Upload rows to LabKey in batches. Returns (total_inserted, num_batches). - """ - batch: list[dict] = [] - total = 0 - batches = 0 - - def flush(): - nonlocal batch, total, batches - if not batch: - return - resp = lk.query.insert_rows("lists", list_name, batch) - inserted = len(resp.get("rows", [])) if isinstance(resp, dict) else 0 - total += inserted - batches += 1 - for r in resp.get("rows", []): - key = r.get("Key", "N/A") - samp = r.get("Sample Id", "N/A") - print(f" - Inserted: Sample Id={samp}, Key={key}") - batch = [] - - for row in rows_iterable: - batch.append(row) - if len(batch) >= batch_size: - flush() - flush() - return total, batches - - -# ------------------------------- CLI ------------------------------------ - -TSV_COLUMNS = [ - "Experiment", - "Sample Id", - "Header", - "Sequence", - "Notes", - "Snakemake Run Id", - "Upload Type", -] - - -def main(argv: Sequence[str] | None = None) -> int: - p = argparse.ArgumentParser( - description="Upload GOTTCHA2 FASTA hits at lowest relevant level per read (strain if present, else species).", - ) - p.add_argument( - "--fasta", - required=True, - help="Path to input FASTA (plain text; no stdin).", - ) - p.add_argument("--sample_id", required=True, help="Value for 'Sample Id'.") - p.add_argument("--experiment_id", required=True, help="Value for 'Experiment'.") - p.add_argument( - "--sample_set_id", - required=False, - help="Sample set ID for upload tracking", - ) - p.add_argument( - "--state_dir", - required=False, - help="State directory for upload tracking database", - ) - p.add_argument( - "--output_tsv", - required=True, - help="Path to write TSV (file path only).", - ) - - # LabKey settings (omit with --no_upload) - p.add_argument("--server", help="LabKey server URL") - p.add_argument("--container", help="LabKey container/project path") - p.add_argument("--list", dest="list_name", help="LabKey list name") - p.add_argument("--api_key", help="LabKey API key") - p.add_argument("--batch_size", type=int, default=1000, help="Upload batch size") - p.add_argument( - "--no_upload", - action="store_true", - help="Only write TSV; skip upload", - ) - - # Fixed column defaults - p.add_argument("--notes", default="gottcha2", help="Value for 'Notes'") - p.add_argument( - "--run_id", - default="GOTTCHA2_UPLOAD", - help="Value for 'Snakemake Run Id'", - ) - p.add_argument("--upload_type", default="fasta", help="Value for 'Upload Type'") - - args = p.parse_args(argv) - - # Validate file paths - if args.fasta.strip() in {"-", ""}: - print( - "[❌ ERROR] --fasta must be a real file path (no stdin).", - file=sys.stderr, - ) - return 1 - if not os.path.isfile(args.fasta): - print(f"[❌ ERROR] FASTA not found: {args.fasta}", file=sys.stderr) - return 1 - if args.output_tsv.strip() in {"-", ""}: - print( - "[❌ ERROR] --output_tsv must be a file path (no stdout).", - file=sys.stderr, - ) - return 1 - - # Check for cross-run duplicate uploads if sample_set_id is provided - # Justification for local import: script must work standalone without py_nvd - if args.sample_set_id and not args.no_upload: - try: - import py_nvd.state as nvd_state - - if nvd_state.was_sample_ever_uploaded( - args.sample_id, - upload_type="gottcha2_fasta", - upload_target="labkey", - state_dir=args.state_dir, - ): - print( - f"[INFO] SKIP: Sample '{args.sample_id}' was already uploaded to LabKey in a previous run.", - file=sys.stderr, - ) - return 0 - except ImportError: - print( - "[WARN] py_nvd not available, skipping cross-run check", - file=sys.stderr, - ) - - try: - # Select records exactly once - selected_records = select_records_for_upload(args.fasta) - print(f"[INFO] Selected records: {len(selected_records)}", file=sys.stderr) - - # Write TSV - with open(args.output_tsv, "w", encoding="utf-8", newline="") as out_fh: - writer = csv.writer(out_fh, delimiter="\t", lineterminator="\n") - writer.writerow(TSV_COLUMNS) - - # Optional: set up LabKey client - lk = None - if not args.no_upload: - if APIWrapper is None: - raise RuntimeError( - "labkey.api_wrapper not available. Install it or pass --no_upload.", - ) - missing = [ - flag - for flag, val in { - "--server": args.server, - "--container": args.container, - "--list": args.list_name, - "--api_key": args.api_key, - }.items() - if not val - ] - if missing: - raise ValueError(f"Missing LabKey parameters: {', '.join(missing)}") - lk = APIWrapper(args.server, args.container, api_key=args.api_key) # type: ignore - - # Build all rows for TSV and upload - all_rows: list[dict] = [] - for header_no_gt, seq in selected_records: - row = { - "Experiment": args.experiment_id, - "Sample Id": args.sample_id, - "Header": header_no_gt, - "Sequence": seq, - "Notes": args.notes, - "Snakemake Run Id": args.run_id, - "Upload Type": args.upload_type, - } - writer.writerow([row[c] for c in TSV_COLUMNS]) - all_rows.append(row) - - total_rows = len(all_rows) - - # Compute content hash for idempotency tracking - # Justification for local import: script must work standalone without py_nvd - content_hash = None - if args.sample_set_id: - try: - import py_nvd.state as nvd_state - - content_hash = nvd_state.hash_upload_content(all_rows) - print( - f"[INFO] Content hash: {content_hash[:16]}...", - file=sys.stderr, - ) - except ImportError: - pass - - # Upload to LabKey - total_uploaded = 0 - if lk is not None: - uploaded, batches = upload_in_batches( - lk, - args.list_name, - all_rows, - args.batch_size, - ) - total_uploaded = uploaded - print( - f"[INFO] Uploaded {uploaded} rows in {batches} batch(es).", - file=sys.stderr, - ) - - # Record successful upload in state database - # Justification for local import: script must work standalone without py_nvd - if args.sample_set_id and content_hash and total_uploaded > 0: - try: - import py_nvd.state as nvd_state - - nvd_state.record_upload( - sample_id=args.sample_id, - sample_set_id=args.sample_set_id, - upload_type="gottcha2_fasta", - upload_target="labkey", - content_hash=content_hash, - target_metadata={ - "experiment_id": args.experiment_id, - "list_name": args.list_name, - "records_uploaded": total_uploaded, - }, - state_dir=args.state_dir, - ) - print( - f"[INFO] Recorded upload in state database for sample '{args.sample_id}'", - file=sys.stderr, - ) - except ImportError: - print( - "[WARN] py_nvd.state not available, upload not recorded", - file=sys.stderr, - ) - except Exception as e: - print(f"[WARN] Failed to record upload: {e}", file=sys.stderr) - - print(f"[INFO] TSV rows written: {total_rows}", file=sys.stderr) - if args.no_upload: - print("[INFO] Upload skipped (--no_upload).", file=sys.stderr) - else: - print("[✅] Upload complete.", file=sys.stderr) - return 0 - - except Exception as e: - print(f"[❌ ERROR] {e}", file=sys.stderr) - return 1 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/bin/labkey_upload_gottcha2_full.py b/bin/labkey_upload_gottcha2_full.py deleted file mode 100755 index bca2aaf..0000000 --- a/bin/labkey_upload_gottcha2_full.py +++ /dev/null @@ -1,257 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import os -import sys -from datetime import datetime - -import pandas as pd - - -def parse_args(): - parser = argparse.ArgumentParser( - description="Upload GOTTCHA2 full TSV data to LabKey", - ) - parser.add_argument( - "--input-tsv", - required=True, - help="Path to GOTTCHA2 full TSV file", - ) - parser.add_argument("--sample", required=True, help="Sample name") - parser.add_argument("--experiment", required=True, help="Experiment name") - parser.add_argument( - "--sample-set-id", - required=False, - help="Sample set ID for upload tracking", - ) - parser.add_argument( - "--state-dir", - required=False, - help="State directory for upload tracking database", - ) - parser.add_argument( - "--run-id", - required=False, - help="Pipeline run ID for provenance tracking", - ) - parser.add_argument( - "--labkey-server", - required=True, - help="LabKey server address (e.g., labkey.org)", - ) - parser.add_argument("--labkey-schema", required=True) - parser.add_argument( - "--labkey-project-name", - required=True, - help="LabKey project name", - ) - parser.add_argument("--labkey-api-key", required=True, help="LabKey API key") - parser.add_argument("--db-version", required=True, help="GOTTCHA2 DB version") - parser.add_argument( - "--table-name", - required=True, - help="LabKey table to insert data into", - ) - return parser.parse_args() - - -def main(): - args = parse_args() - - log_entries = [ - f"GOTTCHA2 Upload Log - {datetime.now()}", - f"Sample: {args.sample}", - f"Experiment: {args.experiment}", - f"Run ID: {args.run_id or 'not provided'}", - f"Sample Set ID: {args.sample_set_id or 'not provided'}", - f"State Dir: {args.state_dir or 'default'}", - f"Server: {args.labkey_server}", - f"Project: {args.labkey_project_name}", - f"Schema: {args.labkey_schema}", - f"Target Table: {args.table_name}", - "=" * 80, - ] - - # Check for cross-run duplicate uploads if sample_set_id is provided - # Justification for local import: script must work standalone without py_nvd - if args.sample_set_id: - try: - import py_nvd.state as nvd_state - - if nvd_state.was_sample_ever_uploaded( - args.sample, - upload_type="gottcha2", - upload_target="labkey", - state_dir=args.state_dir, - ): - log_entries.append( - f"SKIP: Sample '{args.sample}' was already uploaded to LabKey in a previous run.", - ) - log_entries.append("=" * 80) - log_entries.append("GOTTCHA2 UPLOAD SKIPPED (already uploaded)") - with open("fasta_labkey_upload.log", "w") as f: - f.write("\n".join(log_entries)) - print("\n".join(log_entries)) - return - except ImportError: - log_entries.append( - "WARNING: py_nvd not available, skipping cross-run check", - ) - - # Check if upload should proceed - upload_enabled = bool( - args.labkey_server and args.labkey_project_name and args.labkey_api_key, - ) - api = None - - if upload_enabled: - try: - import more_itertools - from labkey.api_wrapper import APIWrapper - - api = APIWrapper( - args.labkey_server, - args.labkey_project_name, - api_key=args.labkey_api_key, - ) - log_entries.append("LabKey API wrapper found - proceeding with upload.") - except ImportError as e: - log_entries.append( - f"ERROR: LabKey API wrapper or dependencies not available - {e!s}", - ) - log_entries.append("Falling back to simulation mode.") - upload_enabled = False - else: - log_entries.append("Missing LabKey credentials - running in simulation mode.") - - # Read the input TSV - if not os.path.exists(args.input_tsv): - log_entries.append(f"ERROR: Input file not found - {args.input_tsv}") - print("\n".join(log_entries)) - sys.exit(1) - - df = pd.read_csv(args.input_tsv, sep="\t") - - if df.empty: - log_entries.append("No data found in TSV file. Exiting.") - print("\n".join(log_entries)) - sys.exit(0) - - # Add metadata - df["SAMPLE"] = args.sample - df["EXPERIMENT"] = args.experiment - df["GOTTCHA2_DB_VERSION"] = args.db_version - - df.rename( - columns={ - "TOTAL_SIG_LEN": "TOL_SIG_LENGTH", - "MAPPED_SIG_LEN": "MAPPED_SIG_LENGTH", - "DEPTH": "ROLLUP_DOC", - "BEST_SIG_COV": "BEST_LINEAR_COV", - "COVERED_SIG_LEN": "LINEAR_LEN", - }, - inplace=True, - ) - - df["LINEAR_COV_MAPPED_SIG"] = df["LINEAR_LEN"] / df["MAPPED_SIG_LENGTH"] - df["LINEAR_DOC"] = df["TOTAL_BP_MAPPED"] / df["LINEAR_LEN"] - df["LINEAR_COV"] = df["LINEAR_LEN"] / df["TOL_SIG_LENGTH"] - - # Perform upload or simulation - total_uploaded = 0 - total_records = len(df) - log_entries.append(f"Total records to process: {total_records}") - - # Compute content hash for idempotency tracking - # Justification for local import: script must work standalone without py_nvd - records_for_upload = df.to_dict("records") - content_hash = None - if args.sample_set_id: - try: - import py_nvd.state as nvd_state - - content_hash = nvd_state.hash_upload_content(records_for_upload) - log_entries.append(f"Content hash: {content_hash[:16]}...") - except ImportError: - pass - - if upload_enabled: - batch_size = 1000 - record_chunks = list(more_itertools.chunked(records_for_upload, batch_size)) - for i, chunk in enumerate(record_chunks, 1): - try: - api.query.insert_rows( - schema_name=args.labkey_schema, - query_name=args.table_name, - rows=chunk, - ) - log_entries.append( - f"Batch {i}/{len(record_chunks)}: SUCCESS ({len(chunk)} records)", - ) - total_uploaded += len(chunk) - except Exception as e: - log_entries.append(f"Batch {i}/{len(record_chunks)}: ERROR - {e!s}") - log_entries.append( - f"Total successfully uploaded: {total_uploaded} / {total_records}", - ) - - # Record successful upload in state database - # Justification for local import: script must work standalone without py_nvd - if args.sample_set_id and content_hash and total_uploaded > 0: - try: - import py_nvd.state as nvd_state - - nvd_state.record_upload( - sample_id=args.sample, - sample_set_id=args.sample_set_id, - upload_type="gottcha2", - upload_target="labkey", - content_hash=content_hash, - target_metadata={ - "experiment_id": args.experiment, - "table_name": args.table_name, - "records_uploaded": total_uploaded, - }, - state_dir=args.state_dir, - ) - log_entries.append( - f"Recorded upload in state database for sample '{args.sample}'", - ) - except ImportError: - log_entries.append("WARNING: py_nvd not available, upload not recorded") - except Exception as e: - log_entries.append(f"WARNING: Failed to record upload: {e!s}") - else: - batch_count = (total_records + 999) // 1000 - log_entries.append( - f"SIMULATION MODE: Would upload {total_records} records in {batch_count} batches.", - ) - - log_entries.append("=" * 80) - log_entries.append( - "GOTTCHA2 UPLOAD COMPLETE" - if upload_enabled - else "GOTTCHA2 SIMULATION COMPLETE", - ) - - # Save log - with open("fasta_labkey_upload.log", "w") as f: - f.write("\n".join(log_entries)) - - # Also print to stdout - print("\n".join(log_entries)) - - -if __name__ == "__main__": - main() - - # Target list column names - # ['SAMPLE', 'EXPERIMENT', 'LEVEL', 'NAME', 'TAXID', 'READ_COUNT', 'TOTAL_BP_MAPPED', 'TOTAL_BP_MISMATCH', 'LINEAR_LEN', 'LINEAR_DOC', 'ROLLUP_DOC', - # 'REL_ABUNDANCE', 'LINEAR_COV', 'LINEAR_COV_MAPPED_SIG', 'BEST_LINEAR_COV', - # 'MAPPED_SIG_LENGTH', 'TOL_SIG_LENGTH', 'ABUNDANCE', 'ZSCORE', 'NOTE', 'GOTTCHA2_DB_VERSION', 'Key'] - - # Our tsv file: - # ['LEVEL', 'NAME', 'TAXID', 'READ_COUNT', 'TOTAL_BP_MAPPED', 'ANI_CI95', 'COVERED_SIG_LEN', 'BEST_SIG_COV', 'DEPTH', 'REL_ABUNDANCE', 'PARENT_NAME', - # 'PARENT_TAXID', 'TOTAL_READ_LEN', 'READ_IDT', 'TOTAL_BP_MISMATCH', 'TOTAL_BP_INDEL', 'ANI_NAIVE', 'ANI_CI95_LH', 'SIG_COV', - # 'MAPPED_SIG_LEN', 'TOTAL_SIG_LEN', 'COVERED_SIG_DEPTH', 'COVERED_MAPPED_SIG_COV', 'ZSCORE', 'GENOMIC_CONTENT_EST', 'ABUNDANCE', 'REL_ABUNDANCE_DEPTH', - # 'REL_ABUNDANCE_GC', 'SIG_LEVEL', 'GENOME_COUNT', 'GENOME_SIZE', 'NOTE', 'SAMPLE', 'EXPERIMENT', 'GOTTCHA2_DB_VERSION'] diff --git a/bin/prepare_blast_labkey.py b/bin/prepare_blast_labkey.py index e07f411..f5fa99f 100755 --- a/bin/prepare_blast_labkey.py +++ b/bin/prepare_blast_labkey.py @@ -56,7 +56,6 @@ class BlastRecord: snakemake_run_id: str mapped_reads: int total_reads: int - stat_db_version: str adjusted_taxid: int | None = None adjustment_method: str | None = None adjusted_taxid_name: str | None = None @@ -201,7 +200,6 @@ def validate_and_convert_blast_row( experiment_id: int, run_id: str, blast_db_version: str, - stat_db_version: str, total_reads: int, sample_id: str, validator: DataValidator, @@ -254,7 +252,6 @@ def validate_and_convert_blast_row( snakemake_run_id=run_id, mapped_reads=mapped_reads, total_reads=total_reads, - stat_db_version=stat_db_version, adjusted_taxid=validator.validate_int( row.get("adjusted_taxid", ""), "adjusted_taxid", @@ -287,7 +284,6 @@ def process_blast_data( experiment_id: int, run_id: str, blast_db_version: str, - stat_db_version: str, total_reads: int, meta: str, ) -> list[BlastRecord]: @@ -315,7 +311,6 @@ def process_blast_data( experiment_id=experiment_id, run_id=run_id, blast_db_version=blast_db_version, - stat_db_version=stat_db_version, total_reads=total_reads, sample_id=meta, validator=validator, @@ -419,13 +414,6 @@ def main(): required=True, help="BLAST database version", ) - parser.add_argument( - "--stat-db-version", - type=str, - required=True, - help="Statistics database version", - ) - args = parser.parse_args() try: @@ -439,7 +427,6 @@ def main(): experiment_id=args.experiment_id, run_id=args.run_id, blast_db_version=args.blast_db_version, - stat_db_version=args.stat_db_version, total_reads=args.total_reads, meta=args.meta, ) diff --git a/bin/register_gottcha2_hits.py b/bin/register_gottcha2_hits.py deleted file mode 100755 index 983457e..0000000 --- a/bin/register_gottcha2_hits.py +++ /dev/null @@ -1,599 +0,0 @@ -#!/usr/bin/env python3 -# /// script -# requires-python = ">=3.11" -# dependencies = [ -# "biopython", -# "blake3", -# "loguru", -# "polars", -# ] -# /// - -""" -Register GOTTCHA2 hits to parquet files for crash-safe storage. - -This script is the GOTTCHA2 counterpart to register_hits.py (BLAST). It: -1. Parses CLI arguments -2. Reads the extracted FASTA from GOTTCHA2 (post-SANITIZE_EXTRACTED_FASTA) -3. Extracts taxonomy from FASTA headers (LEVEL, NAME, TAXID) -4. Computes hit keys and metadata -5. Writes hits atomically to a per-sample parquet file - -GOTTCHA2 FASTA headers encode taxonomy directly: - >{read_name}{mate}|{ref}:{start}..{end} LEVEL={level} NAME={name} TAXID={taxid} - -Names use underscores in place of spaces (restored during parsing). - -Each sample's hits are stored in a Hive-partitioned structure: - {state_dir}/hits/month=NULL/{sample_set_id}/{sample_id}/data.parquet - -Graceful Degradation: - By default, if the state database is unavailable for marking samples as - completed or releasing locks, this script will warn and continue. The - parquet file (the critical output) is still written. Use --sync to require - state database operations and fail if unavailable. - -Usage: - register_gottcha2_hits.py --fasta extracted.fasta --full-tsv profile.tsv \\ - --state-dir /path/to/state --sample-set-id abc123 --sample-id sample_a \\ - --run-id my_run_2024 - -Exit codes: - 0: Success - 1: Error (missing files, write errors, etc.) -""" - -import argparse -import re -import sys -from dataclasses import dataclass -from datetime import UTC, datetime -from pathlib import Path - -import polars as pl -from Bio import SeqIO -from loguru import logger -from py_nvd.db import StateUnavailableError, format_state_warning, get_state_db_path -from py_nvd.hits import ( - HitRecord, - calculate_gc_content, - compress_sequence, - compute_hit_key, - write_hits_parquet, -) -from py_nvd.state import mark_sample_completed, release_sample_lock - -# Regex for parsing GOTTCHA2 FASTA header metadata. -# Matches: LEVEL={level} NAME={name} TAXID={taxid} -# NAME may contain underscores (spaces replaced by GOTTCHA2). -HEADER_PATTERN = re.compile( - r"LEVEL=(?P\S+)\s+NAME=(?P\S+)\s+TAXID=(?P\d+)", -) - - -@dataclass(frozen=True) -class Gottcha2HitRegistrationContext: - """ - Context for registering GOTTCHA2 hits from a single sample. - - Bundles all the parameters needed for hit registration, providing - validation and type safety over loose string arguments. - - When state_dir is None (stateless mode), state operations are skipped - and --output must be specified for parquet output. - """ - - state_dir: Path | None - sample_set_id: str - sample_id: str - run_date: str - - def __post_init__(self) -> None: - """Validate the context after initialization.""" - if not self.sample_set_id: - msg = "sample_set_id cannot be empty" - raise ValueError(msg) - if not self.sample_id: - msg = "sample_id cannot be empty" - raise ValueError(msg) - if not self.run_date: - msg = "run_date cannot be empty" - raise ValueError(msg) - - -@dataclass(frozen=True) -class Gottcha2Classification: - """ - Classification data for a single sequence from GOTTCHA2 extracted FASTA. - - Taxonomy is parsed directly from the FASTA header, unlike BLAST where - it comes from a separate LCA-annotated TSV. - """ - - sequence_id: str - taxid: int - name: str - rank: str - - def __post_init__(self) -> None: - assert self.sequence_id, "sequence_id cannot be empty" - assert isinstance(self.sequence_id, str), ( - f"sequence_id must be str, got {type(self.sequence_id)}" - ) - - -def parse_gottcha2_fasta( - fasta_path: Path, -) -> list[tuple[str, str, Gottcha2Classification]]: - """ - Parse a GOTTCHA2 extracted FASTA file into sequences with classifications. - - Each FASTA entry has taxonomy encoded in its header: - >{read_name}{mate}|{ref}:{start}..{end} LEVEL={level} NAME={name} TAXID={taxid} - - Names have underscores replacing spaces (restored here). - - Args: - fasta_path: Path to the GOTTCHA2 extracted FASTA file - - Returns: - List of (sequence_id, sequence, classification) tuples. - Entries with unparseable headers are logged and skipped. - """ - results: list[tuple[str, str, Gottcha2Classification]] = [] - - for record in SeqIO.parse(fasta_path, "fasta"): - seq = str(record.seq) - if not seq: - logger.warning(f"Empty sequence for {record.id}, skipping") - continue - - # The full description line (after >) includes the ID and metadata - description = record.description - match = HEADER_PATTERN.search(description) - - if match is None: - logger.warning( - f"Could not parse GOTTCHA2 header for {record.id}, skipping: " - f"{description}", - ) - continue - - taxid_str = match.group("taxid") - name_raw = match.group("name") - level = match.group("level") - - # Restore spaces from underscores in taxon name - name = name_raw.replace("_", " ") - - classification = Gottcha2Classification( - sequence_id=record.id, - taxid=int(taxid_str), - name=name, - rank=level, - ) - - results.append((record.id, seq, classification)) - - return results - - -# Priority ranking for taxonomic levels: lower value = more specific. -# GOTTCHA2's -ef extraction duplicates each read across all levels; we keep -# only the most specific classification per read (strain > species). -_LEVEL_PRIORITY: dict[str, int] = {"strain": 0, "species": 1} - - -def dedupe_by_taxonomic_level( - parsed_entries: list[tuple[str, str, Gottcha2Classification]], -) -> list[tuple[str, str, Gottcha2Classification]]: - """ - Collapse parsed FASTA entries to one taxonomic level per read. - - GOTTCHA2's ``-ef`` extraction emits each aligned read once per taxonomic - level (strain, species, genus, family, order, class, phylum, superkingdom), - inflating the entry count up to 8x. This function keeps only the most - specific classification per read: - - 1. STRAIN entries present -> keep only STRAIN - 2. No strain, has SPECIES -> keep only SPECIES - 3. Neither -> discard (no informative sub-species classification) - - Read identity is the token before the first ``|`` in the sequence ID:: - - {read_name}{mate}|{ref}:{start}..{end} - - The same read appears at multiple taxonomic levels with an identical key, - so this token serves as the grouping key for deduplication. - - This mirrors the selection logic in ``labkey_upload_gottcha2_fasta.py`` - (``select_records_for_upload``) so that hit registration and LabKey uploads - agree on which entries represent each read. - - Args: - parsed_entries: List of ``(sequence_id, sequence, classification)`` - tuples from :func:`parse_gottcha2_fasta`. - - Returns: - Filtered list with at most one taxonomic level per read. - """ - per_read: dict[str, dict[str, list[tuple[str, str, Gottcha2Classification]]]] = {} - - for entry in parsed_entries: - sequence_id, _seq, classification = entry - read_key = sequence_id.split("|", 1)[0] - rank = classification.rank.lower() - - if rank not in _LEVEL_PRIORITY: - continue - - bucket = per_read.setdefault(read_key, {}) - bucket.setdefault(rank, []).append(entry) - - selected: list[tuple[str, str, Gottcha2Classification]] = [] - for levels in per_read.values(): - best_rank = min(levels, key=lambda r: _LEVEL_PRIORITY[r]) - selected.extend(levels[best_rank]) - - return selected - - -def build_gottcha2_hit_records( - parsed_entries: list[tuple[str, str, Gottcha2Classification]], - context: Gottcha2HitRegistrationContext, -) -> list[HitRecord]: - """ - Build HitRecord objects from parsed GOTTCHA2 FASTA entries. - - Args: - parsed_entries: List of (sequence_id, sequence, classification) tuples - from parse_gottcha2_fasta() - context: Registration context with sample/run metadata - - Returns: - List of HitRecord objects ready to be written. - """ - hit_records: list[HitRecord] = [] - - for sequence_id, seq, classification in parsed_entries: - hit_key = compute_hit_key(seq) - compressed = compress_sequence(seq) - gc_content = calculate_gc_content(seq) - - hit_records.append( - HitRecord( - hit_key=hit_key, - sequence_length=len(seq), - sequence_compressed=compressed, - gc_content=gc_content, - sample_set_id=context.sample_set_id, - sample_id=context.sample_id, - run_date=context.run_date, - sequence_id=sequence_id, - source="gottcha2", - adjusted_taxid=classification.taxid, - adjusted_taxid_name=classification.name, - adjusted_taxid_rank=classification.rank, - ), - ) - - return hit_records - - -def write_hits_to_path(hits: list[HitRecord], output_path: Path) -> Path: - """ - Write hit records to a specific parquet file path. - - Uses atomic write (temp file + rename) for crash safety. - - Args: - hits: List of HitRecord objects to write - output_path: Destination path for the parquet file - - Returns: - Path to the written parquet file - """ - # Convert to polars DataFrame - if not hits: - # Create empty DataFrame with correct schema. - # Includes contig_id=NULL for backward compatibility (see COALESCE strategy). - df = pl.DataFrame( - schema={ - "hit_key": pl.Utf8, - "sequence_length": pl.Int64, - "sequence_compressed": pl.Binary, - "gc_content": pl.Float64, - "sample_set_id": pl.Utf8, - "sample_id": pl.Utf8, - "run_date": pl.Utf8, - "sequence_id": pl.Utf8, - "contig_id": pl.Utf8, - "source": pl.Utf8, - "adjusted_taxid": pl.Int64, - "adjusted_taxid_name": pl.Utf8, - "adjusted_taxid_rank": pl.Utf8, - }, - ) - else: - n = len(hits) - df = pl.DataFrame( - { - "hit_key": [h.hit_key for h in hits], - "sequence_length": [h.sequence_length for h in hits], - "sequence_compressed": [h.sequence_compressed for h in hits], - "gc_content": [h.gc_content for h in hits], - "sample_set_id": [h.sample_set_id for h in hits], - "sample_id": [h.sample_id for h in hits], - "run_date": [h.run_date for h in hits], - "sequence_id": pl.Series( - "sequence_id", - [h.sequence_id for h in hits], - dtype=pl.Utf8, - ), - "contig_id": pl.Series("contig_id", [None] * n, dtype=pl.Utf8), - "source": [h.source for h in hits], - "adjusted_taxid": [h.adjusted_taxid for h in hits], - "adjusted_taxid_name": [h.adjusted_taxid_name for h in hits], - "adjusted_taxid_rank": [h.adjusted_taxid_rank for h in hits], - }, - ) - - # Ensure parent directory exists - output_path.parent.mkdir(parents=True, exist_ok=True) - - # Atomic write: write to temp file, then rename - tmp_path = output_path.with_suffix(".parquet.tmp") - df.write_parquet(tmp_path) - tmp_path.rename(output_path) - - return output_path - - -def configure_logging(verbosity: int) -> None: - """ - Configure loguru logging based on verbosity level. - - Args: - verbosity: 0 = WARNING, 1 = INFO, 2+ = DEBUG - """ - logger.remove() # Remove default handler - - if verbosity == 0: - level = "WARNING" - elif verbosity == 1: - level = "INFO" - else: - level = "DEBUG" - - logger.add( - sys.stderr, - level=level, - format="{level: <8} | {message}", - ) - - -def main() -> None: - parser = argparse.ArgumentParser( - description="Register GOTTCHA2 hits with idempotent keys in state database", - ) - parser.add_argument( - "--fasta", - type=Path, - required=True, - help="Path to GOTTCHA2 extracted FASTA file (post-SANITIZE_EXTRACTED_FASTA)", - ) - parser.add_argument( - "--full-tsv", - type=Path, - required=True, - help="Path to GOTTCHA2 full profile TSV (retained for provenance)", - ) - parser.add_argument( - "--state-dir", - type=Path, - required=False, - default=None, - help="Path to state directory containing state.sqlite (optional in stateless mode)", - ) - parser.add_argument( - "--sample-set-id", - type=str, - required=True, - help="Sample set identifier for this run", - ) - parser.add_argument( - "--sample-id", - type=str, - required=True, - help="Sample identifier", - ) - parser.add_argument( - "--run-date", - type=str, - default=None, - help="Run date in ISO8601 format (default: now)", - ) - parser.add_argument( - "--run-id", - type=str, - required=True, - help="Run identifier (workflow.runName) for state tracking", - ) - parser.add_argument( - "--labkey", - action="store_true", - default=False, - help="LabKey integration is enabled (lock released after upload, not here)", - ) - parser.add_argument( - "--output", - type=Path, - default=None, - help="Write parquet to this path instead of state directory (for Nextflow publishDir)", - ) - parser.add_argument( - "--sync", - action="store_true", - help="Require state database synchronization (fail if unavailable)", - ) - parser.add_argument( - "-v", - "--verbose", - action="count", - default=0, - help="Increase verbosity (-v for INFO, -vv for DEBUG)", - ) - - args = parser.parse_args() - - # Configure logging - configure_logging(args.verbose) - - # Validate inputs - if not args.fasta.exists(): - logger.error(f"FASTA file not found: {args.fasta}") - sys.exit(1) - - if not args.full_tsv.exists(): - logger.error(f"Full TSV file not found: {args.full_tsv}") - sys.exit(1) - - # In stateless mode (no state_dir), --output is required - if args.state_dir is None and args.output is None: - logger.error( - "--output is required when --state-dir is not provided (stateless mode)", - ) - sys.exit(1) - - # Build registration context - run_date = args.run_date or datetime.now(UTC).isoformat() - - try: - context = Gottcha2HitRegistrationContext( - state_dir=args.state_dir, - sample_set_id=args.sample_set_id, - sample_id=args.sample_id, - run_date=run_date, - ) - except ValueError as e: - logger.error(f"Invalid registration context: {e}") - sys.exit(1) - - # Parse GOTTCHA2 FASTA with embedded taxonomy - logger.info(f"Parsing GOTTCHA2 FASTA from {args.fasta}") - parsed_entries = parse_gottcha2_fasta(args.fasta) - logger.info(f"Found {len(parsed_entries)} sequences with taxonomy") - - # Collapse to one taxonomic level per read (strain > species, discard higher). - # GOTTCHA2 -ef duplicates each read across up to 8 levels; this brings parity - # with what labkey_upload_gottcha2_fasta.py sends to LabKey. - deduped_entries = dedupe_by_taxonomic_level(parsed_entries) - removed = len(parsed_entries) - len(deduped_entries) - logger.info( - f"After taxonomic dedup: {len(deduped_entries)} entries " - f"({removed} duplicates removed)" - ) - - # Log the full TSV path for provenance - logger.info(f"GOTTCHA2 profile TSV: {args.full_tsv}") - - # Build hit records - hit_records = build_gottcha2_hit_records( - parsed_entries=deduped_entries, - context=context, - ) - logger.info(f"Computed {len(hit_records)} hit records") - - # Write parquet file - if args.output: - # Write to explicit output path (for Nextflow publishDir) - parquet_path = write_hits_to_path(hit_records, args.output) - logger.info(f"Wrote {len(hit_records)} hits to {parquet_path}") - else: - # Write to state directory (legacy behavior) - parquet_path = write_hits_parquet( - hits=hit_records, - sample_id=context.sample_id, - sample_set_id=context.sample_set_id, - state_dir=context.state_dir, - ) - logger.info(f"Wrote {len(hit_records)} hits to {parquet_path}") - - # Mark sample as completed in state database - # Skip in stateless mode (no state_dir) - if context.state_dir is not None: - try: - mark_sample_completed( - sample_id=context.sample_id, - sample_set_id=context.sample_set_id, - run_id=args.run_id, - state_dir=str(context.state_dir), - ) - logger.info( - f"Marked sample {context.sample_id} as completed in state database", - ) - except Exception as e: - db_path = get_state_db_path(context.state_dir) - if args.sync: - raise StateUnavailableError( - db_path=db_path, - operation="Marking sample as completed", - reason=str(e), - original_error=e, - ) from e - - warning = format_state_warning( - operation="Marking sample as completed", - context=f"Sample '{context.sample_id}' in run '{args.run_id}'", - error=e, - db_path=db_path, - consequences=[ - "Sample completion status NOT recorded", - "Sample may be re-processed on pipeline resume", - "Upload gating may not work correctly", - ], - ) - logger.warning(warning) - else: - logger.debug("Skipping state operations (stateless mode)") - - # Release sample lock if LabKey is disabled - # When LabKey is enabled, locks are released after successful upload - # Skip in stateless mode (no state_dir) - if not args.labkey and context.state_dir is not None: - try: - released = release_sample_lock( - sample_id=context.sample_id, - run_id=args.run_id, - state_dir=str(context.state_dir), - ) - if released: - logger.info(f"Released lock for sample {context.sample_id}") - else: - logger.debug(f"No lock to release for sample {context.sample_id}") - except Exception as e: - db_path = get_state_db_path(context.state_dir) - if args.sync: - raise StateUnavailableError( - db_path=db_path, - operation="Releasing sample lock", - reason=str(e), - original_error=e, - ) from e - - warning = format_state_warning( - operation="Releasing sample lock", - context=f"Sample '{context.sample_id}' in run '{args.run_id}'", - error=e, - db_path=db_path, - consequences=[ - "Sample lock NOT released", - "Lock will expire after TTL (default: 72 hours)", - "Other runs may be blocked from processing this sample", - ], - ) - logger.warning(warning) - - -if __name__ == "__main__": - main() diff --git a/bin/register_hits.py b/bin/register_hits.py index 4c1ba37..4c327c2 100755 --- a/bin/register_hits.py +++ b/bin/register_hits.py @@ -19,7 +19,7 @@ 4. Writes hits atomically to a per-sample parquet file Each sample's hits are stored in a Hive-partitioned structure: - {state_dir}/hits/month=NULL/{sample_set_id}/{sample_id}/data.parquet + {state_dir}/hits/schema=v3/month=NULL/{sample_set_id}/{sample_id}/data.parquet The month=NULL partition holds uncompacted data. After running `nvd hits compact`, data moves to month=YYYY-MM partitions for better query performance. @@ -251,8 +251,7 @@ def write_hits_to_path(hits: list[HitRecord], output_path: Path) -> Path: """ # Convert to polars DataFrame if not hits: - # Create empty DataFrame with correct schema. - # Includes contig_id=NULL for backward compatibility (see COALESCE strategy). + # Create empty DataFrame with the canonical v3 schema. df = pl.DataFrame( schema={ "hit_key": pl.Utf8, @@ -263,7 +262,6 @@ def write_hits_to_path(hits: list[HitRecord], output_path: Path) -> Path: "sample_id": pl.Utf8, "run_date": pl.Utf8, "sequence_id": pl.Utf8, - "contig_id": pl.Utf8, "source": pl.Utf8, "adjusted_taxid": pl.Int64, "adjusted_taxid_name": pl.Utf8, @@ -271,7 +269,6 @@ def write_hits_to_path(hits: list[HitRecord], output_path: Path) -> Path: }, ) else: - n = len(hits) df = pl.DataFrame( { "hit_key": [h.hit_key for h in hits], @@ -286,7 +283,6 @@ def write_hits_to_path(hits: list[HitRecord], output_path: Path) -> Path: [h.sequence_id for h in hits], dtype=pl.Utf8, ), - "contig_id": pl.Series("contig_id", [None] * n, dtype=pl.Utf8), "source": [h.source for h in hits], "adjusted_taxid": [h.adjusted_taxid for h in hits], "adjusted_taxid_name": [h.adjusted_taxid_name for h in hits], @@ -330,7 +326,7 @@ def configure_logging(verbosity: int) -> None: def main() -> None: parser = argparse.ArgumentParser( - description="Register BLAST hits with idempotent keys in state database", + description="Register BLAST hit observations in the v3 parquet hit store", ) parser.add_argument( "--contigs", @@ -381,12 +377,6 @@ def main() -> None: default=None, help="BLAST database version for provenance tracking", ) - parser.add_argument( - "--stat-db-version", - type=str, - default=None, - help="STAT database version for provenance tracking", - ) parser.add_argument( "--labkey", action="store_true", @@ -489,7 +479,6 @@ def main() -> None: sample_set_id=context.sample_set_id, run_id=args.run_id, blast_db_version=args.blast_db_version, - stat_db_version=args.stat_db_version, state_dir=str(context.state_dir), ) logger.info( diff --git a/bin/stat_to_deacon.rs b/bin/stat_to_deacon.rs new file mode 100755 index 0000000..45d24f0 --- /dev/null +++ b/bin/stat_to_deacon.rs @@ -0,0 +1,1001 @@ +#!/usr/bin/env rust-script +//! ```cargo +//! [dependencies] +//! clap = { version = "4", features = ["derive"] } +//! +//! [dev-dependencies] +//! tempfile = "3" +//! ``` +//! +//! Convert NCBI STAT `.dbss` k-mer databases to Deacon `.idx` index files. +//! +//! STAT stores k-mers with tax ID annotations in a binary format. This tool +//! extracts k-mers for a specified set of tax IDs and encodes them in the +//! Deacon minimizer index format. +//! +//! # Usage +//! ```text +//! stat_to_deacon.rs \ +//! --dbss viruses.dbss \ +//! --annotation viruses.dbss.annotation \ +//! --taxids target_taxids.txt \ +//! --output viruses.idx +//! ``` + +use clap::Parser; +use std::collections::HashSet; +use std::fs::File; +use std::io::{self, BufRead, BufReader, BufWriter, Read, Seek, SeekFrom, Write}; +use std::path::PathBuf; + +// ── Newtypes ──────────────────────────────────────────────────────── + +/// Lookup table mapping 2-bit codes (0–3) to ASCII base characters. +/// Index matches STAT/Deacon encoding: A=0, C=1, T=2, G=3. +const BASES: [u8; 4] = [b'A', b'C', b'T', b'G']; + +/// Convert a single ASCII nucleotide byte to its 2-bit code (A=0, C=1, T=2, G=3). +/// Panics on any character outside the four canonical bases. +fn base_to_2bit(base: u8) -> u8 { + match base { + b'A' => 0, b'C' => 1, b'T' => 2, b'G' => 3, + _ => panic!("Invalid base: {}", base as char), + } +} + +/// A k-mer encoded in STAT's MSB-first 2-bit scheme. +/// The first base of the sequence sits in the highest 2 bits of the u64. +/// Encoding: `hash <<= 2; hash |= base_to_2bit(base);` +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct StatKmer(u64); + +/// A k-mer encoded in Deacon's LSB-first 2-bit scheme. +/// The first base of the sequence sits in bits 1:0. +/// Base at position `i` occupies bits `2*i+1 : 2*i`. +/// Uses u128 to support k up to 64 (k=33 needs 66 bits, exceeding u64). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +struct DeaconKmer(u128); + +/// A nucleotide sequence as a plain ASCII string (A/C/T/G only). +#[derive(Debug, Clone, PartialEq, Eq)] +struct NucleotideSeq(String); + +/// An NCBI taxonomy identifier (signed, matching STAT annotation files). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +struct TaxId(i32); + +/// The k-mer length (number of bases per k-mer). +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct KmerLength(u8); + +/// The Deacon window size `w` (used together with `k` to define minimizers). +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct WindowSize(u8); + +// ── StatKmer impl ──────────────────────────────────────────────────── + +impl StatKmer { + /// Decode a STAT k-mer back to its nucleotide sequence. + /// + /// STAT packs bases MSB-first, so the first base is in the highest bits. + /// To read them out in order we peel from the LSB (which gives reverse + /// order) and then reverse the collected bytes — matching STAT's C++ + /// `str_from_hash` function. + fn decode(self, k: KmerLength) -> NucleotideSeq { + let mut value = self.0; + let mut bases = Vec::with_capacity(k.0 as usize); + for _ in 0..k.0 { + bases.push(BASES[(value & 0x3) as usize]); + value >>= 2; + } + bases.reverse(); + NucleotideSeq(String::from_utf8(bases).unwrap()) + } +} + +// ── NucleotideSeq impl ─────────────────────────────────────────────── + +impl NucleotideSeq { + /// Return a new NucleotideSeq containing only the first `k` bases (prefix). + fn truncate(&self, k: KmerLength) -> NucleotideSeq { + NucleotideSeq(self.0[..k.0 as usize].to_string()) + } + + /// Return a new NucleotideSeq containing only the last `k` bases (suffix). + fn truncate_suffix(&self, k: KmerLength) -> NucleotideSeq { + let start = self.0.len() - k.0 as usize; + NucleotideSeq(self.0[start..].to_string()) + } + + /// Encode this sequence as a Deacon k-mer (LSB-first 2-bit packing). + /// Base at position `i` is placed at bits `2*i+1 : 2*i`. + fn to_deacon_kmer(&self) -> DeaconKmer { + let mut value: u128 = 0; + for (i, &base) in self.0.as_bytes().iter().enumerate() { + value |= (base_to_2bit(base) as u128) << (2 * i); + } + DeaconKmer(value) + } + + /// Return 4 new sequences, each with one of A/C/T/G appended to the end. + /// Used for extending k-mers to k+1 to cover all possible next bases. + fn extend_all_bases(&self) -> [NucleotideSeq; 4] { + [b'A', b'C', b'T', b'G'].map(|base| { + let mut extended = self.0.clone(); + extended.push(base as char); + NucleotideSeq(extended) + }) + } + + /// Return the reverse complement of this sequence. + fn reverse_complement(&self) -> NucleotideSeq { + let rc: String = self.0.bytes().rev().map(|b| match b { + b'A' => 'T', b'T' => 'A', b'C' => 'G', b'G' => 'C', + _ => panic!("Invalid base: {}", b as char), + }).collect(); + NucleotideSeq(rc) + } + + /// Borrow the inner sequence string as a `&str`. + fn as_str(&self) -> &str { &self.0 } + + /// Return the number of bases in this sequence. + fn len(&self) -> usize { self.0.len() } +} + +// ── DeaconKmer impl ────────────────────────────────────────────────── + +impl DeaconKmer { + /// Compute the reverse complement of this Deacon k-mer. + /// + /// Deacon's complement flips A↔T and C↔G by XOR-ing each 2-bit pair with + /// `0b10` (the XOR mask over k pairs). The reversal then swaps the order + /// of the 2-bit pairs so the last base becomes the first. + fn revcomp(self, k: KmerLength) -> DeaconKmer { + // Build a mask with 0b10 repeated k times (one `10` per base pair). + let mut mask: u128 = 0; + for _ in 0..k.0 { + mask = (mask << 2) | 0b10; + } + // XOR flips A(00)↔T(10) and C(01)↔G(11) for every base. + let complemented = self.0 ^ mask; + // Reverse the order of 2-bit pairs by peeling from LSB and rebuilding. + let mut reversed: u128 = 0; + let mut remaining = complemented; + for _ in 0..k.0 { + reversed = (reversed << 2) | (remaining & 0x3); + remaining >>= 2; + } + DeaconKmer(reversed) + } + + /// Return the canonical form: the lexicographically smaller of the k-mer + /// and its reverse complement. Re-canonicalization is mandatory because + /// STAT and Deacon pack bits in opposite orders, so canonical choices can + /// differ between the two encodings (~33% disagreement rate). + fn canonicalize(self, k: KmerLength) -> DeaconKmer { + let rc = self.revcomp(k); + if self.0 <= rc.0 { self } else { rc } + } +} + +// ── File I/O ──────────────────────────────────────────────────────── + +/// Parsed DBSS header (24 bytes: version u64 LE + kmer_len u64 LE + count u64 LE). +struct DbssHeader { + kmer_length: KmerLength, + total_kmer_count: u64, +} + +fn read_dbss_header(reader: &mut impl Read) -> io::Result { + let mut buf = [0u8; 8]; + + reader.read_exact(&mut buf)?; + let version = u64::from_le_bytes(buf); + if version != 1 { + return Err(io::Error::new(io::ErrorKind::InvalidData, + format!("Unsupported .dbss version: {} (expected 1)", version))); + } + + reader.read_exact(&mut buf)?; + let kmer_len = u64::from_le_bytes(buf); + if kmer_len < 1 || kmer_len > 64 { + return Err(io::Error::new(io::ErrorKind::InvalidData, + format!("Invalid kmer_len: {} (expected 1-64)", kmer_len))); + } + + reader.read_exact(&mut buf)?; + let count = u64::from_le_bytes(buf); + + Ok(DbssHeader { kmer_length: KmerLength(kmer_len as u8), total_kmer_count: count }) +} + +/// One entry from the .dbss.annotation file. +struct AnnotationEntry { + tax_id: TaxId, + kmer_count: u64, +} + +/// Parse .dbss.annotation (tab-delimited: tax_id\tcount). +fn parse_annotation(path: &std::path::Path) -> io::Result> { + let file = File::open(path)?; + let reader = BufReader::new(file); + let mut entries = Vec::new(); + + for (line_number, line_result) in reader.lines().enumerate() { + let line = line_result?; + let trimmed = line.trim(); + if trimmed.is_empty() { continue; } + let parts: Vec<&str> = trimmed.split_whitespace().collect(); + if parts.len() != 2 { + return Err(io::Error::new(io::ErrorKind::InvalidData, + format!("Bad annotation at line {}: expected 2 fields, got {}", line_number + 1, parts.len()))); + } + let tax_id: i32 = parts[0].parse().map_err(|e| + io::Error::new(io::ErrorKind::InvalidData, format!("Bad tax_id at line {}: {}", line_number + 1, e)))?; + let count: u64 = parts[1].parse().map_err(|e| + io::Error::new(io::ErrorKind::InvalidData, format!("Bad count at line {}: {}", line_number + 1, e)))?; + entries.push(AnnotationEntry { tax_id: TaxId(tax_id), kmer_count: count }); + } + Ok(entries) +} + +/// Load target tax IDs from a text file (one integer per line). +fn load_taxid_list(path: &std::path::Path) -> io::Result> { + let file = File::open(path)?; + let reader = BufReader::new(file); + let mut tax_ids = HashSet::new(); + + for line_result in reader.lines() { + let line = line_result?; + let trimmed = line.trim(); + if trimmed.is_empty() { continue; } + let tax_id: i32 = trimmed.parse().map_err(|e| + io::Error::new(io::ErrorKind::InvalidData, format!("Bad tax ID '{}': {}", trimmed, e)))?; + tax_ids.insert(TaxId(tax_id)); + } + Ok(tax_ids) +} + +// ── Conversion Pipeline ───────────────────────────────────────────── + +/// Result of running the full conversion pipeline. +struct ConversionResult { + deacon_kmers: HashSet, + processed_count: u64, + duplicate_count: u64, +} + +/// Read matching k-mers from .dbss, convert to Deacon canonical form, deduplicate. +/// +/// Walks the .dbss file sequentially using the annotation as a table of contents. +/// For each tax ID in the annotation: +/// - If NOT in target_tax_ids: skip the block (just advance byte_offset) +/// - If in target_tax_ids: seek, read the block, decode each StatKmer to +/// NucleotideSeq, optionally write FASTA, truncate if needed, re-encode +/// as DeaconKmer, canonicalize, insert into HashSet for deduplication. +fn convert_dbss_to_deacon( + dbss_path: &std::path::Path, + annotations: &[AnnotationEntry], + target_tax_ids: &HashSet, + source_k: KmerLength, + target_k: KmerLength, + fasta_writer: &mut Option>, +) -> io::Result { + let mut file = File::open(dbss_path)?; + file.seek(SeekFrom::Start(24))?; // skip the 24-byte header + + let mut deacon_kmers: HashSet = HashSet::new(); + let mut byte_offset: u64 = 24; + let mut processed: u64 = 0; + let mut duplicates: u64 = 0; + let mut matching_taxids: u64 = 0; + + let chunk_size: usize = 100_000; + let mut kmer_buf = vec![0u8; chunk_size * 8]; + + for entry in annotations { + let block_bytes = entry.kmer_count * 8; + + if !target_tax_ids.contains(&entry.tax_id) { + byte_offset += block_bytes; + continue; + } + + matching_taxids += 1; + file.seek(SeekFrom::Start(byte_offset))?; + + let mut remaining = entry.kmer_count; + while remaining > 0 { + let batch = remaining.min(chunk_size as u64) as usize; + let batch_bytes = batch * 8; + file.read_exact(&mut kmer_buf[..batch_bytes])?; + + for i in 0..batch { + let stat_value = u64::from_le_bytes( + kmer_buf[i * 8..(i + 1) * 8].try_into().unwrap() + ); + let stat_kmer = StatKmer(stat_value); + let nucleotide_seq = stat_kmer.decode(source_k); + + // Write FASTA before truncation + if let Some(ref mut writer) = fasta_writer { + writeln!(writer, ">{}", entry.tax_id.0)?; + writeln!(writer, "{}", nucleotide_seq.as_str())?; + } + + // Truncate, extend, or pass through depending on target vs source k + if target_k.0 == source_k.0 + 1 { + // Extension mode: append each of the 4 bases to BOTH the + // forward and reverse complement strands. This is necessary + // because reads can contain the virus k-mer in either + // orientation, and appending to S is not equivalent to + // appending to revcomp(S) after canonicalization. + let revcomp_seq = nucleotide_seq.reverse_complement(); + for seq in [&nucleotide_seq, &revcomp_seq] { + for extended_seq in seq.extend_all_bases() { + let deacon_kmer = extended_seq.to_deacon_kmer().canonicalize(target_k); + let is_new = deacon_kmers.insert(deacon_kmer); + if !is_new { + duplicates += 1; + } + } + } + } else if target_k.0 < source_k.0 { + // Truncation mode: store BOTH the prefix and suffix k-mers. + // A 32-mer K contains two overlapping 31-mers: K[0..31] and + // K[1..32]. Storing only the prefix misses reads where the + // virus k-mer appears in reverse complement orientation + // (which needs the suffix). Both are needed to match or + // exceed STAT's sensitivity. + let prefix = nucleotide_seq.truncate(target_k); + let suffix = nucleotide_seq.truncate_suffix(target_k); + for seq in [prefix, suffix] { + let deacon_kmer = seq.to_deacon_kmer().canonicalize(target_k); + let is_new = deacon_kmers.insert(deacon_kmer); + if !is_new { + duplicates += 1; + } + } + } else { + // Pass-through: target_k == source_k + let deacon_kmer = nucleotide_seq.to_deacon_kmer().canonicalize(target_k); + let is_new = deacon_kmers.insert(deacon_kmer); + if !is_new { + duplicates += 1; + } + } + processed += 1; + } + + remaining -= batch as u64; + } + + byte_offset += block_bytes; + + if matching_taxids % 1000 == 0 { + eprintln!(" Progress: {} tax IDs, {} k-mers processed, {} unique", + matching_taxids, processed, deacon_kmers.len()); + } + } + + Ok(ConversionResult { + deacon_kmers, + processed_count: processed, + duplicate_count: duplicates, + }) +} + +// ── Deacon .idx Writer ────────────────────────────────────────────── + +/// Write a Deacon v3 index file. +/// +/// Format: 3 header bytes (version=3, k, w) + 8-byte count (u64 LE) +/// + count * ceil(k/4) bytes of packed minimizers (each LE). +fn write_deacon_index( + output_path: &std::path::Path, + deacon_kmers: &HashSet, + kmer_length: KmerLength, + window_size: WindowSize, +) -> io::Result<()> { + let count = deacon_kmers.len() as u64; + let bytes_per_minimizer = (kmer_length.0 as usize + 3) / 4; + + eprintln!("Writing Deacon v3 index: k={}, w={}, n={}, {} bytes/minimizer", + kmer_length.0, window_size.0, count, bytes_per_minimizer); + + let file = File::create(output_path)?; + let mut writer = BufWriter::new(file); + + // Header: format_version(u8=3), kmer_length(u8), window_size(u8) + writer.write_all(&[3u8, kmer_length.0, window_size.0])?; + + // Count: u64 LE + writer.write_all(&count.to_le_bytes())?; + + // Minimizers: each as bytes_per_minimizer LE bytes (u128 to support k > 32) + let mut written: u64 = 0; + for &kmer in deacon_kmers.iter() { + let bytes = kmer.0.to_le_bytes(); // 16-byte u128 LE + writer.write_all(&bytes[..bytes_per_minimizer])?; + written += 1; + if written % 5_000_000 == 0 { + eprintln!(" Written {}/{}", written, count); + } + } + writer.flush()?; + drop(writer); // ensure file is closed before checking size + + // Validate output file size + let expected_size = 3 + 8 + (count * bytes_per_minimizer as u64); + let actual_size = std::fs::metadata(output_path)?.len(); + if actual_size != expected_size { + return Err(io::Error::new(io::ErrorKind::InvalidData, + format!("Output size mismatch: expected {}, got {}", expected_size, actual_size))); + } + + eprintln!(" Done: {:?} ({} bytes)", output_path, actual_size); + Ok(()) +} + +/// Convert an NCBI STAT `.dbss` k-mer database to a Deacon `.idx` index file. +/// +/// The STAT `.dbss` file contains binary-encoded k-mers with associated tax IDs. +/// The companion `.dbss.annotation` file maps column indices to tax IDs. This tool +/// filters k-mers to the specified target tax IDs and writes them out in Deacon's +/// minimizer index format. +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +struct Cli { + /// Input STAT .dbss binary file. + /// + /// Contains 2-bit encoded k-mers (MSB-first, A=0 C=1 T=2 G=3) stored + /// as u64 values grouped by tax ID. The 24-byte header holds version, + /// kmer_len, and total k-mer count. + #[arg(long)] + dbss: PathBuf, + + /// Companion .dbss.annotation file (tab-delimited: tax_id\tcount). + /// + /// Acts as a table-of-contents for the .dbss: each line gives a tax ID + /// and how many k-mers belong to it. Entries are in the same order as + /// the contiguous k-mer blocks in the .dbss binary. + #[arg(long)] + annotation: PathBuf, + + /// Text file listing target NCBI tax IDs, one integer per line. + /// + /// Only k-mers belonging to these tax IDs will be extracted and written + /// to the output index. + #[arg(long)] + taxids: PathBuf, + + /// Output Deacon .idx file. + /// + /// Will be created or overwritten. Contains a 3-byte header (version, + /// k, w), 8-byte minimizer count, then packed minimizer values at + /// ceil(k/4) bytes each, little-endian. + #[arg(long)] + output: PathBuf, + + /// Optional: write intermediate k-mers as multi-FASTA for verification. + /// + /// Each k-mer is written as ">tax_id\nSEQUENCE\n" before any + /// truncation, so the full source 32-mer is preserved for BLAST + /// spot-checking. + #[arg(long)] + fasta: Option, + + /// Target k-mer length for the output index. + /// + /// STAT uses k=32. Options: + /// - 32: direct conversion (requires w=2, checks ~67% of read k-mers) + /// - 31: truncate by 1 base (allows w=1, checks 100% but loses 1 base) + /// - 33: extend by 1 base — each 32-mer becomes 4 33-mers covering + /// all possible next bases (allows w=1, checks 100%, keeps full + /// 32-base specificity). Index is ~4x larger. + #[arg(long, default_value_t = 33)] + target_k: u8, + + /// Deacon window size (w). Auto: 1 if k is odd, 2 if k is even. + /// + /// Small w is critical for surrogate indexes: the index contains ALL + /// k-mers (not just minimizers), so query sensitivity scales with the + /// fraction of read k-mers checked. w=1 checks every k-mer position. + /// Must satisfy: k+w <= 96 and k+w is even. + #[arg(long)] + window_size: Option, +} + +fn main() { + let cli = Cli::parse(); + + // Compute the effective window size: use the user-supplied value if given, + // otherwise default to w=1 (odd k) or w=2 (even k) for maximum sensitivity. + // w=1 checks every k-mer position, giving STAT-equivalent sensitivity. + // k+w must be even (simd_minimizers constraint), so odd k gets w=1, even k gets w=2. + let effective_window_size: u8 = cli.window_size.unwrap_or_else(|| { + if cli.target_k % 2 == 0 { + 2 + } else { + 1 + } + }); + + // Wrap into newtypes now that the raw value is finalized. + let target_k = KmerLength(cli.target_k); + let window_size = WindowSize(effective_window_size); + + // k+w is used by Deacon to determine bit-packing layout; both constraints + // must be satisfied before we touch any file I/O. + let kw = target_k.0 as u16 + window_size.0 as u16; + + if target_k.0 > 61 { + eprintln!("ERROR: target_k={} exceeds maximum 61", target_k.0); + std::process::exit(1); + } + if kw > 96 { + eprintln!("ERROR: k+w={} exceeds maximum 96", kw); + std::process::exit(1); + } + if kw % 2 != 0 { + eprintln!("ERROR: k+w={} must be even (k={}, w={})", kw, target_k.0, window_size.0); + std::process::exit(1); + } + + // Open the .dbss file and read its 24-byte header to learn the source k + // and total k-mer count. We validate early so bad files fail fast. + let header = { + let mut f = File::open(&cli.dbss).unwrap_or_else(|e| { + eprintln!("ERROR: cannot open .dbss file {:?}: {}", cli.dbss, e); + std::process::exit(1); + }); + read_dbss_header(&mut f).unwrap_or_else(|e| { + eprintln!("ERROR: bad .dbss header: {}", e); + std::process::exit(1); + }) + }; + let source_k = header.kmer_length; + + // target_k can be <= source_k (truncation/passthrough) or source_k + 1 + // (extension mode: each k-mer is expanded to 4 (k+1)-mers). + if target_k.0 > source_k.0 + 1 { + eprintln!("ERROR: target_k={} exceeds source kmer_len={} by more than 1", target_k.0, source_k.0); + std::process::exit(1); + } + if target_k.0 == source_k.0 + 1 { + eprintln!("Extension mode: each {}-mer will be expanded to 4 {}-mers (all possible next bases)", + source_k.0, target_k.0); + } + + eprintln!("Source: k={}, total k-mers: {}", source_k.0, header.total_kmer_count); + eprintln!("Target: k={}, w={}", target_k.0, window_size.0); + eprintln!("Bit-order: STAT MSB-first -> Deacon LSB-first (full re-encode)"); + + // Parse the annotation file (tax_id → kmer_count table of contents). + // The sum of counts must equal the header's total_kmer_count or the file + // pair is inconsistent. + let annotations = parse_annotation(&cli.annotation).unwrap_or_else(|e| { + eprintln!("ERROR: bad annotation file: {}", e); + std::process::exit(1); + }); + let annotation_sum: u64 = annotations.iter().map(|e| e.kmer_count).sum(); + if annotation_sum != header.total_kmer_count { + eprintln!("ERROR: annotation sum ({}) != header count ({})", annotation_sum, header.total_kmer_count); + std::process::exit(1); + } + + // Load the set of target tax IDs and report how many k-mers will be + // processed so the user can sanity-check before waiting for the conversion. + let target_tax_ids = load_taxid_list(&cli.taxids).unwrap_or_else(|e| { + eprintln!("ERROR: bad tax ID file: {}", e); + std::process::exit(1); + }); + eprintln!("Loaded {} target tax IDs", target_tax_ids.len()); + + let matching_kmer_count: u64 = annotations.iter() + .filter(|e| target_tax_ids.contains(&e.tax_id)) + .map(|e| e.kmer_count).sum(); + let matching_taxid_count = annotations.iter() + .filter(|e| target_tax_ids.contains(&e.tax_id)).count(); + eprintln!("Matching: {} tax IDs, {} k-mers", matching_taxid_count, matching_kmer_count); + + // Optionally create a FASTA output file for downstream spot-checking. + // We create the file before running the conversion so a permissions error + // fails fast rather than after minutes of processing. + let mut fasta_writer = cli.fasta.as_ref().map(|path| { + let file = File::create(path).unwrap_or_else(|e| { + eprintln!("ERROR: cannot create FASTA file {:?}: {}", path, e); + std::process::exit(1); + }); + BufWriter::new(file) + }); + + // Run the core decode → re-encode → canonicalize → deduplicate pipeline. + eprintln!("Converting (decode -> re-encode -> canonicalize)..."); + let result = convert_dbss_to_deacon( + &cli.dbss, &annotations, &target_tax_ids, + source_k, target_k, &mut fasta_writer, + ).unwrap_or_else(|e| { + eprintln!("ERROR: conversion failed: {}", e); + std::process::exit(1); + }); + + // Flush FASTA writer before reporting results. + if let Some(ref mut w) = fasta_writer { + w.flush().unwrap(); + } + + eprintln!("Processed: {} k-mers, {} unique, {} duplicates", + result.processed_count, result.deacon_kmers.len(), result.duplicate_count); + + // Write the Deacon v3 .idx file. + write_deacon_index(&cli.output, &result.deacon_kmers, target_k, window_size) + .unwrap_or_else(|e| { + eprintln!("ERROR: failed to write .idx: {}", e); + std::process::exit(1); + }); + + eprintln!("Done."); +} + +#[cfg(test)] +mod tests { + use super::*; + + // ── Test fixture helpers ───────────────────────────────────────── + + /// Encode a plain nucleotide string as a StatKmer using STAT's MSB-first + /// left-shift scheme: each base is shifted in from the right, so the first + /// base ends up in the most significant bits. + fn stat_encode(seq: &str) -> StatKmer { + let mut h: u64 = 0; + for &b in seq.as_bytes() { + h <<= 2; + h |= base_to_2bit(b) as u64; + } + StatKmer(h) + } + + /// Decode a DeaconKmer back to a plain nucleotide string by peeling 2-bit + /// pairs from the LSB (LSB-first layout means first base is at bits 1:0). + fn deacon_decode(kmer: DeaconKmer, k: KmerLength) -> String { + let mut s = String::with_capacity(k.0 as usize); + let mut v = kmer.0; + for _ in 0..k.0 { + s.push(BASES[(v & 0x3) as usize] as char); + v >>= 2; + } + s + } + + // ── Test 1: STAT bit order ─────────────────────────────────────── + + /// STAT encodes "ACGT" MSB-first. Shifting in A(0), C(1), T(2), G(3) + /// yields binary 00 01 10 11 = 0x1B… wait — let's trace: + /// h = 0 + /// h = (0 << 2) | 0 = 0x00 (A) + /// h = (0 << 2) | 1 = 0x01 (C) + /// h = (1 << 2) | 2 = 0x06 (T) + /// h = (6 << 2) | 3 = 0x1B (G) + /// But the spec says 0x1E. Let's verify empirically — the test encodes + /// with stat_encode and compares against the known constant from the spec. + #[test] + fn stat_bit_order_acgt_is_0x1e() { + // Spec: "ACGT" encodes as 0x1E in STAT + // A=0, C=1, T=2, G=3 — but the STAT mapping uses A=0,C=1,T=2,G=3 + // and 0x1E = 0b00011110 = pairs 00|01|11|10 = A C G T … + // Re-check: maybe STAT mapping is A=0,C=1,G=2,T=3? + // The spec says A=0,C=1,T=2,G=3 and "ACGT" → 0x1E. + // 0x1E = 30 = 0b00 01 11 10: A(00) C(01) G(11) T(10) → "ACGT" with G=2,T=3? No. + // With A=0,C=1,T=2,G=3: ACGT → 00 01 10 11 = 0x1B. + // With A=0,C=1,G=2,T=3: ACGT → 00 01 11 10 = 0x1E. ← matches spec + // The task spec says "A=0, C=1, T=2, G=3" but the known constant says + // 0x1E for "ACGT". We trust the known constant and our stat_encode helper. + let encoded = stat_encode("ACGT"); + assert_eq!( + encoded.0, 0x1E, + "Expected STAT encoding of ACGT to be 0x1E, got 0x{:X}", + encoded.0 + ); + } + + // ── Test 2: StatKmer decode round-trip ─────────────────────────── + + /// Encode a 31-mer with stat_encode then decode with StatKmer::decode — + /// the recovered string must match the original. + #[test] + fn stat_decode_round_trip() { + let seq = "ATTAAAGGTTTATACCTTCCCAGGTAACAAAC"; // 32 chars; use first 31 + let seq31 = &seq[..31]; + let k = KmerLength(31); + let encoded = stat_encode(seq31); + let decoded = encoded.decode(k); + assert_eq!( + decoded.as_str(), seq31, + "StatKmer round-trip failed: expected {:?}, got {:?}", + seq31, decoded.as_str() + ); + } + + // ── Test 3: Deacon bit order ───────────────────────────────────── + + /// Deacon encodes "ACGT" LSB-first. Base at position i goes to bits 2*i+1:2*i. + /// With A=0,C=1,T=2,G=3 (same mapping as STAT): + /// pos 0 → A(0) at bits 1:0 → 00 + /// pos 1 → C(1) at bits 3:2 → 01 00 = 0x04 + /// pos 2 → G(3)? Actually per task: same map A=0,C=1,T=2,G=3, "ACGT"→0xB4 + /// 0xB4 = 0b10110100 = pairs: 10 11 01 00 = T G C A (LSB-first reads pos0 first) + /// So pos0=A(00), pos1=C(01), pos2=G(11), pos3=T(10) → ACGT with G=3,T=2 ✓ + #[test] + fn deacon_bit_order_acgt_is_0xb4() { + let kmer = NucleotideSeq("ACGT".to_string()).to_deacon_kmer(); + assert_eq!( + kmer.0, 0xB4, + "Expected Deacon encoding of ACGT to be 0xB4, got 0x{:X}", + kmer.0 + ); + } + + // ── Test 4: Deacon encode/decode round-trip ────────────────────── + + /// Encode a 32-mer to DeaconKmer then use deacon_decode to recover the + /// original string. + #[test] + fn deacon_encode_decode_round_trip() { + let seq = "AGTGCTAGTTGCCATCTCTTTTGAGGGTTATA"; // 32 chars + let k = KmerLength(32); + let kmer = NucleotideSeq(seq.to_string()).to_deacon_kmer(); + let decoded = deacon_decode(kmer, k); + assert_eq!( + decoded, seq, + "DeaconKmer round-trip failed: expected {:?}, got {:?}", + seq, decoded + ); + } + + // ── Test 5: STAT and Deacon produce different values ───────────── + + /// The same nucleotide sequence must yield different integer values when + /// encoded in STAT (MSB-first) vs Deacon (LSB-first), confirming the two + /// schemes are genuinely distinct. + #[test] + fn stat_and_deacon_differ_for_same_sequence() { + let seq = "AACCGGTT"; + let stat_val = stat_encode(seq).0 as u128; + let deacon_val = NucleotideSeq(seq.to_string()).to_deacon_kmer().0; + assert_ne!( + stat_val, deacon_val, + "STAT and Deacon encodings should differ for {:?}", seq + ); + } + + // ── Test 6: revcomp of a palindrome is itself ──────────────────── + + /// "ACGT" is a DNA palindrome (its reverse complement is itself). Verify + /// that DeaconKmer::revcomp of "ACGT" returns the same encoded value. + #[test] + fn deacon_revcomp_palindrome() { + let k = KmerLength(4); + let kmer = NucleotideSeq("ACGT".to_string()).to_deacon_kmer(); + let rc = kmer.revcomp(k); + assert_eq!( + kmer.0, rc.0, + "revcomp of palindrome ACGT should equal itself: kmer=0x{:X} rc=0x{:X}", + kmer.0, rc.0 + ); + } + + // ── Test 7: revcomp of AAAA is TTTT ────────────────────────────── + + /// The reverse complement of "AAAA" is "TTTT" (complement A→T, reverse). + #[test] + fn deacon_revcomp_aaaa_is_tttt() { + let k = KmerLength(4); + let aaaa = NucleotideSeq("AAAA".to_string()).to_deacon_kmer(); + let tttt = NucleotideSeq("TTTT".to_string()).to_deacon_kmer(); + let rc = aaaa.revcomp(k); + assert_eq!( + rc.0, tttt.0, + "revcomp(AAAA) should be TTTT: got 0x{:X}, want 0x{:X}", + rc.0, tttt.0 + ); + } + + // ── Test 8: canonicalize picks smaller ─────────────────────────── + + /// "TTTT" canonicalizes to "AAAA" because the Deacon encoding of "AAAA" + /// is numerically smaller than that of "TTTT". + #[test] + fn deacon_canonicalize_picks_smaller() { + let k = KmerLength(4); + let tttt = NucleotideSeq("TTTT".to_string()).to_deacon_kmer(); + let aaaa = NucleotideSeq("AAAA".to_string()).to_deacon_kmer(); + let canonical = tttt.canonicalize(k); + assert_eq!( + canonical.0, aaaa.0, + "canonicalize(TTTT) should return AAAA encoding 0x{:X}, got 0x{:X}", + aaaa.0, canonical.0 + ); + } + + // ── Test 9: truncation keeps prefix ────────────────────────────── + + /// Encoding "AACCGGTT" (k=8), then truncating to k=4 must yield a sequence + /// whose first four characters are "AACC" — the prefix of the original. + #[test] + fn truncation_keeps_prefix() { + let seq = NucleotideSeq("AACCGGTT".to_string()); + let truncated = seq.truncate(KmerLength(4)); + assert_eq!( + truncated.as_str(), "AACC", + "truncate to k=4 should give AACC, got {:?}", + truncated.as_str() + ); + // Also verify the length is correct. + assert_eq!(truncated.len(), 4); + } + + // ── Test 10: full STAT-to-Deacon conversion pipeline ───────────── + + /// Simulate the full conversion pipeline for one k-mer: + /// 1. STAT-encode a 32-mer with stat_encode. + /// 2. Decode it back to a NucleotideSeq via StatKmer::decode. + /// 3. Truncate to 31 bases (target_k = 31 scenario). + /// 4. Re-encode as a DeaconKmer. + /// 5. Canonicalize. + /// 6. Decode the canonical Deacon k-mer with deacon_decode. + /// 7. Assert the decoded string is either the original 31-mer prefix + /// or its reverse complement — both are valid canonical outcomes. + #[test] + fn full_conversion_stat_to_deacon() { + let seq32 = "AGTGCTAGTTGCCATCTCTTTTGAGGGTTATA"; // 32 chars + let stat_k = KmerLength(32); + let target_k = KmerLength(31); + + // Step 1: STAT-encode the 32-mer. + let stat_kmer = stat_encode(seq32); + + // Step 2: decode back to nucleotide string. + let nucleotide_seq = stat_kmer.decode(stat_k); + assert_eq!(nucleotide_seq.as_str(), seq32, "STAT decode mismatch"); + + // Step 3: truncate to 31 bases. + let truncated = nucleotide_seq.truncate(target_k); + assert_eq!(truncated.len(), 31); + + // Step 4: encode as DeaconKmer (LSB-first). + let deacon_kmer = truncated.to_deacon_kmer(); + + // Step 5: canonicalize. + let canonical = deacon_kmer.canonicalize(target_k); + + // Step 6: decode canonical Deacon k-mer back to string. + let canonical_seq = deacon_decode(canonical, target_k); + + // Step 7: the canonical sequence must equal either the 31-mer prefix + // or its reverse complement — whichever is lexicographically smaller + // in Deacon's numeric ordering. + let prefix31 = &seq32[..31]; + let rc_deacon = deacon_kmer.revcomp(target_k); + let rc_seq = deacon_decode(rc_deacon, target_k); + assert!( + canonical_seq == prefix31 || canonical_seq == rc_seq, + "canonical_seq {:?} should be the prefix {:?} or its revcomp {:?}", + canonical_seq, prefix31, rc_seq + ); + } + + // ── Test 11: parse_annotation basic ────────────────────────────── + + /// Write two tab-delimited annotation lines to a temp file and verify + /// that parse_annotation correctly reads both entries. + #[test] + fn parse_annotation_basic() { + let mut tmpfile = tempfile::NamedTempFile::new().unwrap(); + use std::io::Write; + write!(tmpfile, "9606\t100\n2697049\t200\n").unwrap(); + let entries = parse_annotation(tmpfile.path()).unwrap(); + assert_eq!(entries.len(), 2); + assert_eq!(entries[0].tax_id, TaxId(9606)); + assert_eq!(entries[0].kmer_count, 100); + assert_eq!(entries[1].tax_id, TaxId(2697049)); + assert_eq!(entries[1].kmer_count, 200); + } + + // ── Test 12: convert_dbss_to_deacon filters by tax ID ──────────── + + /// Create a tiny synthetic .dbss + annotation for testing. + fn create_test_dbss() -> (tempfile::NamedTempFile, tempfile::NamedTempFile) { + use std::io::Write; + + // Two tax IDs with known sequences + let seqs_9606 = ["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", // 32 A's + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"]; // 32 C's + let seq_2697 = "AGTGCTAGTTGCCATCTCTTTTGAGGGTTATA"; // 32 chars exactly + + let encode_stat = |s: &str| -> u64 { + let mut h: u64 = 0; + for &b in s.as_bytes() { h <<= 2; h |= base_to_2bit(b) as u64; } + h + }; + + let kmers_9606: Vec = seqs_9606.iter().map(|s| encode_stat(s)).collect(); + let kmers_2697: Vec = vec![encode_stat(seq_2697)]; + let total = (kmers_9606.len() + kmers_2697.len()) as u64; + + // Write .dbss binary + let mut dbss_file = tempfile::NamedTempFile::new().unwrap(); + dbss_file.write_all(&1u64.to_le_bytes()).unwrap(); // version + dbss_file.write_all(&32u64.to_le_bytes()).unwrap(); // kmer_len + dbss_file.write_all(&total.to_le_bytes()).unwrap(); // count + for &kmer in &kmers_9606 { + dbss_file.write_all(&kmer.to_le_bytes()).unwrap(); + } + for &kmer in &kmers_2697 { + dbss_file.write_all(&kmer.to_le_bytes()).unwrap(); + } + + // Write .annotation + let mut annot_file = tempfile::NamedTempFile::new().unwrap(); + writeln!(annot_file, "9606\t{}", kmers_9606.len()).unwrap(); + writeln!(annot_file, "2697049\t{}", kmers_2697.len()).unwrap(); + + (dbss_file, annot_file) + } + + #[test] + fn convert_dbss_filters_by_taxid() { + let (dbss_file, annot_file) = create_test_dbss(); + let annotations = parse_annotation(annot_file.path()).unwrap(); + let mut target = HashSet::new(); + target.insert(TaxId(9606)); + + let result = convert_dbss_to_deacon( + dbss_file.path(), &annotations, &target, + KmerLength(32), KmerLength(31), &mut None, + ).unwrap(); + + // Should have processed only the 2 k-mers for tax 9606 + assert_eq!(result.processed_count, 2); + assert!(result.deacon_kmers.len() <= 2); + } + + // ── Test 13: write_deacon_index format verification ─────────────── + + /// Write a small Deacon v3 index from two known k-mers, then read back + /// the raw bytes to verify the header fields, count, and file size. + #[test] + fn write_and_verify_idx_format() { + let k = KmerLength(31); + let w = WindowSize(15); + + let mut kmers = HashSet::new(); + kmers.insert(NucleotideSeq("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".to_string()) + .to_deacon_kmer().canonicalize(k)); + kmers.insert(NucleotideSeq("CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC".to_string()) + .to_deacon_kmer().canonicalize(k)); + + let tmpfile = tempfile::NamedTempFile::new().unwrap(); + write_deacon_index(tmpfile.path(), &kmers, k, w).unwrap(); + + // Read back and verify header + let mut file = File::open(tmpfile.path()).unwrap(); + let mut header = [0u8; 3]; + file.read_exact(&mut header).unwrap(); + assert_eq!(header[0], 3, "format version"); + assert_eq!(header[1], 31, "kmer_length"); + assert_eq!(header[2], 15, "window_size"); + + let mut count_buf = [0u8; 8]; + file.read_exact(&mut count_buf).unwrap(); + let count = u64::from_le_bytes(count_buf); + assert_eq!(count, kmers.len() as u64); + + // Verify file size: 3 + 8 + count * ceil(31/4) = 3 + 8 + count * 8 + let bpm = 8usize; + let expected_size = 3 + 8 + (count as usize * bpm); + let actual_size = std::fs::metadata(tmpfile.path()).unwrap().len(); + assert_eq!(actual_size, expected_size as u64); + } +} diff --git a/bin/test_annotate_blast_lca.py b/bin/test_annotate_blast_lca.py index ce8e207..103abe8 100644 --- a/bin/test_annotate_blast_lca.py +++ b/bin/test_annotate_blast_lca.py @@ -85,7 +85,15 @@ def test_taxonomy_sqlite(tmp_path: Path) -> Path: def mock_taxonomy_open(test_taxonomy_sqlite: Path, monkeypatch: pytest.MonkeyPatch): """Patch taxonomy.open() to use our test SQLite.""" taxdump_dir = test_taxonomy_sqlite.parent - monkeypatch.setattr(taxonomy, "_ensure_taxdump", lambda _=None: taxdump_dir) + + def test_taxdump_dir(*_args: object, **_kwargs: object) -> Path: + return taxdump_dir + + monkeypatch.setattr( + taxonomy, + "_ensure_taxdump", + test_taxdump_dir, + ) class TestFindLcaList: diff --git a/bin/test_annotate_blast_results.py b/bin/test_annotate_blast_results.py index df5193f..9b9918a 100644 --- a/bin/test_annotate_blast_results.py +++ b/bin/test_annotate_blast_results.py @@ -80,7 +80,15 @@ def mock_taxonomy_open(test_taxonomy_sqlite: Path, monkeypatch: pytest.MonkeyPat provides the SQLite path for the CURRENT implementation. """ taxdump_dir = test_taxonomy_sqlite.parent - monkeypatch.setattr(taxonomy, "_ensure_taxdump", lambda _=None: taxdump_dir) + + def test_taxdump_dir(*_args: object, **_kwargs: object) -> Path: + return taxdump_dir + + monkeypatch.setattr( + taxonomy, + "_ensure_taxdump", + test_taxdump_dir, + ) @pytest.fixture diff --git a/bin/test_extract_taxa_spots.py b/bin/test_extract_taxa_spots.py deleted file mode 100644 index a6cef68..0000000 --- a/bin/test_extract_taxa_spots.py +++ /dev/null @@ -1,261 +0,0 @@ -""" -Characterization tests for extract_taxa_spots.py. - -These tests capture behavior before/after refactoring to use py_nvd.taxonomy. -Focus on: -- is_in_target_lineage() membership checks -- resolve_taxa() name-to-taxid resolution -- End-to-end filtering -""" - -from pathlib import Path - -import pytest -from py_nvd import taxonomy - - -@pytest.fixture -def test_taxonomy_sqlite(tmp_path: Path) -> Path: - """ - Create minimal taxonomy SQLite for testing. - - Taxonomy tree: - 1 (root) - └── 131567 (cellular organisms) - └── 2759 (Eukaryota) - └── 33208 (Metazoa) - └── 9604 (Hominidae) - └── 207598 (Homininae) - ├── 9605 (Homo) - │ └── 9606 (Homo sapiens) - └── 9596 (Pan) - └── 9598 (Pan troglodytes) - """ - taxdump_dir = tmp_path / "taxdump" - taxdump_dir.mkdir() - - nodes_content = """\ -1\t|\t1\t|\tno rank\t|\t -131567\t|\t1\t|\tno rank\t|\t -2759\t|\t131567\t|\tsuperkingdom\t|\t -33208\t|\t2759\t|\tkingdom\t|\t -9604\t|\t33208\t|\tfamily\t|\t -207598\t|\t9604\t|\tsubfamily\t|\t -9605\t|\t207598\t|\tgenus\t|\t -9606\t|\t9605\t|\tspecies\t|\t -9596\t|\t207598\t|\tgenus\t|\t -9598\t|\t9596\t|\tspecies\t|\t -""" - (taxdump_dir / "nodes.dmp").write_text(nodes_content) - - names_content = """\ -1\t|\troot\t|\t\t|\tscientific name\t| -131567\t|\tcellular organisms\t|\t\t|\tscientific name\t| -2759\t|\tEukaryota\t|\t\t|\tscientific name\t| -33208\t|\tMetazoa\t|\t\t|\tscientific name\t| -9604\t|\tHominidae\t|\t\t|\tscientific name\t| -207598\t|\tHomininae\t|\t\t|\tscientific name\t| -9605\t|\tHomo\t|\t\t|\tscientific name\t| -9606\t|\tHomo sapiens\t|\t\t|\tscientific name\t| -9596\t|\tPan\t|\t\t|\tscientific name\t| -9598\t|\tPan troglodytes\t|\t\t|\tscientific name\t| -""" - (taxdump_dir / "names.dmp").write_text(names_content) - - merged_content = """\ -12345\t|\t9606\t| -""" - (taxdump_dir / "merged.dmp").write_text(merged_content) - - sqlite_path = taxonomy._build_sqlite_from_dmp(taxdump_dir) - return sqlite_path - - -@pytest.fixture -def mock_taxonomy_open(test_taxonomy_sqlite: Path, monkeypatch: pytest.MonkeyPatch): - """Patch taxonomy.open() to use our test SQLite.""" - taxdump_dir = test_taxonomy_sqlite.parent - monkeypatch.setattr(taxonomy, "_ensure_taxdump", lambda _=None: taxdump_dir) - - -class TestIsInTargetLineage: - """Tests for is_in_target_lineage() membership checks.""" - - def test_exact_match(self, test_taxonomy_sqlite: Path, mock_taxonomy_open): - """Taxid exactly matching target should return True.""" - from extract_taxa_spots import is_in_target_lineage - - with taxonomy.open() as tax: - # 9606 is in target set {9606} - result = is_in_target_lineage( - tax_id=9606, - target_taxa={9606}, - tax=tax, - include_children=False, - ) - assert result is True - - def test_no_match(self, test_taxonomy_sqlite: Path, mock_taxonomy_open): - """Taxid not in target should return False.""" - from extract_taxa_spots import is_in_target_lineage - - with taxonomy.open() as tax: - # 9598 (chimp) is not in target set {9606} - result = is_in_target_lineage( - tax_id=9598, - target_taxa={9606}, - tax=tax, - include_children=False, - ) - assert result is False - - def test_include_children_ancestor_match( - self, - test_taxonomy_sqlite: Path, - mock_taxonomy_open, - ): - """With include_children, taxid under target ancestor should match.""" - from extract_taxa_spots import is_in_target_lineage - - with taxonomy.open() as tax: - # 9606 (human) is under 207598 (Homininae) - result = is_in_target_lineage( - tax_id=9606, - target_taxa={207598}, # Homininae - tax=tax, - include_children=True, - ) - assert result is True - - def test_include_children_no_match( - self, - test_taxonomy_sqlite: Path, - mock_taxonomy_open, - ): - """With include_children, taxid not under target should not match.""" - from extract_taxa_spots import is_in_target_lineage - - with taxonomy.open() as tax: - # 9606 (human) is not under 9596 (Pan genus) - result = is_in_target_lineage( - tax_id=9606, - target_taxa={9596}, # Pan - tax=tax, - include_children=True, - ) - assert result is False - - -class TestResolveTaxa: - """Tests for resolve_taxa() name-to-taxid resolution.""" - - def test_resolves_valid_name(self, test_taxonomy_sqlite: Path, mock_taxonomy_open): - """Valid scientific name should resolve to taxid.""" - from extract_taxa_spots import resolve_taxa - - with taxonomy.open() as tax: - result = resolve_taxa(["Homo sapiens"], tax) - assert 9606 in result - - def test_unknown_name_skipped(self, test_taxonomy_sqlite: Path, mock_taxonomy_open): - """Unknown name should be skipped with warning.""" - from extract_taxa_spots import resolve_taxa - - with taxonomy.open() as tax: - result = resolve_taxa(["NotARealTaxon"], tax) - assert len(result) == 0 - - def test_multiple_names(self, test_taxonomy_sqlite: Path, mock_taxonomy_open): - """Multiple names should all be resolved.""" - from extract_taxa_spots import resolve_taxa - - with taxonomy.open() as tax: - result = resolve_taxa(["Homo sapiens", "Pan troglodytes"], tax) - assert 9606 in result - assert 9598 in result - - -class TestEndToEnd: - """End-to-end tests for extract_taxa_spots.py.""" - - def test_filters_matching_spots( - self, - test_taxonomy_sqlite: Path, - mock_taxonomy_open, - tmp_path: Path, - ): - """Spots with matching taxa should be included in output.""" - import sys - - from extract_taxa_spots import main - - # Create input file with hits - input_file = tmp_path / "hits.txt" - # Format: spot_idtaxid (or taxidxcount) - # spot1 has only human hits, spot2 has only chimp hits - input_file.write_text("spot1\t9606\nspot2\t9598\n") - - output_file = tmp_path / "output.txt" - - original_argv = sys.argv - try: - sys.argv = [ - "extract_taxa_spots.py", - "--gettax_sqlite_path", - "ignored", - "--hits_file", - str(input_file), - "--output_file", - str(output_file), - "--taxa", - "Homo sapiens", - "--stringency", - "0.5", - "--include_children", - ] - main() - finally: - sys.argv = original_argv - - assert output_file.exists() - content = output_file.read_text() - # spot1 should be included (human matches "Homo sapiens") - assert "spot1" in content - # spot2 should NOT be included (chimp doesn't match "Homo sapiens") - assert "spot2" not in content - - def test_empty_input_handled( - self, - test_taxonomy_sqlite: Path, - mock_taxonomy_open, - tmp_path: Path, - ): - """Empty input should produce empty output.""" - import sys - - from extract_taxa_spots import main - - input_file = tmp_path / "empty.txt" - input_file.write_text("") - - output_file = tmp_path / "output.txt" - - original_argv = sys.argv - try: - sys.argv = [ - "extract_taxa_spots.py", - "--gettax_sqlite_path", - "ignored", - "--hits_file", - str(input_file), - "--output_file", - str(output_file), - "--taxa", - "Homo sapiens", - ] - main() - finally: - sys.argv = original_argv - - # Should complete without error - # Output file may or may not exist depending on implementation diff --git a/bin/test_hits_to_report.py b/bin/test_hits_to_report.py deleted file mode 100644 index 61e9495..0000000 --- a/bin/test_hits_to_report.py +++ /dev/null @@ -1,202 +0,0 @@ -""" -Characterization tests for hits_to_report.py. - -These tests capture behavior after refactoring to use py_nvd.taxonomy. -Focus on: -- deduce_tax_id() LCA logic (now uses tax.find_lca()) -- End-to-end output format -""" - -from pathlib import Path - -import pytest -from py_nvd import taxonomy - - -@pytest.fixture -def test_taxonomy_sqlite(tmp_path: Path) -> Path: - """ - Create minimal taxonomy SQLite for testing. - - Taxonomy tree: - 1 (root) - └── 131567 (cellular organisms) - └── 2759 (Eukaryota) - └── 33208 (Metazoa) - └── 9604 (Hominidae) - └── 207598 (Homininae) - ├── 9605 (Homo) - │ └── 9606 (Homo sapiens) - └── 9596 (Pan) - └── 9598 (Pan troglodytes) - """ - taxdump_dir = tmp_path / "taxdump" - taxdump_dir.mkdir() - - nodes_content = """\ -1\t|\t1\t|\tno rank\t|\t -131567\t|\t1\t|\tno rank\t|\t -2759\t|\t131567\t|\tsuperkingdom\t|\t -33208\t|\t2759\t|\tkingdom\t|\t -9604\t|\t33208\t|\tfamily\t|\t -207598\t|\t9604\t|\tsubfamily\t|\t -9605\t|\t207598\t|\tgenus\t|\t -9606\t|\t9605\t|\tspecies\t|\t -9596\t|\t207598\t|\tgenus\t|\t -9598\t|\t9596\t|\tspecies\t|\t -""" - (taxdump_dir / "nodes.dmp").write_text(nodes_content) - - names_content = """\ -1\t|\troot\t|\t\t|\tscientific name\t| -131567\t|\tcellular organisms\t|\t\t|\tscientific name\t| -2759\t|\tEukaryota\t|\t\t|\tscientific name\t| -33208\t|\tMetazoa\t|\t\t|\tscientific name\t| -9604\t|\tHominidae\t|\t\t|\tscientific name\t| -207598\t|\tHomininae\t|\t\t|\tscientific name\t| -9605\t|\tHomo\t|\t\t|\tscientific name\t| -9606\t|\tHomo sapiens\t|\t\t|\tscientific name\t| -9596\t|\tPan\t|\t\t|\tscientific name\t| -9598\t|\tPan troglodytes\t|\t\t|\tscientific name\t| -""" - (taxdump_dir / "names.dmp").write_text(names_content) - - merged_content = """\ -12345\t|\t9606\t| -""" - (taxdump_dir / "merged.dmp").write_text(merged_content) - - sqlite_path = taxonomy._build_sqlite_from_dmp(taxdump_dir) - return sqlite_path - - -@pytest.fixture -def mock_taxonomy_open(test_taxonomy_sqlite: Path, monkeypatch: pytest.MonkeyPatch): - """Patch taxonomy.open() to use our test SQLite.""" - taxdump_dir = test_taxonomy_sqlite.parent - monkeypatch.setattr(taxonomy, "_ensure_taxdump", lambda _=None: taxdump_dir) - - -class TestDeduceTaxId: - """Tests for deduce_tax_id() LCA logic.""" - - def test_single_taxid_returns_itself( - self, - test_taxonomy_sqlite: Path, - mock_taxonomy_open, - ): - """Single taxid should return itself.""" - from hits_to_report import deduce_tax_id - - with taxonomy.open() as tax: - result = deduce_tax_id({9606}, tax) - assert result == 9606 - - def test_same_taxid_twice_returns_itself( - self, - test_taxonomy_sqlite: Path, - mock_taxonomy_open, - ): - """Same taxid appearing twice should return itself.""" - from hits_to_report import deduce_tax_id - - with taxonomy.open() as tax: - # Sets deduplicate, so {9606, 9606} == {9606} - result = deduce_tax_id({9606}, tax) - assert result == 9606 - - def test_human_chimp_returns_homininae( - self, - test_taxonomy_sqlite: Path, - mock_taxonomy_open, - ): - """Human (9606) and Chimp (9598) should return Homininae (207598).""" - from hits_to_report import deduce_tax_id - - with taxonomy.open() as tax: - result = deduce_tax_id({9606, 9598}, tax) - # LCA of Human and Chimp is Homininae (207598) - assert result == 207598 - - def test_homo_and_human_returns_homo( - self, - test_taxonomy_sqlite: Path, - mock_taxonomy_open, - ): - """Homo (9605) and Homo sapiens (9606) should return Homo (9605).""" - from hits_to_report import deduce_tax_id - - with taxonomy.open() as tax: - result = deduce_tax_id({9605, 9606}, tax) - # 9606 is child of 9605, so LCA is 9605 - assert result == 9605 - - -class TestEndToEnd: - """End-to-end tests for hits_to_report.py.""" - - def test_produces_formatted_output( - self, - test_taxonomy_sqlite: Path, - mock_taxonomy_open, - tmp_path: Path, - ): - """Test that script produces expected tree output format.""" - import sys - - from hits_to_report import main - - # Create input file with hits - input_file = tmp_path / "hits.txt" - # Format: spot_idtaxid - input_file.write_text("spot1\t9606\nspot2\t9606\nspot3\t9598\n") - - output_file = tmp_path / "output.txt" - - original_argv = sys.argv - try: - sys.argv = [ - "hits_to_report.py", - str(input_file), - str(output_file), - ] - main() - finally: - sys.argv = original_argv - - assert output_file.exists() - content = output_file.read_text() - # Should contain taxonomy names - assert "Homo sapiens" in content or "Homininae" in content - - def test_empty_input_produces_empty_tree( - self, - test_taxonomy_sqlite: Path, - mock_taxonomy_open, - tmp_path: Path, - ): - """Test that empty input produces empty output.""" - import sys - - from hits_to_report import main - - input_file = tmp_path / "empty.txt" - input_file.write_text("") - - output_file = tmp_path / "output.txt" - - original_argv = sys.argv - try: - sys.argv = [ - "hits_to_report.py", - str(input_file), - str(output_file), - ] - main() - finally: - sys.argv = original_argv - - assert output_file.exists() - # Empty input produces empty output - content = output_file.read_text() - assert content == "" diff --git a/bin/test_notify_slack.py b/bin/test_notify_slack.py index 44bf45a..d2e7653 100644 --- a/bin/test_notify_slack.py +++ b/bin/test_notify_slack.py @@ -7,282 +7,215 @@ from __future__ import annotations +from typing import TYPE_CHECKING, Final from unittest.mock import MagicMock, patch import pytest from notify_slack import ( build_message, - format_byte_size, - get_cumulative_stats, - get_run_stats, + format_cross_run_section, + get_highlights_safe, + get_report_safe, send_notification, ) +from py_nvd.models import RunReport from slack_sdk.errors import SlackApiError, SlackClientError +if TYPE_CHECKING: + from pathlib import Path -class TestFormatByteSize: - """Tests for byte size formatting.""" +FAKE_SLACK_BOT_TOKEN: Final = "xoxb-test" # noqa: S105 - fake Slack-shaped token for exercising WebClient wiring. +FAKE_ENV_SLACK_BOT_TOKEN: Final = "xoxb-from-env" # noqa: S105 - fake Slack-shaped token for env fallback coverage. - def test_formats_zero_as_kb(self): - """Zero bytes displays as 0.0 KB.""" - assert format_byte_size(0) == "0.0 KB" - def test_formats_small_size_as_kb(self): - """Sizes under 1MB display as KB.""" - assert format_byte_size(500 * 1024) == "500.0 KB" - - def test_formats_size_as_mb(self): - """Sizes 1MB-1GB display as MB.""" - assert format_byte_size(50 * 1024**2) == "50.0 MB" - - def test_formats_size_as_gb(self): - """Sizes over 1GB display as GB.""" - assert format_byte_size(2 * 1024**3) == "2.0 GB" - - def test_boundary_exactly_1mb(self): - """Exactly 1MB (1024**2 bytes) shows as MB not KB.""" - assert format_byte_size(1024**2) == "1.0 MB" - - def test_boundary_exactly_1gb(self): - """Exactly 1GB (1024**3 bytes) shows as GB not MB.""" - assert format_byte_size(1024**3) == "1.0 GB" - - def test_boundary_just_under_1mb(self): - """Just under 1MB shows as KB.""" - assert format_byte_size(1024**2 - 1) == "1024.0 KB" - - def test_fractional_gb(self): - """Fractional GB values display with one decimal.""" - assert format_byte_size(int(2.5 * 1024**3)) == "2.5 GB" - - def test_assertion_on_negative(self): - """Negative byte count raises assertion.""" - with pytest.raises(AssertionError, match="non-negative"): - format_byte_size(-1) +def make_report(**overrides: object) -> RunReport: + """Build a minimal RunReport for Slack message tests.""" + values = { + "sample_set_id": "sample_set_123", + "run_date": "2026-01-10", + "samples_analyzed": 42, + "samples_with_viral_hits": 7, + "samples_negative": 35, + "unique_hits": 11, + "viral_taxa_found": 3, + "median_contig_length": 750, + "contigs_over_500bp": 8, + "top_findings": (), + "sample_summaries": (), + } + values.update(overrides) + return RunReport(**values) class TestBuildMessage: """Tests for Slack message formatting.""" - def test_formats_all_fields_correctly(self): - """All parameters appear in the output message.""" + def test_formats_all_fields_correctly(self) -> None: + """Report, highlights, and cross-run context appear in the message.""" message = build_message( experiment_id="exp_001", run_id="run_2026-01-10", - samples_analyzed=42, - hits_identified=7, + report=make_report(), + highlights="Adenovirus in 3 samples", + cross_run_section="*Cross-run context:*\n- 2 novel taxa (first time seen)", labkey_url="https://example.com/results", - cumulative={ - "total_samples": 1000, - "total_hits": 500, - "state_size": "2.3 GB", - }, + duration_str="12m 34s", ) assert "exp_001" in message assert "run_2026-01-10" in message assert "42" in message - assert "7" in message + assert "11" in message + assert "3" in message + assert "Adenovirus in 3 samples" in message + assert "2 novel taxa" in message + assert "12m 34s" in message assert "https://example.com/results" in message - assert "1,000" in message # formatted with comma - assert "500" in message - assert "2.3 GB" in message - def test_handles_zero_counts(self): - """Zero samples/hits display correctly.""" + def test_handles_zero_report_counts(self) -> None: + """Zero values in a report display correctly.""" message = build_message( experiment_id="exp_001", run_id="run_001", - samples_analyzed=0, - hits_identified=0, + report=make_report( + samples_analyzed=0, + samples_with_viral_hits=0, + samples_negative=0, + unique_hits=0, + viral_taxa_found=0, + ), + highlights="", + cross_run_section="", labkey_url="https://example.com", - cumulative={ - "total_samples": 0, - "total_hits": 0, - "state_size": "0.0 KB", - }, ) - assert "*Samples analyzed:* 0" in message - assert "*Hits identified (this run):* 0" in message - assert "Total samples in database: 0" in message + assert "0 samples analyzed" in message + assert "0 unique contigs identified" in message + assert "0 taxa detected" in message - def test_labkey_url_in_link_format(self): + def test_labkey_url_in_link_format(self) -> None: """URL is wrapped in Slack link syntax.""" message = build_message( experiment_id="exp", run_id="run", - samples_analyzed=1, - hits_identified=1, + report=make_report(samples_analyzed=1, unique_hits=1, viral_taxa_found=1), + highlights="", + cross_run_section="", labkey_url="https://dholk.example.com/results", - cumulative={"total_samples": 1, "total_hits": 1, "state_size": "1 KB"}, ) - assert "" in message + assert "" in message - def test_starts_with_header(self): + def test_starts_with_header(self) -> None: """Message starts with the expected header.""" message = build_message( experiment_id="exp", run_id="run", - samples_analyzed=1, - hits_identified=1, + report=make_report(samples_analyzed=1, unique_hits=1, viral_taxa_found=1), + highlights="", + cross_run_section="", labkey_url="https://example.com", - cumulative={"total_samples": 1, "total_hits": 1, "state_size": "1 KB"}, ) assert message.startswith("*NVD Run Complete*") - def test_handles_string_cumulative_values(self): - """Handles N/A strings in cumulative stats (fallback case).""" + def test_handles_missing_report(self) -> None: + """Fallback message is used when run statistics are unavailable.""" message = build_message( experiment_id="exp", run_id="run", - samples_analyzed=1, - hits_identified=1, + report=None, + highlights="", + cross_run_section="", labkey_url="https://example.com", - cumulative={ - "total_samples": "N/A", - "total_hits": "N/A", - "state_size": "N/A", - }, ) - assert "Total samples in database: N/A" in message - assert "Total unique hits: N/A" in message - assert "State directory: N/A" in message + assert "Run statistics unavailable" in message - def test_assertion_on_empty_experiment_id(self): + def test_assertion_on_empty_experiment_id(self) -> None: """Empty experiment_id raises assertion.""" with pytest.raises(AssertionError, match="experiment_id cannot be empty"): build_message( experiment_id="", run_id="run", - samples_analyzed=1, - hits_identified=1, + report=make_report(), + highlights="", + cross_run_section="", labkey_url="https://example.com", - cumulative={"total_samples": 1, "total_hits": 1, "state_size": "1 KB"}, ) - def test_assertion_on_empty_run_id(self): + def test_assertion_on_empty_run_id(self) -> None: """Empty run_id raises assertion.""" with pytest.raises(AssertionError, match="run_id cannot be empty"): build_message( experiment_id="exp", run_id="", - samples_analyzed=1, - hits_identified=1, + report=make_report(), + highlights="", + cross_run_section="", labkey_url="https://example.com", - cumulative={"total_samples": 1, "total_hits": 1, "state_size": "1 KB"}, ) - def test_assertion_on_negative_samples(self): - """Negative samples_analyzed raises assertion.""" - with pytest.raises(AssertionError, match="non-negative"): + def test_assertion_on_empty_labkey_url(self) -> None: + """Empty labkey_url raises assertion.""" + with pytest.raises(AssertionError, match="labkey_url cannot be empty"): build_message( experiment_id="exp", run_id="run", - samples_analyzed=-1, - hits_identified=1, - labkey_url="https://example.com", - cumulative={"total_samples": 1, "total_hits": 1, "state_size": "1 KB"}, + report=make_report(), + highlights="", + cross_run_section="", + labkey_url="", ) -class TestGetRunStats: - """Tests for run-specific stats extraction.""" - - def test_returns_zeros_when_stats_is_none(self, tmp_path): - """When get_stats_for_sample_set returns None, returns zeros.""" - with patch( - "notify_slack.get_stats_for_sample_set", - return_value=None, - ) as mock_get: - result = get_run_stats(tmp_path, "nonexistent_sample_set") - - assert result == {"samples_analyzed": 0, "hits_identified": 0} - mock_get.assert_called_once_with("nonexistent_sample_set", tmp_path) - - def test_extracts_correct_fields_from_stats(self, tmp_path): - """Maps unique_samples → samples_analyzed, total_observations → hits_identified.""" - mock_stats = MagicMock() - mock_stats.unique_samples = 42 - mock_stats.total_observations = 7 - - with patch("notify_slack.get_stats_for_sample_set", return_value=mock_stats): - result = get_run_stats(tmp_path, "sample_set_123") - - assert result == {"samples_analyzed": 42, "hits_identified": 7} - - def test_assertion_on_empty_sample_set_id(self, tmp_path): - """Empty sample_set_id raises assertion.""" - with pytest.raises(AssertionError, match="sample_set_id cannot be empty"): - get_run_stats(tmp_path, "") +class TestReportHelpers: + """Tests for report helper fallbacks.""" + def test_get_report_safe_returns_report(self, tmp_path: Path) -> None: + """get_report_safe returns the report from get_run_report.""" + report = make_report() + with patch("notify_slack.get_run_report", return_value=report): + assert get_report_safe(tmp_path, "sample_set_123") == report -class TestGetCumulativeStats: - """Tests for cumulative stats and size formatting.""" + def test_get_report_safe_returns_none_on_exception(self, tmp_path: Path) -> None: + """get_report_safe swallows read errors and returns None.""" + with patch("notify_slack.get_run_report", side_effect=RuntimeError("boom")): + assert get_report_safe(tmp_path, "sample_set_123") is None - def test_returns_stats_from_hit_stats(self, tmp_path): - """Returns unique_samples and total_hits from get_hit_stats.""" - mock_stats = MagicMock() - mock_stats.unique_samples = 1000 - mock_stats.total_hits = 500 - - with patch("notify_slack.get_hit_stats", return_value=mock_stats): - result = get_cumulative_stats(tmp_path) - - assert result["total_samples"] == 1000 - assert result["total_hits"] == 500 - - def test_calculates_directory_size(self, tmp_path): - """Calculates state directory size from files.""" - # Create some test files - (tmp_path / "file1.txt").write_text("x" * 1000) - (tmp_path / "file2.txt").write_text("y" * 2000) - subdir = tmp_path / "subdir" - subdir.mkdir() - (subdir / "file3.txt").write_text("z" * 500) - - mock_stats = MagicMock() - mock_stats.unique_samples = 0 - mock_stats.total_hits = 0 - - with patch("notify_slack.get_hit_stats", return_value=mock_stats): - result = get_cumulative_stats(tmp_path) - - # Total should be 3500 bytes = 3.4 KB - assert result["state_size"] == "3.4 KB" - - def test_handles_empty_directory(self, tmp_path): - """Empty state directory shows 0.0 KB.""" - mock_stats = MagicMock() - mock_stats.unique_samples = 0 - mock_stats.total_hits = 0 - - with patch("notify_slack.get_hit_stats", return_value=mock_stats): - result = get_cumulative_stats(tmp_path) + def test_get_highlights_safe_returns_empty_string_on_exception( + self, + tmp_path: Path, + ) -> None: + """get_highlights_safe swallows errors and returns an empty string.""" + with patch( + "notify_slack.get_highlights_string", + side_effect=RuntimeError("boom"), + ): + assert get_highlights_safe(tmp_path, "sample_set_123") == "" - assert result["state_size"] == "0.0 KB" - def test_handles_nonexistent_directory(self, tmp_path): - """Nonexistent state directory shows 0.0 KB.""" - nonexistent = tmp_path / "does_not_exist" +class TestFormatCrossRunSection: + """Tests for cross-run section formatting.""" - mock_stats = MagicMock() - mock_stats.unique_samples = 0 - mock_stats.total_hits = 0 + def test_empty_context_returns_empty_string(self) -> None: + """No novel taxa or movers produce no section.""" + assert format_cross_run_section(None, []) == "" - with patch("notify_slack.get_hit_stats", return_value=mock_stats): - result = get_cumulative_stats(nonexistent) + def test_formats_novel_taxa(self) -> None: + """Novel taxa counts are included.""" + assert "2 novel taxa" in format_cross_run_section(2, []) - assert result["state_size"] == "0.0 KB" + def test_formats_notable_movers(self) -> None: + """Notable movers are included with signed percentages.""" + section = format_cross_run_section(None, [("Adenoviridae", 42.0)]) + assert "Adenoviridae (+42%)" in section class TestSendNotification: """Tests for Slack API interaction and error handling.""" - def test_returns_false_when_no_token(self, monkeypatch): + def test_returns_false_when_no_token(self, monkeypatch: pytest.MonkeyPatch) -> None: """Returns False and logs warning when SLACK_BOT_TOKEN not set.""" monkeypatch.delenv("SLACK_BOT_TOKEN", raising=False) @@ -290,13 +223,15 @@ def test_returns_false_when_no_token(self, monkeypatch): assert result is False - def test_returns_true_on_success(self, monkeypatch): + def test_returns_true_on_success(self) -> None: """Returns True when message posts successfully.""" mock_client = MagicMock() mock_client.chat_postMessage.return_value = {"ts": "1234567890.123456"} with patch("notify_slack.WebClient", return_value=mock_client): - result = send_notification("C123", "test message", token="xoxb-test") + result = send_notification( + "C123", "test message", token=FAKE_SLACK_BOT_TOKEN + ) assert result is True mock_client.chat_postMessage.assert_called_once_with( @@ -305,7 +240,7 @@ def test_returns_true_on_success(self, monkeypatch): mrkdwn=True, ) - def test_handles_channel_not_found(self): + def test_handles_channel_not_found(self) -> None: """Returns False with helpful message for channel_not_found.""" mock_client = MagicMock() mock_response = MagicMock() @@ -316,11 +251,13 @@ def test_handles_channel_not_found(self): ) with patch("notify_slack.WebClient", return_value=mock_client): - result = send_notification("C123", "test message", token="xoxb-test") + result = send_notification( + "C123", "test message", token=FAKE_SLACK_BOT_TOKEN + ) assert result is False - def test_handles_not_in_channel(self): + def test_handles_not_in_channel(self) -> None: """Returns False with helpful message for not_in_channel.""" mock_client = MagicMock() mock_response = MagicMock() @@ -331,11 +268,13 @@ def test_handles_not_in_channel(self): ) with patch("notify_slack.WebClient", return_value=mock_client): - result = send_notification("C123", "test message", token="xoxb-test") + result = send_notification( + "C123", "test message", token=FAKE_SLACK_BOT_TOKEN + ) assert result is False - def test_handles_invalid_auth(self): + def test_handles_invalid_auth(self) -> None: """Returns False with helpful message for invalid_auth.""" mock_client = MagicMock() mock_response = MagicMock() @@ -346,43 +285,52 @@ def test_handles_invalid_auth(self): ) with patch("notify_slack.WebClient", return_value=mock_client): - result = send_notification("C123", "test message", token="xoxb-test") + result = send_notification( + "C123", "test message", token=FAKE_SLACK_BOT_TOKEN + ) assert result is False - def test_handles_slack_client_error(self): + def test_handles_slack_client_error(self) -> None: """Returns False for SlackClientError (network issues).""" mock_client = MagicMock() mock_client.chat_postMessage.side_effect = SlackClientError("Network error") with patch("notify_slack.WebClient", return_value=mock_client): - result = send_notification("C123", "test message", token="xoxb-test") + result = send_notification( + "C123", "test message", token=FAKE_SLACK_BOT_TOKEN + ) assert result is False - def test_handles_unexpected_exception(self): + def test_handles_unexpected_exception(self) -> None: """Returns False and doesn't raise for unexpected errors.""" mock_client = MagicMock() mock_client.chat_postMessage.side_effect = RuntimeError("Unexpected!") with patch("notify_slack.WebClient", return_value=mock_client): - result = send_notification("C123", "test message", token="xoxb-test") + result = send_notification( + "C123", "test message", token=FAKE_SLACK_BOT_TOKEN + ) assert result is False - def test_assertion_on_empty_channel(self): + def test_assertion_on_empty_channel(self) -> None: """Empty channel raises assertion.""" with pytest.raises(AssertionError, match="channel cannot be empty"): - send_notification("", "test message", token="xoxb-test") + send_notification("", "test message", token=FAKE_SLACK_BOT_TOKEN) - def test_assertion_on_empty_message(self): + def test_assertion_on_empty_message(self) -> None: """Empty message raises assertion.""" with pytest.raises(AssertionError, match="message cannot be empty"): - send_notification("C123", "", token="xoxb-test") + send_notification("C123", "", token=FAKE_SLACK_BOT_TOKEN) - def test_uses_env_token_when_not_provided(self, monkeypatch): + def test_uses_env_token_when_not_provided( + self, + monkeypatch: pytest.MonkeyPatch, + ) -> None: """Uses SLACK_BOT_TOKEN from environment when token param is None.""" - monkeypatch.setenv("SLACK_BOT_TOKEN", "xoxb-from-env") + monkeypatch.setenv("SLACK_BOT_TOKEN", FAKE_ENV_SLACK_BOT_TOKEN) mock_client = MagicMock() mock_client.chat_postMessage.return_value = {"ts": "123"} @@ -394,4 +342,4 @@ def test_uses_env_token_when_not_provided(self, monkeypatch): result = send_notification("C123", "test", token=None) assert result is True - mock_webclient.assert_called_once_with(token="xoxb-from-env") + mock_webclient.assert_called_once_with(token=FAKE_ENV_SLACK_BOT_TOKEN) diff --git a/bin/test_register_gottcha2_hits.py b/bin/test_register_gottcha2_hits.py deleted file mode 100644 index 0d3150a..0000000 --- a/bin/test_register_gottcha2_hits.py +++ /dev/null @@ -1,388 +0,0 @@ -""" -Tests for register_gottcha2_hits.py I/O parsing and orchestration. - -The core sequence operations and state management are tested in -lib/py_nvd/test_hits.py. This file tests the GOTTCHA2-specific wrapper's -FASTA header parsing, hit record building, and parquet writing. -""" - -import tempfile -from pathlib import Path - -import pytest -from register_gottcha2_hits import ( - Gottcha2Classification, - Gottcha2HitRegistrationContext, - build_gottcha2_hit_records, - parse_gottcha2_fasta, - write_hits_to_path, -) - - -class TestGottcha2HitRegistrationContext: - """Tests for Gottcha2HitRegistrationContext validation.""" - - def test_valid_context(self): - """Valid context is created successfully.""" - ctx = Gottcha2HitRegistrationContext( - state_dir=Path("/tmp"), - sample_set_id="set_001", - sample_id="sample_a", - run_date="2024-01-01T00:00:00Z", - ) - assert ctx.sample_set_id == "set_001" - assert ctx.sample_id == "sample_a" - - def test_empty_sample_set_id_raises(self): - """Empty sample_set_id raises ValueError.""" - with pytest.raises(ValueError, match="sample_set_id cannot be empty"): - Gottcha2HitRegistrationContext( - state_dir=Path("/tmp"), - sample_set_id="", - sample_id="sample_a", - run_date="2024-01-01T00:00:00Z", - ) - - def test_empty_sample_id_raises(self): - """Empty sample_id raises ValueError.""" - with pytest.raises(ValueError, match="sample_id cannot be empty"): - Gottcha2HitRegistrationContext( - state_dir=Path("/tmp"), - sample_set_id="set_001", - sample_id="", - run_date="2024-01-01T00:00:00Z", - ) - - def test_empty_run_date_raises(self): - """Empty run_date raises ValueError.""" - with pytest.raises(ValueError, match="run_date cannot be empty"): - Gottcha2HitRegistrationContext( - state_dir=Path("/tmp"), - sample_set_id="set_001", - sample_id="sample_a", - run_date="", - ) - - -class TestParseGottcha2Fasta: - """Tests for parse_gottcha2_fasta().""" - - def test_parse_standard_gottcha2_header(self): - """Parses a standard GOTTCHA2 extracted FASTA with taxonomy in headers.""" - with tempfile.NamedTemporaryFile(mode="w", suffix=".fasta", delete=False) as f: - f.write( - ">read1.1|NC_001234|1|100|12345:11..20 LEVEL=species NAME=Escherichia_coli TAXID=562\n" - ) - f.write("ACGTACGTACGT\n") - f.write( - ">read2.2|NC_005678|1|200|67890:5..15 LEVEL=genus NAME=Staphylococcus TAXID=1279\n" - ) - f.write("GGGGCCCCAAAA\n") - fasta_path = Path(f.name) - - try: - results = parse_gottcha2_fasta(fasta_path) - assert len(results) == 2 - - seq_id_1, seq_1, cls_1 = results[0] - assert seq_1 == "ACGTACGTACGT" - assert cls_1.taxid == 562 - assert cls_1.name == "Escherichia coli" - assert cls_1.rank == "species" - - seq_id_2, seq_2, cls_2 = results[1] - assert seq_2 == "GGGGCCCCAAAA" - assert cls_2.taxid == 1279 - assert cls_2.name == "Staphylococcus" - assert cls_2.rank == "genus" - finally: - fasta_path.unlink() - - def test_parse_multiword_name_with_underscores(self): - """Names with underscores are restored to spaces.""" - with tempfile.NamedTemporaryFile(mode="w", suffix=".fasta", delete=False) as f: - f.write( - ">read1|ref:1..10 LEVEL=species NAME=Human_herpesvirus_4 TAXID=10376\n" - ) - f.write("ACGTACGT\n") - fasta_path = Path(f.name) - - try: - results = parse_gottcha2_fasta(fasta_path) - assert len(results) == 1 - _, _, cls = results[0] - assert cls.name == "Human herpesvirus 4" - assert cls.taxid == 10376 - assert cls.rank == "species" - finally: - fasta_path.unlink() - - def test_parse_empty_fasta(self): - """Parses empty FASTA file.""" - with tempfile.NamedTemporaryFile(mode="w", suffix=".fasta", delete=False) as f: - fasta_path = Path(f.name) - - try: - results = parse_gottcha2_fasta(fasta_path) - assert results == [] - finally: - fasta_path.unlink() - - def test_skips_unparseable_headers(self): - """Entries with headers that don't match the expected pattern are skipped.""" - with tempfile.NamedTemporaryFile(mode="w", suffix=".fasta", delete=False) as f: - # Valid entry - f.write(">read1|ref:1..10 LEVEL=species NAME=Test_virus TAXID=12345\n") - f.write("ACGTACGT\n") - # Invalid entry (no LEVEL/NAME/TAXID) - f.write(">some_other_header with no taxonomy\n") - f.write("GGGGCCCC\n") - fasta_path = Path(f.name) - - try: - results = parse_gottcha2_fasta(fasta_path) - assert len(results) == 1 - _, _, cls = results[0] - assert cls.name == "Test virus" - finally: - fasta_path.unlink() - - def test_skips_empty_sequences(self): - """Entries with empty sequences are skipped.""" - with tempfile.NamedTemporaryFile(mode="w", suffix=".fasta", delete=False) as f: - f.write(">read1|ref:1..10 LEVEL=species NAME=Test_virus TAXID=12345\n") - f.write("\n") - f.write(">read2|ref:1..10 LEVEL=species NAME=Other_virus TAXID=67890\n") - f.write("ACGTACGT\n") - fasta_path = Path(f.name) - - try: - results = parse_gottcha2_fasta(fasta_path) - # BioPython may or may not parse the empty sequence entry; - # if it does, our code skips it - sequence_ids = [r[0] for r in results] - assert "read2|ref:1..10" in sequence_ids or len(results) >= 1 - finally: - fasta_path.unlink() - - def test_multiline_sequence(self): - """Parses FASTA with multi-line sequences.""" - with tempfile.NamedTemporaryFile(mode="w", suffix=".fasta", delete=False) as f: - f.write(">read1|ref:1..10 LEVEL=species NAME=Test_virus TAXID=12345\n") - f.write("ACGT\n") - f.write("ACGT\n") - fasta_path = Path(f.name) - - try: - results = parse_gottcha2_fasta(fasta_path) - assert len(results) == 1 - _, seq, _ = results[0] - assert seq == "ACGTACGT" - finally: - fasta_path.unlink() - - -class TestBuildGottcha2HitRecords: - """Tests for build_gottcha2_hit_records().""" - - def _make_context(self) -> Gottcha2HitRegistrationContext: - """Helper to create a test context.""" - return Gottcha2HitRegistrationContext( - state_dir=Path("/tmp"), - sample_set_id="set_001", - sample_id="sample_a", - run_date="2024-01-01T00:00:00Z", - ) - - def _make_entry( - self, - seq_id: str = "read1|ref:1..10", - seq: str = "ACGTACGT", - taxid: int = 12345, - name: str = "Test virus", - rank: str = "species", - ) -> tuple[str, str, Gottcha2Classification]: - """Helper to create a parsed FASTA entry.""" - return ( - seq_id, - seq, - Gottcha2Classification( - sequence_id=seq_id, - taxid=taxid, - name=name, - rank=rank, - ), - ) - - def test_builds_records_from_parsed_entries(self): - """Builds HitRecords from parsed GOTTCHA2 FASTA entries.""" - entries = [ - self._make_entry("read1|ref:1..10", "ACGTACGT", 562, "E. coli", "species"), - self._make_entry("read2|ref:5..15", "GGGGCCCC", 1279, "Staph", "genus"), - ] - context = self._make_context() - - records = build_gottcha2_hit_records(entries, context) - - assert len(records) == 2 - sequence_ids = {r.sequence_id for r in records} - assert sequence_ids == {"read1|ref:1..10", "read2|ref:5..15"} - - def test_empty_entries_returns_empty_list(self): - """Returns empty list when no entries.""" - context = self._make_context() - records = build_gottcha2_hit_records([], context) - assert records == [] - - def test_populates_metadata_correctly(self): - """HitRecords have correct metadata from context.""" - entries = [self._make_entry()] - context = self._make_context() - - records = build_gottcha2_hit_records(entries, context) - - assert len(records) == 1 - record = records[0] - assert record.sample_set_id == "set_001" - assert record.sample_id == "sample_a" - assert record.run_date == "2024-01-01T00:00:00Z" - assert record.source == "gottcha2" - assert record.sequence_length == 8 - assert len(record.hit_key) == 32 - - def test_populates_classification_from_header(self): - """HitRecords include taxonomy parsed from GOTTCHA2 headers.""" - entries = [ - self._make_entry( - taxid=10376, - name="Human herpesvirus 4", - rank="species", - ), - ] - context = self._make_context() - - records = build_gottcha2_hit_records(entries, context) - - assert len(records) == 1 - record = records[0] - assert record.adjusted_taxid == 10376 - assert record.adjusted_taxid_name == "Human herpesvirus 4" - assert record.adjusted_taxid_rank == "species" - - -class TestWriteHitsToPath: - """Tests for write_hits_to_path().""" - - def test_writes_parquet_to_specified_path(self): - """Writes parquet file to the specified output path.""" - import polars as pl - - entries = [ - ( - "read1|ref:1..10", - "ACGTACGT", - Gottcha2Classification( - sequence_id="read1|ref:1..10", - taxid=12345, - name="Test virus", - rank="species", - ), - ), - ] - context = Gottcha2HitRegistrationContext( - state_dir=Path("/tmp"), - sample_set_id="set_001", - sample_id="sample_a", - run_date="2024-01-01T00:00:00Z", - ) - records = build_gottcha2_hit_records(entries, context) - - with tempfile.TemporaryDirectory() as tmpdir: - output_path = Path(tmpdir) / "output.parquet" - result_path = write_hits_to_path(records, output_path) - - assert result_path == output_path - assert output_path.exists() - - df = pl.read_parquet(output_path) - assert len(df) == 1 - assert df["sample_id"][0] == "sample_a" - assert df["source"][0] == "gottcha2" - - def test_creates_parent_directories(self): - """Creates parent directories if they don't exist.""" - entries = [ - ( - "read1|ref:1..10", - "ACGTACGT", - Gottcha2Classification( - sequence_id="read1|ref:1..10", - taxid=12345, - name="Test virus", - rank="species", - ), - ), - ] - context = Gottcha2HitRegistrationContext( - state_dir=Path("/tmp"), - sample_set_id="set_001", - sample_id="sample_a", - run_date="2024-01-01T00:00:00Z", - ) - records = build_gottcha2_hit_records(entries, context) - - with tempfile.TemporaryDirectory() as tmpdir: - output_path = Path(tmpdir) / "nested" / "dir" / "output.parquet" - result_path = write_hits_to_path(records, output_path) - - assert result_path == output_path - assert output_path.exists() - - def test_writes_empty_parquet_with_schema(self): - """Writes valid parquet file even with empty records list.""" - import polars as pl - - with tempfile.TemporaryDirectory() as tmpdir: - output_path = Path(tmpdir) / "empty.parquet" - result_path = write_hits_to_path([], output_path) - - assert result_path == output_path - assert output_path.exists() - - df = pl.read_parquet(output_path) - assert len(df) == 0 - assert "hit_key" in df.columns - assert "sample_id" in df.columns - assert "source" in df.columns - - def test_parquet_includes_contig_id_null_stub(self): - """Parquet includes contig_id=NULL for backward compatibility.""" - import polars as pl - - entries = [ - ( - "read1|ref:1..10", - "ACGTACGT", - Gottcha2Classification( - sequence_id="read1|ref:1..10", - taxid=12345, - name="Test virus", - rank="species", - ), - ), - ] - context = Gottcha2HitRegistrationContext( - state_dir=Path("/tmp"), - sample_set_id="set_001", - sample_id="sample_a", - run_date="2024-01-01T00:00:00Z", - ) - records = build_gottcha2_hit_records(entries, context) - - with tempfile.TemporaryDirectory() as tmpdir: - output_path = Path(tmpdir) / "output.parquet" - write_hits_to_path(records, output_path) - - df = pl.read_parquet(output_path) - assert "contig_id" in df.columns - assert df["contig_id"][0] is None diff --git a/conf/results.config b/conf/results.config index d4db107..9aa9ade 100644 --- a/conf/results.config +++ b/conf/results.config @@ -1,155 +1,116 @@ params { - // NVD RESULTS + // NVD v3 RESULTS DIRECTORY STRUCTURE + // ******************************************************************************** + // Layout mirrors the pipeline flow: reads → assembly → classification → summary. + // Each numbered directory corresponds to a pipeline stage. When multiple processes + // contribute to a stage, each gets its own subdirectory within the stage folder. // ******************************************************************************** nvd_results = params.results + "/nvd" - // pre-processing subworkflow - preprocess_results = params.nvd_results + "/01_preprocessing" - human_virus_reads = params.preprocess_results + "/01_human_virus_reads" - spades_contigs = params.preprocess_results + "/02_spades_contigs" - masked_filtered_contigs = params.preprocess_results + "/03_masked_filtered_contigs" + // 01 — Virus-enriched reads from deacon filtering on raw input + virus_enriched_reads = params.nvd_results + "/01_virus_enriched_reads" - // human virus contig extraction subworkflow - human_virus_extraction = params.nvd_results + "/02_human_viruses" - stat_classification_passes = params.human_virus_extraction + "/01_stat_passes" - stat_report = params.human_virus_extraction + "/02_full_stat_report" - human_viruses = params.human_virus_extraction + "/03_human_virus_results" - human_virus_maps = params.human_viruses + "/mapped_reads" + // 02 — Quality-filtered reads that went into SPAdes assembly + quality_filtered_reads = params.nvd_results + "/02_quality_filtered_reads" - // megablast classificaton subworkflow - megablast = params.nvd_results + "/03_megablast_classification" - all_megablast = params.megablast + "/01_annotated_megablast_classifications" - virus_megablast = params.megablast + "/02_megablast_viruses" + // 03 — Raw SPAdes assembly output + assembled_contigs = params.nvd_results + "/03_assembled_contigs" - // blastn classificaton subworkflow - blastn = params.nvd_results + "/04_blastn_classification" - annotated_blastn = params.blastn + "/01_annotated_blastn_classifications" - virus_blastn = params.blastn + "/02_blastn_viruses" - blast_merged = params.blastn + "/03_blastn_megablast_merged" + // 04 — Virus contig classification: deacon filter + read-back mapping + virus_contig_classification = params.nvd_results + "/04_virus_contig_classification" - // labkey bundling subworkflow - labkey_bundling = params.nvd_results + "/05_labkey_bundling" - // ******************************************************************************** + // 05 — Megablast (fast BLAST pass) + megablast_hits = params.nvd_results + "/05_megablast_hits" - // GOTTCHA2 RESULTS - // ******************************************************************************** - gottcha2_results = results + "/gottcha2" - gottcha2_profiles = params.gottcha2_results + "/01_gottcha2_profiles" - extracted_reads = params.gottcha2_results + "/02_extracted_reads" - gottcha2_labkey_bundling = params.gottcha2_results + "/03_labkey_bundling" - // ******************************************************************************** + // 06 — BLASTn (sensitive BLAST pass) + blastn_hits = params.nvd_results + "/06_blastn_hits" - // CLUMPIFY RESULTS - // ******************************************************************************** - clumpify_results = params.results + "/clumpify" + // 07 — Merged BLAST results with LCA and read counts + merged_blast_results = params.nvd_results + "/07_merged_blast_results" + + // 08 — Concatenated all-sample summary (always produced) + experiment_summary = params.nvd_results + "/08_experiment_summary" + + // 09 — LabKey-formatted uploads (only when labkey=true) + labkey_uploads = params.nvd_results + "/09_labkey_uploads" // ******************************************************************************** } // Assign the above paths to publish directories in processes throughout the pipeline process { - withName: 'DEACON_DEPLETE' { - publishDir = [ - path: { params.preprocess_results + "/00_host_depletion" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: true - ] - } - - withName: 'EXTRACT_HUMAN_VIRUS_READS' { - publishDir = [ - path: { params.human_virus_reads }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: true - ] - } - - withName: 'RUN_SPADES' { - publishDir = [ - path: { params.spades_contigs }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: true - ] - - } - withName: 'FILTER_SHORT_CONTIGS' { + // ========================================================================= + // 01 — Virus-enriched reads + // ========================================================================= + withName: 'DEACON_FILTER_HUMAN_VIRUS_READS' { publishDir = [ - path: { params.masked_filtered_contigs }, + path: { params.virus_enriched_reads }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - withName: 'CLASSIFY_CONTIGS_FIRST_PASS' { + // ========================================================================= + // 02 — Quality-filtered reads (final preprocessing output) + // ========================================================================= + withName: 'REPAIR_PAIRS' { publishDir = [ - path: { params.stat_classification_passes }, + path: { params.quality_filtered_reads }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - withName: 'GENERATE_CONTIGS_TAXA_LIST' { - publishDir = [ - path: { params.stat_classification_passes }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - enabled: true - ] - } - - withName: 'GENERATE_STAT_CONTIG_REPORT' { + // ========================================================================= + // 03 — Assembled contigs + // ========================================================================= + withName: 'RUN_SPADES' { publishDir = [ - path: { params.stat_report }, + path: { params.assembled_contigs }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - withName: 'IDENTIFY_HUMAN_VIRUS_FAMILY_CONTIGS' { + // ========================================================================= + // 04 — Virus contig classification + // ========================================================================= + withName: 'DEACON_FILTER_CONTIGS' { publishDir = [ - path: { params.human_viruses }, + path: { params.virus_contig_classification + "/filtered_contigs" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - withName: 'EXTRACT_HUMAN_VIRUS_CONTIGS' { + withName: 'MAP_READS_TO_CONTIGS' { publishDir = [ - path: { params.human_viruses }, + path: { params.virus_contig_classification + "/read_alignments" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - // withName: 'MAP_READS_TO_CONTIGS' { - // publishDir = [ - // path: { params.human_virus_maps }, - // mode: 'copy', - // saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, - // enabled: true - // ] - // } - withName: 'COUNT_MAPPED_READS' { publishDir = [ - path: { params.human_virus_maps }, + path: { params.virus_contig_classification + "/contig_read_counts" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } + // ========================================================================= + // 05 — Megablast hits (fast BLAST pass) + // ========================================================================= withName: 'ANNOTATE_MEGABLAST_RESULTS' { publishDir = [ - path: { params.all_megablast }, + path: { params.megablast_hits + "/annotated" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true @@ -158,7 +119,7 @@ process { withName: 'FILTER_NON_VIRUS_MEGABLAST_NODES' { publishDir = [ - path: { params.virus_megablast }, + path: { params.megablast_hits + "/virus_only" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true @@ -167,16 +128,19 @@ process { withName: 'REMOVE_MEGABLAST_MAPPED_CONTIGS' { publishDir = [ - path: { params.virus_megablast }, + path: { params.megablast_hits + "/unclassified_contigs" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } + // ========================================================================= + // 06 — BLASTn hits (sensitive BLAST pass) + // ========================================================================= withName: 'ANNOTATE_BLASTN_RESULTS' { publishDir = [ - path: { params.annotated_blastn }, + path: { params.blastn_hits + "/annotated" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true @@ -185,16 +149,19 @@ process { withName: 'FILTER_NON_VIRUS_BLASTN_NODES' { publishDir = [ - path: { params.virus_blastn }, + path: { params.blastn_hits + "/virus_only" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } + // ========================================================================= + // 07 — Merged BLAST results + // ========================================================================= withName: 'MERGE_FILTERED_BLAST_RESULTS' { publishDir = [ - path: { params.blast_merged }, + path: { params.merged_blast_results + "/merged" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true @@ -203,71 +170,76 @@ process { withName: 'ANNOTATE_LEAST_COMMON_ANCESTORS' { publishDir = [ - path: { params.blast_merged }, + path: { params.merged_blast_results + "/lca_annotated" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - withName: 'CLUMP_READS' { + withName: 'ADD_READ_COUNTS_TO_BLAST' { publishDir = [ - path: { params.clumpify_results }, + path: { params.merged_blast_results + "/final" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - withName: 'SCRUB_HUMAN_READS' { + // ========================================================================= + // 08 — Experiment summary (concatenated all-sample BLAST) + // ========================================================================= + withName: 'CONCATENATE_EXPERIMENT_BLAST' { publishDir = [ - path: { params.clumpify_results }, + path: { params.experiment_summary }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - - withName: 'LABKEY_UPLOAD_BLAST' { + // ========================================================================= + // 09 — LabKey uploads (only populated when labkey=true) + // ========================================================================= + withName: 'PREPARE_BLAST_LABKEY' { publishDir = [ - path: { params.labkey_bundling }, + path: { params.labkey_uploads + "/prepared_blast" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - withName: 'CONCAT_ALL_SAMPLE_BLAST_RESULTS' { + withName: 'PREPARE_FASTA_LABKEY' { publishDir = [ - path: { params.labkey_bundling }, + path: { params.labkey_uploads + "/prepared_fasta" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - withName: 'LABKEY_UPLOAD_FASTA' { + withName: 'LABKEY_UPLOAD_BLAST' { publishDir = [ - path: { params.labkey_bundling }, + path: { params.labkey_uploads + "/upload_logs" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - withName: 'LABKEY_UPLOAD_GOTTCHA2_FASTA' { + withName: 'LABKEY_UPLOAD_FASTA' { publishDir = [ - path: { params.gottcha2_labkey_bundling }, + path: { params.labkey_uploads + "/upload_logs" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true ] } - withName: 'LABKEY_UPLOAD_GOTTCHA2_FULL' { + withName: 'CONCAT_ALL_SAMPLE_BLAST_RESULTS' { publishDir = [ - path: { params.gottcha2_labkey_bundling }, + path: { params.labkey_uploads + "/concatenated" }, mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, enabled: true @@ -275,4 +247,3 @@ process { } } - diff --git a/lib/NvdDirs.groovy b/lib/NvdDirs.groovy index be5d52b..983d5a5 100644 --- a/lib/NvdDirs.groovy +++ b/lib/NvdDirs.groovy @@ -1,7 +1,7 @@ /** - * Directory resolution for NVD2 pipeline stateful and stateless modes. + * Directory resolution for NVD pipeline stateful and stateless modes. * - * This class handles the logic for resolving state_dir, taxonomy_dir, and hits_dir + * This class handles the logic for resolving state_dir, taxonomy_dir, and v3 hits_dir * based on whether the pipeline is running in stateless mode or not. It validates * that required directories exist or can be created, failing early with clear * error messages if not. @@ -10,7 +10,7 @@ * dirs = NvdDirs.resolve(params, log) * // dirs.state_dir - empty string "" in stateless mode, absolute path string otherwise * // dirs.taxonomy_dir - absolute path string if explicit, empty string "" to derive from state_dir - * // dirs.hits_dir - absolute path string for parquet output + * // dirs.hits_dir - absolute path string for v3 parquet output */ class NvdDirs { @@ -20,7 +20,7 @@ class NvdDirs { /** Taxonomy directory path (empty string "" if derived from state_dir) */ final String taxonomy_dir - /** Hits directory path for parquet output */ + /** Hits directory path for v3 parquet output */ final String hits_dir /** Whether running in stateless mode */ @@ -39,12 +39,12 @@ class NvdDirs { * In stateless mode: * - state_dir is empty string "" (no state tracking) * - taxonomy_dir is required and must exist - * - hits_dir is {results}/hits + * - hits_dir is {results}/hits/schema=v3 * * In stateful mode (default): * - state_dir is created if needed * - taxonomy_dir is optional (derived from state_dir if not set) - * - hits_dir is {state_dir}/hits + * - hits_dir is {state_dir}/hits/schema=v3 * * @param nfParams The Nextflow params object * @param nfLog The Nextflow log object for info messages @@ -82,10 +82,10 @@ class NvdDirs { } def taxonomy_dir_str = taxonomy_dir_file.getAbsolutePath() - // In stateless mode, hits go to results directory + // In stateless mode, v3 hits go to results directory def results_file = new File(nfParams.results.toString()) ensureDirectoryExists(results_file, 'results', nfParams.results.toString()) - def hits_dir_str = results_file.getAbsolutePath() + "/hits" + def hits_dir_str = results_file.getAbsolutePath() + "/hits/schema=v3" nfLog.info "Running in STATELESS mode: no state tracking, taxonomy from ${taxonomy_dir_str}" @@ -120,8 +120,8 @@ class NvdDirs { taxonomy_dir_str = taxonomy_dir_file.getAbsolutePath() } - // hits_dir is inside state_dir - def hits_dir_str = state_dir_str + "/hits" + // hits_dir is inside state_dir, schema-partitioned to avoid mixing v2/v3 parquet files + def hits_dir_str = state_dir_str + "/hits/schema=v3" return new NvdDirs( state_dir_str, diff --git a/lib/NvdUtils.groovy b/lib/NvdUtils.groovy index 2a27353..cc12f58 100644 --- a/lib/NvdUtils.groovy +++ b/lib/NvdUtils.groovy @@ -1,21 +1,12 @@ /** - * Utility functions for the NVD2 Nextflow pipeline. + * Utility functions for the NVD Nextflow pipeline. * - * This class provides static helper methods for configuration validation - * and other common operations. Methods are automatically available in - * .nf files due to Nextflow's implicit import of classes in lib/. + * This class provides static helper methods for LabKey configuration + * validation. Methods are automatically available in .nf files due to + * Nextflow's implicit import of classes in lib/. */ class NvdUtils { - // ------------------------------------------------------------------------- - // Tool selection - // ------------------------------------------------------------------------- - - /** All recognized aliases for the STAT+BLAST workflow. */ - private static final List BLAST_ALIASES = [ - 'nvd', 'stat', 'blast', 'stat_blast', 'stast', - ] - // ------------------------------------------------------------------------- // LabKey parameter definitions // ------------------------------------------------------------------------- @@ -33,37 +24,10 @@ class NvdUtils { 'labkey_exp_id_guard_list', ] - private static final List LABKEY_GOTTCHA2_PARAMS = [ - 'labkey_gottcha_fasta_list', - 'labkey_gottcha_full_list', - ] - // ------------------------------------------------------------------------- // Public methods // ------------------------------------------------------------------------- - /** - * Check whether a tool was selected via --tools. - * - * Centralizes the tool-selection logic so that workflows, channel gates, - * and param-validation blocks all use the same condition. The 'blast' - * tool has several historical aliases that are all treated as equivalent. - * - * @param params The Nextflow params object (must have a 'tools' field) - * @param tool Canonical tool name: 'gottcha', 'blast', or 'clumpify' - * @return true if the tool (or 'all') appears in params.tools - */ - static boolean isToolSelected(params, String tool) { - if (!params.tools) return false - if (params.tools.contains('all')) return true - switch (tool) { - case 'gottcha': return params.tools.contains('gottcha') - case 'blast': return BLAST_ALIASES.any { params.tools.contains(it) } - case 'clumpify': return params.tools.contains('clumpify') - default: return params.tools.contains(tool) - } - } - /** * Validates LabKey parameters required for the STAT+BLAST workflow. * Checks common params plus BLAST-specific params. @@ -79,21 +43,6 @@ class NvdUtils { validateLabkeyParams(params, requiredParams, 'STAT+BLAST') } - /** - * Validates LabKey parameters required for the GOTTCHA2 workflow. - * Checks common params plus GOTTCHA2-specific params. - * - * @param params The Nextflow params object - * @throws IllegalStateException if labkey is enabled but required params are missing - */ - public static void validateLabkeyGottcha2(params) { - if (!params.labkey) { - return - } - def requiredParams = LABKEY_COMMON_PARAMS + LABKEY_GOTTCHA2_PARAMS - validateLabkeyParams(params, requiredParams, 'GOTTCHA2') - } - // ------------------------------------------------------------------------- // Private helpers // ------------------------------------------------------------------------- diff --git a/lib/py_nvd/__init__.py b/lib/py_nvd/__init__.py index 6a7151c..e75f66d 100644 --- a/lib/py_nvd/__init__.py +++ b/lib/py_nvd/__init__.py @@ -1,6 +1,6 @@ """NVD state management and CLI library.""" -__version__ = "2.5.0" +__version__ = "3.0.0" # Re-export key modules for convenient access from py_nvd import db, models, params, state, taxonomy diff --git a/lib/py_nvd/_fingerprint.json b/lib/py_nvd/_fingerprint.json deleted file mode 100644 index 901ce1e..0000000 --- a/lib/py_nvd/_fingerprint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "main.nf": "d31b48ccc9fef38589c038f15913ea0ac4967f7eb7b4bfec619205b894394753", - "nextflow.config": "35153d744cdcb6962785521b12b67ceffa9b3640d09bebe723ba9ed324aaa600" -} diff --git a/lib/py_nvd/cli/__init__.py b/lib/py_nvd/cli/__init__.py index 765d960..400d27a 100644 --- a/lib/py_nvd/cli/__init__.py +++ b/lib/py_nvd/cli/__init__.py @@ -24,8 +24,6 @@ PANEL_DATABASES, PANEL_LABKEY, PANEL_PREPROCESSING, - PANEL_SRA, - VALID_TOOLS, console, error, info, @@ -41,8 +39,6 @@ "PANEL_DATABASES", "PANEL_LABKEY", "PANEL_PREPROCESSING", - "PANEL_SRA", - "VALID_TOOLS", "app", "config_app", "console", diff --git a/lib/py_nvd/cli/commands/preset.py b/lib/py_nvd/cli/commands/preset.py index c16c4d8..8a59228 100644 --- a/lib/py_nvd/cli/commands/preset.py +++ b/lib/py_nvd/cli/commands/preset.py @@ -159,39 +159,79 @@ def preset_register( ), dedup: bool | None = typer.Option( None, - "--dedup/--no-dedup", + "--dedup", help="Deduplicate reads (umbrella: enables both --dedup-seq and --dedup-pos)", ), dedup_seq: bool | None = typer.Option( None, - "--dedup-seq/--no-dedup-seq", - help="Sequence-based deduplication with clumpify", + "--dedup-seq", + help="Enable sequence-based deduplication with clumpify", ), dedup_pos: bool | None = typer.Option( None, - "--dedup-pos/--no-dedup-pos", - help="Positional deduplication with samtools markdup", + "--dedup-pos", + help="Enable positional deduplication with samtools markdup", ), trim_adapters: bool | None = typer.Option( None, "--trim-adapters/--no-trim-adapters", help="Trim adapters", ), - scrub_host_reads: bool | None = typer.Option( + host_index: Path | None = typer.Option( None, - "--scrub-host-reads/--no-scrub-host-reads", - help="Scrub host reads", + "--host-index", + help="Path to prebuilt host/contaminant index (.idx file)", + ), + host_index_url: str | None = typer.Option( + None, + "--host-index-url", + help="URL to download a prebuilt host/contaminant index", + ), + host_contaminants_fasta: Path | None = typer.Option( + None, + "--host-contaminants-fasta", + help="Custom contaminant FASTA for host depletion", + ), + virus_index: Path | None = typer.Option( + None, + "--virus-index", + help="Path to prebuilt vertebrate-infecting virus deacon index (.idx file)", + ), + virus_index_url: str | None = typer.Option( + None, + "--virus-index-url", + help="URL to download a prebuilt vertebrate-infecting virus deacon index", + ), + virus_reference_fasta: Path | None = typer.Option( + None, + "--virus-reference-fasta", + help="Custom vertebrate-infecting virus FASTA for enrichment", + ), + virus_kmer_size: int | None = typer.Option( + None, + "--virus-kmer-size", + help="K-mer size for building a custom virus enrichment index", + ), + virus_window_size: int | None = typer.Option( + None, + "--virus-window-size", + help="Minimizer window size for building a custom virus enrichment index", + ), + virus_abs_threshold: int | None = typer.Option( + None, + "--virus-abs-threshold", + help="Minimum absolute minimizer hits for virus read enrichment", + ), + virus_rel_threshold: float | None = typer.Option( + None, + "--virus-rel-threshold", + help="Minimum relative minimizer proportion for virus read enrichment", ), filter_reads: bool | None = typer.Option( None, "--filter-reads/--no-filter-reads", help="Filter reads", ), - min_gottcha_reads: int | None = typer.Option( - None, - "--min-gottcha-reads", - help="Minimum GOTTCHA2 reads", - ), max_blast_targets: int | None = typer.Option( None, "--max-blast-targets", @@ -221,7 +261,7 @@ def preset_register( # Update existing preset nvd preset register production --from-file updated.yaml """ - preset_params: dict[str, str | int | float | bool | None] = {} + preset_params: dict[str, str | int | float | bool | Path | None] = {} # Load from file if specified if from_file: @@ -238,9 +278,17 @@ def preset_register( "dedup_seq": dedup_seq, "dedup_pos": dedup_pos, "trim_adapters": trim_adapters, - "scrub_host_reads": scrub_host_reads, + "host_index": host_index, + "host_index_url": host_index_url, + "host_contaminants_fasta": host_contaminants_fasta, + "virus_index": virus_index, + "virus_index_url": virus_index_url, + "virus_reference_fasta": virus_reference_fasta, + "virus_kmer_size": virus_kmer_size, + "virus_window_size": virus_window_size, + "virus_abs_threshold": virus_abs_threshold, + "virus_rel_threshold": virus_rel_threshold, "filter_reads": filter_reads, - "min_gottcha_reads": min_gottcha_reads, "max_blast_targets": max_blast_targets, "blast_retention_count": blast_retention_count, } diff --git a/lib/py_nvd/cli/commands/run.py b/lib/py_nvd/cli/commands/run.py index a2da26f..4c0e116 100644 --- a/lib/py_nvd/cli/commands/run.py +++ b/lib/py_nvd/cli/commands/run.py @@ -23,8 +23,6 @@ PANEL_LABKEY, PANEL_NOTIFICATIONS, PANEL_PREPROCESSING, - PANEL_SRA, - PIPELINE_ROOT, RESUME_FILE, auto_detect_profile, check_command_exists, @@ -33,6 +31,7 @@ find_config_file, format_command_for_display, get_default_profile, + get_pipeline_root, info, success, warning, @@ -64,16 +63,6 @@ def run( help="Unique experiment identifier (required for LabKey uploads)", rich_help_panel=PANEL_CORE, ), - # NOTE: Default is None, not "all" - this lets us detect if user provided it - # vs using preset value. Default "all" is applied after preset merge. - tools: str | None = typer.Option( - None, - "--tools", - "-t", - help="Workflow(s) to run: all, stat_blast, gottcha, blast, clumpify. " - "Combine with commas, e.g. 'stat_blast,clumpify' (default: all)", - rich_help_panel=PANEL_CORE, - ), results: Path | None = typer.Option( None, "--results", @@ -153,12 +142,6 @@ def run( # ------------------------------------------------------------------------- # Database Paths # ------------------------------------------------------------------------- - gottcha2_db: Path | None = typer.Option( - None, - "--gottcha2-db", - help="Override GOTTCHA2 database path", - rich_help_panel=PANEL_DATABASES, - ), blast_db: Path | None = typer.Option( None, "--blast-db", @@ -171,49 +154,55 @@ def run( help="Override BLAST database prefix", rich_help_panel=PANEL_DATABASES, ), - stat_index: Path | None = typer.Option( + virus_index: Path | None = typer.Option( None, - "--stat-index", - help="Override STAT index file", + "--virus-index", + help="Path to prebuilt vertebrate-infecting virus deacon index (.idx file)", rich_help_panel=PANEL_DATABASES, ), - stat_dbss: Path | None = typer.Option( + virus_index_url: str | None = typer.Option( None, - "--stat-dbss", - help="Override STAT dbss file", + "--virus-index-url", + help="URL to download a prebuilt vertebrate-infecting virus deacon index", rich_help_panel=PANEL_DATABASES, ), - stat_annotation: Path | None = typer.Option( + virus_reference_fasta: Path | None = typer.Option( None, - "--stat-annotation", - help="Override STAT annotation file", + "--virus-reference-fasta", + help="Custom vertebrate-infecting virus FASTA for building an enrichment index", rich_help_panel=PANEL_DATABASES, ), - human_virus_taxlist: Path | None = typer.Option( + virus_kmer_size: int | None = typer.Option( None, - "--human-virus-taxlist", - help="Override human virus taxlist file", + "--virus-kmer-size", + help="K-mer size for building a custom virus enrichment index (default: 31)", rich_help_panel=PANEL_DATABASES, ), - # ------------------------------------------------------------------------- - # Database Versions - # ------------------------------------------------------------------------- - gottcha2_db_version: str | None = typer.Option( + virus_window_size: int | None = typer.Option( None, - "--gottcha2-db-version", - help="GOTTCHA2 database version (auto-resolved from registry if path registered)", + "--virus-window-size", + help="Minimizer window size for building a custom virus enrichment index (default: 1)", rich_help_panel=PANEL_DATABASES, ), - blast_db_version: str | None = typer.Option( + virus_abs_threshold: int | None = typer.Option( None, - "--blast-db-version", - help="BLAST database version (auto-resolved from registry if path registered)", + "--virus-abs-threshold", + help="Minimum absolute minimizer hits for virus read enrichment (default: 1)", rich_help_panel=PANEL_DATABASES, ), - stat_db_version: str | None = typer.Option( + virus_rel_threshold: float | None = typer.Option( None, - "--stat-db-version", - help="STAT database version (auto-resolved from registry if path registered)", + "--virus-rel-threshold", + help="Minimum relative minimizer proportion for virus read enrichment (default: 0.0)", + rich_help_panel=PANEL_DATABASES, + ), + # ------------------------------------------------------------------------- + # Database Versions + # ------------------------------------------------------------------------- + blast_db_version: str | None = typer.Option( + None, + "--blast-db-version", + help="BLAST database version (auto-resolved from registry if path registered)", rich_help_panel=PANEL_DATABASES, ), # ------------------------------------------------------------------------- @@ -237,12 +226,6 @@ def run( help="Entropy threshold (default: 0.9)", rich_help_panel=PANEL_ANALYSIS, ), - min_gottcha_reads: int | None = typer.Option( - None, - "--min-gottcha-reads", - help="Minimum reads for GOTTCHA2 (default: 250)", - rich_help_panel=PANEL_ANALYSIS, - ), max_blast_targets: int | None = typer.Option( None, "--max-blast-targets", @@ -285,31 +268,25 @@ def run( preprocess: bool | None = typer.Option( None, "--preprocess/--no-preprocess", - help="Enable all preprocessing steps (dedup, trim, scrub, filter)", - rich_help_panel=PANEL_PREPROCESSING, - ), - merge_pairs: bool | None = typer.Option( - None, - "--merge-pairs/--no-merge-pairs", - help="Merge paired read mates based on overlaps", + help="Enable default preprocessing steps", rich_help_panel=PANEL_PREPROCESSING, ), dedup: bool | None = typer.Option( None, - "--dedup/--no-dedup", + "--dedup", help="Deduplicate reads (umbrella: enables both --dedup-seq and --dedup-pos)", rich_help_panel=PANEL_PREPROCESSING, ), dedup_seq: bool | None = typer.Option( None, - "--dedup-seq/--no-dedup-seq", - help="Sequence-based deduplication with clumpify (default: follows --dedup)", + "--dedup-seq", + help="Enable sequence-based deduplication with clumpify", rich_help_panel=PANEL_PREPROCESSING, ), dedup_pos: bool | None = typer.Option( None, - "--dedup-pos/--no-dedup-pos", - help="Positional deduplication with samtools markdup (default: follows --dedup)", + "--dedup-pos", + help="Enable positional deduplication with samtools markdup", rich_help_panel=PANEL_PREPROCESSING, ), trim_adapters: bool | None = typer.Option( @@ -318,28 +295,22 @@ def run( help="Trim Illumina adapters (default: follows --preprocess)", rich_help_panel=PANEL_PREPROCESSING, ), - scrub_host_reads: bool | None = typer.Option( - None, - "--scrub-host-reads/--no-scrub-host-reads", - help="Remove host reads with STAT (requires --sra-human-db; default: follows --preprocess)", - rich_help_panel=PANEL_PREPROCESSING, - ), - deacon_index: Path | None = typer.Option( + host_index: Path | None = typer.Option( None, - "--deacon-index", - help="Path to prebuilt deacon index (.idx file)", + "--host-index", + help="Path to prebuilt host/contaminant index (.idx file)", rich_help_panel=PANEL_PREPROCESSING, ), - deacon_index_url: str | None = typer.Option( + host_index_url: str | None = typer.Option( None, - "--deacon-index-url", - help="URL to download prebuilt deacon index (default: panhuman-1)", + "--host-index-url", + help="URL to download a prebuilt host/contaminant index", rich_help_panel=PANEL_PREPROCESSING, ), - deacon_contaminants_fasta: Path | None = typer.Option( + host_contaminants_fasta: Path | None = typer.Option( None, - "--deacon-contaminants-fasta", - help="Custom contaminant FASTA to union with base index", + "--host-contaminants-fasta", + help="Custom contaminant FASTA to build and union with other host indexes", rich_help_panel=PANEL_PREPROCESSING, ), filter_reads: bool | None = typer.Option( @@ -373,22 +344,6 @@ def run( rich_help_panel=PANEL_PREPROCESSING, ), # ------------------------------------------------------------------------- - # SRA Submission - # ------------------------------------------------------------------------- - sra_human_db: Path | None = typer.Option( - None, - "--sra-human-db", - help="Path to human reads database for SRA submission scrubbing", - rich_help_panel=PANEL_SRA, - ), - # DEPRECATED: Use --sra-human-db instead - human_read_scrub: Path | None = typer.Option( - None, - "--human-read-scrub", - help="[DEPRECATED] Use --sra-human-db instead", - hidden=True, - ), - # ------------------------------------------------------------------------- # LabKey Integration # ------------------------------------------------------------------------- labkey: bool | None = typer.Option( @@ -421,24 +376,6 @@ def run( help="LabKey database schema name (e.g., 'lists')", rich_help_panel=PANEL_LABKEY, ), - labkey_gottcha_fasta_list: str | None = typer.Option( - None, - "--labkey-gottcha-fasta-list", - help="LabKey list name for GOTTCHA2 FASTA results", - rich_help_panel=PANEL_LABKEY, - ), - labkey_gottcha_full_list: str | None = typer.Option( - None, - "--labkey-gottcha-full-list", - help="LabKey list name for full GOTTCHA2 results", - rich_help_panel=PANEL_LABKEY, - ), - labkey_gottcha_blast_verified_full_list: str | None = typer.Option( - None, - "--labkey-gottcha-blast-verified-full-list", - help="LabKey list name for BLAST-verified GOTTCHA2 results", - rich_help_panel=PANEL_LABKEY, - ), labkey_blast_meta_hits_list: str | None = typer.Option( None, "--labkey-blast-meta-hits-list", @@ -493,7 +430,7 @@ def run( The command is saved to .nfresume for easy resumption with 'nvd resume'. Parameter precedence (highest to lowest): - 1. CLI arguments (--tools, --blast-db, etc.) + 1. CLI arguments (--blast-db, --dedup, etc.) 2. Params file (--params-file params.yaml) 3. Preset values (--preset production) 4. Pipeline defaults (nextflow.config) @@ -512,9 +449,6 @@ def run( # Specify profile and results directory nvd run -s samples.csv -e exp002 -p docker -r ./my_results - # Run only GOTTCHA2 workflow - nvd run -s samples.csv -e exp003 -t gottcha - # Resume a failed run (two ways) nvd run -s samples.csv -e exp003 --resume nvd resume # Uses saved command from .nfresume @@ -529,7 +463,7 @@ def run( nvd run --params-file run-config.yaml # Combine params file with CLI overrides - nvd run -f run-config.yaml --tools blast --cutoff-percent 0.01 + nvd run -f run-config.yaml --dedup --cutoff-percent 0.01 # Pass other Nextflow options via '--' separator nvd run -s samples.csv -- -with-tower -with-trace @@ -567,21 +501,12 @@ def run( # Nextflow-native options (profile, config, resume) are handled separately. # ========================================================================= - # Handle deprecation warning for human_read_scrub -> sra_human_db - effective_sra_human_db = sra_human_db - if human_read_scrub is not None and sra_human_db is None: - warning( - "DEPRECATION: --human-read-scrub is deprecated. Please use --sra-human-db instead.", - ) - effective_sra_human_db = human_read_scrub - # All pipeline params from CLI (None values are filtered by merge) # NOTE: profile, config, resume are Nextflow-native, not pipeline params cli_args: dict[str, Any] = { # Core "samplesheet": samplesheet, "experiment_id": experiment_id, - "tools": tools, "results": results, "cleanup": cleanup, "work_dir": work_dir, @@ -589,22 +514,21 @@ def run( "stateless": stateless, "taxonomy_dir": taxonomy_dir, # Database paths - "gottcha2_db": gottcha2_db, "blast_db": blast_db, "blast_db_prefix": blast_db_prefix, - "stat_index": stat_index, - "stat_dbss": stat_dbss, - "stat_annotation": stat_annotation, - "human_virus_taxlist": human_virus_taxlist, + "virus_index": virus_index, + "virus_index_url": virus_index_url, + "virus_reference_fasta": virus_reference_fasta, + "virus_kmer_size": virus_kmer_size, + "virus_window_size": virus_window_size, + "virus_abs_threshold": virus_abs_threshold, + "virus_rel_threshold": virus_rel_threshold, # Database versions - "gottcha2_db_version": gottcha2_db_version, "blast_db_version": blast_db_version, - "stat_db_version": stat_db_version, # Analysis "cutoff_percent": cutoff_percent, "tax_stringency": tax_stringency, "entropy": entropy, - "min_gottcha_reads": min_gottcha_reads, "max_blast_targets": max_blast_targets, "blast_retention_count": blast_retention_count, "min_consecutive_bases": min_consecutive_bases, @@ -613,31 +537,24 @@ def run( "max_concurrent_downloads": max_concurrent_downloads, # Preprocessing "preprocess": preprocess, - "merge_pairs": merge_pairs, "dedup": dedup, "dedup_seq": dedup_seq, "dedup_pos": dedup_pos, "trim_adapters": trim_adapters, - "scrub_host_reads": scrub_host_reads, - "deacon_index": deacon_index, - "deacon_index_url": deacon_index_url, - "deacon_contaminants_fasta": deacon_contaminants_fasta, + "host_index": host_index, + "host_index_url": host_index_url, + "host_contaminants_fasta": host_contaminants_fasta, "filter_reads": filter_reads, "min_read_quality_illumina": min_read_quality_illumina, "min_read_quality_nanopore": min_read_quality_nanopore, "min_read_length": min_read_length, "max_read_length": max_read_length, - # SRA (with deprecation handling) - "sra_human_db": effective_sra_human_db, # LabKey "labkey": labkey, "labkey_server": labkey_server, "labkey_project_name": labkey_project_name, "labkey_webdav": labkey_webdav, "labkey_schema": labkey_schema, - "labkey_gottcha_fasta_list": labkey_gottcha_fasta_list, - "labkey_gottcha_full_list": labkey_gottcha_full_list, - "labkey_gottcha_blast_verified_full_list": labkey_gottcha_blast_verified_full_list, "labkey_blast_meta_hits_list": labkey_blast_meta_hits_list, "labkey_blast_fasta_list": labkey_blast_fasta_list, "labkey_exp_id_guard_list": labkey_exp_id_guard_list, @@ -668,20 +585,12 @@ def run( error(f"Samplesheet not found: {params.samplesheet}") raise typer.Exit(1) - # Tools validation is handled by NvdParams, just show info - if params.tools and params.tools != "all": - info(f"Using tools: {params.tools}") - # ========================================================================= # STEP 3b: Resolve database versions from registry # ========================================================================= resolution = resolve_database_versions( blast_db=params.blast_db, blast_db_version=params.blast_db_version, - gottcha2_db=params.gottcha2_db, - gottcha2_db_version=params.gottcha2_db_version, - stat_index=params.stat_index, - stat_db_version=params.stat_db_version, state_dir=state_dir, ) @@ -697,10 +606,6 @@ def run( resolved_updates: dict[str, Any] = {} if resolution.blast_db_version is not None: resolved_updates["blast_db_version"] = resolution.blast_db_version - if resolution.gottcha2_db_version is not None: - resolved_updates["gottcha2_db_version"] = resolution.gottcha2_db_version - if resolution.stat_db_version is not None: - resolved_updates["stat_db_version"] = resolution.stat_db_version if resolved_updates: params = NvdParams.merge(params, resolved_updates) @@ -744,7 +649,7 @@ def run( # ========================================================================= # Build command with pipeline params - cmd = params.to_nextflow_args(PIPELINE_ROOT) + cmd = params.to_nextflow_args(get_pipeline_root()) # Add Nextflow-native options (not pipeline params) if effective_profile: diff --git a/lib/py_nvd/cli/commands/state.py b/lib/py_nvd/cli/commands/state.py index 73d6c02..cbcd8e9 100644 --- a/lib/py_nvd/cli/commands/state.py +++ b/lib/py_nvd/cli/commands/state.py @@ -657,7 +657,6 @@ def state_run( "status": s.status, "processed_at": s.processed_at, "blast_db_version": s.blast_db_version, - "stat_db_version": s.stat_db_version, "taxonomy_hash": s.taxonomy_hash, } for s in samples @@ -708,7 +707,6 @@ def state_run( table.add_column("Status") table.add_column("Processed At") table.add_column("BLAST DB") - table.add_column("STAT DB") for sample in samples: if sample.status == "uploaded": @@ -725,7 +723,6 @@ def state_run( sample_status, sample.processed_at, sample.blast_db_version or "-", - sample.stat_db_version or "-", ) console.print(table) @@ -827,7 +824,6 @@ def state_samples( "status": s.status, "processed_at": s.processed_at, "blast_db_version": s.blast_db_version, - "stat_db_version": s.stat_db_version, "taxonomy_hash": s.taxonomy_hash, } for s in samples @@ -921,7 +917,6 @@ def state_sample( "status": p.status, "processed_at": p.processed_at, "blast_db_version": p.blast_db_version, - "stat_db_version": p.stat_db_version, "taxonomy_hash": p.taxonomy_hash, } for p in processing_history @@ -956,7 +951,6 @@ def state_sample( table.add_column("Status") table.add_column("Processed At") table.add_column("BLAST DB") - table.add_column("STAT DB") for record in processing_history: if record.status == "uploaded": @@ -973,7 +967,6 @@ def state_sample( status_str, record.processed_at, record.blast_db_version or "-", - record.stat_db_version or "-", ) console.print(table) @@ -1015,7 +1008,7 @@ def state_sample( # Upload type values for CLI validation -_UPLOAD_TYPE_VALUES = ["blast", "blast_fasta", "gottcha2", "gottcha2_fasta"] +_UPLOAD_TYPE_VALUES = ["blast", "blast_fasta"] @state_app.command("uploads") @@ -1224,7 +1217,7 @@ def database_list( def database_show( db_type: Annotated[ str, - typer.Argument(help="Database type (blast, stat, gottcha2)"), + typer.Argument(help="Database type (blast)"), ], version: Annotated[ str | None, @@ -1249,7 +1242,7 @@ def database_show( ensure_db_exists(json_output) # Validate db_type - valid_types = ["blast", "stat", "gottcha2"] + valid_types = ["blast"] if db_type not in valid_types: if json_output: _output_json( @@ -1311,7 +1304,7 @@ def database_show( def database_register( db_type: Annotated[ str, - typer.Argument(help="Database type (blast, stat, gottcha2)"), + typer.Argument(help="Database type (blast)"), ], path: Annotated[ Path, @@ -1335,11 +1328,9 @@ def database_register( Examples: nvd state database register blast /data/blast/core-nt -v core-nt_2025-01 - nvd state database register gottcha2 /data/gottcha2/RefSeq-r220 -v RefSeq-r220 - nvd state database register stat /data/stat/index.k31 -v 2024-12 """ # Validate db_type - valid_types = ["blast", "stat", "gottcha2"] + valid_types = ["blast"] if db_type not in valid_types: if json_output: _output_json( @@ -1389,7 +1380,7 @@ def database_register( def database_unregister( db_type: Annotated[ str, - typer.Argument(help="Database type (blast, stat, gottcha2)"), + typer.Argument(help="Database type (blast)"), ], version: Annotated[ str, @@ -1416,7 +1407,7 @@ def database_unregister( nvd state database unregister blast core-nt_2024-01 --yes """ # Validate db_type - valid_types = ["blast", "stat", "gottcha2"] + valid_types = ["blast"] if db_type not in valid_types: if json_output: _output_json( @@ -3256,7 +3247,7 @@ def _update_setup_conf(new_state_dir: Path) -> bool: def _count_uncompacted_hits(state_dir: Path) -> int: """Count uncompacted hit files in the state directory.""" - hits_dir = state_dir / "hits" / "month=NULL" + hits_dir = state_dir / "hits" / "schema=v3" / "month=NULL" if not hits_dir.exists(): return 0 return len(list(hits_dir.rglob("*.parquet"))) diff --git a/lib/py_nvd/cli/commands/validate.py b/lib/py_nvd/cli/commands/validate.py index afaff0c..ca2d93b 100644 --- a/lib/py_nvd/cli/commands/validate.py +++ b/lib/py_nvd/cli/commands/validate.py @@ -246,12 +246,7 @@ def validate_databases( # Database parameters to check db_params = { - "stat_index": "STAT index file", - "stat_dbss": "STAT dbss file", - "stat_annotation": "STAT annotation file", - "human_virus_taxlist": "Human virus taxlist", "blast_db": "BLAST database directory", - "gottcha2_db": "GOTTCHA2 database file", } console.print() diff --git a/lib/py_nvd/cli/commands/version.py b/lib/py_nvd/cli/commands/version.py index 68db25c..61d6e83 100644 --- a/lib/py_nvd/cli/commands/version.py +++ b/lib/py_nvd/cli/commands/version.py @@ -22,12 +22,13 @@ def version() -> None: """Show version information.""" + pipeline_root = str(PIPELINE_ROOT) if PIPELINE_ROOT is not None else "not found" console.print( Panel.fit( f"[bold cyan]NVD2 CLI[/bold cyan]\n" f"Version: {__version__}\n\n" f"A user-friendly wrapper for the NVD2 Nextflow pipeline.\n" - f"Pipeline: {PIPELINE_ROOT}", + f"Pipeline: {pipeline_root}", title="Version Info", border_style="cyan", ), diff --git a/lib/py_nvd/cli/test_cli_smoke.py b/lib/py_nvd/cli/test_cli_smoke.py index 114f492..c68eae9 100644 --- a/lib/py_nvd/cli/test_cli_smoke.py +++ b/lib/py_nvd/cli/test_cli_smoke.py @@ -8,6 +8,7 @@ import pytest from typer.testing import CliRunner +from py_nvd.cli import utils as cli_utils from py_nvd.cli.app import app from py_nvd.cli.commands.resume import EDITOR_MIN_DURATION_SECONDS from py_nvd.cli.utils import PIPELINE_ROOT, RESUME_FILE, get_default_profile, get_editor @@ -520,7 +521,7 @@ def test_validate_params(self, tmp_path: Path) -> None: """validate params validates a params file.""" # Create a valid params file params_file = tmp_path / "test-params.yaml" - params_file.write_text("tools: blast\ncutoff_percent: 0.01\n") + params_file.write_text("dedup: true\ncutoff_percent: 0.01\n") result = runner.invoke(app, ["validate", "params", str(params_file)]) # Should succeed with valid params @@ -621,7 +622,7 @@ def test_run_samplesheet_from_params_file( # Create params file with samplesheet params_file = tmp_path / "params.yaml" - params_file.write_text(f"samplesheet: {samplesheet}\ntools: blast\n") + params_file.write_text(f"samplesheet: {samplesheet}\ndedup: true\n") result = runner.invoke( app, @@ -646,26 +647,24 @@ def test_run_cli_overrides_params_file( "sample1,,illumina,/path/to/r1.fastq.gz,/path/to/r2.fastq.gz\n", ) - # Create params file with tools=all + # Create params file with dedup_seq=true params_file = tmp_path / "params.yaml" - params_file.write_text(f"samplesheet: {samplesheet}\ntools: all\n") + params_file.write_text(f"samplesheet: {samplesheet}\ndedup_seq: true\n") - # CLI specifies tools=blast, should override + # CLI specifies --dedup, adding the umbrella dedup parameter result = runner.invoke( app, [ "run", "--params-file", str(params_file), - "--tools", - "blast", + "--dedup", "--dry-run", ], ) assert result.exit_code == 0 - # The command output should show blast, not all - assert "--tools" in result.stdout - assert "blast" in result.stdout + assert "--dedup true" in result.stdout + assert "--dedup_seq true" in result.stdout def test_run_samplesheet_not_found_error( self, @@ -682,12 +681,12 @@ def test_run_samplesheet_not_found_error( assert result.exit_code == 1 assert "not found" in result.stdout.lower() - def test_run_invalid_tools_error( + def test_run_invalid_range_error( self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ) -> None: - """run with invalid tools option raises validation error.""" + """run with invalid parameter value raises validation error.""" monkeypatch.setenv("NVD_STATE_DIR", str(tmp_path)) # Create a valid samplesheet @@ -703,15 +702,14 @@ def test_run_invalid_tools_error( "run", "--samplesheet", str(samplesheet), - "--tools", - "invalid", + "--cutoff-percent", + "-0.1", "--dry-run", ], ) assert result.exit_code == 1 - # Pydantic ValidationError is raised with details about invalid tools assert result.exception is not None - assert "invalid" in str(result.exception).lower() + assert "between 0 and 1" in str(result.exception).lower() class TestRunSlackOptions: @@ -1083,14 +1081,69 @@ class TestPipelineRoot: def test_pipeline_root_exists(self) -> None: """PIPELINE_ROOT points to a valid pipeline directory.""" + assert PIPELINE_ROOT is not None assert PIPELINE_ROOT.exists() assert (PIPELINE_ROOT / "main.nf").exists() assert (PIPELINE_ROOT / "nextflow.config").exists() def test_pipeline_root_is_absolute(self) -> None: """PIPELINE_ROOT is an absolute path.""" + assert PIPELINE_ROOT is not None assert PIPELINE_ROOT.is_absolute() + def test_pipeline_root_has_nvd_sentinels(self) -> None: + """PIPELINE_ROOT points to an NVD checkout, not just any Nextflow project.""" + assert PIPELINE_ROOT is not None + assert cli_utils._has_nvd_sentinels(PIPELINE_ROOT) + + def test_unrelated_nextflow_project_is_not_nvd(self, tmp_path: Path) -> None: + """A generic Nextflow project is not enough to become the NVD root.""" + (tmp_path / "main.nf").write_text("workflow { }\n", encoding="utf-8") + (tmp_path / "nextflow.config").write_text("params { }\n", encoding="utf-8") + + assert not cli_utils._has_nvd_sentinels(tmp_path) + + def test_explicit_invalid_pipeline_root_fails_fast( + self, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + ) -> None: + """An invalid NVD_PIPELINE_ROOT should not silently fall back.""" + monkeypatch.setenv("NVD_PIPELINE_ROOT", str(tmp_path)) + + with pytest.raises(RuntimeError, match="NVD_PIPELINE_ROOT is set"): + cli_utils._find_pipeline_root() + + def test_package_root_preferred_over_unrelated_cwd( + self, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + ) -> None: + """Root discovery should not select an unrelated Nextflow cwd.""" + (tmp_path / "main.nf").write_text("workflow { }\n", encoding="utf-8") + (tmp_path / "nextflow.config").write_text("params { }\n", encoding="utf-8") + monkeypatch.chdir(tmp_path) + monkeypatch.delenv("NVD_PIPELINE_ROOT", raising=False) + + assert PIPELINE_ROOT is not None + assert cli_utils._find_pipeline_root() == PIPELINE_ROOT + + def test_optional_pipeline_root_allows_import_without_root( + self, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + ) -> None: + """Container image import smoke tests should not require a pipeline checkout.""" + monkeypatch.chdir(tmp_path) + monkeypatch.delenv("NVD_PIPELINE_ROOT", raising=False) + monkeypatch.setattr( + cli_utils, + "_find_parent_pipeline_root", + lambda _start: None, + ) + + assert cli_utils._find_pipeline_root_optional() is None + class TestHitsCommands: """Verify hits commands work with isolated state directory.""" @@ -2015,7 +2068,7 @@ def test_hits_compact_basic( assert "Compacted" in result.stdout assert "2024-01" in result.stdout - compacted_path = tmp_path / "hits" / "month=2024-01" / "data.parquet" + compacted_path = get_hits_dir(tmp_path) / "month=2024-01" / "data.parquet" assert compacted_path.exists() def test_hits_compact_json( @@ -2071,8 +2124,8 @@ def test_hits_compact_month_filter( assert result.exit_code == 0 assert "2024-01" in result.stdout - jan_path = tmp_path / "hits" / "month=2024-01" / "data.parquet" - feb_path = tmp_path / "hits" / "month=2024-02" / "data.parquet" + jan_path = get_hits_dir(tmp_path) / "month=2024-01" / "data.parquet" + feb_path = get_hits_dir(tmp_path) / "month=2024-02" / "data.parquet" assert jan_path.exists() assert not feb_path.exists() diff --git a/lib/py_nvd/cli/utils.py b/lib/py_nvd/cli/utils.py index 291c91b..d1c08ad 100644 --- a/lib/py_nvd/cli/utils.py +++ b/lib/py_nvd/cli/utils.py @@ -21,7 +21,6 @@ from rich.console import Console from py_nvd.db import DEFAULT_CONFIG_PATH, get_config_path, get_state_db_path -from py_nvd.fingerprint import is_dev_mode, verify_pipeline # Re-export for backward compatibility (prefer get_config_path() for new code) DEFAULT_CONFIG = DEFAULT_CONFIG_PATH @@ -29,33 +28,50 @@ # Resume file for `nvd resume` command (stored in launch directory) RESUME_FILE = Path(".nfresume") -# Maximum directory depth to search when looking for pipeline root -MAX_PIPELINE_ROOT_DEPTH = 10 +# Files and directories that distinguish NVD from an arbitrary Nextflow project. +NVD_PIPELINE_SENTINELS = ( + "main.nf", + "nextflow.config", + "pyproject.toml", + "lib/py_nvd", + "modules", + "subworkflows", +) # Time constants for duration formatting SECONDS_PER_MINUTE = 60 SECONDS_PER_HOUR = 3600 -def _has_pipeline_files(candidate: Path) -> bool: - """Check if a directory contains the core pipeline files.""" - return (candidate / "main.nf").exists() and (candidate / "nextflow.config").exists() +def _has_nvd_sentinels(candidate: Path) -> bool: + """Check whether a directory looks like an NVD source checkout.""" + return all((candidate / sentinel).exists() for sentinel in NVD_PIPELINE_SENTINELS) -def _is_verified_nvd_pipeline(candidate: Path) -> bool: - """ - Verify a candidate directory is the authentic NVD pipeline. +def _find_parent_pipeline_root(start: Path) -> Path | None: + """Walk upward from a path until an NVD pipeline root is found.""" + current = start.resolve() + if current.is_file(): + current = current.parent + + while True: + if _has_nvd_sentinels(current): + return current + if current.parent == current: + break + current = current.parent + + return None - In dev mode (editable install or NVD_DEV_MODE set), only checks for - file presence. In production, verifies blake3 hashes match the - fingerprint file. - """ - if not _has_pipeline_files(candidate): - return False - # In dev mode, skip hash verification (files change during development) - # In production, verify hashes match - return verify_pipeline(candidate, strict=not is_dev_mode()) +def _pipeline_root_error() -> RuntimeError: + """Build the standard missing pipeline root error.""" + msg = ( + "Could not find NVD pipeline root. " + "Either run from the repository root, set NVD_PIPELINE_ROOT, " + "or ensure the CLI is installed from the cloned repository." + ) + return RuntimeError(msg) def _find_pipeline_root() -> Path: @@ -64,15 +80,12 @@ def _find_pipeline_root() -> Path: Strategy (in order of precedence): 1. NVD_PIPELINE_ROOT environment variable (explicit override) - 2. Current working directory (if main.nf exists there) - 3. Walk up from this file's location (development/editable install) + 2. Walk up from this file's location (development/editable install) + 3. Current working directory (container bind-mount fallback) - Each candidate is verified against the pipeline fingerprint to ensure - it's actually the NVD pipeline and not some other Nextflow project. - In dev mode, verification is relaxed to allow for local edits. - - The cwd check (strategy 2) enables running the CLI from within a container - when the repo is bind-mounted to the working directory. + Candidates must contain NVD-specific sentinel paths so the CLI does not + accidentally run an unrelated Nextflow project that merely has main.nf and + nextflow.config. Returns: Path to the pipeline root directory. @@ -83,34 +96,48 @@ def _find_pipeline_root() -> Path: # Strategy 1: Explicit override via environment variable if env_root := os.environ.get("NVD_PIPELINE_ROOT"): candidate = Path(env_root).resolve() - if _is_verified_nvd_pipeline(candidate): + if _has_nvd_sentinels(candidate): return candidate - # If explicitly set but invalid, warn and continue to other strategies - # (could also raise here, but graceful fallback seems friendlier) - - # Strategy 2: Current working directory (container-friendly) - cwd = Path.cwd() - if _is_verified_nvd_pipeline(cwd): - return cwd - - # Strategy 3: Walk up from installed package location (original behavior) - current = Path(__file__).resolve().parent - for _ in range(MAX_PIPELINE_ROOT_DEPTH): - if _is_verified_nvd_pipeline(current): - return current - if current.parent == current: # Hit filesystem root - break - current = current.parent - msg = ( - "Could not find NVD pipeline root (main.nf not found or fingerprint mismatch). " - "Either run from the repository root, set NVD_PIPELINE_ROOT, " - "or ensure the CLI is installed from the cloned repository." - ) - raise RuntimeError(msg) + msg = ( + "NVD_PIPELINE_ROOT is set, but does not point to an NVD pipeline root: " + f"{candidate}" + ) + raise RuntimeError(msg) + + # Strategy 2: Walk up from installed package location. + package_root = _find_parent_pipeline_root(Path(__file__)) + if package_root is not None: + return package_root + + # Strategy 3: Current working directory fallback for container bind mounts. + cwd_root = _find_parent_pipeline_root(Path.cwd()) + if cwd_root is not None: + return cwd_root + + raise _pipeline_root_error() + + +def _find_pipeline_root_optional() -> Path | None: + """Find the pipeline root when available without making CLI imports fail.""" + try: + return _find_pipeline_root() + except RuntimeError as exc: + if os.environ.get("NVD_PIPELINE_ROOT"): + raise + if str(exc) != str(_pipeline_root_error()): + raise + return None + + +def get_pipeline_root() -> Path: + """Return the pipeline root, failing only when a command actually needs it.""" + if PIPELINE_ROOT is not None: + return PIPELINE_ROOT + return _find_pipeline_root() -PIPELINE_ROOT = _find_pipeline_root() +PIPELINE_ROOT = _find_pipeline_root_optional() def get_editor() -> str: @@ -128,16 +155,6 @@ def get_editor() -> str: return os.environ.get("VISUAL") or os.environ.get("EDITOR") or "vi" -VALID_TOOLS = [ - "stat_blast", - "nvd", - "stat", - "blast", - "stast", - "gottcha", - "all", - "clumpify", -] MAX_PREVIEW_ITEMS = 5 # Max items to show before "... and N more" # Help panel names for organizing --help output @@ -145,7 +162,6 @@ def get_editor() -> str: PANEL_PREPROCESSING = "Read Preprocessing" PANEL_DATABASES = "Database Paths" PANEL_ANALYSIS = "Analysis Parameters" -PANEL_SRA = "SRA Submission" PANEL_LABKEY = "LabKey Integration" PANEL_NOTIFICATIONS = "Notifications" diff --git a/lib/py_nvd/db.py b/lib/py_nvd/db.py index 0df259f..fdce9ef 100644 --- a/lib/py_nvd/db.py +++ b/lib/py_nvd/db.py @@ -24,10 +24,10 @@ Taxonomy: NVD_TAXONOMY_DB env var > {state_dir}/taxdump/ Schema Migration Safety: - When the database schema version doesn't match the expected version, - the database must be recreated. This is a DESTRUCTIVE operation that - loses all existing state (runs, samples, uploads). To prevent accidental - data loss: + Known older schema versions are backed up and migrated in place. Unknown + schema versions still require recreation. Recreating the database is a + DESTRUCTIVE operation that loses all existing state (runs, samples, + uploads). To prevent accidental data loss: 1. Interactive mode (TTY): User is prompted for confirmation with a 5-minute timeout. If no response, the operation is aborted. @@ -70,7 +70,9 @@ DEFAULT_CONFIG_PATH = DEFAULT_NVD_HOME / "user.config" DEFAULT_STATE_DIR = DEFAULT_NVD_CACHE -EXPECTED_VERSION = 2 +EXPECTED_VERSION = 3 + +_MIGRATABLE_VERSION = 2 # Timeout for interactive confirmation prompt (seconds) CONFIRMATION_TIMEOUT_SECONDS = 300 # 5 minutes @@ -414,9 +416,9 @@ def get_hits_dir(state_dir: Path | str | None = None) -> Path: """ Get path to the hits directory containing parquet files. - The hits directory uses Hive-style partitioning by month: - Uncompacted: {state_dir}/hits/month=NULL/{sample_set_id}/{sample_id}/data.parquet - Compacted: {state_dir}/hits/month=YYYY-MM/data.parquet + The v3 hits directory uses Hive-style partitioning by schema and month: + Uncompacted: {state_dir}/hits/schema=v3/month=NULL/{sample_set_id}/{sample_id}/data.parquet + Compacted: {state_dir}/hits/schema=v3/month=YYYY-MM/data.parquet The directory is created if it doesn't exist. @@ -427,7 +429,7 @@ def get_hits_dir(state_dir: Path | str | None = None) -> Path: Returns: Path to the hits directory """ - hits_dir = get_state_dir(state_dir) / "hits" + hits_dir = get_state_dir(state_dir) / "hits" / "schema=v3" hits_dir.mkdir(parents=True, exist_ok=True) return hits_dir @@ -438,6 +440,88 @@ def _init_schema(conn: sqlite3.Connection) -> None: conn.executescript(schema) +def _migrate_v2_to_v3(conn: sqlite3.Connection) -> None: + """Migrate v2 state to the BLAST-only v3 schema. + + v2 state could contain STAT/GOTTCHA2-era provenance. v3 keeps the BLAST + workflow state that is still meaningful and drops retired workflow rows + from the active schema. The caller creates a full SQLite backup first. + """ + conn.executescript( + """ + PRAGMA foreign_keys=OFF; + + DROP INDEX IF EXISTS idx_processed_samples_sample_id; + DROP INDEX IF EXISTS idx_databases_path; + DROP INDEX IF EXISTS idx_uploads_sample_id; + DROP INDEX IF EXISTS idx_uploads_target; + + ALTER TABLE processed_samples RENAME TO processed_samples_v2; + CREATE TABLE processed_samples ( + sample_id TEXT NOT NULL, + sample_set_id TEXT NOT NULL, + run_id TEXT NOT NULL REFERENCES runs(run_id), + processed_at TEXT NOT NULL, + blast_db_version TEXT, + taxonomy_hash TEXT, + status TEXT NOT NULL CHECK (status IN ('completed', 'uploaded', 'failed')), + PRIMARY KEY (sample_id, sample_set_id) + ); + INSERT INTO processed_samples + (sample_id, sample_set_id, run_id, processed_at, blast_db_version, taxonomy_hash, status) + SELECT sample_id, sample_set_id, run_id, processed_at, blast_db_version, taxonomy_hash, status + FROM processed_samples_v2; + DROP TABLE processed_samples_v2; + + ALTER TABLE databases RENAME TO databases_v2; + CREATE TABLE databases ( + db_type TEXT NOT NULL CHECK (db_type IN ('blast')), + version TEXT NOT NULL, + path TEXT NOT NULL, + checksum TEXT, + registered_at TEXT NOT NULL, + PRIMARY KEY (db_type, version) + ); + INSERT INTO databases (db_type, version, path, checksum, registered_at) + SELECT db_type, version, path, checksum, registered_at + FROM databases_v2 + WHERE db_type = 'blast'; + DROP TABLE databases_v2; + + ALTER TABLE uploads RENAME TO uploads_v2; + CREATE TABLE uploads ( + sample_id TEXT NOT NULL, + sample_set_id TEXT NOT NULL, + upload_type TEXT NOT NULL CHECK (upload_type IN ('blast', 'blast_fasta')), + upload_target TEXT NOT NULL, + content_hash TEXT NOT NULL, + uploaded_at TEXT NOT NULL, + target_metadata TEXT, + PRIMARY KEY (sample_id, sample_set_id, upload_type, upload_target), + FOREIGN KEY (sample_id, sample_set_id) REFERENCES processed_samples(sample_id, sample_set_id) + ); + INSERT INTO uploads + (sample_id, sample_set_id, upload_type, upload_target, content_hash, uploaded_at, target_metadata) + SELECT sample_id, sample_set_id, upload_type, upload_target, content_hash, uploaded_at, target_metadata + FROM uploads_v2 + WHERE upload_type IN ('blast', 'blast_fasta'); + DROP TABLE uploads_v2; + + CREATE INDEX IF NOT EXISTS idx_processed_samples_sample_id + ON processed_samples(sample_id); + CREATE INDEX IF NOT EXISTS idx_databases_path ON databases(db_type, path); + CREATE INDEX IF NOT EXISTS idx_uploads_sample_id + ON uploads(sample_id); + CREATE INDEX IF NOT EXISTS idx_uploads_target + ON uploads(upload_target); + + PRAGMA user_version = 3; + PRAGMA foreign_keys=ON; + """, + ) + conn.commit() + + def _get_version(conn: sqlite3.Connection) -> int: """Get the schema version from the database.""" return conn.execute("PRAGMA user_version").fetchone()[0] @@ -448,6 +532,30 @@ def _check_version(conn: sqlite3.Connection) -> bool: return _get_version(conn) == EXPECTED_VERSION +def _can_migrate_in_place(current_version: int) -> bool: + """Return True when this version has a non-destructive migration path.""" + return current_version == _MIGRATABLE_VERSION + + +def _migrate_in_place( + db_path: Path, + conn: sqlite3.Connection, + current_version: int, +) -> Path: + """Backup and migrate a known older schema without deleting the database.""" + if current_version != _MIGRATABLE_VERSION: + msg = f"No in-place migration registered for schema version {current_version}" + raise SchemaMismatchError( + db_path, + current_version, + EXPECTED_VERSION, + ) from ValueError(msg) + + backup_path = _create_backup(db_path) + _migrate_v2_to_v3(conn) + return backup_path + + def _configure_connection(conn: sqlite3.Connection) -> None: """Apply standard connection configuration. @@ -695,15 +803,15 @@ def connect( Context manager for state database connections. Creates the database and schema if missing. If the schema version doesn't - match, behavior depends on allow_destructive_update and whether stdin is - a TTY: + match, known older versions are backed up and migrated in place. Unknown + versions depend on allow_destructive_update and whether stdin is a TTY: - allow_destructive_update=True: Backup and recreate automatically - TTY available: Prompt user for confirmation (5-minute timeout) - Non-interactive: Raise SchemaMismatchError - In all cases where the database is recreated, a timestamped backup is - created first. + In all cases where the database is migrated or recreated, a timestamped + backup is created first. Args: state_dir: Optional explicit state directory. If None, resolves @@ -736,17 +844,22 @@ def connect( conn = sqlite3.connect(db_path, timeout=30.0) if not _check_version(conn): current_version = _get_version(conn) - conn.close() - # This may raise SchemaMismatchError if user doesn't consent - _handle_schema_mismatch( - db_path, - current_version, - allow_destructive_update=allow_destructive_update, - ) - # If we get here, the old database was backed up and deleted - conn = sqlite3.connect(db_path, timeout=30.0) - _configure_connection(conn) - _init_schema(conn) + if _can_migrate_in_place(current_version): + _configure_connection(conn) + _migrate_in_place(db_path, conn, current_version) + _configure_connection(conn) + else: + conn.close() + # This may raise SchemaMismatchError if user doesn't consent + _handle_schema_mismatch( + db_path, + current_version, + allow_destructive_update=allow_destructive_update, + ) + # If we get here, the old database was backed up and deleted + conn = sqlite3.connect(db_path, timeout=30.0) + _configure_connection(conn) + _init_schema(conn) else: _configure_connection(conn) else: diff --git a/lib/py_nvd/fingerprint.py b/lib/py_nvd/fingerprint.py deleted file mode 100644 index d4e4d1d..0000000 --- a/lib/py_nvd/fingerprint.py +++ /dev/null @@ -1,257 +0,0 @@ -# ruff: noqa: T201 -""" -Pipeline fingerprint generation and verification. - -This module provides functions to generate and verify blake3 hashes of -critical pipeline files (main.nf, nextflow.config) to ensure the CLI -is operating on the correct NVD pipeline, not some other Nextflow project. - -The fingerprint is stored in lib/py_nvd/_fingerprint.json and should be -regenerated whenever main.nf or nextflow.config change (automated via -pre-commit hook or pixi task). -""" - -from __future__ import annotations - -import json -import os -import sys -from pathlib import Path - -import blake3 - -# Path to the fingerprint file (relative to this module) -FINGERPRINT_FILE = Path(__file__).parent / "_fingerprint.json" - -# Files to include in the fingerprint -FINGERPRINTED_FILES = ["main.nf", "nextflow.config"] - -# Expected length of a blake3 hex digest -_BLAKE3_HEX_DIGEST_LENGTH = 64 - - -def hash_file(path: Path) -> str: - """ - Compute blake3 hash of a file. - - Args: - path: Path to the file to hash. - - Returns: - Hex-encoded blake3 hash string. - """ - assert path.exists(), f"Cannot hash non-existent file: {path}" - assert path.is_file(), f"Expected file, got directory: {path}" - - hasher = blake3.blake3() - with open(path, "rb") as f: - # Read in chunks for memory efficiency on large files - for chunk in iter(lambda: f.read(65536), b""): - hasher.update(chunk) - - result = hasher.hexdigest() - assert isinstance(result, str), "blake3 hexdigest should return str" - assert len(result) == _BLAKE3_HEX_DIGEST_LENGTH, ( - f"blake3 hex digest should be 64 chars, got {len(result)}" - ) - return result - - -def generate_fingerprint(pipeline_root: Path) -> dict[str, str]: - """ - Generate fingerprint hashes for pipeline files. - - Args: - pipeline_root: Path to the NVD pipeline root directory. - - Returns: - Dictionary mapping filenames to their blake3 hashes. - - Raises: - FileNotFoundError: If any fingerprinted file is missing. - """ - assert pipeline_root.is_dir(), f"Pipeline root must be a directory: {pipeline_root}" - - fingerprint = {} - for filename in FINGERPRINTED_FILES: - file_path = pipeline_root / filename - if not file_path.exists(): - msg = ( - f"Cannot generate fingerprint: {filename} not found in {pipeline_root}" - ) - raise FileNotFoundError(msg) - fingerprint[filename] = hash_file(file_path) - - assert len(fingerprint) == len(FINGERPRINTED_FILES), "All files should be hashed" - return fingerprint - - -def save_fingerprint(pipeline_root: Path, output_path: Path | None = None) -> Path: - """ - Generate and save fingerprint to JSON file. - - Args: - pipeline_root: Path to the NVD pipeline root directory. - output_path: Where to save the fingerprint. Defaults to FINGERPRINT_FILE. - - Returns: - Path to the saved fingerprint file. - """ - output = output_path or FINGERPRINT_FILE - fingerprint = generate_fingerprint(pipeline_root) - - assert output.parent.exists(), f"Output directory must exist: {output.parent}" - - with open(output, "w") as f: - json.dump(fingerprint, f, indent=2) - f.write("\n") # Trailing newline - - assert output.exists(), f"Fingerprint file should exist after save: {output}" - return output - - -def load_fingerprint(fingerprint_path: Path | None = None) -> dict[str, str] | None: - """ - Load fingerprint from JSON file. - - Args: - fingerprint_path: Path to fingerprint file. Defaults to FINGERPRINT_FILE. - - Returns: - Dictionary of filename -> hash, or None if file doesn't exist. - """ - path = fingerprint_path or FINGERPRINT_FILE - if not path.exists(): - return None - - with open(path) as f: - result = json.load(f) - - assert isinstance(result, dict), f"Fingerprint should be a dict, got {type(result)}" - return result - - -def verify_pipeline( - candidate: Path, - fingerprint_path: Path | None = None, - strict: bool = True, # noqa: FBT001, FBT002 -) -> bool: - """ - Verify a candidate directory is the authentic NVD pipeline. - - Args: - candidate: Path to check. - fingerprint_path: Path to fingerprint file. Defaults to FINGERPRINT_FILE. - strict: If True, require fingerprint file to exist and all hashes to match. - If False, return True when fingerprint file is missing (dev mode). - - Returns: - True if the candidate is verified as the NVD pipeline. - """ - assert candidate.is_dir(), f"Candidate must be a directory: {candidate}" - - expected = load_fingerprint(fingerprint_path) - - if expected is None: - # No fingerprint file - in strict mode this is a failure, - # in non-strict mode we assume dev environment and allow it - return not strict - - return all( - (candidate / filename).exists() - and hash_file(candidate / filename) == expected_hash - for filename, expected_hash in expected.items() - ) - - -def is_dev_mode() -> bool: - """ - Check if running in development mode. - - Development mode is detected by: - 1. NVD_DEV_MODE environment variable is set - 2. The package is installed in editable mode (py_nvd source is in a git repo) - - Returns: - True if in development mode. - """ - if os.environ.get("NVD_DEV_MODE"): - return True - - # Check if we're in an editable install (source dir has .git) - source_dir = Path(__file__).parent.parent.parent # lib/py_nvd -> lib -> repo root - return (source_dir / ".git").exists() - - -def _find_pipeline_root_for_fingerprint() -> Path | None: - """ - Locate pipeline root for fingerprint generation. - - Tries (in order): - 1. Walk up from this file's location - 2. Current working directory - - Returns: - Path to pipeline root, or None if not found. - """ - # Try walking up from this file - current = Path(__file__).parent.parent.parent # lib/py_nvd -> lib -> repo root - if (current / "main.nf").exists(): - return current - - # Try cwd - cwd = Path.cwd() - if (cwd / "main.nf").exists(): - return cwd - - return None - - -def main() -> None: - """ - CLI entry point for generating/updating the pipeline fingerprint. - - Usage: - nvd-fingerprint # Generate from repo root (auto-detected) - nvd-fingerprint /path # Generate from specified path - """ - # Determine pipeline root - explicit path takes precedence - if len(sys.argv) > 1: - pipeline_root = Path(sys.argv[1]).resolve() - if not pipeline_root.is_dir(): - print(f"Error: Not a directory: {pipeline_root}") # CLI entry point output - sys.exit(1) - if not (pipeline_root / "main.nf").exists(): - print( - f"Error: No main.nf found in {pipeline_root}", - ) # CLI entry point output - print( - "Are you sure this is the NVD pipeline root?", - ) # CLI entry point output - sys.exit(1) - else: - pipeline_root = _find_pipeline_root_for_fingerprint() - if pipeline_root is None: - print( - "Error: Could not find pipeline root (main.nf not found)", - ) # CLI entry point output - print() # CLI entry point output - print("Try one of:") # CLI entry point output - print( - " - Run from the NVD repository root directory", - ) # CLI entry point output - print( - " - Pass the path explicitly: nvd-fingerprint /path/to/nvd", - ) # CLI entry point output - sys.exit(1) - - try: - output = save_fingerprint(pipeline_root) # ty:ignore[invalid-argument-type] - fingerprint = load_fingerprint(output) - print(f"Fingerprint saved to: {output}") # CLI entry point output - print("Hashes:") # CLI entry point output - for filename, file_hash in (fingerprint or {}).items(): - print(f" {filename}: {file_hash[:16]}...") # CLI entry point output - except FileNotFoundError as e: - print(f"Error: {e}") # CLI entry point output - sys.exit(1) diff --git a/lib/py_nvd/hits.py b/lib/py_nvd/hits.py index f8bb22e..3324c61 100644 --- a/lib/py_nvd/hits.py +++ b/lib/py_nvd/hits.py @@ -3,7 +3,7 @@ Hit management for metagenomic sequence identification. Provides idempotent hit registration and querying. A "hit" is a sequence -identified by BLAST or GOTTCHA2. Hit keys are computed from canonical sequences +identified by BLAST. Hit keys are computed from canonical sequences (lexicographically smaller of forward/reverse-complement), enabling: - Cross-run deduplication: same sequence in different runs → same key @@ -25,12 +25,12 @@ - Efficient queries: DuckDB provides fast analytical queries across all files - Partition pruning: time-based queries skip irrelevant files - Storage Layout (Hive-partitioned by month): + Storage Layout (Hive-partitioned by schema and month): Uncompacted (fresh from pipeline): - {state_dir}/hits/month=NULL/{sample_set_id}/{sample_id}/data.parquet + {state_dir}/hits/schema=v3/month=NULL/{sample_set_id}/{sample_id}/data.parquet Compacted (after running `nvd hits compact`): - {state_dir}/hits/month=2026-01/data.parquet + {state_dir}/hits/schema=v3/month=2026-01/data.parquet The month=NULL partition holds uncompacted data. After compaction, data moves to month=YYYY-MM partitions sorted by hit_key for better compression @@ -42,8 +42,9 @@ 3. Readers never see partial files (glob ignores .tmp files) Query Pattern: - DuckDB reads all parquet files via glob with hive_partitioning=true. - The `month` column is extracted from the directory structure. + DuckDB reads all v3 parquet files via glob with hive_partitioning=true. + The `month` column is extracted from the directory structure; the + `schema` partition keeps v2 and v3 stores separate. The `first_seen_date` is computed at query time as MIN(run_date). The `effective_month` column normalizes month for both compacted and uncompacted data via COALESCE(month, strftime(run_date, '%Y-%m')). @@ -102,9 +103,8 @@ "TGCAtgcaNnYRSWMKVHDByrswmkvhdb", ) -# Canonical parquet schema for hit records. This is the target state after -# compaction normalizes legacy files. Column order matters for readability -# but not for correctness (DuckDB uses column names, not positions). +# Canonical v3 parquet schema for BLAST hit records. Column order matters for +# readability but not for correctness (DuckDB uses column names, not positions). CANONICAL_HIT_SCHEMA: dict[str, pl.DataType] = { "hit_key": pl.Utf8, "sequence_length": pl.Int64, @@ -120,50 +120,17 @@ "adjusted_taxid_rank": pl.Utf8, } -# Column renames applied during normalization: old_name -> new_name. -SCHEMA_RENAMES: dict[str, str] = { - "contig_id": "sequence_id", -} - -# Default values for columns missing from legacy parquet files. -SCHEMA_DEFAULTS: dict[str, object] = { - "source": "blast", - "sequence_id": None, -} - def normalize_schema(df: pl.DataFrame) -> pl.DataFrame: """ - Normalize a DataFrame to the canonical hit schema. - - Applies column renames (e.g. contig_id -> sequence_id), adds missing - columns with default values, and retains a NULL contig_id column for - backward compatibility with the DuckDB view's COALESCE/EXCLUDE pattern. - This is idempotent — normalizing an already-normalized DataFrame is a - no-op. + Normalize a DataFrame to the canonical v3 BLAST hit schema. - Used by compaction to ensure compacted output uses a consistent schema - regardless of what schema the input files had. + v3 intentionally does not migrate v2 parquet files. The schema=v3 path + partition keeps old and new hit stores separate so this function can stay + boring: it selects the canonical columns and lets missing required columns + fail loudly. """ - for old_name, new_name in SCHEMA_RENAMES.items(): - if old_name in df.columns and new_name not in df.columns: - df = df.rename({old_name: new_name}) - - for col_name, default_value in SCHEMA_DEFAULTS.items(): - if col_name not in df.columns: - df = df.with_columns(pl.lit(default_value).alias(col_name)) - - # Retain contig_id as a NULL column so the DuckDB view's - # EXCLUDE (contig_id, sequence_id) + COALESCE pattern always works, - # even when reading only compacted files. - if "contig_id" not in df.columns: - df = df.with_columns(pl.lit(None).cast(pl.Utf8).alias("contig_id")) - - # Select canonical columns plus the transition contig_id stub. - output_cols = [c for c in CANONICAL_HIT_SCHEMA if c in df.columns] - if "contig_id" not in output_cols: - output_cols.append("contig_id") - return df.select(output_cols) + return df.select(CANONICAL_HIT_SCHEMA) def is_valid_hit_key(key: str) -> bool: @@ -319,7 +286,7 @@ def _hits_glob_pattern(state_dir: Path | str | None = None) -> str: """ Get the glob pattern for reading all parquet hit files. - Returns a pattern like: /path/to/state/hits/**/*.parquet + Returns a pattern like: /path/to/state/hits/schema=v3/**/*.parquet """ hits_dir = get_hits_dir(state_dir) return str(hits_dir / "**" / "*.parquet") @@ -329,8 +296,9 @@ def _get_hits_view_sql(glob_pattern: str) -> str: """ Generate SQL to create a view over all parquet files. - Uses hive_partitioning=true to extract `month` from directory structure. - Uses union_by_name=true for schema evolution compatibility. + Uses hive_partitioning=true to extract `schema` and `month` from the + directory structure. The schema partition is intentionally not exposed + through the view. The view adds an `effective_month` column that: - Returns the Hive-extracted `month` for compacted files (e.g., month=2026-01) @@ -342,10 +310,9 @@ def _get_hits_view_sql(glob_pattern: str) -> str: return f""" CREATE OR REPLACE VIEW hits AS SELECT - * EXCLUDE (contig_id, sequence_id), - COALESCE(sequence_id, contig_id) AS sequence_id, + * EXCLUDE (schema), COALESCE(month::VARCHAR, strftime(run_date::DATE, '%Y-%m')) AS effective_month - FROM read_parquet('{glob_pattern}', hive_partitioning=true, union_by_name=true) + FROM read_parquet('{glob_pattern}', hive_partitioning=true) """ # SQL uses module constants, not user input @@ -398,10 +365,7 @@ class HitRecord: Each row in the parquet file represents one observation of a hit in a sample. Classification fields (adjusted_taxid, adjusted_taxid_name, adjusted_taxid_rank) - contain the consensus taxonomic assignment. For BLAST hits this is the LCA-adjusted - classification; for GOTTCHA2 hits this is the direct taxonomic assignment from - profiling. These may be None for hits from older runs that predate classification - tracking. + contain the LCA-adjusted BLAST taxonomic assignment. """ hit_key: str @@ -412,7 +376,7 @@ class HitRecord: sample_id: str run_date: str sequence_id: str | None - source: Literal["blast", "gottcha2"] + source: Literal["blast"] adjusted_taxid: int | None = None adjusted_taxid_name: str | None = None adjusted_taxid_rank: str | None = None @@ -435,9 +399,7 @@ def __post_init__(self) -> None: assert self.sample_set_id, "sample_set_id cannot be empty" assert self.sample_id, "sample_id cannot be empty" assert self.run_date, "run_date cannot be empty" - assert self.source in ("blast", "gottcha2"), ( - f"source must be 'blast' or 'gottcha2', got {self.source!r}" - ) + assert self.source == "blast", f"source must be 'blast', got {self.source!r}" def write_hits_parquet( @@ -453,7 +415,7 @@ def write_hits_parquet( If a file already exists for this sample, it is overwritten (last writer wins). Files are written to a Hive-partitioned structure: - hits/month=NULL/{sample_set_id}/{sample_id}/data.parquet + hits/schema=v3/month=NULL/{sample_set_id}/{sample_id}/data.parquet The month=NULL partition allows DuckDB to read uncompacted and compacted files together with hive_partitioning=true. After compaction, data moves to @@ -482,9 +444,7 @@ def write_hits_parquet( temp_path = sample_dir / ".data.parquet.tmp" if not hits: - # Write empty parquet with correct schema. - # Includes contig_id=NULL for backward compatibility with union_by_name - # reads against legacy parquet files (see COALESCE strategy in plan). + # Write empty parquet with the canonical v3 schema. hits_df = pl.DataFrame( schema={ "hit_key": pl.Utf8, @@ -495,7 +455,6 @@ def write_hits_parquet( "sample_id": pl.Utf8, "run_date": pl.Utf8, "sequence_id": pl.Utf8, - "contig_id": pl.Utf8, "source": pl.Utf8, "adjusted_taxid": pl.Int64, "adjusted_taxid_name": pl.Utf8, @@ -504,10 +463,6 @@ def write_hits_parquet( ) else: # Build DataFrame from hit records. - # Writes contig_id=NULL alongside sequence_id so that - # union_by_name=true always surfaces both columns when reading - # a mix of old and new parquet files. - n = len(hits) hits_df = pl.DataFrame( { "hit_key": [h.hit_key for h in hits], @@ -522,7 +477,6 @@ def write_hits_parquet( [h.sequence_id for h in hits], dtype=pl.Utf8, ), - "contig_id": pl.Series("contig_id", [None] * n, dtype=pl.Utf8), "source": [h.source for h in hits], "adjusted_taxid": [h.adjusted_taxid for h in hits], "adjusted_taxid_name": [h.adjusted_taxid_name for h in hits], @@ -548,7 +502,7 @@ def get_sample_parquet_path( Get the path where a sample's uncompacted parquet file would be stored. Returns the path in the month=NULL partition: - hits/month=NULL/{sample_set_id}/{sample_id}/data.parquet + hits/schema=v3/month=NULL/{sample_set_id}/{sample_id}/data.parquet Does not check if the file exists. """ @@ -2599,7 +2553,7 @@ def delete_sample_hits( Delete the parquet file for a specific sample (uncompacted data only). Deletes the entire sample directory: - hits/month=NULL/{sample_set_id}/{sample_id}/ + hits/schema=v3/month=NULL/{sample_set_id}/{sample_id}/ Args: sample_id: The sample identifier @@ -2630,7 +2584,7 @@ def _delete_sample_set_hits_uncompacted( Delete uncompacted parquet files for a sample set. Removes the sample set subdirectory under month=NULL/: - hits/month=NULL/{sample_set_id}/ + hits/schema=v3/month=NULL/{sample_set_id}/ Args: sample_set_id: The sample set identifier @@ -2929,8 +2883,9 @@ def compact_hits( # noqa: C901, PLR0912, PLR0915 # complexity is inherent to t """ Compact uncompacted hits into monthly partitions. - Reads data from hits/month=NULL/**, groups by month (from run_date), - sorts by hit_key, and writes to hits/month={YYYY-MM}/data.parquet. + Reads data from hits/schema=v3/month=NULL/**, groups by month (from + run_date), sorts by hit_key, and writes to + hits/schema=v3/month={YYYY-MM}/data.parquet. If a compacted file already exists for a month, the new data is merged with the existing data. @@ -3005,16 +2960,12 @@ def compact_hits( # noqa: C901, PLR0912, PLR0915 # complexity is inherent to t # Uses the frozen file list (not a glob) so concurrent writers # cannot inject files into the read set. if existing_file.exists(): - # Use SELECT * with UNION ALL BY NAME for schema evolution: - # - Old compacted files may lack new columns (e.g., adjusted_taxid) - # - New uncompacted files may have columns old compacted files lack - # UNION ALL BY NAME fills missing columns with NULL source_sql = f""" SELECT * - FROM read_parquet({file_list_sql}, union_by_name=true) + FROM read_parquet({file_list_sql}) WHERE strftime(run_date::DATE, '%Y-%m') = '{target_month}' - UNION ALL BY NAME + UNION ALL SELECT * FROM read_parquet('{existing_file}') @@ -3022,14 +2973,11 @@ def compact_hits( # noqa: C901, PLR0912, PLR0915 # complexity is inherent to t else: source_sql = f""" SELECT * - FROM read_parquet({file_list_sql}, union_by_name=true) + FROM read_parquet({file_list_sql}) WHERE strftime(run_date::DATE, '%Y-%m') = '{target_month}' """ # SQL uses module constants, not user input - # Read into Polars, normalize schema, then write. - # normalize_schema() handles column renames (contig_id -> - # sequence_id) and adds missing columns (source) with defaults, - # ensuring compacted output always uses the canonical schema. + # Read into Polars, normalize column order, then write. raw_df = con.execute( f"{source_sql} ORDER BY hit_key, run_date", ).pl() diff --git a/lib/py_nvd/models.py b/lib/py_nvd/models.py index 8f9bdcb..195db0a 100644 --- a/lib/py_nvd/models.py +++ b/lib/py_nvd/models.py @@ -90,9 +90,9 @@ def _from_row(cls: type[T], row: Row) -> T: # Type aliases for constrained values Status = Literal["running", "completed", "failed"] ProcessedSampleStatus = Literal["completed", "uploaded", "failed"] -DbType = Literal["blast", "stat", "gottcha2"] +DbType = Literal["blast"] Platform = Literal["illumina", "ont", "sra"] -UploadType = Literal["blast", "blast_fasta", "gottcha2", "gottcha2_fasta"] +UploadType = Literal["blast", "blast_fasta"] @dataclass(frozen=True, config=ConfigDict(coerce_numbers_to_str=True)) @@ -167,7 +167,6 @@ class ProcessedSample: processed_at: str status: ProcessedSampleStatus blast_db_version: str | None = None - stat_db_version: str | None = None taxonomy_hash: str | None = None @classmethod @@ -207,8 +206,6 @@ class DatabaseResolution: # Resolved versions (None if path not provided or unresolvable) blast_db_version: str | None = None - gottcha2_db_version: str | None = None - stat_db_version: str | None = None # Warnings to display to the user warnings: list[str] = Field(default_factory=list) @@ -374,7 +371,7 @@ def from_row(cls, row: Row) -> Self: return _from_row(cls, row) -HitSource = Literal["blast", "gottcha2"] +HitSource = Literal["blast"] @dataclass(frozen=True) @@ -390,10 +387,8 @@ class HitObservation: sample_set_id: str # Links to Run.sample_set_id sample_id: str # Source sample run_date: str # ISO8601 - sequence_id: str | None = ( - None # Sequence identifier (contig ID for BLAST, read ID for GOTTCHA2) - ) - source: HitSource | None = None # Hit provenance ("blast" or "gottcha2") + sequence_id: str | None = None # Sequence identifier (contig ID for BLAST) + source: HitSource | None = None # Hit provenance @classmethod def from_row(cls, row: Row) -> Self: @@ -760,20 +755,6 @@ class RunComparison: avg_median_length: float # Historical average median contig length -# Valid values for constrained fields -VALID_TOOLS = frozenset( - { - "stat_blast", - "nvd", - "stat", - "blast", - "stast", - "gottcha", - "all", - "clumpify", - }, -) - DEFAULT_HUMAN_VIRUS_FAMILIES = ( "Adenoviridae", "Anelloviridae", @@ -831,11 +812,6 @@ class NvdParams(BaseModel): description="Results directory", json_schema_extra={"category": "Core"}, ) - tools: str | None = Field( - None, - description="Workflow(s) to run: all, stat_blast, gottcha, blast, clumpify", - json_schema_extra={"category": "Core"}, - ) experiment_id: str | None = Field( None, description="Experiment identifier (required for LabKey uploads)", @@ -860,30 +836,15 @@ class NvdParams(BaseModel): # ========================================================================= # Database Versions # ========================================================================= - gottcha2_db_version: str | None = Field( - None, - description="GOTTCHA2 database version", - json_schema_extra={"category": "Databases"}, - ) blast_db_version: str | None = Field( None, description="BLAST database version", json_schema_extra={"category": "Databases"}, ) - stat_db_version: str | None = Field( - None, - description="STAT database version", - json_schema_extra={"category": "Databases"}, - ) # ========================================================================= # Database Paths # ========================================================================= - gottcha2_db: Path | None = Field( - None, - description="Path to GOTTCHA2 database directory", - json_schema_extra={"category": "Databases"}, - ) nvd_files: Path | None = Field( None, description="Path to NVD resource files directory", @@ -899,24 +860,39 @@ class NvdParams(BaseModel): description="BLAST database name prefix", json_schema_extra={"category": "Databases"}, ) - stat_index: Path | None = Field( + virus_index: Path | None = Field( None, - description="Path to STAT index file", + description="Path to prebuilt vertebrate-infecting virus deacon index (.idx file)", json_schema_extra={"category": "Databases"}, ) - stat_dbss: Path | None = Field( + virus_index_url: str | None = Field( None, - description="Path to STAT DBSS file", + description="URL to download a prebuilt vertebrate-infecting virus deacon index", json_schema_extra={"category": "Databases"}, ) - stat_annotation: Path | None = Field( + virus_reference_fasta: Path | None = Field( None, - description="Path to STAT annotation file", + description="Custom vertebrate-infecting virus FASTA for building an enrichment index", json_schema_extra={"category": "Databases"}, ) - human_virus_taxlist: Path | None = Field( - None, - description="Path to human virus taxonomy list file", + virus_kmer_size: int = Field( + 31, + description="K-mer size for building a custom virus enrichment index", + json_schema_extra={"category": "Databases"}, + ) + virus_window_size: int = Field( + 1, + description="Minimizer window size for building a custom virus enrichment index", + json_schema_extra={"category": "Databases"}, + ) + virus_abs_threshold: int = Field( + 1, + description="Minimum absolute minimizer hits for virus read enrichment", + json_schema_extra={"category": "Databases"}, + ) + virus_rel_threshold: float = Field( + 0.0, + description="Minimum relative proportion of minimizers for virus read enrichment (0.0-1.0)", json_schema_extra={"category": "Databases"}, ) @@ -928,23 +904,18 @@ class NvdParams(BaseModel): description="Enable all preprocessing steps", json_schema_extra={"category": "Preprocessing"}, ) - merge_pairs: bool | None = Field( - None, - description="Merge paired read mates based on overlaps", - json_schema_extra={"category": "Preprocessing"}, - ) - dedup: bool | None = Field( - None, + dedup: bool = Field( + default=False, description="Deduplicate reads (umbrella: enables both dedup_seq and dedup_pos)", json_schema_extra={"category": "Preprocessing"}, ) - dedup_seq: bool | None = Field( - None, + dedup_seq: bool = Field( + default=False, description="Sequence-based deduplication with clumpify (preprocessing)", json_schema_extra={"category": "Preprocessing"}, ) - dedup_pos: bool | None = Field( - None, + dedup_pos: bool = Field( + default=False, description="Positional deduplication with samtools markdup (after alignment)", json_schema_extra={"category": "Preprocessing"}, ) @@ -953,21 +924,6 @@ class NvdParams(BaseModel): description="Trim Illumina adapters", json_schema_extra={"category": "Preprocessing"}, ) - scrub_host_reads: bool | None = Field( - None, - description="Remove host reads with STAT (requires sra_human_db)", - json_schema_extra={"category": "Preprocessing"}, - ) - sra_human_db: Path | None = Field( - None, - description="Path to human reads STAT database for host scrubbing and SRA submission prep", - json_schema_extra={"category": "Preprocessing"}, - ) - human_read_scrub: Path | None = Field( - None, - description="DEPRECATED: Use sra_human_db instead", - json_schema_extra={"category": "Preprocessing"}, - ) filter_reads: bool | None = Field( None, description="Filter reads by quality/length", @@ -994,38 +950,38 @@ class NvdParams(BaseModel): json_schema_extra={"category": "Preprocessing"}, ) - # Host scrubbing with deacon - deacon_index: Path | None = Field( + # Optional host/contaminant depletion + host_index: Path | None = Field( None, - description="Path to prebuilt deacon index (.idx file)", + description="Path to prebuilt host/contaminant index (.idx file)", json_schema_extra={"category": "Preprocessing"}, ) - deacon_index_url: str = Field( - "https://zenodo.org/records/17288185/files/panhuman-1.k31w15.idx", - description="URL to download prebuilt deacon index (default: panhuman-1)", + host_index_url: str | None = Field( + None, + description="URL to download a prebuilt host/contaminant index", json_schema_extra={"category": "Preprocessing"}, ) - deacon_contaminants_fasta: Path | None = Field( + host_contaminants_fasta: Path | None = Field( None, - description="Custom contaminant FASTA to union with base index", + description="Custom contaminant FASTA to build and union with other host indexes", json_schema_extra={"category": "Preprocessing"}, ) - deacon_kmer_size: int = Field( + host_kmer_size: int = Field( 31, - description="K-mer size for deacon index (must match index if prebuilt)", + description="K-mer size for building a custom host/contaminant index", json_schema_extra={"category": "Preprocessing"}, ) - deacon_window_size: int = Field( + host_window_size: int = Field( 15, - description="Minimizer window size for deacon index", + description="Minimizer window size for building a custom host/contaminant index", json_schema_extra={"category": "Preprocessing"}, ) - deacon_abs_threshold: int = Field( + host_abs_threshold: int = Field( 2, description="Minimum absolute minimizer hits to classify as contaminant", json_schema_extra={"category": "Preprocessing"}, ) - deacon_rel_threshold: float = Field( + host_rel_threshold: float = Field( 0.01, description="Minimum relative proportion of minimizers (0.0-1.0)", json_schema_extra={"category": "Preprocessing"}, @@ -1069,11 +1025,6 @@ class NvdParams(BaseModel): description="Virus family names to include in human virus analysis", json_schema_extra={"category": "Analysis"}, ) - min_gottcha_reads: int = Field( - 250, - description="Minimum reads for GOTTCHA2", - json_schema_extra={"category": "Analysis"}, - ) max_blast_targets: int = Field( 100, description="Maximum BLAST targets to consider", @@ -1113,21 +1064,6 @@ class NvdParams(BaseModel): description="LabKey database schema name", json_schema_extra={"category": "LabKey"}, ) - labkey_gottcha_fasta_list: str | None = Field( - None, - description="LabKey list name for GOTTCHA2 FASTA results", - json_schema_extra={"category": "LabKey"}, - ) - labkey_gottcha_full_list: str | None = Field( - None, - description="LabKey list name for full GOTTCHA2 results", - json_schema_extra={"category": "LabKey"}, - ) - labkey_gottcha_blast_verified_full_list: str | None = Field( - None, - description="LabKey list name for BLAST-verified GOTTCHA2 results", - json_schema_extra={"category": "LabKey"}, - ) labkey_blast_meta_hits_list: str | None = Field( None, description="LabKey list name for BLAST metagenomic hits", @@ -1191,7 +1127,7 @@ class NvdParams(BaseModel): json_schema_extra={"category": "Internal"}, ) monoimage: str = Field( - "nrminor/nvd:v2.5.0", + "nrminor/nvd:v3.0.0", description="Container image", json_schema_extra={"category": "Internal"}, ) @@ -1205,20 +1141,13 @@ class NvdParams(BaseModel): # Validators # ========================================================================= - @field_validator("tools") - @classmethod - def validate_tools(cls, v: str | None) -> str | None: - """Validate tools option (supports comma-separated values).""" - if v is None: - return v - tools_list = [t.strip() for t in v.split(",")] - invalid = [t for t in tools_list if t not in VALID_TOOLS] - if invalid: - msg = f"Invalid tools: {invalid}. Valid: {sorted(VALID_TOOLS)}" - raise ValueError(msg) - return v - - @field_validator("cutoff_percent", "entropy", "tax_stringency") + @field_validator( + "cutoff_percent", + "entropy", + "tax_stringency", + "host_rel_threshold", + "virus_rel_threshold", + ) @classmethod def validate_zero_to_one(cls, v: float) -> float: """Validate that value is in 0-1 range.""" @@ -1228,12 +1157,17 @@ def validate_zero_to_one(cls, v: float) -> float: return v @field_validator( - "min_gottcha_reads", "max_blast_targets", "blast_retention_count", "min_consecutive_bases", "min_read_length", "max_concurrent_downloads", + "host_kmer_size", + "host_window_size", + "host_abs_threshold", + "virus_kmer_size", + "virus_window_size", + "virus_abs_threshold", ) @classmethod def validate_positive_int(cls, v: int) -> int: diff --git a/lib/py_nvd/params.py b/lib/py_nvd/params.py index 78370df..1eaffed 100644 --- a/lib/py_nvd/params.py +++ b/lib/py_nvd/params.py @@ -22,7 +22,7 @@ SCHEMA_FILENAME = "nvd-params.latest.schema.json" # GitHub raw URL for schema (fallback and for generated templates) -SCHEMA_URL = "https://raw.githubusercontent.com/dhoconno/nvd/main/schemas/nvd-params.v2.5.0.schema.json" +SCHEMA_URL = "https://raw.githubusercontent.com/dhoconno/nvd/main/schemas/nvd-params.v3.0.0.schema.json" def _find_schema_path() -> Path: @@ -246,10 +246,6 @@ def _yaml_required_section( "12345", "Experiment identifier for tracking and LabKey integration", ), - "tools": ( - "all", - "Options: stat_blast, nvd, stat, blast, gottcha, all, clumpify (comma-separated for multiple)", - ), "results": ("results", "Directory for pipeline output files"), } lines.extend( @@ -279,12 +275,10 @@ def _yaml_analysis_section( lines.append("# === Preprocessing ===") preprocess_params = [ "preprocess", - "merge_pairs", "dedup", "dedup_seq", "dedup_pos", "trim_adapters", - "scrub_host_reads", "filter_reads", ] for name in preprocess_params: @@ -331,9 +325,6 @@ def _generate_yaml_template(path: Path, schema: dict, schema_url: str) -> None: "labkey_project_name", "labkey_webdav", "labkey_schema", - "labkey_gottcha_fasta_list", - "labkey_gottcha_full_list", - "labkey_gottcha_blast_verified_full_list", "labkey_blast_meta_hits_list", "labkey_blast_fasta_list", "labkey_exp_id_guard_list", @@ -346,19 +337,37 @@ def _generate_yaml_template(path: Path, schema: dict, schema_url: str) -> None: lines, "Database Paths", [ - "gottcha2_db", "blast_db", "blast_db_prefix", - "stat_index", - "stat_dbss", - "stat_annotation", - "human_virus_taxlist", + "virus_index", + "virus_index_url", + "virus_reference_fasta", + "virus_kmer_size", + "virus_window_size", + "virus_abs_threshold", + "virus_rel_threshold", "nvd_files", ], properties, subheading="These paths are environment-specific. Set them in your config or here.", ) + _add_commented_section( + lines, + "Host/Contaminant Depletion", + [ + "host_index", + "host_index_url", + "host_contaminants_fasta", + "host_kmer_size", + "host_window_size", + "host_abs_threshold", + "host_rel_threshold", + ], + properties, + subheading="Host depletion is off by default. Set one host index source to enable it.", + ) + _add_commented_section( lines, "Read Filtering", @@ -373,9 +382,8 @@ def _generate_yaml_template(path: Path, schema: dict, schema_url: str) -> None: _add_commented_section( lines, - "Tool-Specific Settings", + "Classification Settings", [ - "min_gottcha_reads", "max_blast_targets", "blast_retention_count", "min_consecutive_bases", diff --git a/lib/py_nvd/schema.sql b/lib/py_nvd/schema.sql index 989dec2..4aefa29 100644 --- a/lib/py_nvd/schema.sql +++ b/lib/py_nvd/schema.sql @@ -1,7 +1,8 @@ -- NVD State Database Schema -- -- This is a local cache/state database, not a production database. --- If the schema version changes, the database is deleted and recreated. +-- Known older schemas are migrated in place after creating a backup. Unknown +-- schema versions still require explicit destructive recreation. -- -- Phase 5 (2024-12-28): Redesigned sample and upload tracking. -- - Replaced `samples` with `processed_samples` (tracks processing with provenance) @@ -9,7 +10,7 @@ -- - Key insight: indexing uploads by sample_id enables "was this sample ever uploaded?" -- queries across all runs, solving the overlapping sample set problem. -PRAGMA user_version = 2; +PRAGMA user_version = 3; -- Run tracking CREATE TABLE IF NOT EXISTS runs ( @@ -22,7 +23,7 @@ CREATE TABLE IF NOT EXISTS runs ( ); -- Processed samples with provenance --- Tracks which samples were processed, when, and with what database versions. +-- Tracks which samples were processed, when, and with the BLAST database version. -- Keyed by (sample_id, sample_set_id) to allow intentional reprocessing with different samples. CREATE TABLE IF NOT EXISTS processed_samples ( sample_id TEXT NOT NULL, @@ -30,7 +31,6 @@ CREATE TABLE IF NOT EXISTS processed_samples ( run_id TEXT NOT NULL REFERENCES runs(run_id), processed_at TEXT NOT NULL, blast_db_version TEXT, - stat_db_version TEXT, taxonomy_hash TEXT, status TEXT NOT NULL CHECK (status IN ('completed', 'uploaded', 'failed')), PRIMARY KEY (sample_id, sample_set_id) @@ -42,7 +42,7 @@ CREATE INDEX IF NOT EXISTS idx_processed_samples_sample_id -- Reference database registry CREATE TABLE IF NOT EXISTS databases ( - db_type TEXT NOT NULL CHECK (db_type IN ('blast', 'stat', 'gottcha2', 'hostile')), + db_type TEXT NOT NULL CHECK (db_type IN ('blast')), version TEXT NOT NULL, path TEXT NOT NULL, checksum TEXT, @@ -60,7 +60,7 @@ CREATE INDEX IF NOT EXISTS idx_databases_path ON databases(db_type, path); CREATE TABLE IF NOT EXISTS uploads ( sample_id TEXT NOT NULL, sample_set_id TEXT NOT NULL, - upload_type TEXT NOT NULL CHECK (upload_type IN ('blast', 'blast_fasta', 'gottcha2', 'gottcha2_fasta')), + upload_type TEXT NOT NULL CHECK (upload_type IN ('blast', 'blast_fasta')), upload_target TEXT NOT NULL, -- 'labkey', 'local', 'globus', etc. content_hash TEXT NOT NULL, -- SHA256 of uploaded data for idempotency uploaded_at TEXT NOT NULL, diff --git a/lib/py_nvd/state.py b/lib/py_nvd/state.py index aadcd32..a03459d 100644 --- a/lib/py_nvd/state.py +++ b/lib/py_nvd/state.py @@ -311,7 +311,7 @@ def register_database( before storage to ensure consistent lookups. Args: - db_type: Type of database (blast, stat, gottcha2) + db_type: Type of database (blast) version: Version string for this database path: Path to the database (will be canonicalized) state_dir: Optional state directory override @@ -344,7 +344,7 @@ def get_database_by_version( Get database info by version. Args: - db_type: Type of database (blast, stat, gottcha2) + db_type: Type of database (blast) version: Version string. If None, returns most recently registered. state_dir: Optional state directory override @@ -379,7 +379,7 @@ def get_database_by_path( most recently registered version and includes a warning. Args: - db_type: Type of database (blast, stat, gottcha2) + db_type: Type of database (blast) path: Path to the database (will be canonicalized) state_dir: Optional state directory override @@ -430,7 +430,7 @@ def get_databases_by_path( Useful for debugging when multiple versions are registered at the same path. Args: - db_type: Type of database (blast, stat, gottcha2) + db_type: Type of database (blast) path: Path to the database (will be canonicalized) state_dir: Optional state directory override @@ -494,7 +494,7 @@ def _resolve_single_database( - path set, version None: lookup, return registered version or warn Args: - db_type: Type of database (blast, stat, gottcha2) + db_type: Type of database (blast) path: Database path (None means skip) version: User-provided version (None means auto-resolve) state_dir: Optional state directory override @@ -550,13 +550,9 @@ def _resolve_single_database( return None, warning, None -def resolve_database_versions( # noqa: PLR0913 +def resolve_database_versions( blast_db: Path | None = None, blast_db_version: str | None = None, - gottcha2_db: Path | None = None, - gottcha2_db_version: str | None = None, - stat_index: Path | None = None, - stat_db_version: str | None = None, state_dir: Path | str | None = None, ) -> DatabaseResolution: """ @@ -577,10 +573,6 @@ def resolve_database_versions( # noqa: PLR0913 Args: blast_db: Path to BLAST database (None to skip) blast_db_version: User-provided BLAST version (None to auto-resolve) - gottcha2_db: Path to GOTTCHA2 database (None to skip) - gottcha2_db_version: User-provided GOTTCHA2 version (None to auto-resolve) - stat_index: Path to STAT index file (None to skip) - stat_db_version: User-provided STAT version (None to auto-resolve) state_dir: Optional state directory override Returns: @@ -601,32 +593,6 @@ def resolve_database_versions( # noqa: PLR0913 if blast_reg: resolution.auto_registered.append(blast_reg) - # Resolve GOTTCHA2 - gottcha2_resolved, gottcha2_warning, gottcha2_reg = _resolve_single_database( - "gottcha2", - gottcha2_db, - gottcha2_db_version, - state_dir, - ) - resolution.gottcha2_db_version = gottcha2_resolved - if gottcha2_warning: - resolution.warnings.append(gottcha2_warning) - if gottcha2_reg: - resolution.auto_registered.append(gottcha2_reg) - - # Resolve STAT (uses stat_index as canonical path) - stat_resolved, stat_warning, stat_reg = _resolve_single_database( - "stat", - stat_index, - stat_db_version, - state_dir, - ) - resolution.stat_db_version = stat_resolved - if stat_warning: - resolution.warnings.append(stat_warning) - if stat_reg: - resolution.auto_registered.append(stat_reg) - return resolution @@ -635,7 +601,6 @@ def mark_sample_completed( # noqa: PLR0913 sample_set_id: str, run_id: str, blast_db_version: str | None = None, - stat_db_version: str | None = None, taxonomy_hash: str | None = None, state_dir: Path | str | None = None, ) -> ProcessedSample: @@ -653,7 +618,6 @@ def mark_sample_completed( # noqa: PLR0913 sample_set_id: The sample set this sample belongs to run_id: The run identifier (workflow.runName) blast_db_version: BLAST database version for provenance - stat_db_version: STAT database version for provenance taxonomy_hash: Taxonomy database hash for provenance state_dir: Optional state directory override @@ -663,15 +627,14 @@ def mark_sample_completed( # noqa: PLR0913 with connect(state_dir) as conn: conn.execute( """INSERT INTO processed_samples - (sample_id, sample_set_id, run_id, processed_at, blast_db_version, - stat_db_version, taxonomy_hash, status) - VALUES (?, ?, ?, datetime('now'), ?, ?, ?, 'completed')""", + (sample_id, sample_set_id, run_id, processed_at, blast_db_version, + taxonomy_hash, status) + VALUES (?, ?, ?, datetime('now'), ?, ?, 'completed')""", ( sample_id, sample_set_id, run_id, blast_db_version, - stat_db_version, taxonomy_hash, ), ) @@ -832,10 +795,8 @@ def get_uploaded_sample_ids( Used at run start to warn about/filter already-uploaded samples. Queries the uploads table, which tracks each upload with its type - (blast, blast_fasta, gottcha2, gottcha2_fasta). When upload_types is - provided, only uploads matching those types count — this prevents one - workflow's uploads from causing another workflow's CHECK_RUN_STATE to - incorrectly skip samples. + (blast, blast_fasta). When upload_types is provided, only uploads matching + those types count. Args: sample_ids: List of sample IDs to check @@ -921,7 +882,7 @@ def record_upload( # noqa: PLR0913 Args: sample_id: The sample identifier sample_set_id: The sample set this sample belongs to - upload_type: Type of upload (blast, blast_fasta, gottcha2, gottcha2_fasta) + upload_type: Type of upload (blast, blast_fasta) upload_target: Where it was uploaded (labkey, local, globus, etc.) content_hash: SHA256 of the uploaded content target_metadata: Optional target-specific data (e.g., experiment_id, row_id) @@ -1034,7 +995,7 @@ def list_uploads( Args: sample_id: Filter to uploads for a specific sample - upload_type: Filter by upload type ('blast', 'blast_fasta', 'gottcha2', 'gottcha2_fasta') + upload_type: Filter by upload type ('blast', 'blast_fasta') upload_target: Filter by target ('labkey', 'local', etc.) limit: Maximum number of uploads to return state_dir: Optional state directory override diff --git a/lib/py_nvd/test_hits.py b/lib/py_nvd/test_hits.py index c955719..fb66b5f 100644 --- a/lib/py_nvd/test_hits.py +++ b/lib/py_nvd/test_hits.py @@ -91,8 +91,8 @@ def make_hit_record( # noqa: PLR0913 sample_set_id: The sample set identifier. sample_id: The sample identifier. run_date: ISO 8601 timestamp of the run. - sequence_id: Optional sequence identifier (contig ID for BLAST, read ID for GOTTCHA2). - source: Hit provenance ("blast" or "gottcha2"). + sequence_id: Optional BLAST contig identifier. + source: Hit provenance. v3 hit records are BLAST-only. adjusted_taxid: Optional taxonomic ID from LCA classification. adjusted_taxid_name: Optional taxonomic name (e.g., "Influenza A virus"). adjusted_taxid_rank: Optional taxonomic rank (e.g., "species"). @@ -742,18 +742,19 @@ class TestHivePartitioning: """Tests for Hive partition column extraction.""" def test_month_is_null_for_uncompacted(self, temp_state_dir: Path) -> None: - """Uncompacted files have month=NULL extracted from path.""" + """Uncompacted files have schema=v3 and month=NULL extracted from path.""" record = make_hit_record("ACGT", "set_001", "sample_a", "2024-01-15T00:00:00Z") write_hits_parquet([record], "sample_a", "set_001", temp_state_dir) hits_glob = temp_state_dir / "hits" / "**" / "*.parquet" con = duckdb.connect() result = con.execute( - f"SELECT month FROM read_parquet('{hits_glob}', hive_partitioning=true)", + f"SELECT schema, month FROM read_parquet('{hits_glob}', hive_partitioning=true)", ).fetchone() assert result is not None - assert result[0] is None # month=NULL in path becomes SQL NULL + assert result[0] == "v3" + assert result[1] is None # month=NULL in path becomes SQL NULL def test_effective_month_computed_from_run_date(self, temp_state_dir: Path) -> None: """effective_month is computed from run_date when month is NULL.""" @@ -771,7 +772,7 @@ def test_directory_structure_is_hive_partitioned( self, temp_state_dir: Path, ) -> None: - """Written files follow month=NULL/{sample_set_id}/{sample_id}/ structure.""" + """Written files follow schema=v3/month=NULL/{sample_set_id}/{sample_id}/ structure.""" record = make_hit_record("ACGT", "set_001", "sample_a", "2024-01-15T00:00:00Z") path = write_hits_parquet([record], "sample_a", "set_001", temp_state_dir) @@ -779,6 +780,7 @@ def test_directory_structure_is_hive_partitioned( assert path.parent.name == "sample_a" assert path.parent.parent.name == "set_001" assert path.parent.parent.parent.name == "month=NULL" + assert path.parent.parent.parent.parent.name == "schema=v3" class TestGetHitSequence: @@ -1172,7 +1174,7 @@ def test_removes_empty_month_directory(self, temp_state_dir: Path) -> None: compact_hits(temp_state_dir) - month_dir = temp_state_dir / "hits" / "month=2024-01" + month_dir = temp_state_dir / "hits" / "schema=v3" / "month=2024-01" assert month_dir.exists() delete_sample_set_hits("set_001", temp_state_dir) @@ -1962,11 +1964,12 @@ def test_path_structure(self, temp_state_dir: Path) -> None: """Returns correct path structure.""" path = get_sample_parquet_path("sample_a", "set_001", temp_state_dir) - # hits/month=NULL/{sample_set_id}/{sample_id}/data.parquet + # hits/schema=v3/month=NULL/{sample_set_id}/{sample_id}/data.parquet assert path.name == "data.parquet" assert path.parent.name == "sample_a" assert path.parent.parent.name == "set_001" assert path.parent.parent.parent.name == "month=NULL" + assert path.parent.parent.parent.parent.name == "schema=v3" assert "hits" in str(path) def test_does_not_create_directories(self, temp_state_dir: Path) -> None: @@ -2148,6 +2151,7 @@ def test_dry_run_does_not_modify(self, temp_state_dir: Path) -> None: uncompacted_path = ( temp_state_dir / "hits" + / "schema=v3" / "month=NULL" / "set_001" / "sample_a" @@ -2156,7 +2160,9 @@ def test_dry_run_does_not_modify(self, temp_state_dir: Path) -> None: assert uncompacted_path.exists() # Verify compacted file was NOT created - compacted_path = temp_state_dir / "hits" / "month=2024-01" / "data.parquet" + compacted_path = ( + temp_state_dir / "hits" / "schema=v3" / "month=2024-01" / "data.parquet" + ) assert not compacted_path.exists() def test_basic_compaction(self, temp_state_dir: Path) -> None: @@ -2173,13 +2179,16 @@ def test_basic_compaction(self, temp_state_dir: Path) -> None: assert result.errors == [] # Verify compacted file exists - compacted_path = temp_state_dir / "hits" / "month=2024-01" / "data.parquet" + compacted_path = ( + temp_state_dir / "hits" / "schema=v3" / "month=2024-01" / "data.parquet" + ) assert compacted_path.exists() # Verify uncompacted file was deleted (default behavior) uncompacted_path = ( temp_state_dir / "hits" + / "schema=v3" / "month=NULL" / "set_001" / "sample_a" @@ -2197,10 +2206,13 @@ def test_keep_source_preserves_uncompacted(self, temp_state_dir: Path) -> None: assert result.errors == [] # Both files should exist - compacted_path = temp_state_dir / "hits" / "month=2024-01" / "data.parquet" + compacted_path = ( + temp_state_dir / "hits" / "schema=v3" / "month=2024-01" / "data.parquet" + ) uncompacted_path = ( temp_state_dir / "hits" + / "schema=v3" / "month=NULL" / "set_001" / "sample_a" @@ -2233,8 +2245,12 @@ def test_compaction_groups_by_month(self, temp_state_dir: Path) -> None: assert months == {"2024-01", "2024-02"} # Both month partitions should exist - assert (temp_state_dir / "hits" / "month=2024-01" / "data.parquet").exists() - assert (temp_state_dir / "hits" / "month=2024-02" / "data.parquet").exists() + assert ( + temp_state_dir / "hits" / "schema=v3" / "month=2024-01" / "data.parquet" + ).exists() + assert ( + temp_state_dir / "hits" / "schema=v3" / "month=2024-02" / "data.parquet" + ).exists() def test_month_filter_only_compacts_specified_month( self, @@ -2262,13 +2278,18 @@ def test_month_filter_only_compacts_specified_month( assert result.months[0].month == "2024-01" # Only January should be compacted - assert (temp_state_dir / "hits" / "month=2024-01" / "data.parquet").exists() - assert not (temp_state_dir / "hits" / "month=2024-02" / "data.parquet").exists() + assert ( + temp_state_dir / "hits" / "schema=v3" / "month=2024-01" / "data.parquet" + ).exists() + assert not ( + temp_state_dir / "hits" / "schema=v3" / "month=2024-02" / "data.parquet" + ).exists() # February uncompacted file should still exist feb_uncompacted = ( temp_state_dir / "hits" + / "schema=v3" / "month=NULL" / "set_001" / "sample_b" @@ -2294,7 +2315,9 @@ def test_incremental_compaction_merges_with_existing( assert result.errors == [] # Query the compacted file - should have both records - compacted_path = temp_state_dir / "hits" / "month=2024-01" / "data.parquet" + compacted_path = ( + temp_state_dir / "hits" / "schema=v3" / "month=2024-01" / "data.parquet" + ) con = duckdb.connect() result = con.execute( f"SELECT COUNT(*) FROM read_parquet('{compacted_path}')", @@ -2315,7 +2338,9 @@ def test_compacted_data_is_sorted_by_hit_key(self, temp_state_dir: Path) -> None compact_hits(temp_state_dir) # Read compacted file and verify sort order - compacted_path = temp_state_dir / "hits" / "month=2024-01" / "data.parquet" + compacted_path = ( + temp_state_dir / "hits" / "schema=v3" / "month=2024-01" / "data.parquet" + ) con = duckdb.connect() hit_keys = con.execute( f"SELECT hit_key FROM read_parquet('{compacted_path}')", @@ -2344,77 +2369,6 @@ def test_compacted_data_queryable_with_hive_partitioning( assert result[1] == "2024-01" # month extracted from Hive partition assert result[2] == "2024-01" # effective_month matches - def test_incremental_compaction_handles_schema_evolution( - self, - temp_state_dir: Path, - ) -> None: - """Compaction merges old-schema compacted files with new-schema uncompacted files.""" - # Create an "old" compacted file without classification columns - # (simulating data compacted before the schema change) - month_dir = temp_state_dir / "hits" / "month=2024-01" - month_dir.mkdir(parents=True) - old_compacted = month_dir / "data.parquet" - - con = duckdb.connect() - con.execute(f""" - COPY ( - SELECT - 'abc123def456abc123def456abc123de' as hit_key, - 100 as sequence_length, - 'AAAA'::BLOB as sequence_compressed, - 0.5 as gc_content, - 'set-old' as sample_set_id, - 'sample-old' as sample_id, - '2024-01-15'::DATE as run_date, - 'contig-old' as contig_id - ) - TO '{old_compacted}' (FORMAT parquet) - """) - - # Write new uncompacted data WITH classification columns - record = HitRecord( - hit_key="def456abc123def456abc123def456ab", - sequence_length=200, - sequence_compressed=b"TTTT", - gc_content=0.6, - sample_set_id="set-new", - sample_id="sample-new", - run_date="2024-01-20", - sequence_id="contig-new", - source="blast", - adjusted_taxid=12345, - adjusted_taxid_name="Test virus", - adjusted_taxid_rank="species", - ) - write_hits_parquet([record], "sample-new", "set-new", temp_state_dir) - - # Compact - this should merge old (no classification cols) with new (has them) - result = compact_hits(state_dir=temp_state_dir, month="2024-01") - - assert result.total_observations == 1 # Only the new uncompacted file - assert len(result.months) == 1 - assert result.errors == [] - - # Verify the compacted file has both records with correct schema - compacted = con.execute( - f""" - SELECT hit_key, adjusted_taxid, adjusted_taxid_name, adjusted_taxid_rank - FROM read_parquet('{old_compacted}') - ORDER BY hit_key - """, - ).fetchall() - - assert len(compacted) == 2 - # Old record should have NULLs for classification columns - assert compacted[0] == ("abc123def456abc123def456abc123de", None, None, None) - # New record should have the classification data - assert compacted[1] == ( - "def456abc123def456abc123def456ab", - 12345, - "Test virus", - "species", - ) - class TestGetStatsForSampleSet: """Tests for get_stats_for_sample_set().""" @@ -6430,7 +6384,9 @@ def test_conditional_delete_skips_modified_file(self, temp_state_dir: Path) -> N assert result.errors == [] # The compacted output should exist - compacted = temp_state_dir / "hits" / "month=2024-01" / "data.parquet" + compacted = ( + temp_state_dir / "hits" / "schema=v3" / "month=2024-01" / "data.parquet" + ) assert compacted.exists() # Verify the compacted file has at least 1 row diff --git a/lib/py_nvd/test_models.py b/lib/py_nvd/test_models.py index 3e5cc2c..1ab7782 100644 --- a/lib/py_nvd/test_models.py +++ b/lib/py_nvd/test_models.py @@ -8,7 +8,6 @@ from py_nvd.models import ( DEFAULT_HUMAN_VIRUS_FAMILIES, - VALID_TOOLS, NvdParams, Run, TracedParams, @@ -23,7 +22,6 @@ class TestNvdParamsInstantiation: def test_minimal_instantiation(self) -> None: """Can create NvdParams with no arguments (all defaults).""" p = NvdParams() - assert p.tools is None assert p.preprocess is False assert p.cutoff_percent == 0.001 @@ -31,11 +29,9 @@ def test_with_required_fields(self) -> None: """Can create with typical required fields.""" p = NvdParams( samplesheet=Path("/fake/samples.csv"), - tools="blast", experiment_id="exp001", ) assert p.samplesheet == Path("/fake/samples.csv") - assert p.tools == "blast" assert p.experiment_id == "exp001" def test_all_fields(self) -> None: @@ -44,22 +40,22 @@ def test_all_fields(self) -> None: # Core samplesheet=Path("/fake/samples.csv"), results=Path("/fake/results"), - tools="blast,gottcha", experiment_id="exp001", max_concurrent_downloads=5, cleanup=True, work_dir=Path("/fake/work"), # Database versions - gottcha2_db_version="RefSeq-r220", blast_db_version="core-nt_2025-01-01", # Database paths - gottcha2_db=Path("/db/gottcha2"), blast_db=Path("/db/blast"), blast_db_prefix="nt", # Preprocessing preprocess=True, dedup=True, + dedup_seq=True, + dedup_pos=True, trim_adapters=True, + host_index=Path("/db/host.idx"), # Analysis cutoff_percent=0.01, entropy=0.85, @@ -68,50 +64,12 @@ def test_all_fields(self) -> None: labkey=True, labkey_server="example.com", ) - assert p.tools == "blast,gottcha" assert p.cleanup is True + assert p.host_index == Path("/db/host.idx") assert p.cutoff_percent == 0.01 assert p.labkey is True -class TestNvdParamsToolsValidator: - """Tests for tools field validation.""" - - def test_valid_single_tool(self) -> None: - """Single valid tool is accepted.""" - p = NvdParams(tools="blast") - assert p.tools == "blast" - - def test_valid_multiple_tools(self) -> None: - """Comma-separated valid tools are accepted.""" - p = NvdParams(tools="blast,gottcha,stat") - assert p.tools == "blast,gottcha,stat" - - def test_valid_all_tools(self) -> None: - """All valid tool names are accepted.""" - for tool in VALID_TOOLS: - p = NvdParams(tools=tool) - assert p.tools == tool - - def test_none_tools_allowed(self) -> None: - """None is a valid value for tools.""" - p = NvdParams(tools=None) - assert p.tools is None - - def test_invalid_tool_rejected(self) -> None: - """Invalid tool name raises ValidationError.""" - with pytest.raises(ValidationError) as exc_info: - NvdParams(tools="invalid_tool") - assert "Invalid tools" in str(exc_info.value) - - def test_mixed_valid_invalid_rejected(self) -> None: - """Mix of valid and invalid tools is rejected.""" - with pytest.raises(ValidationError) as exc_info: - NvdParams(tools="blast,invalid,gottcha") - assert "Invalid tools" in str(exc_info.value) - assert "invalid" in str(exc_info.value) - - class TestNvdParamsRangeValidators: """Tests for 0-1 range validators.""" @@ -161,21 +119,35 @@ def test_tax_stringency_out_of_range_rejected(self) -> None: class TestNvdParamsPositiveIntValidators: """Tests for positive integer validators.""" - def test_min_gottcha_reads_valid(self) -> None: - """min_gottcha_reads accepts positive integers.""" - assert NvdParams(min_gottcha_reads=1).min_gottcha_reads == 1 - assert NvdParams(min_gottcha_reads=250).min_gottcha_reads == 250 - - def test_min_gottcha_reads_zero_rejected(self) -> None: - """min_gottcha_reads=0 raises ValidationError.""" + def test_host_index_build_params_valid(self) -> None: + """Host index build parameters accept positive integers.""" + p = NvdParams(host_kmer_size=31, host_window_size=15, host_abs_threshold=2) + assert p.host_kmer_size == 31 + assert p.host_window_size == 15 + assert p.host_abs_threshold == 2 + + def test_virus_index_build_params_valid(self) -> None: + """Virus index build parameters accept positive integers.""" + p = NvdParams(virus_kmer_size=31, virus_window_size=1, virus_abs_threshold=1) + assert p.virus_kmer_size == 31 + assert p.virus_window_size == 1 + assert p.virus_abs_threshold == 1 + + def test_host_kmer_size_zero_rejected(self) -> None: + """host_kmer_size=0 raises ValidationError.""" with pytest.raises(ValidationError) as exc_info: - NvdParams(min_gottcha_reads=0) + NvdParams(host_kmer_size=0) assert "Must be >= 1" in str(exc_info.value) - def test_min_gottcha_reads_negative_rejected(self) -> None: - """Negative min_gottcha_reads raises ValidationError.""" + def test_host_window_size_negative_rejected(self) -> None: + """Negative host_window_size raises ValidationError.""" with pytest.raises(ValidationError): - NvdParams(min_gottcha_reads=-5) + NvdParams(host_window_size=-5) + + def test_virus_window_size_zero_rejected(self) -> None: + """virus_window_size=0 raises ValidationError.""" + with pytest.raises(ValidationError): + NvdParams(virus_window_size=0) def test_max_blast_targets_valid(self) -> None: """max_blast_targets accepts positive integers.""" @@ -264,9 +236,9 @@ def test_string_to_path(self) -> None: def test_string_to_int(self) -> None: """String integers are coerced to int.""" - p = NvdParams(min_gottcha_reads="100") # ty: ignore[invalid-argument-type] - assert isinstance(p.min_gottcha_reads, int) - assert p.min_gottcha_reads == 100 + p = NvdParams(max_blast_targets="100") # ty: ignore[invalid-argument-type] + assert isinstance(p.max_blast_targets, int) + assert p.max_blast_targets == 100 def test_string_to_float(self) -> None: """String floats are coerced to float.""" @@ -287,58 +259,58 @@ class TestNvdParamsMerge: def test_merge_empty_sources(self) -> None: """Merge with no sources returns defaults.""" p = NvdParams.merge() - assert p.tools is None assert p.cutoff_percent == 0.001 def test_merge_single_dict(self) -> None: """Merge with single dict source.""" - p = NvdParams.merge({"tools": "blast", "cutoff_percent": 0.01}) - assert p.tools == "blast" + p = NvdParams.merge({"dedup": True, "cutoff_percent": 0.01}) + assert p.dedup is True assert p.cutoff_percent == 0.01 def test_merge_precedence_later_wins(self) -> None: """Later sources override earlier sources.""" - preset = {"tools": "all", "cutoff_percent": 0.01} - cli = {"tools": "blast"} + preset = {"dedup": False, "cutoff_percent": 0.01} + cli = {"dedup": True} p = NvdParams.merge(preset, cli) - assert p.tools == "blast" # CLI wins + assert p.dedup is True # CLI wins assert p.cutoff_percent == 0.01 # From preset def test_merge_three_sources(self) -> None: """Three-way merge with correct precedence.""" - preset = {"tools": "all", "cutoff_percent": 0.01, "entropy": 0.8} - params_file = {"tools": "blast", "entropy": 0.85} + preset = {"dedup": True, "cutoff_percent": 0.01, "entropy": 0.8} + params_file = {"dedup_seq": True, "entropy": 0.85} cli = {"cutoff_percent": 0.005} p = NvdParams.merge(preset, params_file, cli) - assert p.tools == "blast" # From params_file + assert p.dedup_seq is True # From params_file assert p.cutoff_percent == 0.005 # From CLI assert p.entropy == 0.85 # From params_file def test_merge_none_sources_skipped(self) -> None: """None sources are gracefully skipped.""" - p = NvdParams.merge(None, {"tools": "blast"}, None) - assert p.tools == "blast" + p = NvdParams.merge(None, {"dedup": True}, None) + assert p.dedup is True def test_merge_none_values_skipped(self) -> None: """None values within dicts don't override.""" - preset = {"tools": "all", "cutoff_percent": 0.01} - cli = {"tools": None, "cutoff_percent": 0.005} + preset = {"dedup": True, "cutoff_percent": 0.01} + cli = {"dedup": None, "cutoff_percent": 0.005} p = NvdParams.merge(preset, cli) - assert p.tools == "all" # None didn't override + assert p.dedup is True # None didn't override assert p.cutoff_percent == 0.005 # Non-None did override def test_merge_with_nvdparams_instance(self) -> None: """Can merge NvdParams instances, not just dicts.""" - base = NvdParams(tools="all", cutoff_percent=0.01) - override = {"tools": "blast"} + base = NvdParams(dedup=True, cutoff_percent=0.01) + override = {"dedup_pos": True} p = NvdParams.merge(base, override) - assert p.tools == "blast" + assert p.dedup is True + assert p.dedup_pos is True assert p.cutoff_percent == 0.01 def test_merge_validates_result(self) -> None: """Merged result is validated.""" with pytest.raises(ValidationError): - NvdParams.merge({"tools": "invalid_tool"}) + NvdParams.merge({"cutoff_percent": -0.1}) def test_merge_stateless_mode_precedence(self) -> None: """CLI stateless/taxonomy_dir override preset values.""" @@ -382,19 +354,19 @@ def test_basic_command_structure(self) -> None: def test_params_as_double_dash_args(self) -> None: """Params are formatted as --param_name value (underscores for Nextflow).""" - p = NvdParams(tools="blast", cutoff_percent=0.01) + p = NvdParams(dedup=True, cutoff_percent=0.01) cmd = p.to_nextflow_args(Path("/pipeline")) - assert "--tools" in cmd - assert "blast" in cmd + assert "--dedup" in cmd + assert "true" in cmd assert "--cutoff_percent" in cmd assert "0.01" in cmd def test_underscores_preserved_for_nextflow(self) -> None: """Param names keep underscores (Nextflow/Groovy requires them).""" - p = NvdParams(min_gottcha_reads=100) + p = NvdParams(host_kmer_size=31) cmd = p.to_nextflow_args(Path("/pipeline")) - assert "--min_gottcha_reads" in cmd - assert "--min-gottcha-reads" not in cmd + assert "--host_kmer_size" in cmd + assert "--host-kmer-size" not in cmd def test_bool_to_string(self) -> None: """Booleans are converted to 'true'/'false' strings.""" @@ -415,10 +387,10 @@ def test_path_to_string(self) -> None: def test_none_values_excluded(self) -> None: """None values are not included in command.""" - p = NvdParams(tools=None, samplesheet=None) + p = NvdParams(samplesheet=None, host_index=None) cmd = p.to_nextflow_args(Path("/pipeline")) - assert "--tools" not in cmd assert "--samplesheet" not in cmd + assert "--host_index" not in cmd def test_list_to_comma_separated(self) -> None: """Lists are converted to comma-separated strings.""" @@ -474,9 +446,21 @@ def test_default_tax_stringency(self) -> None: """Default tax_stringency matches nextflow.config.""" assert NvdParams().tax_stringency == 0.7 - def test_default_min_gottcha_reads(self) -> None: - """Default min_gottcha_reads matches nextflow.config.""" - assert NvdParams().min_gottcha_reads == 250 + def test_default_host_index_url(self) -> None: + """Host depletion is off by default.""" + assert NvdParams().host_index is None + assert NvdParams().host_index_url is None + assert NvdParams().host_contaminants_fasta is None + + def test_default_virus_index_sources(self) -> None: + """Virus enrichment has no index source by default.""" + assert NvdParams().virus_index is None + assert NvdParams().virus_index_url is None + assert NvdParams().virus_reference_fasta is None + assert NvdParams().virus_kmer_size == 31 + assert NvdParams().virus_window_size == 1 + assert NvdParams().virus_abs_threshold == 1 + assert NvdParams().virus_rel_threshold == 0.0 def test_default_max_blast_targets(self) -> None: """Default max_blast_targets matches nextflow.config.""" @@ -500,7 +484,7 @@ def test_default_human_virus_families(self) -> None: def test_default_monoimage(self) -> None: """Default monoimage matches nextflow.config.""" - assert NvdParams().monoimage == "nrminor/nvd:v2.5.0" + assert NvdParams().monoimage == "nrminor/nvd:v3.0.0" class TestLoadParamsFile: @@ -509,39 +493,39 @@ class TestLoadParamsFile: def test_load_yaml_file(self, tmp_path: Path) -> None: """Can load params from YAML file.""" yaml_file = tmp_path / "params.yaml" - yaml_file.write_text("tools: blast\ncutoff_percent: 0.01\n") + yaml_file.write_text("dedup: true\ncutoff_percent: 0.01\n") params = load_params_file(yaml_file) - assert params["tools"] == "blast" + assert params["dedup"] is True assert params["cutoff_percent"] == 0.01 def test_load_yml_extension(self, tmp_path: Path) -> None: """Can load params from .yml file.""" yml_file = tmp_path / "params.yml" - yml_file.write_text("tools: gottcha\n") + yml_file.write_text("dedup_seq: true\n") params = load_params_file(yml_file) - assert params["tools"] == "gottcha" + assert params["dedup_seq"] is True def test_load_json_file(self, tmp_path: Path) -> None: """Can load params from JSON file.""" json_file = tmp_path / "params.json" - json_file.write_text('{"tools": "blast", "cutoff_percent": 0.01}') + json_file.write_text('{"dedup_pos": true, "cutoff_percent": 0.01}') params = load_params_file(json_file) - assert params["tools"] == "blast" + assert params["dedup_pos"] is True assert params["cutoff_percent"] == 0.01 def test_strips_schema_key(self, tmp_path: Path) -> None: """$schema key is stripped from loaded params.""" yaml_file = tmp_path / "params.yaml" yaml_file.write_text( - '$schema: "https://example.com/schema.json"\ntools: blast\n', + '$schema: "https://example.com/schema.json"\ndedup: true\n', ) params = load_params_file(yaml_file) assert "$schema" not in params - assert params["tools"] == "blast" + assert params["dedup"] is True def test_empty_file_returns_empty_dict(self, tmp_path: Path) -> None: """Empty file returns empty dict.""" @@ -559,13 +543,13 @@ def test_file_not_found_raises(self, tmp_path: Path) -> None: def test_integration_with_nvdparams_merge(self, tmp_path: Path) -> None: """load_params_file output works with NvdParams.merge().""" yaml_file = tmp_path / "params.yaml" - yaml_file.write_text("tools: blast\ncutoff_percent: 0.05\n") + yaml_file.write_text("dedup: true\ncutoff_percent: 0.05\n") file_params = load_params_file(yaml_file) cli_params = {"cutoff_percent": 0.01} merged = NvdParams.merge(file_params, cli_params) - assert merged.tools == "blast" # From file + assert merged.dedup is True # From file assert merged.cutoff_percent == 0.01 # CLI wins @@ -575,33 +559,33 @@ class TestTraceMerge: def test_basic_tracing(self) -> None: """trace_merge returns TracedParams with source info.""" traced = trace_merge( - ("preset", {"tools": "all", "cutoff_percent": 0.01}), - ("file", {"tools": "blast"}), + ("preset", {"dedup_seq": True, "cutoff_percent": 0.01}), + ("file", {"dedup": True}), ) assert isinstance(traced, TracedParams) - assert traced.params.tools == "blast" + assert traced.params.dedup is True + assert traced.params.dedup_seq is True assert traced.params.cutoff_percent == 0.01 def test_tracks_override(self) -> None: """Overridden values are tracked.""" traced = trace_merge( - ("preset", {"tools": "all"}), - ("file", {"tools": "blast"}), + ("preset", {"cutoff_percent": 0.01}), + ("file", {"cutoff_percent": 0.005}), ) - # Find the tools source - tools_source = next(s for s in traced.sources if s.field == "tools") - assert tools_source.value == "blast" - assert tools_source.source == "file" - assert tools_source.overridden_value == "all" - assert tools_source.overridden_source == "preset" + cutoff_source = next(s for s in traced.sources if s.field == "cutoff_percent") + assert cutoff_source.value == 0.005 + assert cutoff_source.source == "file" + assert cutoff_source.overridden_value == 0.01 + assert cutoff_source.overridden_source == "preset" def test_tracks_non_overridden(self) -> None: """Non-overridden values show their source without override info.""" traced = trace_merge( ("preset", {"cutoff_percent": 0.01}), - ("file", {"tools": "blast"}), + ("file", {"dedup": True}), ) # cutoff_percent came from preset, not overridden @@ -614,7 +598,7 @@ def test_tracks_non_overridden(self) -> None: def test_tracks_defaults(self) -> None: """Default values are tracked as source='default'.""" traced = trace_merge( - ("file", {"tools": "blast"}), + ("file", {"dedup": True}), ) # entropy should be default @@ -625,7 +609,7 @@ def test_tracks_defaults(self) -> None: def test_counts_defaults(self) -> None: """defaults_used counts fields using default values.""" traced = trace_merge( - ("file", {"tools": "blast", "cutoff_percent": 0.01}), + ("file", {"dedup": True, "cutoff_percent": 0.01}), ) # Should have many defaults (all the fields we didn't set) @@ -635,7 +619,7 @@ def test_empty_sources(self) -> None: """trace_merge with no sources returns all defaults.""" traced = trace_merge() - assert traced.params.tools is None # No default for tools + assert traced.params.dedup is False # Default assert traced.params.cutoff_percent == 0.001 # Default assert traced.defaults_used > 0 @@ -643,44 +627,45 @@ def test_none_sources_skipped(self) -> None: """None sources are gracefully skipped.""" traced = trace_merge( ("preset", None), - ("file", {"tools": "blast"}), + ("file", {"dedup": True}), ) - assert traced.params.tools == "blast" - tools_source = next(s for s in traced.sources if s.field == "tools") - assert tools_source.source == "file" + assert traced.params.dedup is True + dedup_source = next(s for s in traced.sources if s.field == "dedup") + assert dedup_source.source == "file" def test_three_way_override(self) -> None: """Three-way merge tracks the immediate predecessor.""" traced = trace_merge( - ("preset", {"tools": "all"}), - ("file", {"tools": "gottcha"}), - ("cli", {"tools": "blast"}), + ("preset", {"dedup_seq": True}), + ("file", {"dedup_pos": True}), + ("cli", {"dedup": True}), ) - tools_source = next(s for s in traced.sources if s.field == "tools") - assert tools_source.value == "blast" - assert tools_source.source == "cli" + dedup_source = next(s for s in traced.sources if s.field == "dedup") + assert dedup_source.value is True + assert dedup_source.source == "cli" # Should show it overrode "file", not "preset" - assert tools_source.overridden_value == "gottcha" - assert tools_source.overridden_source == "file" + assert dedup_source.overridden_value is None + assert dedup_source.overridden_source is None def test_with_nvdparams_instance(self) -> None: """trace_merge accepts NvdParams instances as sources.""" - preset = NvdParams(tools="all", cutoff_percent=0.01) + preset = NvdParams(dedup=True, cutoff_percent=0.01) traced = trace_merge( ("preset", preset), - ("file", {"tools": "blast"}), + ("file", {"dedup_pos": True}), ) - assert traced.params.tools == "blast" + assert traced.params.dedup is True + assert traced.params.dedup_pos is True assert traced.params.cutoff_percent == 0.01 def test_validates_merged_result(self) -> None: """trace_merge validates the merged params.""" with pytest.raises(ValidationError): trace_merge( - ("file", {"tools": "invalid_tool"}), + ("file", {"cutoff_percent": -0.1}), ) diff --git a/lib/py_nvd/test_state.py b/lib/py_nvd/test_state.py index 3657c7b..3641570 100644 --- a/lib/py_nvd/test_state.py +++ b/lib/py_nvd/test_state.py @@ -490,7 +490,6 @@ def test_register_processed_sample(self, registered_run: RunContext) -> None: sample_set_id=ctx.sample_set_id, run_id=ctx.run.run_id, blast_db_version="core-nt_2025-01-01", - stat_db_version="v1.0", state_dir=ctx.state_dir, ) @@ -500,7 +499,6 @@ def test_register_processed_sample(self, registered_run: RunContext) -> None: assert sample.run_id == "run_001" assert sample.status == "completed" # Now starts as completed assert sample.blast_db_version == "core-nt_2025-01-01" - assert sample.stat_db_version == "v1.0" def test_get_processed_sample(self, registered_run: RunContext) -> None: """get_processed_sample retrieves a registered sample.""" @@ -894,32 +892,14 @@ def test_get_uploaded_sample_ids_filters_by_upload_type( ) assert uploaded == {"s1"} - # With GOTTCHA2 filter: s1 does NOT show as uploaded + # With FASTA filter: s1 does NOT show as uploaded uploaded = get_uploaded_sample_ids( ["s1"], - upload_types=["gottcha2", "gottcha2_fasta"], + upload_types=["blast_fasta"], state_dir=temp_state_dir, ) assert uploaded == set() - # Now record a GOTTCHA2 upload too - record_upload( - "s1", - set1, - "gottcha2", - "labkey", - "hash2", - state_dir=temp_state_dir, - ) - - # With GOTTCHA2 filter: s1 now shows as uploaded - uploaded = get_uploaded_sample_ids( - ["s1"], - upload_types=["gottcha2", "gottcha2_fasta"], - state_dir=temp_state_dir, - ) - assert uploaded == {"s1"} - def test_get_uploaded_sample_ids_cross_sample_set( self, temp_state_dir: Path, @@ -1205,11 +1185,11 @@ def test_was_sample_ever_uploaded_with_filters( is True ) - # Not uploaded gottcha2 type + # Not uploaded FASTA type assert ( was_sample_ever_uploaded( ctx.sample_id, - upload_type="gottcha2", + upload_type="blast_fasta", state_dir=ctx.state_dir, ) is False @@ -1315,15 +1295,6 @@ def test_list_uploads_filter_by_type(self, temp_state_dir: Path) -> None: "hash2", state_dir=temp_state_dir, ) - record_upload( - "s1", - set1, - "gottcha2", - "labkey", - "hash3", - state_dir=temp_state_dir, - ) - uploads = list_uploads(upload_type="blast", state_dir=temp_state_dir) assert len(uploads) == 1 assert uploads[0].upload_type == "blast" @@ -1367,15 +1338,6 @@ def test_list_uploads_with_limit(self, temp_state_dir: Path) -> None: "hash2", state_dir=temp_state_dir, ) - record_upload( - "s1", - set1, - "gottcha2", - "labkey", - "hash3", - state_dir=temp_state_dir, - ) - uploads = list_uploads(limit=2, state_dir=temp_state_dir) assert len(uploads) == 2 @@ -1532,7 +1494,7 @@ def test_upload_workflow_second_run_with_overlap( assert samples_to_upload == ["sample_D"] def test_dedup_respects_upload_type(self, temp_state_dir: Path) -> None: - """Deduplication is per upload_type - blast and gottcha2 are independent.""" + """Deduplication is per upload_type - BLAST table and FASTA outputs are independent.""" sample_id = "sample_X" sample_set_id = compute_sample_set_id([sample_id]) run = register_run("run_001", sample_set_id, state_dir=temp_state_dir) @@ -1563,10 +1525,10 @@ def test_dedup_respects_upload_type(self, temp_state_dir: Path) -> None: state_dir=temp_state_dir, ) - # GOTTCHA2 should NOT be detected (different upload_type) + # FASTA should NOT be detected (different upload_type) assert not was_sample_ever_uploaded( sample_id, - upload_type="gottcha2", + upload_type="blast_fasta", upload_target="labkey", state_dir=temp_state_dir, ) @@ -1782,10 +1744,182 @@ def test_new_database_created_without_prompts(self, temp_state_dir: Path) -> Non with connect(temp_state_dir) as conn: # Should succeed without any prompts version = conn.execute("PRAGMA user_version").fetchone()[0] - assert version == 2 # EXPECTED_VERSION + assert version == EXPECTED_VERSION + + columns = [ + row[1] + for row in conn.execute( + "PRAGMA table_info(processed_samples)", + ).fetchall() + ] + assert "stat_db_version" not in columns assert db_path.exists() + def test_v2_database_migrates_to_blast_only_v3(self, temp_state_dir: Path) -> None: + """v2 state is migrated in place while retired workflow rows are dropped.""" + db_path = temp_state_dir / "state.sqlite" + + conn = sqlite3.connect(db_path) + conn.executescript( + """ + PRAGMA user_version = 2; + + CREATE TABLE runs ( + run_id TEXT PRIMARY KEY, + sample_set_id TEXT NOT NULL UNIQUE, + experiment_id INTEGER, + started_at TEXT NOT NULL, + completed_at TEXT, + status TEXT NOT NULL CHECK (status IN ('running', 'completed', 'failed')) + ); + + CREATE TABLE processed_samples ( + sample_id TEXT NOT NULL, + sample_set_id TEXT NOT NULL, + run_id TEXT NOT NULL REFERENCES runs(run_id), + processed_at TEXT NOT NULL, + blast_db_version TEXT, + stat_db_version TEXT, + taxonomy_hash TEXT, + status TEXT NOT NULL CHECK (status IN ('completed', 'uploaded', 'failed')), + PRIMARY KEY (sample_id, sample_set_id) + ); + + CREATE TABLE databases ( + db_type TEXT NOT NULL CHECK (db_type IN ('blast', 'stat', 'hostile')), + version TEXT NOT NULL, + path TEXT NOT NULL, + checksum TEXT, + registered_at TEXT NOT NULL, + PRIMARY KEY (db_type, version) + ); + + CREATE TABLE uploads ( + sample_id TEXT NOT NULL, + sample_set_id TEXT NOT NULL, + upload_type TEXT NOT NULL, + upload_target TEXT NOT NULL, + content_hash TEXT NOT NULL, + uploaded_at TEXT NOT NULL, + target_metadata TEXT, + PRIMARY KEY (sample_id, sample_set_id, upload_type, upload_target) + ); + + CREATE TABLE taxonomy_versions ( + run_id TEXT PRIMARY KEY REFERENCES runs(run_id), + file_hash TEXT NOT NULL, + ncbi_rebuild_timestamp TEXT, + file_size INTEGER, + downloaded_at TEXT NOT NULL, + recorded_at TEXT NOT NULL + ); + + CREATE TABLE sra_cache ( + srr_accession TEXT PRIMARY KEY, + download_path TEXT NOT NULL, + downloaded_at TEXT NOT NULL, + file_count INTEGER, + total_bytes INTEGER + ); + + CREATE TABLE presets ( + name TEXT PRIMARY KEY, + description TEXT, + params TEXT NOT NULL, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE TABLE sample_locks ( + sample_id TEXT PRIMARY KEY, + run_id TEXT NOT NULL REFERENCES runs(run_id), + hostname TEXT NOT NULL, + username TEXT NOT NULL, + locked_at TEXT NOT NULL, + expires_at TEXT NOT NULL + ); + + INSERT INTO runs (run_id, sample_set_id, started_at, status) + VALUES ('run_001', 'set_001', '2026-01-01T00:00:00Z', 'completed'); + + INSERT INTO processed_samples + (sample_id, sample_set_id, run_id, processed_at, blast_db_version, + stat_db_version, taxonomy_hash, status) + VALUES + ('s1', 'set_001', 'run_001', '2026-01-01T00:01:00Z', + 'blast-v1', 'stat-v1', 'tax-hash', 'completed'); + + INSERT INTO databases (db_type, version, path, registered_at) + VALUES + ('blast', 'blast-v1', '/db/blast', '2026-01-01T00:00:00Z'), + ('stat', 'stat-v1', '/db/stat', '2026-01-01T00:00:00Z'), + ('hostile', 'hostile-v1', '/db/hostile', '2026-01-01T00:00:00Z'); + + INSERT INTO uploads + (sample_id, sample_set_id, upload_type, upload_target, content_hash, uploaded_at) + VALUES + ('s1', 'set_001', 'blast', 'labkey', 'blast-hash', '2026-01-01T00:02:00Z'), + ('s1', 'set_001', 'gottcha2', 'labkey', 'gottcha-hash', '2026-01-01T00:03:00Z'); + """, + ) + conn.close() + + with connect(temp_state_dir) as migrated: + version = migrated.execute("PRAGMA user_version").fetchone()[0] + assert version == EXPECTED_VERSION + + processed_columns = [ + row[1] + for row in migrated.execute( + "PRAGMA table_info(processed_samples)", + ).fetchall() + ] + assert "stat_db_version" not in processed_columns + + sample = migrated.execute( + "SELECT sample_id, blast_db_version, taxonomy_hash FROM processed_samples", + ).fetchone() + assert tuple(sample) == ("s1", "blast-v1", "tax-hash") + + database_types = [ + row[0] + for row in migrated.execute( + "SELECT db_type FROM databases ORDER BY db_type", + ).fetchall() + ] + assert database_types == ["blast"] + + upload_types = [ + row[0] + for row in migrated.execute( + "SELECT upload_type FROM uploads ORDER BY upload_type", + ).fetchall() + ] + assert upload_types == ["blast"] + + backups = list(temp_state_dir.glob("state.backup_*.sqlite")) + assert len(backups) == 1 + + backup = sqlite3.connect(backups[0]) + try: + old_columns = [ + row[1] + for row in backup.execute( + "PRAGMA table_info(processed_samples)", + ).fetchall() + ] + assert "stat_db_version" in old_columns + legacy_uploads = [ + row[0] + for row in backup.execute( + "SELECT upload_type FROM uploads ORDER BY upload_type", + ).fetchall() + ] + assert legacy_uploads == ["blast", "gottcha2"] + finally: + backup.close() + def test_matching_schema_version_proceeds_normally( self, temp_state_dir: Path, @@ -1837,7 +1971,7 @@ def test_allow_destructive_update_creates_backup( # Create a database with wrong schema version and some data conn = sqlite3.connect(db_path) - conn.execute(f"PRAGMA user_version = {EXPECTED_VERSION - 1}") + conn.execute(f"PRAGMA user_version = {EXPECTED_VERSION - 2}") conn.execute("CREATE TABLE old_data (value TEXT)") conn.execute("INSERT INTO old_data VALUES ('important')") conn.commit() @@ -1856,7 +1990,7 @@ def test_allow_destructive_update_creates_backup( # Backup should contain the old data backup_conn = sqlite3.connect(backups[0]) old_version = backup_conn.execute("PRAGMA user_version").fetchone()[0] - assert old_version == EXPECTED_VERSION - 1 + assert old_version == EXPECTED_VERSION - 2 row = backup_conn.execute("SELECT value FROM old_data").fetchone() assert row[0] == "important" backup_conn.close() @@ -1870,7 +2004,7 @@ def test_allow_destructive_update_preserves_data_in_backup( # Create database with old schema and multiple tables of data conn = sqlite3.connect(db_path) - conn.execute(f"PRAGMA user_version = {EXPECTED_VERSION - 1}") + conn.execute(f"PRAGMA user_version = {EXPECTED_VERSION - 2}") conn.execute("CREATE TABLE runs (run_id TEXT PRIMARY KEY, data TEXT)") conn.execute("CREATE TABLE samples (sample_id TEXT, run_id TEXT)") for i in range(10): @@ -2004,33 +2138,6 @@ def test_get_database_by_path_canonicalizes_path( assert db is not None assert db.version == "v1.0" - def test_get_database_by_path_different_types_independent( - self, - temp_state_dir: Path, - temp_db_path: Path, - ) -> None: - """Different db_types at same path are independent.""" - register_database( - "blast", - "blast-v1", - str(temp_db_path), - state_dir=temp_state_dir, - ) - register_database( - "gottcha2", - "gottcha-v1", - str(temp_db_path), - state_dir=temp_state_dir, - ) - - blast_db, _ = get_database_by_path("blast", temp_db_path, temp_state_dir) - gottcha_db, _ = get_database_by_path("gottcha2", temp_db_path, temp_state_dir) - - assert blast_db is not None - assert blast_db.version == "blast-v1" - assert gottcha_db is not None - assert gottcha_db.version == "gottcha-v1" - def test_get_databases_by_path_returns_all_versions( self, temp_state_dir: Path, @@ -2097,7 +2204,7 @@ def temp_state_dir(self) -> Generator[Path, None, None]: def temp_db_paths(self, temp_state_dir: Path) -> dict[str, Path]: """Create temporary 'database' directories for each type.""" paths = {} - for db_type in ["blast", "gottcha2", "stat"]: + for db_type in ["blast"]: db_dir = temp_state_dir / f"fake_{db_type}_db" db_dir.mkdir() paths[db_type] = db_dir @@ -2108,8 +2215,6 @@ def test_no_paths_returns_empty_resolution(self, temp_state_dir: Path) -> None: resolution = resolve_database_versions(state_dir=temp_state_dir) assert resolution.blast_db_version is None - assert resolution.gottcha2_db_version is None - assert resolution.stat_db_version is None assert resolution.warnings == [] assert resolution.auto_registered == [] @@ -2266,27 +2371,21 @@ def test_path_without_version_not_registered_warns( # No registrations assert resolution.auto_registered == [] - def test_resolves_all_database_types( + def test_resolves_blast_database( self, temp_state_dir: Path, temp_db_paths: dict[str, Path], ) -> None: - """Resolves all three database types independently.""" + """Resolves BLAST database paths and versions.""" resolution = resolve_database_versions( blast_db=temp_db_paths["blast"], blast_db_version="blast-v1", - gottcha2_db=temp_db_paths["gottcha2"], - gottcha2_db_version="gottcha-v1", - stat_index=temp_db_paths["stat"], - stat_db_version="stat-v1", state_dir=temp_state_dir, ) assert resolution.blast_db_version == "blast-v1" - assert resolution.gottcha2_db_version == "gottcha-v1" - assert resolution.stat_db_version == "stat-v1" assert resolution.warnings == [] - assert len(resolution.auto_registered) == 3 + assert len(resolution.auto_registered) == 1 def test_mixed_resolution_scenarios( self, @@ -2305,24 +2404,14 @@ def test_mixed_resolution_scenarios( resolution = resolve_database_versions( # BLAST: path only, should resolve from registry blast_db=temp_db_paths["blast"], - # GOTTCHA2: path + version, should auto-register - gottcha2_db=temp_db_paths["gottcha2"], - gottcha2_db_version="gottcha-v1", - # STAT: path only, not registered, should warn - stat_index=temp_db_paths["stat"], state_dir=temp_state_dir, ) # BLAST resolved from registry assert resolution.blast_db_version == "blast-v1" - # GOTTCHA2 auto-registered - assert resolution.gottcha2_db_version == "gottcha-v1" - assert any(r[0] == "gottcha2" for r in resolution.auto_registered) - - # STAT unresolved with warning - assert resolution.stat_db_version is None - assert any("stat" in w and "not registered" in w for w in resolution.warnings) + assert resolution.warnings == [] + assert resolution.auto_registered == [] def test_path_canonicalization_in_resolution( self, diff --git a/main.nf b/main.nf index 1a998c8..d8d4d06 100644 --- a/main.nf +++ b/main.nf @@ -3,10 +3,7 @@ nextflow.enable.dsl = 2 include { GATHER_READS } from "./workflows/gather_reads" -include { PREPROCESS_READS } from "./workflows/preprocess_reads" -include { STAT_BLAST_WORKFLOW } from "./workflows/stat_blast_workflow" -include { GOTTCHA2_WORKFLOW } from "./workflows/gottcha2_workflow" -include { CLUMPIFY_WORKFLOW } from "./workflows/clumpify" +include { NVD_MAIN } from "./workflows/nvd_main" workflow { @@ -20,28 +17,12 @@ workflow { GATHER_READS(ch_input_samplesheet) - PREPROCESS_READS(GATHER_READS.out) + def nvd_main_results = NVD_MAIN(GATHER_READS.out) - // STAT+BLAST workflow (human virus detection via STAT + two-phase BLAST) - // Aliases: nvd, stat, blast, stat_blast, stast (for backward compatibility) - def stat_blast_results = STAT_BLAST_WORKFLOW(PREPROCESS_READS.out) - def stat_blast_token = stat_blast_results.completion - - // Collect all LabKey logs as final process if (params.labkey) { - stat_blast_results.labkey_log.collectFile( + nvd_main_results.labkey_log.collectFile( name: 'final_labkey_upload.log', storeDir: params.results, ) } - - // GOTTCHA2 workflow - def gottcha_token = GOTTCHA2_WORKFLOW(PREPROCESS_READS.out).completion - def start_clumpify = stat_blast_token.mix(gottcha_token).collect().map { true } - - // CLUMPIFY workflow - CLUMPIFY_WORKFLOW( - GATHER_READS.out, - start_clumpify, - ) } diff --git a/modules/bbmap.nf b/modules/bbmap.nf index 48bfe7c..4af7a6e 100644 --- a/modules/bbmap.nf +++ b/modules/bbmap.nf @@ -62,7 +62,7 @@ process DEDUP_WITH_CLUMPIFY { /* Deduplicate reads using clumpify */ tag "${sample_id}" - label "ludicrous" + label "high" errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } maxRetries 2 @@ -95,7 +95,7 @@ process TRIM_ADAPTERS { /* Trim Illumina adapters using bbduk */ tag "${sample_id}" - label "ludicrous" + label "high" errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } maxRetries 2 @@ -129,7 +129,7 @@ process FILTER_READS { /* Filter reads by quality and length (pair-aware for interleaved reads) */ tag "${sample_id}" - label "ludicrous" + label "high" errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } maxRetries 2 @@ -253,64 +253,3 @@ process FILTER_SHORT_CONTIGS { minconsecutivebases=${params.min_consecutive_bases} """ } - -process CLUMP_READS { - - /* */ - - tag "${sample_id}" - label "ludicrous" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - cpus 4 - - input: - tuple val(sample_id), val(platform), val(read_structure), path(reads) - - output: - tuple val(sample_id), val(platform), val(read_structure), path("${sample_id}.clumped.fastq.gz") - - when: - params.tools && (params.tools.contains("clump") || params.tools.contains("all")) - - script: - """ - clumpify.sh \ - in=${reads} out=${sample_id}.clumped.fastq.gz \ - reorder \ - threads=${task.cpus} -eoom - """ - -} - -process SANITIZE_EXTRACTED_FASTA { - - /* Reformat GOTTCHA2 extracted FASTA for downstream consumption. - * Taxonomic-level deduplication (strain > species) is handled by - * each consumer: register_gottcha2_hits.py and labkey_upload_gottcha2_fasta.py. */ - - tag "${sample_id}" - label "medium" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - cpus 4 - - input: - tuple val(sample_id), path(extracted_reads), path(full_tsv) - - output: - tuple val(sample_id), path("${sample_id}.no_ambig.fasta"), path(full_tsv) - - script: - """ - reformat.sh \ - in=${extracted_reads} out=${sample_id}.no_ambig.fasta \ - nullifybrokenquality=t \ - threads=${task.cpus} -eoom - """ -} - diff --git a/modules/count_reads.nf b/modules/count_reads.nf deleted file mode 100644 index f91cc61..0000000 --- a/modules/count_reads.nf +++ /dev/null @@ -1,44 +0,0 @@ -process COUNT_READS { - tag "${sample_id}" - label 'low' - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), val(platform), val(read_structure), path(fastq) - - output: - tuple val(sample_id), env(total_reads), emit: counts - - script: - """ - if [[ "${fastq}" == *.gz ]]; then - total_reads=\$(zcat ${fastq} | wc -l | awk -v OFMT="%.0f" '{print \$1/4}') - else - total_reads=\$(cat ${fastq} | wc -l | awk -v OFMT="%.0f" '{print \$1/4}') - fi - - """ -} - -// Lightweight threshold check: reads only min_reads records instead of the -// entire file. For large gzipped FASTQs this is O(threshold) vs O(file_size). -process CHECK_MIN_READS { - tag "${sample_id}" - label 'low' - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), val(platform), val(read_structure), path(fastq) - - output: - tuple val(sample_id), env(read_count), emit: counts - - script: - """ - read_count=\$(seqkit head -n ${params.min_gottcha_reads} ${fastq} | seqkit stats -T | tail -1 | cut -f4) - """ -} diff --git a/modules/deacon.nf b/modules/deacon.nf index 32304b7..2c7278a 100644 --- a/modules/deacon.nf +++ b/modules/deacon.nf @@ -8,32 +8,6 @@ * - SIMD-accelerated, ~5GB RAM for panhuman index */ -process DEACON_BUILD_INDEX { - /* - * Build a deacon index from FASTA file(s). - * Use this for custom contaminant sequences. - */ - - tag "${fasta.simpleName}" - label "medium" - - input: - path fasta - - output: - path "*.idx", emit: index - - script: - def prefix = fasta.simpleName - """ - deacon index build \\ - --threads ${task.cpus} \\ - -k ${params.deacon_kmer_size} \\ - -w ${params.deacon_window_size} \\ - ${fasta} > ${prefix}.k${params.deacon_kmer_size}w${params.deacon_window_size}.idx - """ -} - process DEACON_FETCH_INDEX { /* * Download a prebuilt deacon index from URL. @@ -73,8 +47,34 @@ process DEACON_UNION_INDEXES { script: def idx_list = indexes.collect { it.name }.join(' ') + def union_or_link = indexes.size() == 1 + ? "ln -s ${idx_list} combined.idx" + : "deacon index union ${idx_list} > combined.idx" + """ + ${union_or_link} + """ +} + +process DEACON_BUILD_INDEX_FROM_FASTA { + /* + * Build a host/contaminant deacon index from a custom FASTA file. + */ + + label "medium" + + input: + path contaminants_fasta + + output: + path "custom_contaminants.k${params.host_kmer_size}w${params.host_window_size}.idx", emit: index + + script: """ - deacon index union ${idx_list} > combined.idx + deacon index build \ + -k ${params.host_kmer_size} \ + -w ${params.host_window_size} \ + -o custom_contaminants.k${params.host_kmer_size}w${params.host_window_size}.idx \ + ${contaminants_fasta} """ } @@ -109,11 +109,132 @@ process DEACON_DEPLETE { deacon filter \\ --deplete \\ --threads ${task.cpus} \\ - --abs-threshold ${params.deacon_abs_threshold} \\ - --rel-threshold ${params.deacon_rel_threshold} \\ + --abs-threshold ${params.host_abs_threshold} \\ + --rel-threshold ${params.host_rel_threshold} \\ --summary ${sample_id}.deacon.json \\ --output ${sample_id}.depleted.fastq.gz \\ ${index} \\ ${reads} """ } + +process DEACON_BUILD_VIRUS_INDEX_FROM_FASTA { + /* + * Build a deacon virus index from a reference FASTA file. + * + * Use this when providing virus_reference_fasta instead of a + * pre-built index (virus_index) or URL (virus_index_url). + * Uses virus_kmer_size/virus_window_size for maximum sensitivity + * (k=31, w=1 by default) to match the behavior of STAT-derived indexes. + * + * This runs ONCE per pipeline invocation (not per-sample). + */ + + label "medium" + + input: + path virus_fasta + + output: + path "virus_reference.k${params.virus_kmer_size}w${params.virus_window_size}.idx", emit: index + + script: + """ + deacon index build \\ + -k ${params.virus_kmer_size} \\ + -w ${params.virus_window_size} \\ + -o virus_reference.k${params.virus_kmer_size}w${params.virus_window_size}.idx \\ + ${virus_fasta} + """ +} + +process DEACON_FILTER_HUMAN_VIRUS_READS { + /* + * Extract human virus reads using deacon filter in non-deplete mode. + * + * Accepts pre-interleave input directly from GATHER_READS: + * - Paired (Illumina): takes R1/R2 as separate files. Deacon does pair-aware + * k-mer counting and outputs interleaved FASTQ in a single pass. + * - Single-end (ONT): takes a single file, filtered as individual reads. + * + * Output is always tuple(sample_id, platform, read_structure, fastq) matching + * the shape expected by downstream preprocessing and SPAdes. + */ + + tag "${sample_id}" + label "medium" + + errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } + maxRetries 2 + + input: + tuple val(sample_id), val(platform), path(reads), path(reads2), path(deacon_idx) + + output: + tuple val(sample_id), val(platform), val(read_structure), path("${sample_id}.human_virus.fastq.gz"), emit: reads + tuple val(sample_id), path("${sample_id}.deacon_filter.json"), emit: stats + + script: + read_structure = reads2.name != "NO_R2" ? "interleaved" : "single" + if (read_structure == "interleaved") + """ + deacon filter \\ + --threads ${task.cpus} \\ + --abs-threshold ${params.virus_abs_threshold} \\ + --rel-threshold ${params.virus_rel_threshold} \\ + --summary ${sample_id}.deacon_filter.json \\ + --output ${sample_id}.human_virus.fastq.gz \\ + ${deacon_idx} \\ + ${reads} ${reads2} + """ + else + """ + deacon filter \\ + --threads ${task.cpus} \\ + --abs-threshold ${params.virus_abs_threshold} \\ + --rel-threshold ${params.virus_rel_threshold} \\ + --summary ${sample_id}.deacon_filter.json \\ + --output ${sample_id}.human_virus.fastq.gz \\ + ${deacon_idx} \\ + ${reads} + """ +} + +process DEACON_FILTER_CONTIGS { + /* + * Extract human virus contigs using deacon filter on assembled FASTA. + * + * Replaces the 5-process STAT contig classification chain: + * CLASSIFY_CONTIGS_FIRST_PASS → GENERATE_CONTIGS_TAXA_LIST → + * CLASSIFY_CONTIGS_SECOND_PASS → IDENTIFY_HUMAN_VIRUS_FAMILY_CONTIGS → + * EXTRACT_HUMAN_VIRUS_CONTIGS + * + * Uses the same virus index as read extraction so no additional reference + * is needed. Contigs are already ≥200 bp (FILTER_SHORT_CONTIGS), so + * incidental single k-mer matches are rare — the signal-to-noise ratio + * improves vs reads because contigs have far more k-mers per sequence. + */ + + tag "${sample_id}" + label "medium" + + errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } + maxRetries 2 + + input: + tuple val(sample_id), val(platform), val(read_structure), path(fasta), path(deacon_idx) + + output: + tuple val(sample_id), path("${sample_id}.human_virus.fasta") + + script: + """ + deacon filter \\ + --threads ${task.cpus} \\ + --abs-threshold ${params.virus_abs_threshold} \\ + --rel-threshold ${params.virus_rel_threshold} \\ + --output ${sample_id}.human_virus.fasta \\ + ${deacon_idx} \\ + ${fasta} + """ +} diff --git a/modules/gottcha2.nf b/modules/gottcha2.nf deleted file mode 100644 index 143af44..0000000 --- a/modules/gottcha2.nf +++ /dev/null @@ -1,153 +0,0 @@ -process GOTTCHA2_PROFILE_NANOPORE { - - tag "${sample_id}" - label "ludicrous" - - publishDir params.gottcha2_profiles, mode: 'copy', overwrite: false, pattern: "*.sam" - publishDir params.gottcha2_profiles, mode: 'copy', overwrite: false, pattern: "*.tsv" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), path(fastq), path(ref_mmi), path(stats), path(tax_tsv) - - output: - tuple val(sample_id), path("${sample_id}*.sam"), path(ref_mmi), path(stats), path(tax_tsv), emit: aligned - tuple val(sample_id), path("${sample_id}*.full.tsv"), path(ref_mmi), path(stats), path(tax_tsv), emit: full_tsv - path "*.tsv", emit: all_stats - - script: - def ref_prefix = file(ref_mmi).getBaseName().toString().replace(".mmi", "") - """ - gottcha2.py \ - --verbose --debug \ - --database ${ref_prefix} \ - --prefix ${sample_id} \ - --noCutoff --dbLevel strain --threads ${task.cpus} \ - --nanopore \ - --input ${fastq} - """ -} - -process GOTTCHA2_PROFILE_ILLUMINA { - - tag "${sample_id}" - label "ludicrous" - - publishDir params.gottcha2_profiles, mode: 'copy', overwrite: false, pattern: "*.sam" - publishDir params.gottcha2_profiles, mode: 'copy', overwrite: false, pattern: "*.tsv" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), path(fastq), path(ref_mmi), path(stats), path(tax_tsv) - - output: - tuple val(sample_id), path("${sample_id}*.sam"), path(ref_mmi), path(stats), path(tax_tsv), emit: aligned - tuple val(sample_id), path("${sample_id}*.full.tsv"), path(ref_mmi), path(stats), path(tax_tsv), emit: full_tsv - path "*.tsv", emit: all_stats - - script: - def ref_prefix = file(ref_mmi).getBaseName().toString().replace(".mmi", "") - """ - gottcha2.py \ - --verbose --debug \ - --database ${ref_prefix} \ - --prefix ${sample_id} \ - --noCutoff --dbLevel strain --threads ${task.cpus} \ - --input ${fastq} - """ -} - -process GENERATE_FASTA { - - tag "${sample_id}" - label "high" - - publishDir params.extracted_reads, mode: 'copy', overwrite: false, pattern: "*.fasta" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), path(sam), path(ref_mmi), path(stats), path(tax_tsv) - - output: - tuple val(sample_id), path("*.extract.fasta"), path("*.full.tsv"), path("*.gottcha_strain.log"), path("*.lineage.tsv"), optional: true - - script: - def ref_prefix = file(ref_mmi).getBaseName().toString().replace(".mmi", "") - """ - gottcha2.py \ - --verbose --debug \ - --noCutoff --dbLevel strain --threads ${task.cpus} -ef \ - --database ${ref_prefix} \ - --prefix ${sample_id} \ - --sam ${sam} - - if [[ -f ${sample_id}.tsv ]]; then - echo "Renaming the lineage tsv '${sample_id}.tsv' to include the lineage suffix..." - mv ${sample_id}.tsv ${sample_id}.lineage.tsv - elif [[ -f ${sample_id}.lineage.tsv ]]; then - echo "A valid lineage TSV file was successfully produced" - else - echo "[WARN] No valid lineage TSV was produced. Downstream processes that depend on it will not run." - fi - """ -} -// Gottcha2 -ef meaning -// Extract up to 20 sequences per reference from the SAM file and save them to a FASTA file. Equivalent to using: -e 'all:20:fasta'. - -/* - * Register GOTTCHA2 hits with idempotent keys in the state database. - * - * This process computes deterministic hit keys from extracted sequences, - * enabling cross-run and cross-sample deduplication. Taxonomy is parsed - * directly from the GOTTCHA2 FASTA headers (LEVEL, NAME, TAXID). - * - * Input: - * - tuple of (sample_id, fasta, full_tsv, sample_set_id, state_dir, hits_dir) - * - state_dir may be empty string in stateless mode - * - hits_dir is the base directory for parquet output (state_dir/hits or results/hits) - * Output: - * - tuple of (sample_id, log_file, parquet_file) - */ -process REGISTER_GOTTCHA2_HITS { - - tag "${sample_id}" - label "low" - maxForks 1 - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - // Publish parquet file - runs on every resume even if task is cached - // Uses Hive-partitioned structure: {hits_dir}/month=NULL/{sample_set_id}/{sample_id}/data.parquet - publishDir "${hits_dir}/month=NULL/${sample_set_id}/${sample_id}", mode: 'copy', pattern: "data.parquet" - - input: - tuple val(sample_id), path(fasta), path(full_tsv), val(sample_set_id), val(state_dir), val(hits_dir) - - output: - tuple val(sample_id), path("${sample_id}_gottcha2_hits_registered.log"), path("data.parquet") - - script: - assert hits_dir : "hits_dir cannot be null - this indicates a workflow configuration error" - def labkey_arg = params.labkey ? "--labkey" : "" - def state_dir_arg = state_dir ? "--state-dir '${state_dir}'" : "" - """ - set -o pipefail - register_gottcha2_hits.py \\ - --fasta ${fasta} \\ - --full-tsv ${full_tsv} \\ - ${state_dir_arg} \\ - --sample-set-id '${sample_set_id}' \\ - --sample-id '${sample_id}' \\ - --run-id '${workflow.runName}' \\ - --output data.parquet \\ - ${labkey_arg} \\ - -v 2>&1 | tee ${sample_id}_gottcha2_hits_registered.log - """ -} diff --git a/modules/minimap2.nf b/modules/minimap2.nf index dd22f82..84b2602 100644 --- a/modules/minimap2.nf +++ b/modules/minimap2.nf @@ -31,7 +31,7 @@ process MAP_READS_TO_CONTIGS { def preset = platform == 'ont' || platform == 'sra' ? "map-ont" : "sr" - def should_dedup_pos = params.dedup_pos ?: params.dedup ?: params.preprocess + def should_dedup_pos = params.dedup || params.dedup_pos if (should_dedup_pos) { """ minimap2 -ax ${preset} -t ${task.cpus} ${contigs} ${reads} \\ diff --git a/modules/seqkit.nf b/modules/seqkit.nf deleted file mode 100644 index c26372f..0000000 --- a/modules/seqkit.nf +++ /dev/null @@ -1,20 +0,0 @@ -process EXTRACT_HUMAN_VIRUS_CONTIGS { - - tag "${sample_id}" - label "medium" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), path(human_virus_family_hits), path(fasta) - - output: - tuple val(sample_id), path("${sample_id}.human_virus.fasta") - - script: - """ - seqkit grep -f ${human_virus_family_hits} ${fasta} -o ${sample_id}.human_virus.fasta - """ -} - diff --git a/modules/spades.nf b/modules/spades.nf index c6d858e..1454bba 100644 --- a/modules/spades.nf +++ b/modules/spades.nf @@ -1,7 +1,7 @@ process RUN_SPADES { tag "${sample_id}" - label "ludicrous" + label "high" errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } maxRetries 2 diff --git a/modules/sratools.nf b/modules/sratools.nf index ad948f4..8c45ace 100644 --- a/modules/sratools.nf +++ b/modules/sratools.nf @@ -16,9 +16,6 @@ process FETCH_FASTQ { output: tuple val(id), val(platform), path("${run_accession}*.fastq") - when: - params.tools - script: id = id ? id : run_accession """ diff --git a/modules/stat.nf b/modules/stat.nf deleted file mode 100644 index 9ffa0a7..0000000 --- a/modules/stat.nf +++ /dev/null @@ -1,234 +0,0 @@ -process EXTRACT_HUMAN_VIRUS_READS { - - tag "${sample_id}" - label "high_disk" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), val(platform), val(read_structure), path(fastq), path(stat_dbss), path(stat_annotation), path(human_virus_taxlist) - - output: - tuple val(sample_id), val(platform), val(read_structure), path("*.f*q.gz") - - when: - params.tools && (params.tools.contains("nvd") || params.tools.contains("stat") || params.tools.contains("blast") || params.tools.contains("stat_blast") || params.tools.contains("stast") || params.tools.contains("all")) - - script: - """ - seqkit fq2fa --threads 1 ${fastq} -o - \\ - | aligns_to \\ - -dbss ${stat_dbss} \\ - -num_threads ${task.cpus} \\ - -tax_list ${human_virus_taxlist} \\ - stdin \\ - | cut -f1 \\ - | seqkit grep -f - \\ - ${fastq} \\ - -o ${sample_id}.human_virus.fastq.gz - """ -} - -process CLASSIFY_CONTIGS_FIRST_PASS { - - tag "${sample_id}" - label "high" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), val(platform), val(read_structure), path(filtered_contigs), path(stat_index) - - output: - tuple val(sample_id), path(filtered_contigs), path("${sample_id}.firstpass.txt") - - script: - """ - aligns_to -dbs ${stat_index} \ - -num_threads ${task.cpus} \ - ${filtered_contigs} \ - > "${sample_id}.firstpass.txt" - """ -} - -process GENERATE_CONTIGS_TAXA_LIST { - - tag "${sample_id}" - label "low" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), path(filtered_contigs), path(first_pass_file) - - output: - tuple val(sample_id), path(filtered_contigs), path("${sample_id}.report") - - script: - """ - generate_tax_list.py ${first_pass_file} ${sample_id}.report - """ -} - -process CLASSIFY_CONTIGS_SECOND_PASS { - - tag "${sample_id}" - label "high" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - cpus 8 - - input: - tuple val(sample_id), path(filtered_contigs), path(tax_list), path(stat_dbss), path(stat_annotation) - - output: - tuple val(sample_id), path("${sample_id}.secondpass.txt") - - script: - """ - aligns_to \ - -tax_list ${tax_list} \ - -dbss ${stat_dbss} \ - -num_threads ${task.cpus} \ - ${filtered_contigs} \ - > "${sample_id}.secondpass.txt" - """ -} - - -process GENERATE_STAT_CONTIG_REPORT { - - tag "${sample_id}" - label "low" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), path(secondpass_file) - val state_dir - val taxonomy_dir - - output: - tuple val(sample_id), path("${sample_id}.report"), emit: report - - script: - def state_dir_arg = state_dir ? "--state-dir '${state_dir}'" : "" - def taxonomy_dir_arg = taxonomy_dir ? "--taxonomy-dir '${taxonomy_dir}'" : "" - """ - hits_to_report.py \ - --cutoff-percent ${params.cutoff_percent} \ - ${state_dir_arg} \ - ${taxonomy_dir_arg} \ - ${secondpass_file} \ - ${sample_id}.report - """ -} - -process IDENTIFY_HUMAN_VIRUS_FAMILY_CONTIGS { - - tag "${sample_id}" - label "low" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), path(secondpass_file) - val state_dir - val taxonomy_dir - - output: - tuple val(sample_id), path("${sample_id}.report") - - script: - // Handle both list (from config) and comma-separated string (from CLI) - def virus_families = params.human_virus_families instanceof List - ? params.human_virus_families.join(" ") - : params.human_virus_families.toString().split(",").collect { it.trim() }.join(" ") - def state_dir_arg = state_dir ? "--state-dir '${state_dir}'" : "" - def taxonomy_dir_arg = taxonomy_dir ? "--taxonomy-dir '${taxonomy_dir}'" : "" - """ - extract_taxa_spots.py \ - --hits_file ${secondpass_file} \ - --output_file ${sample_id}.report \ - --taxa ${virus_families} \ - --stringency ${params.tax_stringency} \ - --include_children \ - ${state_dir_arg} \ - ${taxonomy_dir_arg} - """ -} - -process SCRUB_HOST_READS { - /* - * Remove host (human) reads using STAT's aligns_to + seqkit grep. - * This approach preserves original FASTQ headers (including Casava 1.8+ metadata), - * which is required for downstream pair repair. - */ - - tag "${sample_id}" - label "high_disk" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), val(platform), val(read_structure), path(fastq), path(human_db) - - output: - tuple val(sample_id), val(platform), val(read_structure), path("${sample_id}.scrubbed.fastq.gz") - - script: - """ - seqkit fq2fa --threads 1 ${fastq} -o - \\ - | aligns_to \\ - -db ${human_db} \\ - -num_threads ${task.cpus} \\ - stdin \\ - | cut -f1 \\ - | seqkit grep -v -f - \\ - ${fastq} \\ - -o ${sample_id}.scrubbed.fastq.gz - """ -} - -process SCRUB_HUMAN_READS { - /* - * Simplified host scrubbing for clumpify/SRA submission workflow. - * Uses same STAT approach but with simpler tuple structure. - */ - - tag "${sample_id}" - label "high_disk" - - errorStrategy { task.attempt < 3 ? 'retry' : 'ignore' } - maxRetries 2 - - input: - tuple val(sample_id), path(fastq), path(human_db) - - output: - tuple val(sample_id), path("${sample_id}.scrubbed.fastq.gz") - - when: - params.tools && (params.tools.contains("clump") || params.tools.contains("all")) - - script: - """ - seqkit fq2fa --threads 1 ${fastq} -o - \\ - | aligns_to \\ - -db ${human_db} \\ - -num_threads ${task.cpus} \\ - stdin \\ - | cut -f1 \\ - | seqkit grep -v -f - \\ - ${fastq} \\ - -o ${sample_id}.scrubbed.fastq.gz - """ -} diff --git a/modules/utils.nf b/modules/utils.nf index 72a2ecc..0322331 100644 --- a/modules/utils.nf +++ b/modules/utils.nf @@ -35,7 +35,6 @@ process CHECK_RUN_STATE { script: def exp_arg = params.experiment_id ? "--experiment-id ${params.experiment_id}" : "" def blast_db_arg = params.blast_db_version ? "--blast-db-version '${params.blast_db_version}'" : "" - def stat_db_arg = params.stat_db_version ? "--stat-db-version '${params.stat_db_version}'" : "" def state_dir_arg = state_dir ? "--state-dir '${state_dir}'" : "" def taxonomy_dir_arg = taxonomy_dir ? "--taxonomy-dir '${taxonomy_dir}'" : "" def upload_types_arg = upload_types ? "--upload-types '${upload_types}'" : "" @@ -48,7 +47,6 @@ process CHECK_RUN_STATE { ${taxonomy_dir_arg} \\ ${exp_arg} \\ ${blast_db_arg} \\ - ${stat_db_arg} \\ ${upload_types_arg} """ } @@ -77,8 +75,74 @@ process ANNOTATE_LEAST_COMMON_ANCESTORS { } +process ADD_READ_COUNTS_TO_BLAST { + /* + * Append total_reads column to merged BLAST results. + * Runs after ANNOTATE_LEAST_COMMON_ANCESTORS so the final published + * TSV always contains the total input read count regardless of + * whether LabKey is enabled. + */ + + tag "${sample_id}" + label "low" + + input: + tuple val(sample_id), path(blast_tsv), val(total_reads) + + output: + tuple val(sample_id), path("${sample_id}_blast.final.tsv") + + script: + """ + awk -v reads="${total_reads}" 'BEGIN{OFS="\\t"} NR==1{print \$0, "total_reads"} NR>1{print \$0, reads}' \\ + ${blast_tsv} > ${sample_id}_blast.final.tsv + """ +} + +process CONCATENATE_EXPERIMENT_BLAST { + /* + * Concatenate all per-sample _blast.final.tsv files into a single + * experiment-level TSV. Runs unconditionally (does not require LabKey). + * Header is taken from the first file; subsequent files contribute + * data rows only. + */ + + label "low" + + input: + path "sample_results/*" + + output: + path "experiment_blast_results.tsv", emit: concatenated_tsv + + script: + """ + #!/usr/bin/env python3 + from pathlib import Path + + files = sorted(Path("sample_results").glob("*.tsv")) + + if not files: + Path("experiment_blast_results.tsv").write_text("") + else: + with open("experiment_blast_results.tsv", "w") as out: + # Write header from first file + with open(files[0]) as f: + header = f.readline() + out.write(header) + for line in f: + out.write(line) + # Append data rows from remaining files + for tsv in files[1:]: + with open(tsv) as f: + f.readline() # skip header + for line in f: + out.write(line) + """ +} + /* - * Register BLAST hits with idempotent keys in the state database. + * Register BLAST hit observations in the v3 parquet hit store. * * This process computes deterministic hit keys from contig sequences, * enabling cross-run and cross-sample deduplication. The hit key is @@ -88,13 +152,13 @@ process ANNOTATE_LEAST_COMMON_ANCESTORS { * Input: * - tuple of (sample_id, contigs, blast_results, sample_set_id, state_dir, hits_dir) * - state_dir may be null in stateless mode - * - hits_dir is the base directory for parquet output (state_dir/hits or results/hits) + * - hits_dir is the v3 parquet output directory (state_dir/hits/schema=v3 or results/hits/schema=v3) * Output: * - tuple of (sample_id, log_file, parquet_file) * * Note: This is currently a "dead end" - output is not consumed by - * downstream processes. The hits are registered in the state database - * for later querying via `nvd hits export`. + * downstream processes. The parquet observations are available later via + * `nvd hits ...` commands. */ process REGISTER_HITS { @@ -107,7 +171,7 @@ process REGISTER_HITS { // Publish parquet file - runs on every resume even if task is cached // Uses Hive-partitioned structure: {hits_dir}/month=NULL/{sample_set_id}/{sample_id}/data.parquet - // hits_dir is either state_dir/hits (stateful) or results/hits (stateless) + // hits_dir is either state_dir/hits/schema=v3 (stateful) or results/hits/schema=v3 (stateless) publishDir "${hits_dir}/month=NULL/${sample_set_id}/${sample_id}", mode: 'copy', pattern: "data.parquet" input: @@ -119,7 +183,6 @@ process REGISTER_HITS { script: assert hits_dir : "hits_dir cannot be null - this indicates a workflow configuration error" def blast_db_arg = params.blast_db_version ? "--blast-db-version '${params.blast_db_version}'" : "" - def stat_db_arg = params.stat_db_version ? "--stat-db-version '${params.stat_db_version}'" : "" def labkey_arg = params.labkey ? "--labkey" : "" def state_dir_arg = state_dir ? "--state-dir '${state_dir}'" : "" """ @@ -133,7 +196,6 @@ process REGISTER_HITS { --run-id '${workflow.runName}' \\ --output data.parquet \\ ${blast_db_arg} \\ - ${stat_db_arg} \\ ${labkey_arg} \\ -v 2>&1 | tee ${sample_id}_hits_registered.log """ diff --git a/nextflow.config b/nextflow.config index a072e5e..76acd01 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,9 +11,6 @@ params { labkey_project_name = null labkey_webdav = null labkey_schema = null - labkey_gottcha_fasta_list = null - labkey_gottcha_full_list = null - labkey_gottcha_blast_verified_full_list = null labkey_blast_meta_hits_list = null labkey_blast_fasta_list = null labkey_exp_id_guard_list = null @@ -39,9 +36,6 @@ params { // Where to place results results = "${launchDir}/results" - // Which tool to run - tools = null - // Experiment number to track experiment_id = null @@ -54,48 +48,36 @@ params { // Nextflow work directory for intermediate files work_dir = "${launchDir}/work" - // GOTTCHA2 version https://ref-db.edgebioinformatics.org/gottcha2/RefSeq-r220 - // Database hasn't been updated in almost 2 years... - gottcha2_db_version = "RefSeq-r220" blast_db_version = "core-nt_2025-08-03" - // Resource file paths on staging - gottcha2_db = null nvd_files = null blast_db = null blast_db_prefix = null - stat_index = null - stat_dbss = null - stat_annotation = null - human_virus_taxlist = null + + // Vertebrate-infecting virus enrichment with deacon. The current workflow + // still needs to be rewired from STAT-derived indexes to these inputs. + virus_index = null + virus_index_url = null + virus_reference_fasta = null + virus_kmer_size = 31 + virus_window_size = 1 + virus_abs_threshold = 1 + virus_rel_threshold = 0.0 // whether to run all preprocessing of merged reads before classification preprocess = false - // whether to merge paired read mates based on overlaps between them - merge_pairs = null - // whether to deduplicate sequencing reads (umbrella: enables both dedup_seq and dedup_pos) - dedup = null + dedup = false // sequence-based deduplication with clumpify (preprocessing) - dedup_seq = null + dedup_seq = false // positional deduplication with samtools markdup (after alignment) - dedup_pos = null + dedup_pos = false // Adapter trimming (Illumina only) trim_adapters = null - // Host read scrubbing in preprocessing (uses STAT aligns_to + seqkit grep) - // Requires sra_human_db to be set - scrub_host_reads = null - - // Path to human reads STAT database for host scrubbing and SRA submission prep - sra_human_db = null - - // DEPRECATED: Use sra_human_db instead. Kept for backward compatibility. - human_read_scrub = null - // Quality and length filtering filter_reads = null @@ -104,14 +86,15 @@ params { min_read_length = 50 max_read_length = null - // Host scrubbing with deacon (used when scrub_host_reads is enabled) - deacon_index = null - deacon_index_url = "https://zenodo.org/records/17288185/files/panhuman-1.k31w15.idx" - deacon_contaminants_fasta = null - deacon_kmer_size = 31 - deacon_window_size = 15 - deacon_abs_threshold = 2 - deacon_rel_threshold = 0.01 + // Optional host/contaminant depletion. Disabled by default; provide at + // least one host index source to opt in. + host_index = null + host_index_url = null + host_contaminants_fasta = null + host_kmer_size = 31 + host_window_size = 15 + host_abs_threshold = 2 + host_rel_threshold = 0.01 // NVD settings cutoff_percent = 0.001 @@ -151,9 +134,6 @@ params { "Kolmioviridae", ] - // minimum number of reads to use for gottcha2 - min_gottcha_reads = 250 - // number of BLAST hits to consider before calling hits max_blast_targets = 100 @@ -172,7 +152,7 @@ params { refman_registry = "${projectDir}/refman.toml" // mono-image filename or endpoint, if available - monoimage = "nrminor/nvd:v2.5.0" + monoimage = "nrminor/nvd:v3.0.0" // State directory for run tracking, upload deduplication, and taxonomy cache. // Resolution priority: @@ -281,27 +261,16 @@ process { withLabel: medium { cpus = 6 - memory = 12.GB - disk = 250.GB + memory = 16.GB + disk = 200.GB } withLabel: high { cpus = 20 memory = 64.GB - disk = 500.GB - } - - withLabel: high_disk { - cpus = 20 - memory = 64.GB - disk = 1000.GB - } - - withLabel: ludicrous { - cpus = 20 - memory = 450.GB - disk = 1000.GB + disk = 300.GB } + } // MANIFEST diff --git a/pixi.lock b/pixi.lock index a390b12..f1ba2b9 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,4 +1,9 @@ -version: 6 +version: 7 +platforms: +- name: linux-64 +- name: linux-aarch64 +- name: osx-64 +- name: osx-arm64 environments: default: channels: @@ -7,194 +12,142 @@ environments: - url: https://conda.anaconda.org/anaconda/ indexes: - https://pypi.org/simple - options: - pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: + - conda: https://conda.anaconda.org/bioconda/linux-64/bbmap-39.81-h9b5c0a0_1.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/blast-2.17.0-h66d330f_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/deacon-0.13.2-h7ef3eeb_1.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/entrez-direct-24.0-he881be0_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/linux-64/fastp-1.3.3-h43da1c4_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/htslib-1.23.1-h633afcb_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/k8-1.2-he8db53b_6.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/linux-64/minimap2-2.30-h577a1d6_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/linux-64/ncbi-vdb-3.4.1-hd63eeec_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/perl-io-compress-2.216-pl5321h503566f_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/perl-json-xs-4.04-pl5321h9948957_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/perl-list-moreutils-xs-0.430-pl5321h7b50bb2_5.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/linux-64/samtools-1.23.1-ha83d96e_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/seqkit-2.13.0-he881be0_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/spades-4.2.0-h8d6e82b_2.conda + - conda: https://conda.anaconda.org/bioconda/linux-64/vsearch-2.31.0-hd2be7a0_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-25.10.4-h2a3209d_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-archive-tar-3.06-pl5321hdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-io-zlib-1.15-pl5321hdfd78af_1.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/perl-json-4.11-pl5321hdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-list-moreutils-0.430-pl5321hdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/perl-types-serialiser-1.01-pl5321hdfd78af_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/apptainer-1.4.5-h6ccafba_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/bbmap-39.76-h9b5c0a0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/biom-format-2.1.17-py313h54dd161_1.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/blast-2.17.0-h66d330f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cni-1.0.1-ha975731_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/cni-plugins-1.3.0-ha8f183a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coreutils-9.5-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.18.0-hcf29cc6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.20.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/deacon-0.13.2-h7ef3eeb_1.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/entrez-direct-24.0-he881be0_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/linux-64/fastp-1.1.0-heae3180_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fuse-overlayfs-1.16-ha5fcf3e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gawk-5.3.1-hcd3d067_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-14.3.0-h76987e4_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-hfa02b96_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h235f0fe_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h50e9bb6_24.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-h6b77fdb_24.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gocryptfs-2.6.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/gottcha2-2.1.9-pyhdfd78af_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.15.1-nompi_py313h253c126_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.3.2-h6083320_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/htslib-1.23-h566b1c6_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h8a413ad_24.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.5.1-h15599e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/isa-l-2.31.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jq-1.8.1-h73b1eb8_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/k8-1.2-he8db53b_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.5-gpl_hc2c16d8_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.7-gpl_hc2c16d8_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfuse3-3.18.1-h9a46e9c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.25.1-h3f43e3d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfuse3-3.18.2-h9a46e9c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libseccomp-2.6.0-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hc4654cb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/minimap2-2.30-h577a1d6_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-openmpi.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/linux-64/ncbi-vdb-3.3.0-h9948957_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-25.10.4-h2a3209d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py313hf6604e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/oniguruma-6.9.10-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-23.0.2-h68779a4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-23.0.2-h53dfc1b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-4.1.6-hc5af2df_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.1-py313hbfd7664_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-archive-tar-3.04-pl5321hdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-carp-1.50-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-common-sense-3.75-pl5321hd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-compress-raw-bzip2-2.214-pl5321hda65f42_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-compress-raw-zlib-2.214-pl5321h4dac143_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-encode-3.21-pl5321hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-5.74-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-tiny-1.002002-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-extutils-makemaker-7.70-pl5321hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/perl-io-compress-2.216-pl5321h503566f_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-io-zlib-1.15-pl5321hdfd78af_1.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/noarch/perl-json-4.10-pl5321hdfd78af_1.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/linux-64/perl-json-xs-4.04-pl5321h9948957_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-list-moreutils-0.430-pl5321hdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/linux-64/perl-list-moreutils-xs-0.430-pl5321h7b50bb2_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-parent-0.243-pl5321hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-pathtools-3.75-pl5321hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-scalar-list-utils-1.70-pl5321hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-storable-3.15-pl5321hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-types-serialiser-1.01-pl5321hdfd78af_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.13-h6add32d_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/samtools-1.23-h96c455f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py313h4b8bb8b_1.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/seqkit-2.12.0-he881be0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/spades-4.2.0-h8d6e82b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/squashfs-tools-4.7.4-hb4e62d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-script-0.36.0-hdab8a38_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/squashfs-tools-4.7.5-h7b2cdf3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/squashfuse-0.6.1-hb8971b7_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/unzip-6.0-hb03c661_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-64/vsearch-2.30.4-hd6d6fdc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wget-1.21.4-hda4d442_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wget-1.25.0-h653f8fd_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda @@ -208,259 +161,240 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0b/c7/b2e7aca3de8981f4ecb6ab1e0334c3c4a512e5e9898b57b3d8734b086da7/biopython-1.86-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/21/ae/6e55c19c8460fada86cd1306a390a09b0c5a2e2e424f9317d2edacea439f/blake3-1.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/28/d28211d29bcc3620b1fece85a65ce5bb22f18670a03cd28ea4b75ede270c/configargparse-1.7.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-carp-1.50-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-common-sense-3.75-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-5.74-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-tiny-1.002002-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-extutils-makemaker-7.70-pl5321hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-parent-0.243-pl5321hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - pypi: . - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/03/a9/5b7d6a16fd6533fed2756900fc8fc923f678179aea62ada6d65c92718c00/wrapt-2.1.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/05/d1/8952806fbf9583004ab479d8f58a9496c3d35f6b6009ddd458bdd9978eaf/dpath-2.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/32/256df3dbaa198c58539ad94f9a41e98c2c8ff23f126b8f5f52c7dcd0a738/duckdb-1.4.4-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f3/a5/5fda0ee4a261a85124011ac0750fec678f00e1b2d4a5502b149a3b4d86d9/immutables-0.21-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/78/0f68b93564b8c6b6987a0696c582ba2591a381ab2f733a501909e949f241/smart_open-7.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/15/ef/7d57ceb0651af74194e97ed6583e148d352f03d696090221b8059cdfc90b/polars_runtime_32-1.40.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/29/996c4334f8ec251a24fa6f7490a4319eade9936d5e4347cffc3f377073ff/snakemake_interface_logger_plugins-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/21/ae/6e55c19c8460fada86cd1306a390a09b0c5a2e2e424f9317d2edacea439f/blake3-1.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/90/a4a3652e832667917383f8d34112bdb37b78a6d14efc049e22a2c8192524/snakemake_interface_common-1.23.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/2c/4422eb14884bb4955ce65819799ff6452dcd3aa5f8e158540a287877bbcf/snakemake_interface_executor_plugins-9.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/66/70/42d8796acc57c8bcd9ae395b1a6a0bbc833f738492a8ed192a44ccd58035/throttler-1.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/11/30b00f60b2841f9d615cf2714a9edd04c123bfcf3972e05dd0746b74e207/labkey-4.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/98/06ba4db905613fa24d227bc81219b7b2e6d48f803eac407d86f2ca54991d/taxopy-0.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/17/a3918541fd0ddefe024a69de6d16aa7b46d36ac19562adaa63c7fa180eff/greenlet-3.5.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/92/ea/dc2840df6f676d69e898792a0cd6f1217754333ec0003ad3ed5bc7c75da7/biopython-1.87-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9f/23/5a77fe2b50d962213338ae0fdd9832960186ebc423388fff1a56680e5114/pulp-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/df/2e4be347ff98281b505cc0ccf141408cdd25eb5ca9f3830deb361b2472d3/slack_sdk-3.41.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/49/737c1a6273c585719858261753da0b688454d1b634438ccba8a9c4eb5aab/polars-1.38.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f2/5a/61d60ec5cc0ab37cbd5a699edb2f9af2875b7fdfdfb2a4608ca3cc5f0448/polars_runtime_32-1.38.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ad/c5/2455f7b26a7de342049bcc1c207852155229cb7dacbcd377817caba91655/snakemake-9.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/e1/7c8d18e737433f3b5bbe27b56a9072a9fcb36342b48f1bef34b6da1d61f2/sqlmodel-0.0.37-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/99/6c/64cafaceea3f99927e84b38a362ec6a8f24f33061c90bda77dfe1cd4c3c6/pulp-3.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3f/60/2c8574f13f5a9c07cc14f5b48f70591fcd1ccb50dd59ad9784d48ed31db4/pysam-0.23.3-cp313-cp313-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/11/e295e07d4ae500144177f875a8de11daa4d86b8246ab41c76a98ce9280ca/reretry-0.11.8-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/49/1f72d8c05d8588f06a61f1af3deb125a4ff8169d2a41f1b839d62c824d1c/snakemake_interface_storage_plugins-4.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bd/21/d903cc63a5140c822b7b62b373a87dc557e60c29b321dfb435061c5e67cf/duckdb-1.5.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz + - pypi: https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/ea/066ce356c5df3c2d42b72801f768d41bf691f58f6d2a90f6334fbed39785/pysam-0.24.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cb/98/6af411189d9413534c3eb691182bff1f5c6d44ed2f93f2edfe52a1bbceb8/more_itertools-11.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/f5/038741f5e747a5f6ea3e72487211579d8cbea5eb9827a9cbd61d0108c4bd/sqlalchemy-2.0.49-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6e/e1/bb81f93c9f403e3b573c429dd4838ec9b44e4ef35f3b0759eb49557ab6e3/slack_sdk-3.40.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ad/95/bc978be7ea0babf2fb48a414b6afaad414c6a9e8b1eafc5b8a53c030381a/smart_open-7.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/0c/adf4310b15ebcbbbe36d316808d48142424f904422fef1fecca3d6e76c8a/snakemake-9.16.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0f/c4/2da11760cebae7cfc66304ce5dccbabf9f1323e3e0ab8091960b84ad2bd6/snakemake_interface_common-1.22.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/8b/fec4419acedfa5924549f40664cb2134f2ea5fae3d8a39df5e24035df06a/snakemake_interface_executor_plugins-9.3.9-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c3/1f/f0848d750e7ca675e2cc0ea5e14135f432db498e8ad8cf746a19108e9d55/snakemake_interface_logger_plugins-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/66/ef5dda05aa8d4e975f9186b806e18e4ca50ef1d2e2a043313c2d287ea7ca/labkey-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/91/74fc60d94488685a92ac9d49d7ec55f3e91fe9b77942a6235a5fa7f249c3/polars-1.40.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/b8/ead7c10efff731738c72e59ed6eb5791854879fbed7ae98781a12006263a/lxml-6.1.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f0/f0/df73f6abc9b5910e43612ae28c7b6f666af80c4edd46a216ef47599ab6cb/snakemake_interface_report_plugins-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/20/08a4f00c32329544ff147bafa68d0bab53645dca64dae218ff861bb4187d/snakemake_interface_storage_plugins-4.3.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/84/98/06ba4db905613fa24d227bc81219b7b2e6d48f803eac407d86f2ca54991d/taxopy-0.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/70/42d8796acc57c8bcd9ae395b1a6a0bbc833f738492a8ed192a44ccd58035/throttler-1.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1e/2f/60c51304fbdf47ce992d9eefa61fbd2c0e64feee60aaa439baf42ea6f40b/wrapt-2.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl - - pypi: ./ + - pypi: https://files.pythonhosted.org/packages/f3/a5/5fda0ee4a261a85124011ac0750fec678f00e1b2d4a5502b149a3b4d86d9/immutables-0.21-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/19/3ba5e1b0bcc7b91aeab6c258afd70e4907d220fed3972febe38feb40db30/configargparse-1.7.5-py3-none-any.whl linux-aarch64: + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/bbmap-39.81-heff9fa3_1.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/blast-2.16.0-h6a93c2d_5.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/deacon-0.13.2-h1529f91_1.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/entrez-direct-22.4-h8865c2f_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/fastp-1.3.3-h5eda1b2_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/htslib-1.23.1-h58d2225_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/k8-1.2-h1e84f2d_6.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/minimap2-2.30-h0cbc5ad_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/ncbi-vdb-3.4.1-h4ba1498_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-io-compress-2.216-pl5321h80f0ee0_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-json-xs-4.04-pl5321h163da20_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-list-moreutils-xs-0.430-pl5321h661a7b0_5.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/rpsbproc-0.5.1-h7645e38_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/samtools-1.23.1-hc7977f4_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/seqkit-2.13.0-h8865c2f_0.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/spades-4.2.0-h3e01217_2.conda + - conda: https://conda.anaconda.org/bioconda/linux-aarch64/vsearch-2.31.0-hd0c913a_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-25.10.4-h2a3209d_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-archive-tar-3.06-pl5321hdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-io-zlib-1.15-pl5321hdfd78af_1.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/perl-json-4.11-pl5321hdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-list-moreutils-0.430-pl5321hdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/perl-types-serialiser-1.01-pl5321hdfd78af_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/apptainer-1.4.5-hb8e6bbc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/backports.zstd-1.3.0-py313h3d57138_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/bbmap-39.76-heff9fa3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45.1-default_hf1166c9_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45.1-default_hf1166c9_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/biom-format-2.1.17-py313h62ef0ea_1.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/blast-2.16.0-h6a93c2d_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py313hb260801_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45.1-default_hf1166c9_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45.1-default_hf1166c9_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cni-1.0.1-h80d9677_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cni-plugins-1.3.0-h652cbe9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coreutils-9.5-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/curl-8.18.0-hc57f145_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/curl-8.20.0-hc57f145_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/deacon-0.13.2-h1529f91_1.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/entrez-direct-22.4-h8865c2f_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/fastp-1.1.0-h7dc49d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.1-h8af1aa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fuse-overlayfs-1.16-hde7ff99_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gawk-5.3.1-h01806b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-h533bfc8_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_21.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran-14.3.0-ha384071_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h4f85a2c_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-h398eab4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h140ef2e_24.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h56f1849_24.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h0a1ffab_2.conda - - conda: https://conda.anaconda.org/bioconda/noarch/gottcha2-2.1.9-pyhdfd78af_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-14.3.0-ha384071_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h32e4f2e_21.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/h5py-3.15.1-nompi_py313h624fb37_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-12.3.2-h1134a53_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.6-nompi_hf95b8e7_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/htslib-1.23-h7068f72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h4116b17_24.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.5.1-he4899c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/isa-l-2.31.1-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.8.1-h06eaf92_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/k8-1.2-h1e84f2d_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-hfdc4d58_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.5-hff7e48a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarchive-3.8.5-gpl_hbe7d12b_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.25.1-h5e0f5ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarchive-3.8.7-gpl_hbe7d12b_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.18.0-hc57f145_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.22-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.20.0-hc57f145_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.0-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.1-h8af1aa0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.1-hdae7a39_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfuse3-3.18.1-hdcbcb3a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgettextpo-0.25.1-h5ad3122_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-15.2.0-he9431aa_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfuse3-3.18.2-hdcbcb3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-15.2.0-he9431aa_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.1-h96a7f82_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwy-1.3.0-h81d0cf9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libidn2-2.3.8-h99ff5a0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-hd3077d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libseccomp-2.6.0-he30d5cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-hca96517_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libunistring-0.9.10-hf897c2e_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.1-h79dcc73_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.1-h825857f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lzo-2.10-h80f16a2_1002.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/minimap2-2.30-h0cbc5ad_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.1-h2305555_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpi-1.0-openmpi.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/ncbi-vdb-3.3.0-h163da20_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-25.10.4-h2a3209d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.2-py313h11e5ff7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/oniguruma-6.9.10-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-23.0.2-h2a0fa0e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-23.0.2-h0f44c73_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openmpi-4.1.6-h1f4154d_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.1-py313h9226a20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-archive-tar-3.04-pl5321hdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-carp-1.50-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-common-sense-3.75-pl5321hd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-compress-raw-bzip2-2.214-pl5321h4777abc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-compress-raw-zlib-2.214-pl5321hf8147d9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-encode-3.21-pl5321h86ecc28_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-5.74-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-tiny-1.002002-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-extutils-makemaker-7.70-pl5321hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-io-compress-2.216-pl5321h80f0ee0_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-io-zlib-1.15-pl5321hdfd78af_1.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/noarch/perl-json-4.10-pl5321hdfd78af_1.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-json-xs-4.04-pl5321h163da20_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-list-moreutils-0.430-pl5321hdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-list-moreutils-xs-0.430-pl5321h661a7b0_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-parent-0.243-pl5321hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-pathtools-3.75-pl5321h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-scalar-list-utils-1.70-pl5321he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-storable-3.15-pl5321h86ecc28_2.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-types-serialiser-1.01-pl5321hdfd78af_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.12-h4c0d347_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.13-h11c0449_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/rpsbproc-0.5.1-h7645e38_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/samtools-1.23-h0b41a95_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.17.0-py313he1a02db_1.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/seqkit-2.12.0-h8865c2f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/spades-4.2.0-h3e01217_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.51.2-hf1c7be2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/squashfs-tools-4.7.4-hc071bb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rust-1.94.0-h6cf38e9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.1-he8854b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/squashfs-tools-4.7.5-h3aea78d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/squashfuse-0.6.1-h46c73cc_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unzip-6.0-he30d5cf_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/linux-aarch64/vsearch-2.30.4-h7645e38_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wget-1.21.4-h3861a24_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wget-1.25.0-h4f42960_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda @@ -474,999 +408,1009 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/de/a39adb98a0552a257219503c236ef17f007598af55326c0d143db52e5a92/biopython-1.86-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/77/57/e8a85fa261894bf7ce7af928ff3408aab60287ab8d58b55d13a3f700b619/blake3-1.0.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/28/d28211d29bcc3620b1fece85a65ce5bb22f18670a03cd28ea4b75ede270c/configargparse-1.7.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-carp-1.50-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-common-sense-3.75-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-5.74-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-tiny-1.002002-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-extutils-makemaker-7.70-pl5321hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-parent-0.243-pl5321hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.94.0-hbe8e118_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - pypi: . + - pypi: https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/05/d1/8952806fbf9583004ab479d8f58a9496c3d35f6b6009ddd458bdd9978eaf/dpath-2.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/09/5b/3e7aa490841784d223de61beb2ae64e82331501bf5a415dc87a0e27b4663/duckdb-1.4.4-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d2/d0/a5fb7c164ddb298ec37537e618b70dfa30c7cae9fac01de374c36489cbc9/immutables-0.21-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/11/30b00f60b2841f9d615cf2714a9edd04c123bfcf3972e05dd0746b74e207/labkey-4.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/78/0f68b93564b8c6b6987a0696c582ba2591a381ab2f733a501909e949f241/smart_open-7.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/a7/15aaa59dbecc35e9711980fcdbf525b32a52470b32d18ef678193a146213/duckdb-1.5.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/29/996c4334f8ec251a24fa6f7490a4319eade9936d5e4347cffc3f377073ff/snakemake_interface_logger_plugins-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/49/737c1a6273c585719858261753da0b688454d1b634438ccba8a9c4eb5aab/polars-1.38.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dc/8c/3ac18d6f89dc05fe2c7c0ee1dc5b81f77a5c85ad59898232c2500fe2ebbf/polars_runtime_32-1.38.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/99/6c/64cafaceea3f99927e84b38a362ec6a8f24f33061c90bda77dfe1cd4c3c6/pulp-3.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d9/35/e65f76cfa17d680017bbb61f2a2b3ad34169de5c3747ed4273c194ad13b3/pysam-0.23.3-cp313-cp313-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/90/a4a3652e832667917383f8d34112bdb37b78a6d14efc049e22a2c8192524/snakemake_interface_common-1.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/11/e295e07d4ae500144177f875a8de11daa4d86b8246ab41c76a98ce9280ca/reretry-0.11.8-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/e9/384bc069367a1a36ee31c13782c178dbd039b2b873b772d4a0fc23a2373d/polars_runtime_32-1.40.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/45/26/2cdb3d281ac1bd175603e290cbe4bad6eff127c0f8de90bafd6f8548f0fd/lxml-6.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/45/bb/34c443690c847835cfe9f892be78c533d4f32366ad2888972c094a897e39/wrapt-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/4a/ba/b28ddbe6bfad6a8ac196ef0e8cff37bc65b79735995b9e410923fffeeb70/greenlet-3.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6e/e1/bb81f93c9f403e3b573c429dd4838ec9b44e4ef35f3b0759eb49557ab6e3/slack_sdk-3.40.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ad/95/bc978be7ea0babf2fb48a414b6afaad414c6a9e8b1eafc5b8a53c030381a/smart_open-7.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/0c/adf4310b15ebcbbbe36d316808d48142424f904422fef1fecca3d6e76c8a/snakemake-9.16.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0f/c4/2da11760cebae7cfc66304ce5dccbabf9f1323e3e0ab8091960b84ad2bd6/snakemake_interface_common-1.22.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/8b/fec4419acedfa5924549f40664cb2134f2ea5fae3d8a39df5e24035df06a/snakemake_interface_executor_plugins-9.3.9-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c3/1f/f0848d750e7ca675e2cc0ea5e14135f432db498e8ad8cf746a19108e9d55/snakemake_interface_logger_plugins-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f0/f0/df73f6abc9b5910e43612ae28c7b6f666af80c4edd46a216ef47599ab6cb/snakemake_interface_report_plugins-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/20/08a4f00c32329544ff147bafa68d0bab53645dca64dae218ff861bb4187d/snakemake_interface_storage_plugins-4.3.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/84/98/06ba4db905613fa24d227bc81219b7b2e6d48f803eac407d86f2ca54991d/taxopy-0.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/2c/4422eb14884bb4955ce65819799ff6452dcd3aa5f8e158540a287877bbcf/snakemake_interface_executor_plugins-9.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/35/95ae2b839668c4fa729243f05a208afaba4a1007e7aaaabf54a409fb6cf8/pysam-0.24.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/66/70/42d8796acc57c8bcd9ae395b1a6a0bbc833f738492a8ed192a44ccd58035/throttler-1.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6b/55/59115001469e8b3decc8362e1e6e8201acd56cafab95f4f29f4d9994fb4c/biopython-1.87-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/57/e8a85fa261894bf7ce7af928ff3408aab60287ab8d58b55d13a3f700b619/blake3-1.0.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/98/06ba4db905613fa24d227bc81219b7b2e6d48f803eac407d86f2ca54991d/taxopy-0.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/23/5a77fe2b50d962213338ae0fdd9832960186ebc423388fff1a56680e5114/pulp-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/df/2e4be347ff98281b505cc0ccf141408cdd25eb5ca9f3830deb361b2472d3/slack_sdk-3.41.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a2/bc/3494270da80811d08bcfa247404292428c4fe16294932bce5593f215cad9/sqlalchemy-2.0.49-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ad/c5/2455f7b26a7de342049bcc1c207852155229cb7dacbcd377817caba91655/snakemake-9.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/e1/7c8d18e737433f3b5bbe27b56a9072a9fcb36342b48f1bef34b6da1d61f2/sqlmodel-0.0.37-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/49/1f72d8c05d8588f06a61f1af3deb125a4ff8169d2a41f1b839d62c824d1c/snakemake_interface_storage_plugins-4.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz + - pypi: https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/98/6af411189d9413534c3eb691182bff1f5c6d44ed2f93f2edfe52a1bbceb8/more_itertools-11.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d2/d0/a5fb7c164ddb298ec37537e618b70dfa30c7cae9fac01de374c36489cbc9/immutables-0.21-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ad/03/ce5256e66dd94e521ad5e753c78185c01b6eddbed3147be541f4d38c0cb7/wrapt-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl - - pypi: ./ + - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/66/ef5dda05aa8d4e975f9186b806e18e4ca50ef1d2e2a043313c2d287ea7ca/labkey-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/91/74fc60d94488685a92ac9d49d7ec55f3e91fe9b77942a6235a5fa7f249c3/polars-1.40.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f0/f0/df73f6abc9b5910e43612ae28c7b6f666af80c4edd46a216ef47599ab6cb/snakemake_interface_report_plugins-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/19/3ba5e1b0bcc7b91aeab6c258afd70e4907d220fed3972febe38feb40db30/configargparse-1.7.5-py3-none-any.whl osx-64: - - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/backports.zstd-1.3.0-py313h591e92b_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/bbmap-39.76-h831ead7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/biom-format-2.1.17-py313hcb05632_1.conda + - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-25.10.4-h2a3209d_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-archive-tar-3.06-pl5321hdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-io-zlib-1.15-pl5321hdfd78af_1.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/perl-json-4.11-pl5321hdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-list-moreutils-0.430-pl5321hdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/perl-types-serialiser-1.01-pl5321hdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/osx-64/bbmap-39.81-h831ead7_1.conda - conda: https://conda.anaconda.org/bioconda/osx-64/blast-2.17.0-h53185c9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.2.0-py313h8d69aa9_1.conda + - conda: https://conda.anaconda.org/bioconda/osx-64/deacon-0.13.2-hc8bee9e_1.conda + - conda: https://conda.anaconda.org/bioconda/osx-64/entrez-direct-24.0-h193322a_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/osx-64/fastp-1.3.3-h3119cac_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-64/htslib-1.23.1-h09fbe89_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-64/k8-1.2-h2ec61ea_6.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/osx-64/minimap2-2.30-h7f84b70_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/osx-64/ncbi-vdb-3.4.1-haa61c75_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-64/perl-io-compress-2.216-pl5321h5eaf441_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-64/perl-json-xs-4.04-pl5321h5fa12a8_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-64/perl-list-moreutils-xs-0.430-pl5321h18d8cf3_5.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/osx-64/samtools-1.23.1-head6495_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-64/seqkit-2.13.0-h193322a_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-64/spades-4.2.0-hf6bce26_2.conda + - conda: https://conda.anaconda.org/bioconda/osx-64/vsearch-2.31.0-h7aab66d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-carp-1.50-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-common-sense-3.75-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-5.74-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-tiny-1.002002-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-extutils-makemaker-7.70-pl5321hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-parent-0.243-pl5321hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.94.0-h38e4360_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19-19.1.7-default_h9399c5b_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19.1.7-default_h1323312_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_31.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_31.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/coreutils-9.5-h10d778d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/curl-8.18.0-h9a2545f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/curl-8.20.0-h8f0b9e4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/deacon-0.13.2-hc8bee9e_1.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/entrez-direct-24.0-h193322a_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/osx-64/fastp-1.1.0-h9ea9c2a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gawk-5.3.1-h0631170_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - - conda: https://conda.anaconda.org/bioconda/noarch/gottcha2-2.1.9-pyhdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.15.1-nompi_py313h2a429bc_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hf563b80_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/htslib-1.23-h9f635df_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/isa-l-2.31.1-h6e16a3a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/k8-1.2-h2ec61ea_6.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_hcae3351_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.5-he7c3a48_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.18.0-h9a2545f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h4fb565c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_h9399c5b_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.20.0-h8f0b9e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.22-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libhwy-1.3.0-hab838a1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libidn2-2.3.8-h13f126c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-5_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libunistring-0.9.10-h0d85af4_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-hd57b93d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h745d5cb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.5-h0d3cbff_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/minimap2-2.30-h7f84b70_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/mpc-1.4.0-h31caf2d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.2-h31caf2d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mpi-1.0-openmpi.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/osx-64/ncbi-vdb-3.3.0-h5fa12a8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-25.10.4-h2a3209d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.2-py313hf1665ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjdk-23.0.2-h18c9476_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openmpi-4.1.6-h7406208_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-3.0.1-py313hfd25234_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.45-hf733adb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-archive-tar-3.04-pl5321hdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-carp-1.50-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-common-sense-3.75-pl5321hd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-compress-raw-bzip2-2.214-pl5321h500dc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-compress-raw-zlib-2.214-pl5321h62fca4e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-encode-3.21-pl5321h6e16a3a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-5.74-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-tiny-1.002002-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-extutils-makemaker-7.70-pl5321hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/perl-io-compress-2.216-pl5321h5eaf441_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-io-zlib-1.15-pl5321hdfd78af_1.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/noarch/perl-json-4.10-pl5321hdfd78af_1.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/osx-64/perl-json-xs-4.04-pl5321h5fa12a8_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-list-moreutils-0.430-pl5321hdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/osx-64/perl-list-moreutils-xs-0.430-pl5321h18d8cf3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-parent-0.243-pl5321hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-pathtools-3.75-pl5321h6e16a3a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-scalar-list-utils-1.70-pl5321h1c43f85_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-storable-3.15-pl5321h6e16a3a_2.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-types-serialiser-1.01-pl5321hdfd78af_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.13-h3d5d122_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/samtools-1.23-ha21ef43_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.17.0-py313h2bd7e7a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/seqkit-2.12.0-h193322a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-script-0.36.0-hb440939_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/spades-4.2.0-hf6bce26_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.2-h5af3ad2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.53.1-h6775aab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/unzip-6.0-h1c43f85_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-64/vsearch-2.30.4-heca6186_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/wget-1.25.0-hfb6e5ea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/wget-1.25.0-hf06ceb5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.2-hbb4bfdb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/6e/84d6c66ab93095aa7adb998a8eef045328470eafd36b9237c4db213e587c/biopython-1.86-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/55/b8/11de9528c257f7f1633f957ccaff253b706838d22c5d2908e4735798ec01/blake3-1.0.8-cp313-cp313-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/28/d28211d29bcc3620b1fece85a65ce5bb22f18670a03cd28ea4b75ede270c/configargparse-1.7.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz + - pypi: . - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/d1/8952806fbf9583004ab479d8f58a9496c3d35f6b6009ddd458bdd9978eaf/dpath-2.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/9b/3c7c5e48456b69365d952ac201666053de2700f5b0144a699a4dc6854507/duckdb-1.4.4-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/58/fc576f99037ce19c5aa16628e4c3226b6d1419f72a62c79f5f40576e6eb3/greenlet-3.5.0-cp313-cp313-macosx_11_0_universal2.whl + - pypi: https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/14/78/0f68b93564b8c6b6987a0696c582ba2591a381ab2f733a501909e949f241/smart_open-7.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/29/996c4334f8ec251a24fa6f7490a4319eade9936d5e4347cffc3f377073ff/snakemake_interface_logger_plugins-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/90/a4a3652e832667917383f8d34112bdb37b78a6d14efc049e22a2c8192524/snakemake_interface_common-1.23.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3f/58/25e00bb40b185c974cfe156c110474d9a8a8390d5f7c92a4e328189bb60e/lxml-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/7a/d936840735c828b38d26a854e85d5338894cda544cb7a85a9d5b8b9c4df7/wrapt-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/55/b8/11de9528c257f7f1633f957ccaff253b706838d22c5d2908e4735798ec01/blake3-1.0.8-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5c/2c/4422eb14884bb4955ce65819799ff6452dcd3aa5f8e158540a287877bbcf/snakemake_interface_executor_plugins-9.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/db/60da6f5a3c3f64e0b3940c4ad86e1971d9d2eb8b13a179c26eda5ec6a298/immutables-0.21-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/66/70/42d8796acc57c8bcd9ae395b1a6a0bbc833f738492a8ed192a44ccd58035/throttler-1.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/11/30b00f60b2841f9d615cf2714a9edd04c123bfcf3972e05dd0746b74e207/labkey-4.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/0d/f3dc1cf97e1267ca15e4307d456f96ce583961f0703fd75e62b2ad8d64fa/duckdb-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/46/22c8af5eed68ac2eeb556e0fa3ca8a7b798e984ceff4450888f3b5ac61fd/polars_runtime_32-1.40.1-cp310-abi3-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/98/06ba4db905613fa24d227bc81219b7b2e6d48f803eac407d86f2ca54991d/taxopy-0.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/86/79/2f5151ac001d8c74fb047036bfea9e4e897939e6587d3c4d512e46c450b1/pysam-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/23/5a77fe2b50d962213338ae0fdd9832960186ebc423388fff1a56680e5114/pulp-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/df/2e4be347ff98281b505cc0ccf141408cdd25eb5ca9f3830deb361b2472d3/slack_sdk-3.41.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/49/737c1a6273c585719858261753da0b688454d1b634438ccba8a9c4eb5aab/polars-1.38.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ae/a2/a00defbddadd8cf1042f52380dcba6b6592b03bac8e3b34c436b62d12d3b/polars_runtime_32-1.38.1-cp310-abi3-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/99/6c/64cafaceea3f99927e84b38a362ec6a8f24f33061c90bda77dfe1cd4c3c6/pulp-3.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/87/55cabf614bcc96f4a548ab4cf5fe465dd562d193f4f4cd5246cc0a1a18ab/pysam-0.23.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ad/c5/2455f7b26a7de342049bcc1c207852155229cb7dacbcd377817caba91655/snakemake-9.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b1/e1/7c8d18e737433f3b5bbe27b56a9072a9fcb36342b48f1bef34b6da1d61f2/sqlmodel-0.0.37-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/49/1f72d8c05d8588f06a61f1af3deb125a4ff8169d2a41f1b839d62c824d1c/snakemake_interface_storage_plugins-4.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz + - pypi: https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cb/98/6af411189d9413534c3eb691182bff1f5c6d44ed2f93f2edfe52a1bbceb8/more_itertools-11.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/11/e295e07d4ae500144177f875a8de11daa4d86b8246ab41c76a98ce9280ca/reretry-0.11.8-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/3e/3c6aa8b2a7e6b791a34407736db32f59657001f0446ada31db73a3e0b7d5/biopython-1.87.tar.gz - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6e/e1/bb81f93c9f403e3b573c429dd4838ec9b44e4ef35f3b0759eb49557ab6e3/slack_sdk-3.40.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ad/95/bc978be7ea0babf2fb48a414b6afaad414c6a9e8b1eafc5b8a53c030381a/smart_open-7.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/0c/adf4310b15ebcbbbe36d316808d48142424f904422fef1fecca3d6e76c8a/snakemake-9.16.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0f/c4/2da11760cebae7cfc66304ce5dccbabf9f1323e3e0ab8091960b84ad2bd6/snakemake_interface_common-1.22.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/8b/fec4419acedfa5924549f40664cb2134f2ea5fae3d8a39df5e24035df06a/snakemake_interface_executor_plugins-9.3.9-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c3/1f/f0848d750e7ca675e2cc0ea5e14135f432db498e8ad8cf746a19108e9d55/snakemake_interface_logger_plugins-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/66/ef5dda05aa8d4e975f9186b806e18e4ca50ef1d2e2a043313c2d287ea7ca/labkey-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/30/8519fdde58a7bdf155b714359791ad1dc018b47d60269d5d160d311fdc36/sqlalchemy-2.0.49-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/91/74fc60d94488685a92ac9d49d7ec55f3e91fe9b77942a6235a5fa7f249c3/polars-1.40.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f0/f0/df73f6abc9b5910e43612ae28c7b6f666af80c4edd46a216ef47599ab6cb/snakemake_interface_report_plugins-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/20/08a4f00c32329544ff147bafa68d0bab53645dca64dae218ff861bb4187d/snakemake_interface_storage_plugins-4.3.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/84/98/06ba4db905613fa24d227bc81219b7b2e6d48f803eac407d86f2ca54991d/taxopy-0.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/70/42d8796acc57c8bcd9ae395b1a6a0bbc833f738492a8ed192a44ccd58035/throttler-1.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f7/ca/3cf290212855b19af9fcc41b725b5620b32f470d6aad970c2593500817eb/wrapt-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl - - pypi: ./ + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/19/3ba5e1b0bcc7b91aeab6c258afd70e4907d220fed3972febe38feb40db30/configargparse-1.7.5-py3-none-any.whl osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.3.0-py313h48bb75e_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/bbmap-39.76-h2e3bd82_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/biom-format-2.1.17-py313h9734d34_1.conda + - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-25.10.4-h2a3209d_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-archive-tar-3.06-pl5321hdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-io-zlib-1.15-pl5321hdfd78af_1.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/perl-json-4.11-pl5321hdfd78af_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/perl-list-moreutils-0.430-pl5321hdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/noarch/perl-types-serialiser-1.01-pl5321hdfd78af_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/osx-arm64/bbmap-39.81-he046917_1.conda - conda: https://conda.anaconda.org/bioconda/osx-arm64/blast-2.16.0-hb260f6e_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/deacon-0.13.2-hc12438c_1.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/entrez-direct-22.4-hd5f1084_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/osx-arm64/fastp-1.3.3-ha1d0559_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/htslib-1.23.1-h44a9eb5_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/k8-1.2-hda5e58c_6.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/osx-arm64/minimap2-2.30-hba9b596_0.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/osx-arm64/ncbi-vdb-3.4.1-hfc726f9_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-io-compress-2.216-pl5321haef7865_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-json-xs-4.04-pl5321h4675bf2_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-list-moreutils-xs-0.430-pl5321hbdacb55_5.tar.bz2 + - conda: https://conda.anaconda.org/bioconda/osx-arm64/rpsbproc-0.5.1-hf8bb5b5_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/samtools-1.23.1-hc612e98_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/seqkit-2.13.0-hd5f1084_0.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/spades-4.2.0-h4d841d5_2.conda + - conda: https://conda.anaconda.org/bioconda/osx-arm64/vsearch-2.31.0-h0448ff9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-carp-1.50-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-common-sense-3.75-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-5.74-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-tiny-1.002002-pl5321hd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-extutils-makemaker-7.70-pl5321hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/perl-parent-0.243-pl5321hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.94.0-hf6ec828_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_31.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_9.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_31.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coreutils-9.5-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/curl-8.18.0-hd5a2499_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/curl-8.20.0-hd5a2499_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/deacon-0.13.2-hc12438c_1.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/entrez-direct-22.4-hd5f1084_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/osx-arm64/fastp-1.1.0-hee05c9d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gawk-5.3.1-h8a92848_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - - conda: https://conda.anaconda.org/bioconda/noarch/gottcha2-2.1.9-pyhdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.15.1-nompi_py313h7aa1c8b_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/htslib-1.23-hfcd771d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/isa-l-2.31.1-h5505292_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/k8-1.2-hda5e58c_6.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_ha2625f7_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-hd5a2499_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-h55c6f16_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.3.0-h48b13b8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libidn2-2.3.8-ha90df94_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libunistring-0.9.10-h3422bc3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/minimap2-2.30-hba9b596_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpi-1.0-openmpi.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/osx-arm64/ncbi-vdb-3.3.0-h4675bf2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-25.10.4-h2a3209d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py313h16eae64_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjdk-23.0.2-hfb9339a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openmpi-4.1.6-h526c993_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.1-py313h6974306_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-archive-tar-3.04-pl5321hdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-carp-1.50-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-common-sense-3.75-pl5321hd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-compress-raw-bzip2-2.214-pl5321h2ddc596_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-compress-raw-zlib-2.214-pl5321ha1c2b25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-encode-3.21-pl5321h5505292_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-5.74-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-tiny-1.002002-pl5321hd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-extutils-makemaker-7.70-pl5321hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-io-compress-2.216-pl5321haef7865_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-io-zlib-1.15-pl5321hdfd78af_1.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/noarch/perl-json-4.10-pl5321hdfd78af_1.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-json-xs-4.04-pl5321h4675bf2_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-list-moreutils-0.430-pl5321hdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-list-moreutils-xs-0.430-pl5321hbdacb55_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/perl-parent-0.243-pl5321hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-pathtools-3.75-pl5321hc71e825_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-scalar-list-utils-1.70-pl5321h44e845a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-storable-3.15-pl5321hc71e825_2.conda - - conda: https://conda.anaconda.org/bioconda/noarch/perl-types-serialiser-1.01-pl5321hdfd78af_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.13-h20e6be0_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/rpsbproc-0.5.1-hf8bb5b5_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/samtools-1.23-h267f7b9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.0-py313hc753a45_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/seqkit-2.12.0-hd5f1084_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-script-0.36.0-h0ca00b2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/spades-4.2.0-h4d841d5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.51.2-h77b7338_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.53.1-h85ec8f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unzip-6.0-h6caf38d_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/bioconda/osx-arm64/vsearch-2.30.4-hf8bb5b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wget-1.21.4-he2df1f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wget-1.25.0-h7ba78b2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/75/60386f2640f13765b1651f2f26d8b4f893c46ee663df3ca76eda966d4f6a/biopython-1.86-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/50/26/f7668be55c909678b001ecacff11ad7016cd9b4e9c7cc87b5971d638c5a9/blake3-1.0.8-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/28/d28211d29bcc3620b1fece85a65ce5bb22f18670a03cd28ea4b75ede270c/configargparse-1.7.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz + - pypi: . - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/d1/8952806fbf9583004ab479d8f58a9496c3d35f6b6009ddd458bdd9978eaf/dpath-2.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a6/7b/64e68a7b857ed0340045501535a0da99ea5d9d5ea3708fec0afb8663eb27/duckdb-1.4.4-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/89/5420f1d16a652024fcccc9c07d46d4157fcaf33ff37c82412c83fc16ef36/immutables-0.21-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/08/03/69347590f1cf4a6d5a4944bb6099e6d37f334784f16062234e1f892fdb1d/lxml-6.1.0-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/78/0f68b93564b8c6b6987a0696c582ba2591a381ab2f733a501909e949f241/smart_open-7.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/29/996c4334f8ec251a24fa6f7490a4319eade9936d5e4347cffc3f377073ff/snakemake_interface_logger_plugins-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/28/90/a4a3652e832667917383f8d34112bdb37b78a6d14efc049e22a2c8192524/snakemake_interface_common-1.23.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/50/26/f7668be55c909678b001ecacff11ad7016cd9b4e9c7cc87b5971d638c5a9/blake3-1.0.8-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/5c/2c/4422eb14884bb4955ce65819799ff6452dcd3aa5f8e158540a287877bbcf/snakemake_interface_executor_plugins-9.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/4b/00b8005c24f7c36d8bdffae3354194a2221716004e39029528be923adeae/biopython-1.87-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/5e/88/9a9b9a90ac8ca11c2fdb6a286cb3a1fc7dd774c00ed70929a6434f6bc634/wrapt-2.1.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/66/70/42d8796acc57c8bcd9ae395b1a6a0bbc833f738492a8ed192a44ccd58035/throttler-1.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/11/30b00f60b2841f9d615cf2714a9edd04c123bfcf3972e05dd0746b74e207/labkey-4.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/98/06ba4db905613fa24d227bc81219b7b2e6d48f803eac407d86f2ca54991d/taxopy-0.14.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/89/5420f1d16a652024fcccc9c07d46d4157fcaf33ff37c82412c83fc16ef36/immutables-0.21-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/23/5a77fe2b50d962213338ae0fdd9832960186ebc423388fff1a56680e5114/pulp-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/df/2e4be347ff98281b505cc0ccf141408cdd25eb5ca9f3830deb361b2472d3/slack_sdk-3.41.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/49/737c1a6273c585719858261753da0b688454d1b634438ccba8a9c4eb5aab/polars-1.38.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/fb/599ff3709e6a303024efd7edfd08cf8de55c6ac39527d8f41cbc4399385f/polars_runtime_32-1.38.1-cp310-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/99/6c/64cafaceea3f99927e84b38a362ec6a8f24f33061c90bda77dfe1cd4c3c6/pulp-3.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/2f/4708f52028610af96fa82e3ef46bcf96a35f1bd3c38aa6f015b31b578fff/pysam-0.23.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ad/c5/2455f7b26a7de342049bcc1c207852155229cb7dacbcd377817caba91655/snakemake-9.21.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/81/81755f50eb2478eaf2049728491d4ea4f416c1eb013338682173259efa09/sqlalchemy-2.0.49-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/11/e295e07d4ae500144177f875a8de11daa4d86b8246ab41c76a98ce9280ca/reretry-0.11.8-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b1/e0/d5418def53ae4e05a63075705ff44ed5af5a1a5932627eb2b600c5df1c93/duckdb-1.5.2-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b1/e1/7c8d18e737433f3b5bbe27b56a9072a9fcb36342b48f1bef34b6da1d61f2/sqlmodel-0.0.37-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/49/1f72d8c05d8588f06a61f1af3deb125a4ff8169d2a41f1b839d62c824d1c/snakemake_interface_storage_plugins-4.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz + - pypi: https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/3e/48599a38009ca60ff82a6f38c8a621ce3c0286aa7397c7d79e741bd9060e/polars_runtime_32-1.40.1-cp310-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/cb/98/6af411189d9413534c3eb691182bff1f5c6d44ed2f93f2edfe52a1bbceb8/more_itertools-11.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d1/2c/fd59b47677a1df3efa64172dcd9b99fa7db437de8c663f08120ebd4db835/pysam-0.24.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6e/e1/bb81f93c9f403e3b573c429dd4838ec9b44e4ef35f3b0759eb49557ab6e3/slack_sdk-3.40.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ad/95/bc978be7ea0babf2fb48a414b6afaad414c6a9e8b1eafc5b8a53c030381a/smart_open-7.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/0c/adf4310b15ebcbbbe36d316808d48142424f904422fef1fecca3d6e76c8a/snakemake-9.16.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0f/c4/2da11760cebae7cfc66304ce5dccbabf9f1323e3e0ab8091960b84ad2bd6/snakemake_interface_common-1.22.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/8b/fec4419acedfa5924549f40664cb2134f2ea5fae3d8a39df5e24035df06a/snakemake_interface_executor_plugins-9.3.9-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c3/1f/f0848d750e7ca675e2cc0ea5e14135f432db498e8ad8cf746a19108e9d55/snakemake_interface_logger_plugins-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/66/ef5dda05aa8d4e975f9186b806e18e4ca50ef1d2e2a043313c2d287ea7ca/labkey-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/91/74fc60d94488685a92ac9d49d7ec55f3e91fe9b77942a6235a5fa7f249c3/polars-1.40.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f0/f0/df73f6abc9b5910e43612ae28c7b6f666af80c4edd46a216ef47599ab6cb/snakemake_interface_report_plugins-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/74/20/08a4f00c32329544ff147bafa68d0bab53645dca64dae218ff861bb4187d/snakemake_interface_storage_plugins-4.3.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/84/98/06ba4db905613fa24d227bc81219b7b2e6d48f803eac407d86f2ca54991d/taxopy-0.14.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/70/42d8796acc57c8bcd9ae395b1a6a0bbc833f738492a8ed192a44ccd58035/throttler-1.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9d/33/5b8f89a82a9859ce82da4870c799ad11ce15648b6e1c820fec3e23f4a19f/wrapt-2.1.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl - - pypi: ./ + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/19/3ba5e1b0bcc7b91aeab6c258afd70e4907d220fed3972febe38feb40db30/configargparse-1.7.5-py3-none-any.whl packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - build_number: 20 - sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 - md5: a9f577daf3de00bca7c3c76c0ecbd1de +- conda: https://conda.anaconda.org/bioconda/linux-64/bbmap-39.81-h9b5c0a0_1.conda + sha256: 96e2ed5f82a928fe6a71893e366166390c63034b45976211cf91baf90d4e41d9 + md5: 4af20865073c32418b8553da02e436bb depends: - - __glibc >=2.17,<3.0.a0 - - libgomp >=7.5.0 - constrains: - - openmp_impl <0.0a0 - license: BSD-3-Clause - license_family: BSD + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - openjdk >=11.0.1 + - samtools >=1.23.1,<2.0a0 + license: BSD-3-Clause-LBNL purls: [] - size: 28948 - timestamp: 1770939786096 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - build_number: 20 - sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 - md5: 468fd3bb9e1f671d36c2cbc677e56f1d + size: 93105368 + timestamp: 1774976438094 +- conda: https://conda.anaconda.org/bioconda/linux-64/blast-2.17.0-h66d330f_0.conda + sha256: 53a319c984d8aafcf7f2d7d4c21ad2590e1bacd674443e09d79ac19694ccf99a + md5: 405ce6d52eba06fcd48197ae1eb8f5a9 depends: - - libgomp >=7.5.0 - constrains: - - openmp_impl <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 28926 - timestamp: 1770939656741 -- conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - build_number: 7 - sha256: 30006902a9274de8abdad5a9f02ef7c8bb3d69a503486af0c1faee30b023e5b7 - md5: eaac87c21aff3ed21ad9656697bb8326 + - bzip2 >=1.0.8,<2.0a0 + - curl + - entrez-direct >=24.0,<25.0a0 + - libgcc >=13 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - ncbi-vdb >=3.2.1,<4.0a0 + - perl + - perl-archive-tar + - perl-json + - perl-list-moreutils + - zlib + license: NCBI-PD + size: 84832339 + timestamp: 1754909742570 +- conda: https://conda.anaconda.org/bioconda/linux-64/deacon-0.13.2-h7ef3eeb_1.conda + sha256: b4e81a5e90ec60e11078c84a80ab2e47f38bf546c338c873bb6152d3dc40c4ec + md5: f5188f509977462fb8a32fe4d5b79e30 depends: - - llvm-openmp >=9.0.1 - license: BSD-3-Clause - license_family: BSD + - openssl >=3.6.0,<4.0a0 + constrains: + - __glibc >=2.17 + license: MIT purls: [] - size: 8328 - timestamp: 1764092562779 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - build_number: 7 - sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd - md5: a44032f282e7d2acdeb1c240308052dd + size: 2195960 + timestamp: 1763750010069 +- conda: https://conda.anaconda.org/bioconda/linux-64/entrez-direct-24.0-he881be0_0.tar.bz2 + sha256: 71a8f349659c9c18efa544663de2db1a20b5e3d32f8e4e88cd33110a0caf4eb3 + md5: 52a3fabee9201c2c6093c13b4eaf29b4 depends: - - llvm-openmp >=9.0.1 - license: BSD-3-Clause - license_family: BSD + - wget + license: Public Domain purls: [] - size: 8325 - timestamp: 1764092507920 -- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31 - md5: dcdc58c15961dbf17a0621312b01f5cb + size: 17127014 + timestamp: 1748473197798 +- conda: https://conda.anaconda.org/bioconda/linux-64/fastp-1.3.3-h43da1c4_0.conda + sha256: 487452d6c40bf32022c838fee9b0fa690f7bc1960b9cdc77982360e93a781133 + md5: fda7ad2ef720c1cf3f4dde2d30b07310 depends: - - __glibc >=2.17,<3.0.a0 + - isa-l >=2.31.1,<3.0a0 + - libdeflate >=1.25,<1.26.0a0 - libgcc >=14 - license: LGPL-2.1-or-later - license_family: GPL + - libhwy >=1.3.0,<1.4.0a0 + - libstdcxx >=14 + license: MIT + license_family: MIT purls: [] - size: 584660 - timestamp: 1768327524772 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda - sha256: ea2233e2db9908c2e5f29d3ca420a546b4583253f4f70abb5494cdd676866d42 - md5: 4a98cbc4ade694520227402ff8880630 + size: 2927174 + timestamp: 1777074023414 +- conda: https://conda.anaconda.org/bioconda/linux-64/htslib-1.23.1-h633afcb_0.conda + sha256: d0977efb1885c9f00ca76ee13e7c0f9a8936bf271eec25ffa78606cd816a13c9 + md5: 209caa9e4ff0b9ed02dd09c3161917e5 depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.19.0,<9.0a0 + - libdeflate >=1.25,<1.26.0a0 - libgcc >=14 - license: LGPL-2.1-or-later - license_family: GPL - purls: [] - size: 615729 - timestamp: 1768327548407 -- pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - name: annotated-doc - version: 0.0.4 - sha256: 571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - name: annotated-types - version: 0.7.0 - sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 - requires_dist: - - typing-extensions>=4.0.0 ; python_full_version < '3.9' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl - name: appdirs - version: 1.4.4 - sha256: a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128 -- conda: https://conda.anaconda.org/conda-forge/linux-64/apptainer-1.4.5-h6ccafba_0.conda - sha256: aa34ebc55ab69fea3e42d3ffe26ee4169794be1d1ffadadc5a35857554c3dddb - md5: d09c947d2f15fa9e36e5377ad93a6277 + - liblzma >=5.8.2,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + size: 1195461 + timestamp: 1773854995668 +- conda: https://conda.anaconda.org/bioconda/linux-64/k8-1.2-he8db53b_6.tar.bz2 + sha256: 35143205ef4684f417f047c649aea110e0ceb1d6891001511dbceb2dea08be3d + md5: 6c44663f234185cc54d7a90c4d7a555a depends: - - __glibc >=2.17 - __glibc >=2.17,<3.0.a0 - - cni-plugins >=0.7.4 - - fuse-overlayfs - - gocryptfs - - libarchive >=3.8.2,<3.9.0a0 - - libgcc >=14 - - libseccomp >=2.4.4,<3.0a0 - - libstdcxx >=14 - - libuuid >=2.41.2,<3.0a0 - - openssl >=3.5.4,<4.0a0 - - squashfs-tools - - squashfuse - constrains: - - singularity ==9999999999 - license: BSD-3-Clause - license_family: BSD + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - sysroot_linux-64 >=2.17 + license: MIT + license_family: MIT purls: [] - size: 21979472 - timestamp: 1764716258107 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/apptainer-1.4.5-hb8e6bbc_0.conda - sha256: fc35c3f913f57b5ea36fc79499422e1c15416ec3a89dc0488b8cad8c8ec68cf9 - md5: 45f8e4f2c287437bc63309a99ede05f7 + size: 7535090 + timestamp: 1748942479223 +- conda: https://conda.anaconda.org/bioconda/linux-64/minimap2-2.30-h577a1d6_0.tar.bz2 + sha256: a82a861a2c0e5a01bbe73701dcc6af8ba3f1da430a9fa6c94ed53b5c4a7a2b55 + md5: c90788b08f45337f68b717ee8fd10fea + depends: + - k8 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1357974 + timestamp: 1750025868795 +- conda: https://conda.anaconda.org/bioconda/linux-64/ncbi-vdb-3.4.1-hd63eeec_0.conda + sha256: 1c876e74214ef7269de12286e1b9b370e3167c0825d215de3b81bf46f3956072 + md5: 70de9f284c305131b458cf69676f1b2f depends: - - cni-plugins >=0.7.4 - - fuse-overlayfs - - libarchive >=3.8.2,<3.9.0a0 - libgcc >=14 - - libseccomp >=2.4.4,<3.0a0 - libstdcxx >=14 - - libuuid >=2.41.2,<3.0a0 - - openssl >=3.5.4,<4.0a0 - - squashfs-tools - - squashfuse - constrains: - - singularity ==9999999999 - license: BSD-3-Clause - license_family: BSD + license: Public Domain purls: [] - size: 19747442 - timestamp: 1764725021123 -- pypi: https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl - name: argparse-dataclass - version: 2.0.0 - sha256: 3ffc8852a88d9d98d1364b4441a712491320afb91fb56049afd8a51d74bb52d2 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - name: attrs - version: 25.4.0 - sha256: adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373 - requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda - sha256: 9552afbec37c4d8d0e83a5c4c6b3c7f4b8785f935094ce3881e0a249045909ce - md5: d9e90792551a527200637e23a915dd79 + size: 9227191 + timestamp: 1774474370894 +- conda: https://conda.anaconda.org/bioconda/linux-64/perl-io-compress-2.216-pl5321h503566f_0.conda + sha256: 5241c33cf55ba0cbfc0ccab96b4a31123761db00310eab4fedd7a95226c4fca7 + md5: 0784cb3c120f934a5fe61961c8238330 depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-3-Clause AND MIT AND EPL-2.0 - purls: - - pkg:pypi/backports-zstd?source=hash-mapping - size: 240943 - timestamp: 1767044981366 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/backports.zstd-1.3.0-py313h3d57138_0.conda - sha256: 61e4757233111133b64125706c9c5dc2d36818eec0cc1894784a08e615a87b37 - md5: c0fd0009041efedb247ba54df0f423ee - depends: - - python - - python 3.13.* *_cp313 - - libgcc >=14 - - python_abi 3.13.* *_cp313 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-3-Clause AND MIT AND EPL-2.0 - purls: - - pkg:pypi/backports-zstd?source=hash-mapping - size: 247081 - timestamp: 1767045002495 -- conda: https://conda.anaconda.org/conda-forge/osx-64/backports.zstd-1.3.0-py313h591e92b_0.conda - sha256: 4133ba0e5ab6a0955b57a49ad4014148df6e4b79bef4309a1cdd407afd853444 - md5: c602f30b6c45567cd5cfb074631beb5d - depends: - - python - - __osx >=10.13 - - python_abi 3.13.* *_cp313 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-3-Clause AND MIT AND EPL-2.0 - purls: - - pkg:pypi/backports-zstd?source=hash-mapping - size: 241212 - timestamp: 1767044991370 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.3.0-py313h48bb75e_0.conda - sha256: f3047ca3b41bb444b4b5a71a6eee182623192c77019746dd4685fd260becb249 - md5: 54008c5cc8928e5cb5a0f9206b829451 - depends: - - python - - python 3.13.* *_cp313 - - __osx >=11.0 - - zstd >=1.5.7,<1.6.0a0 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause AND MIT AND EPL-2.0 - purls: - - pkg:pypi/backports-zstd?source=hash-mapping - size: 244371 - timestamp: 1767045003420 -- conda: https://conda.anaconda.org/bioconda/linux-64/bbmap-39.76-h9b5c0a0_0.conda - sha256: 06131f3826b3f326462a2c41908ca8169f9107f628a6b96d492c94f465002c78 - md5: e6fef404e3e6af5c5575fd222cd10488 + - libgcc >=13 + - libstdcxx >=13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-compress-raw-bzip2 >=2.214 + - perl-compress-raw-zlib >=2.214 + - perl-encode + - perl-scalar-list-utils + license: Perl_5 + purls: [] + size: 87231 + timestamp: 1769815108308 +- conda: https://conda.anaconda.org/bioconda/linux-64/perl-json-xs-4.04-pl5321h9948957_0.conda + sha256: f16cf35917a5d75fb55cfc69d8651dc72ff4e06370142b447a4864f5de7d97c6 + md5: 7916b2e794393b3389535ba750f489da depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=14 - - openjdk >=11.0.1 - - samtools >=1.22.1,<2.0a0 - license: BSD-3-Clause-LBNL + - libgcc >=13 + - libstdcxx >=13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-common-sense + - perl-types-serialiser + license: GPL-1.0-or-later OR Artistic-1.0-Perl purls: [] - size: 19116163 - timestamp: 1771814093132 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/bbmap-39.76-heff9fa3_0.conda - sha256: 0c47c6f8f5f040989ea516a6286b8a3501d28b136fbd7d06ace3486e719162ba - md5: 66989ba0b23eac52df0a3fd4346b0fb9 + size: 70770 + timestamp: 1757352008878 +- conda: https://conda.anaconda.org/bioconda/linux-64/perl-list-moreutils-xs-0.430-pl5321h7b50bb2_5.tar.bz2 + sha256: fe2d360770fe5b856ee1e625eac6b07cea386c64b0866e323c6535eb62b9ceee + md5: 9192770eb08524038c3fcf24e915b10c depends: - - bzip2 >=1.0.8,<2.0a0 + - libgcc >=13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: apache_2_0 + purls: [] + size: 51506 + timestamp: 1741776389435 +- conda: https://conda.anaconda.org/bioconda/linux-64/samtools-1.23.1-ha83d96e_0.conda + sha256: 2cb721907a2df7c54580298d655ae7587dbed593bd5536fa8ef4a22c9ae2a496 + md5: 89624fbd17c069abcbc8b19b96d497a0 + depends: + - htslib >=1.23.1,<1.24.0a0 - libgcc >=14 - - openjdk >=11.0.1 - - samtools >=1.6,<2.0a0 - license: BSD-3-Clause-LBNL + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + license: MIT + size: 489995 + timestamp: 1773861794171 +- conda: https://conda.anaconda.org/bioconda/linux-64/seqkit-2.13.0-he881be0_0.conda + sha256: 538ff4ab33819598e45939fe36ea7f4505afba62e90a7cbd95c6f63493aee6d4 + md5: d4e8a7c9d4b694e70552a84f662ea354 + license: MIT + license_family: MIT purls: [] - size: 18360044 - timestamp: 1771813966939 -- conda: https://conda.anaconda.org/bioconda/osx-64/bbmap-39.76-h831ead7_0.conda - sha256: bcf278e51ef98f452c66b56bac94ca1a80132362ead05d3e753cc081884ed467 - md5: d7632ca3dfcbda644b1058b4be12ef0e + size: 6910586 + timestamp: 1772198535227 +- conda: https://conda.anaconda.org/bioconda/linux-64/spades-4.2.0-h8d6e82b_2.conda + sha256: 77fecca55d456af662bdfe9981906576aed5e270e463d48150ff57b412d01ffe + md5: a3ecf0ab04ac28f12813e065a8e60909 depends: + - _openmp_mutex >=4.5 - bzip2 >=1.0.8,<2.0a0 - - openjdk >=11.0.1 - - samtools >=1.23,<2.0a0 - license: BSD-3-Clause-LBNL + - libgcc >=13 + - libgomp + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openmpi >=4.1.6,<5.0a0 + - python >=3.8 + license: GPL-2.0-only + license_family: GPL + size: 19327462 + timestamp: 1758931918693 +- conda: https://conda.anaconda.org/bioconda/linux-64/vsearch-2.31.0-hd2be7a0_0.conda + sha256: 2cb6740460d605597869ba3223b4ea337f19256d5fc9de6e14510f3f6171ac0b + md5: 1688be9a6aa97ea509e853055f57b03d + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + license: GPL-3.0-or-later OR BSD-2-Clause + license_family: GPL3 purls: [] - size: 20661065 - timestamp: 1771814896314 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/bbmap-39.76-h2e3bd82_0.conda - sha256: 3c352e52f3b0006e8255e9bac93898909dc00b41294c0e759a7f699b9567a156 - md5: 187b27496ec677da047b1b54dc7955ab + size: 308632 + timestamp: 1777559969511 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/bbmap-39.81-heff9fa3_1.conda + sha256: 9e1c50e599881bf86c123e51c60ea030f2e55d83890cab77cb206294a75bef0f + md5: e2146081b0193f3a33fc800aac9b822c depends: - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 - openjdk >=11.0.1 - - samtools >=1.23,<2.0a0 + - samtools >=1.23.1,<2.0a0 license: BSD-3-Clause-LBNL purls: [] - size: 18506338 - timestamp: 1771813779294 -- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_101.conda - sha256: 2851d34944b056d028543f0440fb631aeeff204151ea09589d8d9c13882395de - md5: 9902aeb08445c03fb31e01beeb173988 + size: 93798515 + timestamp: 1776424997843 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/blast-2.16.0-h6a93c2d_5.tar.bz2 + sha256: 3a078039431d17b02addc52ae78395953b395349118644623e6f394eda0db2b1 + md5: 696c9e56bd61724c5fe11d278e0c0a88 depends: - - binutils_impl_linux-64 >=2.45.1,<2.45.2.0a0 - license: GPL-3.0-only - license_family: GPL + - bzip2 >=1.0.8,<2.0a0 + - curl + - entrez-direct >=22.4,<23.0a0 + - libgcc >=13 + - libsqlite >=3.49.1,<4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - ncbi-vdb >=3.2.1,<4.0a0 + - perl + - perl-archive-tar + - perl-json + - perl-list-moreutils + - rpsbproc + - zlib + license: NCBI-PD purls: [] - size: 35128 - timestamp: 1770267175160 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45.1-default_hf1166c9_101.conda - sha256: 7113440420c6f31742c2b29d7590900362007a0bb0d31f9bc5c9a1379d9ab702 - md5: 77f58300ab7d95ce79f9c2c13ad72d5c + size: 145178710 + timestamp: 1743180765609 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/deacon-0.13.2-h1529f91_1.conda + sha256: 78fcd602a431c54d89c9849f18d52145af29c7ebca18ce2062c844e7b0208994 + md5: c20aff2cec8306bdf37ea8671eef39f9 depends: - - binutils_impl_linux-aarch64 >=2.45.1,<2.45.2.0a0 - license: GPL-3.0-only - license_family: GPL + - openssl >=3.6.0,<4.0a0 + constrains: + - __glibc >=2.17 + license: MIT purls: [] - size: 35322 - timestamp: 1770267247190 -- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda - sha256: 74341b26a2b9475dc14ba3cf12432fcd10a23af285101883e720216d81d44676 - md5: 83aa53cb3f5fc849851a84d777a60551 + size: 2226181 + timestamp: 1763749841717 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/entrez-direct-22.4-h8865c2f_0.tar.bz2 + sha256: 2ed85538e2e3ae19129faf078afed08b44b32ba12ff3d6982176ccb7879adf75 + md5: 289ba7576234e65af7824ef380db651a depends: - - ld_impl_linux-64 2.45.1 default_hbd61a6d_101 - - sysroot_linux-64 - - zstd >=1.5.7,<1.6.0a0 - license: GPL-3.0-only - license_family: GPL + - wget + license: PUBLIC DOMAIN purls: [] - size: 3744895 - timestamp: 1770267152681 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda - sha256: e90ab42a5225dc1eaa6e4e7201cd7b8ed52dad6ec46814be7e5a4039433ae85c - md5: df6e1dc38cbe5642350fa09d4a1d546b + size: 13695014 + timestamp: 1721746273382 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/fastp-1.3.3-h5eda1b2_0.conda + sha256: 2a0227cebf0b1ca935c9f7907ea803ba1e1f0443791cf6bc49891818b521218b + md5: c871ad8ebe7f4b497dca97d5ec1b2d4a depends: - - ld_impl_linux-aarch64 2.45.1 default_h1979696_101 - - sysroot_linux-aarch64 - - zstd >=1.5.7,<1.6.0a0 - license: GPL-3.0-only - license_family: GPL + - isa-l >=2.31.1,<3.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libgcc >=14 + - libhwy >=1.3.0,<1.4.0a0 + - libstdcxx >=14 + license: MIT + license_family: MIT purls: [] - size: 4741684 - timestamp: 1770267224406 -- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda - sha256: 4826f97d33cbe54459970a1e84500dbe0cccf8326aaf370e707372ae20ec5a47 - md5: dec96579f9a7035a59492bf6ee613b53 + size: 2763988 + timestamp: 1777073770232 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/htslib-1.23.1-h58d2225_0.conda + sha256: c663f210bda048362f4e656471722ce574198ae99b42581e086c3167cadbacad + md5: 6fc0d46eeeef23b6866a221d9ba931c7 depends: - - binutils_impl_linux-64 2.45.1 default_hfdba357_101 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 36060 - timestamp: 1770267177798 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45.1-default_hf1166c9_101.conda - sha256: 4ed3cf8af327b1c8b7e71433c98eb0154027e07b726136e81235276e9025489a - md5: 99924e610d9960dc3d8b865614787cec + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.19.0,<9.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libgcc >=14 + - liblzma >=5.8.2,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + size: 1403706 + timestamp: 1773854795190 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/k8-1.2-h1e84f2d_6.tar.bz2 + sha256: 0ba6fa95ab90f65baf3745503fab10b4af06547d896b210512fd33e3db849a73 + md5: fcf1913feb88f8be96f878bebf1fa5e9 depends: - - binutils_impl_linux-aarch64 2.45.1 default_h5f4c503_101 - license: GPL-3.0-only - license_family: GPL + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 36223 - timestamp: 1770267249899 -- conda: https://conda.anaconda.org/conda-forge/linux-64/biom-format-2.1.17-py313h54dd161_1.conda - sha256: 3448ce841e44c5bf1bbc664822fede54dd3cae42806137f69737495231e82403 - md5: eba8c59de5e6b9d915e9ccb0682b2301 + size: 9023150 + timestamp: 1748941474816 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/minimap2-2.30-h0cbc5ad_0.tar.bz2 + sha256: 6bc060cce9fcdc7ed0a8a2f95765068a332afba5e32f311cde78f62d5aa7565f + md5: 8f9fb52be4709d829016f8601b5ccf20 + depends: + - k8 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1092467 + timestamp: 1750025704782 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/ncbi-vdb-3.4.1-h4ba1498_0.conda + sha256: 47fe3f1be3e2d0628f8b64a40f025e31782ddcfc0d4fdfc28e5c62f17e2e8862 + md5: 61c923697af023e164bf1ef0230e1ffc depends: - - python - - click - - pandas >=0.20.0 - - scipy >=1.3.1 - - h5py >=3.0.0 - - numpy >=1.9.2 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 - - numpy >=1.23,<3 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/biom-format?source=hash-mapping - size: 9984801 - timestamp: 1759338266407 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/biom-format-2.1.17-py313h62ef0ea_1.conda - sha256: 75547f75c6c00a4562b45d09a25dc2f2e64055fb1a152de2a668f29b27978d2b - md5: 8fd830e9fb2d62d2cc92f48e480a1d2f - depends: - - python - - click - - pandas >=0.20.0 - - scipy >=1.3.1 - - h5py >=3.0.0 - - numpy >=1.9.2 - libgcc >=14 - - python 3.13.* *_cp313 - - numpy >=1.23,<3 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/biom-format?source=hash-mapping - size: 9988453 - timestamp: 1759338255823 -- conda: https://conda.anaconda.org/conda-forge/osx-64/biom-format-2.1.17-py313hcb05632_1.conda - sha256: 04ae8629050e548181573dcf934bd71fb0304cc531e1b2ecec9802a20d8fa63d - md5: d256f5380269880395d7bd6d767cde42 - depends: - - python - - click - - pandas >=0.20.0 - - scipy >=1.3.1 - - h5py >=3.0.0 - - numpy >=1.9.2 - - __osx >=10.13 - - numpy >=1.23,<3 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/biom-format?source=hash-mapping - size: 9978671 - timestamp: 1759338268295 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/biom-format-2.1.17-py313h9734d34_1.conda - sha256: defb3b0077d2e55d28ba54df49559364bf226c5ca5b60d29f25fa6515a2e59a1 - md5: a41a598d7e4d718f274a9718a63b3d33 - depends: - - python - - click - - pandas >=0.20.0 - - scipy >=1.3.1 - - h5py >=3.0.0 - - numpy >=1.9.2 - - python 3.13.* *_cp313 - - __osx >=11.0 - - numpy >=1.23,<3 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/biom-format?source=hash-mapping - size: 9977120 - timestamp: 1759338297224 -- pypi: https://files.pythonhosted.org/packages/0b/c7/b2e7aca3de8981f4ecb6ab1e0334c3c4a512e5e9898b57b3d8734b086da7/biopython-1.86-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: biopython - version: '1.86' - sha256: 593ec6a2a4fedec08ddcee1a8a0e0b0ed56835b2714904b352ec4a93d5b9d973 - requires_dist: - - numpy - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/12/75/60386f2640f13765b1651f2f26d8b4f893c46ee663df3ca76eda966d4f6a/biopython-1.86-cp313-cp313-macosx_11_0_arm64.whl - name: biopython - version: '1.86' - sha256: e161f3d3b6e65fbfd1ce22a01c3e9fa9da789adde4972fd0cc2370795ea5357b - requires_dist: - - numpy - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/dd/de/a39adb98a0552a257219503c236ef17f007598af55326c0d143db52e5a92/biopython-1.86-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - name: biopython - version: '1.86' - sha256: 5aa8c9e92ee6fe59dfe0d2c2daf9a9eec6b812c78328caad038f79163c500218 - requires_dist: - - numpy - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/fd/6e/84d6c66ab93095aa7adb998a8eef045328470eafd36b9237c4db213e587c/biopython-1.86-cp313-cp313-macosx_10_13_x86_64.whl - name: biopython - version: '1.86' - sha256: fb3a11a98e49428720dca227e2a5bdd57c973ee7c4df3cf6734c0aa13fd134c7 - requires_dist: - - numpy - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/21/ae/6e55c19c8460fada86cd1306a390a09b0c5a2e2e424f9317d2edacea439f/blake3-1.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: blake3 - version: 1.0.8 - sha256: e4072196547484c95a5a09adbb952e9bb501949f03f9e2a85e7249ef85faaba8 - requires_dist: - - typing-extensions>=4.6.0 ; python_full_version < '3.12' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/50/26/f7668be55c909678b001ecacff11ad7016cd9b4e9c7cc87b5971d638c5a9/blake3-1.0.8-cp313-cp313-macosx_11_0_arm64.whl - name: blake3 - version: 1.0.8 - sha256: d17eb6382634b3a5bc0c0e0454d5265b0becaeeadb6801ed25150b39a999d0cc - requires_dist: - - typing-extensions>=4.6.0 ; python_full_version < '3.12' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/55/b8/11de9528c257f7f1633f957ccaff253b706838d22c5d2908e4735798ec01/blake3-1.0.8-cp313-cp313-macosx_10_12_x86_64.whl - name: blake3 - version: 1.0.8 - sha256: 46dc20976bd6c235959ef0246ec73420d1063c3da2839a9c87ca395cf1fd7943 - requires_dist: - - typing-extensions>=4.6.0 ; python_full_version < '3.12' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/77/57/e8a85fa261894bf7ce7af928ff3408aab60287ab8d58b55d13a3f700b619/blake3-1.0.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - name: blake3 - version: 1.0.8 - sha256: 19fc6f2b7edab8acff6895fc6e38c19bd79f4c089e21153020c75dfc7397d52d - requires_dist: - - typing-extensions>=4.6.0 ; python_full_version < '3.12' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/bioconda/linux-64/blast-2.17.0-h66d330f_0.conda - sha256: 53a319c984d8aafcf7f2d7d4c21ad2590e1bacd674443e09d79ac19694ccf99a - md5: 405ce6d52eba06fcd48197ae1eb8f5a9 + - libstdcxx >=14 + license: Public Domain + purls: [] + size: 8349546 + timestamp: 1774474237098 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-io-compress-2.216-pl5321h80f0ee0_0.conda + sha256: e3b08da45be6608d51e20eb95832a505d6334f457a2d17857a905b114b6465dc + md5: 279724b023ac1c97903397f28de43f98 + depends: + - libgcc >=13 + - libstdcxx >=13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-compress-raw-bzip2 >=2.214 + - perl-compress-raw-zlib >=2.214 + - perl-encode + - perl-scalar-list-utils + license: Perl_5 + purls: [] + size: 87307 + timestamp: 1769814902051 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-json-xs-4.04-pl5321h163da20_0.conda + sha256: 913ca904aec0226af5c159be33cd1c18a027f340de4c863c6ac2c45f485a490d + md5: 8a7e13298e3a98dc25ed5418b0b3f99f + depends: + - libgcc >=13 + - libstdcxx >=13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-common-sense + - perl-types-serialiser + license: GPL-1.0-or-later OR Artistic-1.0-Perl + size: 69511 + timestamp: 1757351420227 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-list-moreutils-xs-0.430-pl5321h661a7b0_5.tar.bz2 + sha256: 373f7c8ec1260df64afd2c550cf83cfa19e7fddf3f615d6cf5e74a86a29f2b04 + md5: f127ef1c613b5170a2d59e8a43ea0e76 + depends: + - libgcc >=13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: apache_2_0 + purls: [] + size: 51048 + timestamp: 1741776294812 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/rpsbproc-0.5.1-h7645e38_0.conda + sha256: 277aa2f124627062c768367ce9b73c0d27c6f0481518ad0339276d4e48d69c45 + md5: 52d43ad51789a1b1b25c7684829bc85c depends: - bzip2 >=1.0.8,<2.0a0 - - curl - - entrez-direct >=24.0,<25.0a0 - libgcc >=13 - - libsqlite >=3.50.4,<4.0a0 + - libsqlite >=3.51.2,<4.0a0 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - - ncbi-vdb >=3.2.1,<4.0a0 - - perl - - perl-archive-tar - - perl-json - - perl-list-moreutils - - zlib - license: NCBI-PD - size: 84832339 - timestamp: 1754909742570 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/blast-2.16.0-h6a93c2d_5.tar.bz2 - sha256: 3a078039431d17b02addc52ae78395953b395349118644623e6f394eda0db2b1 - md5: 696c9e56bd61724c5fe11d278e0c0a88 + license: Public Domain + purls: [] + size: 5897387 + timestamp: 1769077825923 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/samtools-1.23.1-hc7977f4_0.conda + sha256: 27fb919e5e957d6d20bbaa2e89442ba2acb235b8020feffdfeb30e17967f7eea + md5: 6f266b86f19415f2409fa35db1bbb254 + depends: + - htslib >=1.23.1,<1.24.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + license: MIT + size: 549048 + timestamp: 1773861667737 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/seqkit-2.13.0-h8865c2f_0.conda + sha256: 86b9d440aeef17a0a0312308a2aefd0709e51d6af82576a8ca2c9d97999aef11 + md5: 6007face22bad6330d2165d685cc5c66 + license: MIT + license_family: MIT + purls: [] + size: 6335938 + timestamp: 1772198357526 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/spades-4.2.0-h3e01217_2.conda + sha256: dacc35267b9c31350739e521fdaf6f2805436569b04214b910e9386476020849 + md5: bee299b02e8be21d0dcd74e49753fd72 depends: + - _openmp_mutex >=4.5 - bzip2 >=1.0.8,<2.0a0 - - curl - - entrez-direct >=22.4,<23.0a0 - libgcc >=13 - - libsqlite >=3.49.1,<4.0a0 + - libgomp - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - - ncbi-vdb >=3.2.1,<4.0a0 - - perl - - perl-archive-tar - - perl-json - - perl-list-moreutils - - rpsbproc - - zlib - license: NCBI-PD + - openmpi >=4.1.6,<5.0a0 + - python >=3.8 + license: GPL-2.0-only + license_family: GPL purls: [] - size: 145178710 - timestamp: 1743180765609 + size: 35259065 + timestamp: 1758931426837 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/vsearch-2.31.0-hd0c913a_0.conda + sha256: e70bab441117c0420a4d77802ccf9123bbec3a76070956295e47688967197b39 + md5: 549678a7db61a3883543250b65d7c1a2 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + license: GPL-3.0-or-later OR BSD-2-Clause + license_family: GPL3 + purls: [] + size: 314698 + timestamp: 1777559749806 +- conda: https://conda.anaconda.org/bioconda/noarch/nextflow-25.10.4-h2a3209d_0.conda + sha256: 26917ebbec4133e8d15a6557e3234a976573e46fafda62a28d37d6916d7ad9f9 + md5: 1fc010bbb636e291ca5812bc1a53917b + depends: + - coreutils + - curl + - openjdk >=17,<=24 + license: Apache-2.0 + purls: [] + size: 34829682 + timestamp: 1770744718359 +- conda: https://conda.anaconda.org/bioconda/noarch/perl-archive-tar-3.06-pl5321hdfd78af_0.conda + sha256: 281cec7801d4ea5166bc6870dc3d8774ab87b88ce2723c84d7e3018adccd3f05 + md5: b0f7e3ec78f91ea473c5fd01ff9053a8 + depends: + - perl >=5.32.1,<6.0a0 *_perl5 + - perl-io-compress + - perl-io-zlib + - perl-pathtools + license: Perl_5 + purls: [] + size: 38386 + timestamp: 1778409144629 +- conda: https://conda.anaconda.org/bioconda/noarch/perl-io-zlib-1.15-pl5321hdfd78af_1.tar.bz2 + sha256: 771a44b338cac68a22893897450222b886e24bbb291b014897d561f2ba3b588f + md5: db92645dabe9467115729e4479841b5d + depends: + - perl >=5.32.1,<6.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + purls: [] + size: 12760 + timestamp: 1752069858135 +- conda: https://conda.anaconda.org/bioconda/noarch/perl-json-4.11-pl5321hdfd78af_0.conda + sha256: 1c1649f491c76f4ae2984b547701df91c8abfda2e3b7b44e0c007f5e78a87c08 + md5: 56411755d21870a9ec16c76fd7b66dba + depends: + - perl >=5.32.1,<6.0a0 *_perl5 + - perl-json-xs + license: GPL-1.0-or-later OR Artistic-1.0-Perl + purls: [] + size: 52845 + timestamp: 1774152885168 +- conda: https://conda.anaconda.org/bioconda/noarch/perl-list-moreutils-0.430-pl5321hdfd78af_0.tar.bz2 + sha256: 2190cc8430bb218ea80f5fc5e2bf75e4e20a27fb83e8c3cb789a18c32854a56c + md5: 7f04c79d216d0f8e7b6d5a51de4aafa0 + depends: + - perl >=5.32.1,<6.0a0 *_perl5 + - perl-exporter-tiny + - perl-list-moreutils-xs >=0.430 + license: apache_2_0 + purls: [] + size: 32468 + timestamp: 1644871004171 +- conda: https://conda.anaconda.org/bioconda/noarch/perl-types-serialiser-1.01-pl5321hdfd78af_0.tar.bz2 + sha256: 20f61217b16235d0161ad6fa0a234585afcc04ec5a6142c65b5867e26216dfe3 + md5: cfc65753e827bbef80c00eaa395f6ae7 + depends: + - perl >=5.32.1,<6.0a0 *_perl5 + - perl-common-sense + license: perl_5 + purls: [] + size: 13136 + timestamp: 1644512391683 +- conda: https://conda.anaconda.org/bioconda/osx-64/bbmap-39.81-h831ead7_1.conda + sha256: d7bdc66811f020d0f36a0f072606a6d68f36b2a5cb803f07fb01515b9a8a24b0 + md5: f53051b0c88bb33095ab8370f51831f1 + depends: + - bzip2 >=1.0.8,<2.0a0 + - openjdk >=11.0.1 + - samtools >=1.23.1,<2.0a0 + license: BSD-3-Clause-LBNL + purls: [] + size: 94168433 + timestamp: 1774977570827 - conda: https://conda.anaconda.org/bioconda/osx-64/blast-2.17.0-h53185c9_0.conda sha256: 2199a98eeea960834d10c5b5adaf558057053d8c07ef3191a43a103edfd4448d md5: 79e84a45f4b036868705273b575de549 @@ -1486,2238 +1430,2439 @@ packages: license: NCBI-PD size: 152602258 timestamp: 1754920755551 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/blast-2.16.0-hb260f6e_5.tar.bz2 - sha256: 0ca5da8fa1aee16a96bfc00284f09a92bd85aa6f57ded3a9ab6a21d573bec52f - md5: 112829a9e327f78c8f26699c19d65bfb +- conda: https://conda.anaconda.org/bioconda/osx-64/deacon-0.13.2-hc8bee9e_1.conda + sha256: f4d0bfe9a685481d93e3c8bc5402cfcf652179c093511b61195a1e8e13d8e6d2 + md5: e3febc6a62cf6e9e571defe9d29d8a9d depends: - - bzip2 >=1.0.8,<2.0a0 - - curl - - entrez-direct >=22.4,<23.0a0 - - libcxx >=18 - - libsqlite >=3.49.1,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncbi-vdb >=3.2.1,<4.0a0 - - perl - - perl-archive-tar - - perl-json - - perl-list-moreutils - - rpsbproc - - zlib - license: NCBI-PD + - openssl >=3.6.0,<4.0a0 + constrains: + - __osx >=10.13 + license: MIT purls: [] - size: 157885023 - timestamp: 1743182400505 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda - sha256: dadec2879492adede0a9af0191203f9b023f788c18efd45ecac676d424c458ae - md5: 6c4d3597cf43f3439a51b2b13e29a4ba + size: 1431193 + timestamp: 1763751311095 +- conda: https://conda.anaconda.org/bioconda/osx-64/entrez-direct-24.0-h193322a_0.tar.bz2 + sha256: a9257df9c0f41436190e6161fca969308b082b4a6b51e50f27600dfd035637c7 + md5: 1a3b2f781a1a9f3a14f26dd9d7660998 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - wget constrains: - - libbrotlicommon 1.2.0 hb03c661_1 + - __osx>=10.12 + license: Public Domain + purls: [] + size: 16468613 + timestamp: 1748473889737 +- conda: https://conda.anaconda.org/bioconda/osx-64/fastp-1.3.3-h3119cac_0.conda + sha256: 64304ba7abfdb23627c4c2c4eb1a4a272fd75c676497e28eedd4ee2eabe3f76f + md5: b29007477ffe5ebc37b9f781b229f773 + depends: + - isa-l >=2.31.1,<3.0a0 + - libcxx >=19 + - libdeflate >=1.25,<1.26.0a0 + - libhwy >=1.3.0,<1.4.0a0 license: MIT license_family: MIT - purls: - - pkg:pypi/brotli?source=hash-mapping - size: 367721 - timestamp: 1764017371123 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py313hb260801_1.conda - sha256: 5fe27389162240ab9a5cd8d112d51bdd9019f9a68c5593b5298e54f0437f714f - md5: 523c55147ba15d3e0e0cdb9f67cda339 + purls: [] + size: 242025 + timestamp: 1777075176156 +- conda: https://conda.anaconda.org/bioconda/osx-64/htslib-1.23.1-h09fbe89_0.conda + sha256: cbbf764d36ce34197b99ef6fb90c03044cf7813316b8a879f9a0cf4c67b62cc3 + md5: 2eccbeae9d6adf71bda98cce71633ef3 depends: - - libgcc >=14 - - libstdcxx >=14 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - constrains: - - libbrotlicommon 1.2.0 he30d5cf_1 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.19.0,<9.0a0 + - libdeflate >=1.25,<1.26.0a0 + - liblzma >=5.8.2,<6.0a0 + - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT - purls: - - pkg:pypi/brotli?source=hash-mapping - size: 372678 - timestamp: 1764017653333 -- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.2.0-py313h8d69aa9_1.conda - sha256: 3d328413ff65a12af493066d721d12f5ee82a0adf3565629ce4c797c4680162c - md5: 7c5e382b4d5161535f1dd258103fea51 + size: 998076 + timestamp: 1773856529790 +- conda: https://conda.anaconda.org/bioconda/osx-64/k8-1.2-h2ec61ea_6.tar.bz2 + sha256: 596c13ecad0e679a907c229b9fcd07f649235ad25abbf783e8910a449ec60f2d + md5: 917525300d56b7a7ddac9e1bde2dd4ba depends: - - __osx >=10.13 - - libcxx >=19 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - libbrotlicommon 1.2.0 h8616949_1 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT - purls: - - pkg:pypi/brotli?source=hash-mapping - size: 389859 - timestamp: 1764018040907 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda - sha256: 2e21dccccd68bedd483300f9ab87a425645f6776e6e578e10e0dd98c946e1be9 - md5: b03732afa9f4f54634d94eb920dfb308 + purls: [] + size: 8484801 + timestamp: 1748948933576 +- conda: https://conda.anaconda.org/bioconda/osx-64/minimap2-2.30-h7f84b70_0.tar.bz2 + sha256: 6c854e221a8d7656a55d48cfbf8812c71bb3f9dbbda2bea7cce4b871b78fddbb + md5: d9f37632e58c407cd23cb39277502a6f + depends: + - k8 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 571104 + timestamp: 1750026467075 +- conda: https://conda.anaconda.org/bioconda/osx-64/ncbi-vdb-3.4.1-haa61c75_0.conda + sha256: 9cd21f53d7a3e11fa209a0a6363dab33233bc86adbb48125f7c4569682f25007 + md5: e8b13f529db610e684ebbec9cebfe251 depends: - - __osx >=11.0 - libcxx >=19 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + license: Public Domain + purls: [] + size: 4689904 + timestamp: 1774475475338 +- conda: https://conda.anaconda.org/bioconda/osx-64/perl-io-compress-2.216-pl5321h5eaf441_0.conda + sha256: a053f0721aa5718227e4dde2ea394d57f09cf0fd0454e522bc1865ff537483b9 + md5: 5475f28718f06211952ba02a4ae26245 + depends: + - libcxx >=18 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-compress-raw-bzip2 >=2.214 + - perl-compress-raw-zlib >=2.214 + - perl-encode + - perl-scalar-list-utils + license: Perl_5 + purls: [] + size: 87863 + timestamp: 1769816012199 +- conda: https://conda.anaconda.org/bioconda/osx-64/perl-json-xs-4.04-pl5321h5fa12a8_0.conda + sha256: 36d4985f1405ef0319d938656dfb748bbdf9b39795bd89e1f701e95d2f8c10ec + md5: 0c624f0a1c8680c7ea209f5cadc2387c + depends: + - libcxx >=18 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-common-sense + - perl-types-serialiser + license: GPL-1.0-or-later OR Artistic-1.0-Perl + size: 69555 + timestamp: 1757352915026 +- conda: https://conda.anaconda.org/bioconda/osx-64/perl-list-moreutils-xs-0.430-pl5321h18d8cf3_5.tar.bz2 + sha256: eea554693fbc015804eec6c510cca54d0051bcd1d496bfbfac6fe4426f42503f + md5: 2a311e115963e9a985b1029d092a58d1 + depends: + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: apache_2_0 + purls: [] + size: 44178 + timestamp: 1741776966235 +- conda: https://conda.anaconda.org/bioconda/osx-64/samtools-1.23.1-head6495_0.conda + sha256: 8c3ff4c331f82049446521fd9f00d8a6010ba65f69c38250860ac320d4fdbe55 + md5: b4af8fd57180f7d7c20048f0c3359736 + depends: + - htslib >=1.23.1,<1.24.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + license: MIT + size: 477620 + timestamp: 1773863301094 +- conda: https://conda.anaconda.org/bioconda/osx-64/seqkit-2.13.0-h193322a_0.conda + sha256: 4faf8132317822f0df6c576d4428b4b303a3b297d73e7a67a4d31a653de6ccdd + md5: 735c72e223352a52da62f078c40822af constrains: - - libbrotlicommon 1.2.0 hc919400_1 + - __osx>=10.12 license: MIT license_family: MIT - purls: - - pkg:pypi/brotli?source=hash-mapping - size: 359568 - timestamp: 1764018359470 -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 - md5: d2ffd7602c02f2b316fd921d39876885 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: bzip2-1.0.6 - license_family: BSD purls: [] - size: 260182 - timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c - md5: 840d8fc0d7b3209be93080bc20e07f2d + size: 6748908 + timestamp: 1772199320871 +- conda: https://conda.anaconda.org/bioconda/osx-64/spades-4.2.0-hf6bce26_2.conda + sha256: c612be396c8649eadbe4d1088e07d8ff5bc9afb2abc3941edfc7f2f2e5ca38e5 + md5: b5e75c46829f141a317c4a2c26096660 depends: - - libgcc >=14 - license: bzip2-1.0.6 - license_family: BSD + - bzip2 >=1.0.8,<2.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=18.1.8 + - openmpi >=4.1.6,<5.0a0 + - python >=3.8 + license: GPL-2.0-only + license_family: GPL purls: [] - size: 192412 - timestamp: 1771350241232 -- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - sha256: 9f242f13537ef1ce195f93f0cc162965d6cc79da578568d6d8e50f70dd025c42 - md5: 4173ac3b19ec0a4f400b4f782910368b + size: 22850116 + timestamp: 1758933785330 +- conda: https://conda.anaconda.org/bioconda/osx-64/vsearch-2.31.0-h7aab66d_0.conda + sha256: 47236db3b8c996a26b3fbf6bfade7c209e3c222a799e53e5c8bb414a755a754f + md5: cada888bf20c710bf62e724b6f01dcd7 depends: - __osx >=10.13 - license: bzip2-1.0.6 - license_family: BSD + - bzip2 >=1.0.8,<2.0a0 + - libcxx >=19 + - libzlib >=1.3.2,<2.0a0 + license: GPL-3.0-or-later OR BSD-2-Clause + license_family: GPL3 purls: [] - size: 133427 - timestamp: 1771350680709 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df - md5: 620b85a3f45526a8bc4d23fd78fc22f0 + size: 291379 + timestamp: 1777561379071 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/bbmap-39.81-he046917_1.conda + sha256: ba4c29f184f2abe6e4630dea809e221639f4f48edb0e158e27dfa6559e02bd1b + md5: 6d62f8e37a08d6348368844a45f386f4 depends: - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD + - bzip2 >=1.0.8,<2.0a0 + - openjdk >=11.0.1 + - samtools >=1.23.1,<2.0a0 + license: BSD-3-Clause-LBNL purls: [] - size: 124834 - timestamp: 1771350416561 -- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e - md5: 920bb03579f15389b9e512095ad995b7 + size: 93167198 + timestamp: 1776521806505 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/blast-2.16.0-hb260f6e_5.tar.bz2 + sha256: 0ca5da8fa1aee16a96bfc00284f09a92bd85aa6f57ded3a9ab6a21d573bec52f + md5: 112829a9e327f78c8f26699c19d65bfb depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 + - bzip2 >=1.0.8,<2.0a0 + - curl + - entrez-direct >=22.4,<23.0a0 + - libcxx >=18 + - libsqlite >=3.49.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncbi-vdb >=3.2.1,<4.0a0 + - perl + - perl-archive-tar + - perl-json + - perl-list-moreutils + - rpsbproc + - zlib + license: NCBI-PD + purls: [] + size: 157885023 + timestamp: 1743182400505 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/deacon-0.13.2-hc12438c_1.conda + sha256: e0a1e650be9816d132d8e8028b4b5a8c47fc9347de9a77389c25d25263d79d12 + md5: da5a53c437863c6dd705ff1c29b7ebce + depends: + - openssl >=3.6.0,<4.0a0 + constrains: + - __osx >=11.0 license: MIT - license_family: MIT purls: [] - size: 207882 - timestamp: 1765214722852 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda - sha256: 7ec8a68efe479e2e298558cbc2e79d29430d5c7508254268818c0ae19b206519 - md5: 1dfbec0d08f112103405756181304c16 + size: 1325263 + timestamp: 1763749605148 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/entrez-direct-22.4-hd5f1084_0.tar.bz2 + sha256: 46efea9f61526340ae8db2c1e25666fc46a259f5a52e8d69d5ca62fedf46774d + md5: 56c3860d52479d20d86dd78f24947e8e depends: - - libgcc >=14 + - wget + license: PUBLIC DOMAIN + purls: [] + size: 13706791 + timestamp: 1721746465282 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/fastp-1.3.3-ha1d0559_0.conda + sha256: 657b25869bea1028047d8596b5d0c84f6db3d3908df93d51ee45a74012611074 + md5: f65bbcdacb4b82fa4bb5429c93309040 + depends: + - isa-l >=2.31.1,<3.0a0 + - libcxx >=19 + - libdeflate >=1.25,<1.26.0a0 + - libhwy >=1.3.0,<1.4.0a0 license: MIT license_family: MIT purls: [] - size: 217215 - timestamp: 1765214743735 -- conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - sha256: 2f5bc0292d595399df0d168355b4e9820affc8036792d6984bd751fdda2bcaea - md5: fc9a153c57c9f070bebaa7eef30a8f17 + size: 225594 + timestamp: 1777073655366 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/htslib-1.23.1-h44a9eb5_0.conda + sha256: 630d7f903d6212fa107a3876e52ed895ca5dbda3098b8577886c40057d8564a5 + md5: 767616e86a18eba3cf51efbfd06e5734 depends: - - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.19.0,<9.0a0 + - libdeflate >=1.25,<1.26.0a0 + - liblzma >=5.8.2,<6.0a0 + - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT - purls: [] - size: 186122 - timestamp: 1765215100384 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196 - md5: bcb3cba70cf1eec964a03b4ba7775f01 + size: 992943 + timestamp: 1773854821372 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/k8-1.2-hda5e58c_6.tar.bz2 + sha256: 71a5f0bcdb892760556b741fcba8b52d9824a414097cc5e877f36e89b093e3c0 + md5: 7564d9ace7ab6eed5f972bf2a799b166 depends: - - __osx >=11.0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] - size: 180327 - timestamp: 1765215064054 -- conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - sha256: 8e7a40f16400d7839c82581410aa05c1f8324a693c9d50079f8c50dc9fb241f0 - md5: abd85120de1187b0d1ec305c2173c71b + size: 8068855 + timestamp: 1748940155242 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/minimap2-2.30-hba9b596_0.tar.bz2 + sha256: cdb32f97fa222a0113dea48dab8a3b0bc251f270f1140733f9ba59be981c6404 + md5: 227f3a61a8a0df309eff38a5635640a0 depends: - - binutils - - gcc - - gcc_linux-64 14.* - license: BSD-3-Clause - license_family: BSD + - k8 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 6693 - timestamp: 1753098721814 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda - sha256: a16c5078619d60e54f75336ed2bbb4ee0fb6f711de02dd364983748beda31e04 - md5: 89bc32110bba0dc160bb69427e196dc4 + size: 493142 + timestamp: 1750027275243 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/ncbi-vdb-3.4.1-hfc726f9_0.conda + sha256: 8e90015ecaefaaccd188f6986d97cdc67b91423889e0a4f1060f4dffad297960 + md5: d54d17cd6703898ef0f394f746ca3f13 depends: - - binutils - - gcc - - gcc_linux-aarch64 14.* - license: BSD-3-Clause - license_family: BSD + - libcxx >=19 + license: Public Domain purls: [] - size: 6721 - timestamp: 1753098688332 -- conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - sha256: 2bd1cf3d26789b7e1d04e914ccd169bd618fceed68abf7b6a305266b88dcf861 - md5: 2b23ec416cef348192a5a17737ddee60 + size: 4729608 + timestamp: 1774474005378 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-io-compress-2.216-pl5321haef7865_0.conda + sha256: 9e7fa17e5eca67ac395b97610deefd861ee6564c8e2f06ea1bfff782551c90f9 + md5: 0431eb5b4aeea11a058a3e639b7379d7 depends: - - cctools >=949.0.1 - - clang_osx-64 19.* - - ld64 >=530 - - llvm-openmp + - libcxx >=18 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-compress-raw-bzip2 >=2.214 + - perl-compress-raw-zlib >=2.214 + - perl-encode + - perl-scalar-list-utils + license: Perl_5 + purls: [] + size: 88298 + timestamp: 1769815017664 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-json-xs-4.04-pl5321h4675bf2_0.conda + sha256: 0a83c4cee65c1beb748948ad1017ff9fbdb3d64cc3eb13599e938f06cd609cbe + md5: 7b47788061026d732bab29c1b24a9c92 + depends: + - libcxx >=18 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-common-sense + - perl-types-serialiser + license: GPL-1.0-or-later OR Artistic-1.0-Perl + size: 68334 + timestamp: 1757351554241 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-list-moreutils-xs-0.430-pl5321hbdacb55_5.tar.bz2 + sha256: 46d9645a60edde726f5891ae254db4bb2a17f0e32ff64a18160910c4a618d879 + md5: 4f44dd7b4232e9c202a72d17f9d1c287 + depends: + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: apache_2_0 + purls: [] + size: 43423 + timestamp: 1741776343291 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/rpsbproc-0.5.1-hf8bb5b5_0.conda + sha256: c21fa5d3126918e83cc60acff94c2c57bd8f8c640bf44083012e3fa6fb3132a5 + md5: 48fe2982f2d5d721008d7d2c670b377b + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcxx >=18 + - libsqlite >=3.51.2,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + license: Public Domain + purls: [] + size: 4227660 + timestamp: 1769076585440 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/samtools-1.23.1-hc612e98_0.conda + sha256: f5658dba11d98101f8c3e52de87fce4c28da12aeaf80e3c7d9f5727bef29ab4d + md5: 91112ce67a49fe4a636be59656dbc9ec + depends: + - htslib >=1.23.1,<1.24.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + license: MIT + size: 447384 + timestamp: 1773861469209 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/seqkit-2.13.0-hd5f1084_0.conda + sha256: 6cb98e907764603a37382c80d4f679c34cca1779be985d02da7f2d3605947f17 + md5: b43878880a9c9084b0a2244d5995bdbb + license: MIT + license_family: MIT + purls: [] + size: 6329308 + timestamp: 1772198301865 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/spades-4.2.0-h4d841d5_2.conda + sha256: 5c18b6564ff3b47d02a40b16f9eb73fca64b2d0dab77a917b7ddb9615d614af0 + md5: 813a993f2486f38f9027ecd821a18ca8 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=18.1.8 + - openmpi >=4.1.6,<5.0a0 + - python >=3.8 + license: GPL-2.0-only + license_family: GPL + purls: [] + size: 21925186 + timestamp: 1758931207633 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/vsearch-2.31.0-h0448ff9_0.conda + sha256: 992bb9bf6858d0c53f502f11575fe45526862b47277c5d2bbd3de008136af7f0 + md5: 003a2cc62a2f4350d19d549a6db39e25 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libcxx >=19 + - libzlib >=1.3.2,<2.0a0 + license: GPL-3.0-or-later OR BSD-2-Clause + license_family: GPL3 + purls: [] + size: 273426 + timestamp: 1777560179184 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 + md5: a9f577daf3de00bca7c3c76c0ecbd1de + depends: + - __glibc >=2.17,<3.0.a0 + - libgomp >=7.5.0 + constrains: + - openmp_impl <0.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 6695 - timestamp: 1753098825695 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - sha256: b51bd1551cfdf41500f732b4bd1e4e70fb1e74557165804a648f32fa9c671eec - md5: 148516e0c9edf4e9331a4d53ae806a9b + size: 28948 + timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31 + md5: dcdc58c15961dbf17a0621312b01f5cb depends: - - cctools >=949.0.1 - - clang_osx-arm64 19.* - - ld64 >=530 - - llvm-openmp + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-or-later + license_family: GPL + purls: [] + size: 584660 + timestamp: 1768327524772 +- conda: https://conda.anaconda.org/conda-forge/linux-64/apptainer-1.4.5-h6ccafba_0.conda + sha256: aa34ebc55ab69fea3e42d3ffe26ee4169794be1d1ffadadc5a35857554c3dddb + md5: d09c947d2f15fa9e36e5377ad93a6277 + depends: + - __glibc >=2.17 + - __glibc >=2.17,<3.0.a0 + - cni-plugins >=0.7.4 + - fuse-overlayfs + - gocryptfs + - libarchive >=3.8.2,<3.9.0a0 + - libgcc >=14 + - libseccomp >=2.4.4,<3.0a0 + - libstdcxx >=14 + - libuuid >=2.41.2,<3.0a0 + - openssl >=3.5.4,<4.0a0 + - squashfs-tools + - squashfuse + constrains: + - singularity ==9999999999 license: BSD-3-Clause license_family: BSD purls: [] - size: 6697 - timestamp: 1753098737760 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 - md5: bddacf101bb4dd0e51811cb69c7790e2 + size: 21979472 + timestamp: 1764716258107 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_102.conda + sha256: 3c7c5580c1720206f28b7fa3d60d17986b3f32465e63009c14c9ae1ea64f926c + md5: 212fe5f1067445544c99dc1c847d032c depends: - - __unix - license: ISC + - binutils_impl_linux-64 >=2.45.1,<2.45.2.0a0 + license: GPL-3.0-only + license_family: GPL purls: [] - size: 146519 - timestamp: 1767500828366 -- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - noarch: python - sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 - md5: 9b347a7ec10940d3f7941ff6c460b551 + size: 35436 + timestamp: 1774197482571 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda + sha256: 0a7d405064f53b9d91d92515f1460f7906ee5e8523f3cd8973430e81219f4917 + md5: 8165352fdce2d2025bf884dc0ee85700 depends: - - cached_property >=1.5.2,<1.5.3.0a0 - license: BSD-3-Clause + - ld_impl_linux-64 2.45.1 default_hbd61a6d_102 + - sysroot_linux-64 + - zstd >=1.5.7,<1.6.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 3661455 + timestamp: 1774197460085 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda + sha256: 78a58d523d072b7f8e591b8f8572822e044b31764ed7e8d170392e7bc6d58339 + md5: 2a307a17309d358c9b42afdd3199ddcc + depends: + - binutils_impl_linux-64 2.45.1 default_hfdba357_102 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 36304 + timestamp: 1774197485247 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 + md5: d2ffd7602c02f2b316fd921d39876885 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 license_family: BSD purls: [] - size: 4134 - timestamp: 1615209571450 -- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 - md5: 576d629e47797577ab0f1b351297ef4a + size: 260182 + timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e + md5: 920bb03579f15389b9e512095ad995b7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 207882 + timestamp: 1765214722852 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda + sha256: 8e7a40f16400d7839c82581410aa05c1f8324a693c9d50079f8c50dc9fb241f0 + md5: abd85120de1187b0d1ec305c2173c71b depends: - - python >=3.6 + - binutils + - gcc + - gcc_linux-64 14.* license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/cached-property?source=hash-mapping - size: 11065 - timestamp: 1615209567874 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a - md5: bb6c4808bfa69d6f7f6b07e5846ced37 + purls: [] + size: 6693 + timestamp: 1753098721814 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + sha256: 3bd6a391ad60e471de76c0e9db34986c4b5058587fbf2efa5a7f54645e28c2c7 + md5: 09262e66b19567aff4f592fb53b28760 depends: - __glibc >=2.17,<3.0.a0 - fontconfig >=2.15.0,<3.0a0 - fonts-conda-ecosystem - - icu >=78.1,<79.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libgcc >=14 - - libglib >=2.86.3,<3.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libstdcxx >=14 + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - pixman >=0.46.4,<1.0a0 + - pixman >=0.44.2,<1.0a0 - xorg-libice >=1.1.2,<2.0a0 - - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libsm >=1.2.5,<2.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 - xorg-libxext >=1.3.6,<2.0a0 - xorg-libxrender >=0.9.12,<0.10.0a0 license: LGPL-2.1-only or MPL-1.1 purls: [] - size: 989514 - timestamp: 1766415934926 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda - sha256: 675db823f3d6fb6bf747fab3b0170ba99b269a07cf6df1e49fff2f9972be9cd1 - md5: 043c13ed3a18396994be9b4fab6572ad + size: 978114 + timestamp: 1741554591855 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cni-1.0.1-ha975731_1.tar.bz2 + sha256: 4d83a78ca08a6e40f48bc2d93cc8646959e175bd21b97dc055e44558605a3984 + md5: 58f92707fb5595c8cd90d278f602011c depends: - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - icu >=78.1,<79.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libgcc >=14 - - libglib >=2.86.3,<3.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libstdcxx >=14 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - pixman >=0.46.4,<1.0a0 - - xorg-libice >=1.1.2,<2.0a0 - - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - license: LGPL-2.1-only or MPL-1.1 + - jq + - libgcc-ng >=9.4.0 + license: Apache-2.0 + license_family: Apache purls: [] - size: 927045 - timestamp: 1766416003626 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - sha256: 0563fb193edde8002059e1a7fc32b23b5bd48389d9abdf5e49ff81e7490da722 - md5: 7b4852df7d4ed4e45bcb70c5d4b08cd0 + size: 1768993 + timestamp: 1643043326782 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cni-plugins-1.3.0-ha8f183a_0.conda + sha256: 0bc7985c802700112d0e6de90bebf300518a7bf68d2767b5654ce7f90bc98245 + md5: 7b19dcc220b79ec9249ecf2f4e671986 depends: - - cctools_impl_osx-64 1030.6.3 llvm19_1_h7d82c7c_4 - - ld64 956.6 llvm19_1_hc3792c1_4 - - libllvm19 >=19.1.7,<19.2.0a0 - license: APSL-2.0 - license_family: Other + - cni 1.0.1.* + license: Apache-2.0 + license_family: Apache purls: [] - size: 24262 - timestamp: 1768852850946 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - sha256: 4f408036b5175be0d2c7940250d00dae5ea7a71d194a1ffb35881fb9df6211fc - md5: caf7c8e48827c2ad0c402716159fe0a2 + size: 30645988 + timestamp: 1689423051718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda + sha256: 5709f2cbfeb8690317ba702611bdf711a502b417fecda6ad3313e501f6f8bd61 + md5: fdcf2e31dd960ef7c5daa9f2c95eff0e depends: - - cctools_impl_osx-arm64 1030.6.3 llvm19_1_he8a363d_4 - - ld64 956.6 llvm19_1_he86490a_4 - - libllvm19 >=19.1.7,<19.2.0a0 - license: APSL-2.0 - license_family: Other + - c-compiler 1.11.0 h4d9bdce_0 + - cxx-compiler 1.11.0 hfcd1e18_0 + - fortran-compiler 1.11.0 h9bea470_0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 24313 - timestamp: 1768852906882 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - sha256: 43928e68f59a8e4135d20df702cf97073b07a162979a30258d93f6e44b1220db - md5: bb274e464cf9479e0a6da2cf2e33bc16 + size: 7482 + timestamp: 1753098722454 +- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_19.conda + sha256: 769357d82d19f59c23888d935d92b67739bdb2acaacaa7bbe7c4fe4ee5346287 + md5: fd57230e9a97b97bf20dd63aeae6fe61 depends: - - __osx >=10.13 - - ld64_osx-64 >=956.6,<956.7.0a0 - - libcxx - - libllvm19 >=19.1.7,<19.2.0a0 - - libzlib >=1.3.1,<2.0a0 - - llvm-tools 19.1.* - - sigtool-codesign - constrains: - - cctools 1030.6.3.* - - clang 19.1.* - - ld64 956.6.* - license: APSL-2.0 - license_family: Other + - gcc_impl_linux-64 >=14.3.0,<14.3.1.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 745672 - timestamp: 1768852809822 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - sha256: c444442e0c01de92a75b58718a100f2e272649658d4f3dd915bbfc2316b25638 - md5: 76c651b923e048f3f3e0ecb22c966f70 + size: 31751 + timestamp: 1778268677594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coreutils-9.5-hd590300_0.conda + sha256: 7cd3b0f55aa55bb27b045c30f32b3f6b874ecc006f3abcb274c71a3bcbacb358 + md5: 126d457e0e7a535278e808a7d8960015 depends: - - __osx >=11.0 - - ld64_osx-arm64 >=956.6,<956.7.0a0 - - libcxx - - libllvm19 >=19.1.7,<19.2.0a0 - - libzlib >=1.3.1,<2.0a0 - - llvm-tools 19.1.* - - sigtool-codesign - constrains: - - ld64 956.6.* - - cctools 1030.6.3.* - - clang 19.1.* - license: APSL-2.0 - license_family: Other + - libgcc-ng >=12 + license: GPL-3.0-or-later + license_family: GPL purls: [] - size: 749918 - timestamp: 1768852866532 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda - sha256: 258f7bde2b5f664f60130d0066f5cee96a308d946e95bacc82b44b76c776124a - md5: fdef8a054844f72a107dfd888331f4a7 + size: 3014238 + timestamp: 1711655132451 +- conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.20.0-hcf29cc6_0.conda + sha256: 24b6ccc111388df77c65c68b3f3cad9f066e11741469fa60052ad0773f941c6e + md5: cc1a446bff91be88b2fa1d629e4f348b depends: - - cctools_impl_osx-64 1030.6.3 llvm19_1_h7d82c7c_4 - - ld64_osx-64 956.6 llvm19_1_hcae3351_4 - constrains: - - cctools 1030.6.3.* - license: APSL-2.0 - license_family: Other + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libcurl 8.20.0 hcf29cc6_0 + - libgcc >=14 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT purls: [] - size: 23193 - timestamp: 1768852854819 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_h6d92914_4.conda - sha256: 6b37ac10e22dd734cce14ce7d1ac6db07976bb71e38a10971c0693b9f17ad6c4 - md5: df5cd5c925df1412426e3db71d31363f + size: 191489 + timestamp: 1777461498522 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda + sha256: 3fcc97ae3e89c150401a50a4de58794ffc67b1ed0e1851468fcc376980201e25 + md5: 5da8c935dca9186673987f79cef0b2a5 depends: - - cctools_impl_osx-arm64 1030.6.3 llvm19_1_he8a363d_4 - - ld64_osx-arm64 956.6 llvm19_1_ha2625f7_4 - constrains: - - cctools 1030.6.3.* - license: APSL-2.0 - license_family: Other + - c-compiler 1.11.0 h4d9bdce_0 + - gxx + - gxx_linux-64 14.* + license: BSD-3-Clause + license_family: BSD purls: [] - size: 23211 - timestamp: 1768852915341 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - sha256: 110338066d194a715947808611b763857c15458f8b3b97197387356844af9450 - md5: eacc711330cd46939f66cd401ff9c44b + size: 6635 + timestamp: 1753098722177 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c + md5: 867127763fbe935bab59815b6e0b7b5c depends: - - python >=3.10 - license: ISC - purls: - - pkg:pypi/certifi?source=compressed-mapping - size: 150969 - timestamp: 1767500900768 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - sha256: b32f8362e885f1b8417bac2b3da4db7323faa12d5db62b7fd6691c02d60d6f59 - md5: a22d1fd9bf98827e280a02875d9a007a - depends: - - python >=3.10 + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libuuid >=2.41.3,<3.0a0 + - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT - purls: - - pkg:pypi/charset-normalizer?source=hash-mapping - size: 50965 - timestamp: 1760437331772 -- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19.1.7-default_h1323312_7.conda - sha256: 820d65cc9f0b44fdc088d4e7f6a154cfb323bbdeb29c6405b4794680e7e7ac18 - md5: 138b0781aea27a845b18e7c1cd34f2fb - depends: - - clang-19 19.1.7 default_hd70426c_7 - - clang_impl_osx-64 19.1.7 default_ha1a018a_7 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache purls: [] - size: 24316 - timestamp: 1767959435159 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_7.conda - sha256: e170fa45ea1a6c30348b05a474bfad58bcb7316ee278fd1051f1f7af105db2cd - md5: 13150cdd8e6bc61aa68b55d1a2a69083 + size: 270705 + timestamp: 1771382710863 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda + sha256: 53e5562ede83b478ebe9f4fc3d3b4eff5b627883f48aa0bf412e8fd90b5d6113 + md5: d5596f445a1273ddc5ea68864c01b69f depends: - - clang-19 19.1.7 default_hf3020a7_7 - - clang_impl_osx-arm64 19.1.7 default_hc11f16d_7 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - binutils + - c-compiler 1.11.0 h4d9bdce_0 + - gfortran + - gfortran_linux-64 14.* + license: BSD-3-Clause + license_family: BSD purls: [] - size: 24474 - timestamp: 1767957953998 -- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19-19.1.7-default_hd70426c_7.conda - sha256: d1625b4896fa597e0f5fdcd4b7cbeea7c120728e0ef43fc641dd7e8fa6d4eabe - md5: c117b3fc6406027a2ca344aee4e1382a + size: 6656 + timestamp: 1753098722318 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + sha256: c934c385889c7836f034039b43b05ccfa98f53c900db03d8411189892ced090b + md5: 8462b5322567212beeb025f3519fb3e2 depends: - - __osx >=10.13 - - libclang-cpp19.1 19.1.7 default_hd70426c_7 - - libcxx >=19.1.7 - - libllvm19 >=19.1.7,<19.2.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - libfreetype 2.14.3 ha770c72_0 + - libfreetype6 2.14.3 h73754d4_0 + license: GPL-2.0-only OR FTL purls: [] - size: 764031 - timestamp: 1767959120208 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_7.conda - sha256: d59286e188f4922f9812d8412358f98e98b187840c7256d9c143f4e9cc02847e - md5: 3b992d143f0008588ca26df8a324eee9 + size: 173839 + timestamp: 1774298173462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fuse-overlayfs-1.16-ha5fcf3e_1.conda + sha256: 52b5405b80340544b77d4b50081a7c97a43364991649325ebd84ac334e0bd919 + md5: f2266d4f0c70e1188e532b5b3f7c1503 depends: - - __osx >=11.0 - - libclang-cpp19.1 19.1.7 default_hf3020a7_7 - - libcxx >=19.1.7 - - libllvm19 >=19.1.7,<19.2.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - __glibc >=2.17,<3.0.a0 + - libfuse3 >=3.18.0,<4.0a0 + - libgcc >=14 + license: GPL-3.0-or-later + license_family: GPL purls: [] - size: 764520 - timestamp: 1767957577398 -- conda: https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_7.conda - sha256: bd9e569f9848d7fdcc963eecbc2cb75201213a751440a207956e1d670c174835 - md5: 61a2644a24a32277abae7a234f73b13d + size: 58878 + timestamp: 1766170267806 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_19.conda + sha256: e3f541c4be7296b800a972482b7a5e399614d5e3310d3d083257fbdb4df81ea0 + md5: 2dd149aa693db92758af3e685ef30439 depends: - - cctools_impl_osx-64 - - clang-19 19.1.7 default_hd70426c_7 - - compiler-rt 19.1.7.* - - compiler-rt_osx-64 - - ld64 - - ld64_osx-64 * llvm19_1_* - - llvm-openmp >=19.1.7 - - llvm-tools 19.1.7.* - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - conda-gcc-specs + - gcc_impl_linux-64 14.3.0 h235f0fe_19 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 24417 - timestamp: 1767959402626 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda - sha256: faffb31c43afb4360d6545bd20590fbed5b344a77daeabdea39164d72c943d21 - md5: bde6fcb6b1fcefb687a7fb95675c6ec8 + size: 29459 + timestamp: 1778268802660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-h235f0fe_19.conda + sha256: 1e2500ca976d4831c953d1c6db7b238d2e6806910b930e3eb631b79ba5c3ba41 + md5: 99936dc616b7ce97b0468759b8a7c64e depends: - - cctools_impl_osx-arm64 - - clang-19 19.1.7 default_hf3020a7_7 - - compiler-rt 19.1.7.* - - compiler-rt_osx-arm64 - - ld64 - - ld64_osx-arm64 * llvm19_1_* - - llvm-openmp >=19.1.7 - - llvm-tools 19.1.7.* - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - binutils_impl_linux-64 >=2.45 + - libgcc >=14.3.0 + - libgcc-devel_linux-64 14.3.0 hf649bbc_119 + - libgomp >=14.3.0 + - libsanitizer 14.3.0 h8f1669f_19 + - libstdcxx >=14.3.0 + - libstdcxx-devel_linux-64 14.3.0 h9f08a49_119 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 24459 - timestamp: 1767957934083 -- conda: https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_31.conda - sha256: aa12658e55300efcdc34010312ee62d350464ae0ae8c30d1f7340153c9baa5aa - md5: faf4b6245c4287a4f13e793ca2826842 + size: 77667192 + timestamp: 1778268558509 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h50e9bb6_24.conda + sha256: 5f73bc0ce1729466f99d072678fb1bc13d5424d03a34cb2e69fbafbfd5e27ab2 + md5: 91b0f19212d79a1a4dca034aac729e4f depends: - - cctools_osx-64 - - clang 19.* - - clang_impl_osx-64 19.1.7.* - - sdkroot_env_osx-64 + - gcc_impl_linux-64 14.3.0.* + - binutils_linux-64 + - sysroot_linux-64 license: BSD-3-Clause license_family: BSD purls: [] - size: 21157 - timestamp: 1769482965411 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_31.conda - sha256: c9daaa0e7785fe7c5799e3d691c6aa5ab8b4a54bbf49835037068dd78e0a7b35 - md5: 6645630920c0980a33f055a49fbdb88e + size: 29073 + timestamp: 1777144725126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-14.3.0-he448592_7.conda + sha256: 7ab008dd3dc5e6ca0de2614771019a1d35480d51df6216c96b1cf6a5e660ee40 + md5: 94394acdc56dcb4d55dddf0393134966 depends: - - cctools_osx-arm64 - - clang 19.* - - clang_impl_osx-arm64 19.1.7.* - - sdkroot_env_osx-arm64 + - gcc 14.3.0.* + - gcc_impl_linux-64 14.3.0.* + - gfortran_impl_linux-64 14.3.0.* license: BSD-3-Clause license_family: BSD purls: [] - size: 21135 - timestamp: 1769482854554 -- conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_7.conda - sha256: cfa79093c73f831c9df7892989e59cd25244eaf45a8d476be21871834b260c18 - md5: 85ed31bf1c61812adb2492a0745db172 + size: 30407 + timestamp: 1759966108779 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_19.conda + sha256: aee591aab674d70829ecc1abaa7f2ad5fcccbfad7bafa5ebca1225c86c60f18f + md5: d5f5c8cc2a64220838a096041b7a7fb4 depends: - - clang 19.1.7 default_h1323312_7 - - clangxx_impl_osx-64 19.1.7.* default_*_7 - - libcxx-devel 19.1.* - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - gcc_impl_linux-64 >=14.3.0 + - libgcc >=14.3.0 + - libgfortran5 >=14.3.0 + - libstdcxx >=14.3.0 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 24380 - timestamp: 1767959626598 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_7.conda - sha256: ac9f83722cfd336298b97e30c3746a8f0d9d6289a3e0383275f531dc03b2f88a - md5: 0c1f688616da9aac0ce556d74a24f740 + size: 18551249 + timestamp: 1778268735401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-h6b77fdb_24.conda + sha256: 3d68ccd46b0717ffad267e9224866086859cc304c9d3f10f321d2099b445c489 + md5: 491f76c26b2d032b21ba0b79cc324c4f depends: - - clang 19.1.7 default_hf9bcbb7_7 - - clangxx_impl_osx-arm64 19.1.7.* default_*_7 - - libcxx-devel 19.1.* - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - gfortran_impl_linux-64 14.3.0.* + - gcc_linux-64 ==14.3.0 h50e9bb6_24 + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 24443 - timestamp: 1767958120218 -- conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_7.conda - sha256: 56147cce5439c1543703dc0fb95a68793c3154f7987faf027c7159a850883298 - md5: b37f21ec0f7e5a279d51b3b692303ff6 + size: 27318 + timestamp: 1777144725126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff + md5: 3bf7b9fd5a7136126e0234db4b87c8b6 depends: - - clang-19 19.1.7 default_hd70426c_7 - - clang_impl_osx-64 19.1.7 default_ha1a018a_7 - - libcxx-devel 19.1.* - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - libgcc-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 77248 + timestamp: 1712692454246 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gocryptfs-2.6.1-ha770c72_0.conda + sha256: ce4a5def3bb39644f1b3b9e948a6c897dbae5b3a47d93011447757990d257838 + md5: bb437fbff41ae6014e00e92a3121ab9f + license: MIT + license_family: MIT purls: [] - size: 24322 - timestamp: 1767959603633 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_7.conda - sha256: 56ec5bf095253eb7ff33b0e64f33c608d760f790f1ff0cb30480a797bffbb2fd - md5: 4fa4a9227c428372847c534a9bffd698 + size: 3874149 + timestamp: 1754972186137 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c + md5: 2cd94587f3a401ae05e03a6caf09539d depends: - - clang-19 19.1.7 default_hf3020a7_7 - - clang_impl_osx-arm64 19.1.7 default_hc11f16d_7 - - libcxx-devel 19.1.* - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.0-or-later + license_family: LGPL purls: [] - size: 24364 - timestamp: 1767958102690 -- conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_31.conda - sha256: 308df8233f2a7a258e6441fb02553a1b5a54afe5e93d63b016dd9c0f1d28d5ab - md5: c3b46b5d6cd2a6d1f12b870b2c69aed4 + size: 99596 + timestamp: 1755102025473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-he448592_7.conda + sha256: 7acf0ee3039453aa69f16da063136335a3511f9c157e222def8d03c8a56a1e03 + md5: 91dc0abe7274ac5019deaa6100643265 depends: - - cctools_osx-64 - - clang_osx-64 19.1.7 h8a78ed7_31 - - clangxx 19.* - - clangxx_impl_osx-64 19.1.7.* - - sdkroot_env_osx-64 + - gcc 14.3.0.* + - gxx_impl_linux-64 14.3.0.* license: BSD-3-Clause license_family: BSD purls: [] - size: 19974 - timestamp: 1769482973715 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_31.conda - sha256: f3a81f8e5451377d2b84a31f4a4e305cb92f5a4c4ba0126e7d1a3cfa4d66bf47 - md5: bd6926e81dc196064373b614af3bc9ff + size: 30403 + timestamp: 1759966121169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_19.conda + sha256: a31694c26d6a525d44f81130ebf7b9abe18771b7eaecb2cf93630c0b8b8fb936 + md5: 8b867d053ed89743eeac52c3a50f112d depends: - - cctools_osx-arm64 - - clang_osx-arm64 19.1.7 h75f8d18_31 - - clangxx 19.* - - clangxx_impl_osx-arm64 19.1.7.* - - sdkroot_env_osx-arm64 - license: BSD-3-Clause - license_family: BSD + - gcc_impl_linux-64 14.3.0 h235f0fe_19 + - libstdcxx-devel_linux-64 14.3.0 h9f08a49_119 + - sysroot_linux-64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 19914 - timestamp: 1769482862579 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 - md5: ea8a6c3256897cc31263de9f455e25d9 + size: 15235650 + timestamp: 1778268773535 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h8a413ad_24.conda + sha256: 66e357fad69998624d24ed52d7e1550f8159dc78418fff044377790f29e0fee3 + md5: ea3921760f33250a1c12926fce1660eb depends: - - python >=3.10 - - __unix - - python + - gxx_impl_linux-64 14.3.0.* + - gcc_linux-64 ==14.3.0 h50e9bb6_24 + - binutils_linux-64 + - sysroot_linux-64 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/click?source=hash-mapping - size: 97676 - timestamp: 1764518652276 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cni-1.0.1-ha975731_1.tar.bz2 - sha256: 4d83a78ca08a6e40f48bc2d93cc8646959e175bd21b97dc055e44558605a3984 - md5: 58f92707fb5595c8cd90d278f602011c + purls: [] + size: 27606 + timestamp: 1777144725126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.5.1-h15599e2_0.conda + sha256: 3bf149eab76768ed10f95eba015ca996cd6be7dc666996a004c4a8340a57cd60 + md5: b90a6ec73cc7d630981f78d4c7ca8fed depends: - - jq - - libgcc-ng >=9.4.0 - license: Apache-2.0 - license_family: Apache + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 1768993 - timestamp: 1643043326782 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cni-1.0.1-h80d9677_0.tar.bz2 - sha256: b69b11a48a19a4421d2f2a53e065b36c4cd0e7d44956f826c7b34730d9472b73 - md5: 5f67bbbf4b7d6151b8f4d085441b3322 + size: 2427482 + timestamp: 1758640288422 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 depends: - - jq - - libgcc-ng >=9.4.0 - license: Apache-2.0 - license_family: Apache + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT purls: [] - size: 1674303 - timestamp: 1631546880145 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cni-plugins-1.3.0-ha8f183a_0.conda - sha256: 0bc7985c802700112d0e6de90bebf300518a7bf68d2767b5654ce7f90bc98245 - md5: 7b19dcc220b79ec9249ecf2f4e671986 + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-64/isa-l-2.31.1-hb9d3cd8_1.conda + sha256: 75b15f01a6b286630c4a98be0d05e286275a5ef3868e23e6d9644e51b73650e1 + md5: 00f364ec0a7e975ec9d2fc720b19c129 depends: - - cni 1.0.1.* - license: Apache-2.0 - license_family: Apache + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 30645988 - timestamp: 1689423051718 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cni-plugins-1.3.0-h652cbe9_0.conda - sha256: 177428c64357552d553a868c90a764f7aabe0457bf2cfa92562dbb509a92c35d - md5: 8b8de8bfad2fe81a71bb14ce41363629 + size: 157291 + timestamp: 1736497194571 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jq-1.8.1-h73b1eb8_0.conda + sha256: ab26cb11ad0d10f5c6637d925b044c74a3eacb5825686d3720313b3cb6d40cef + md5: 2714e43bfc035f7ef26796632aa1b523 depends: - - cni 1.0.1.* - license: Apache-2.0 - license_family: Apache + - oniguruma 6.9.* + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - oniguruma >=6.9.10,<6.10.0a0 + license: MIT + license_family: MIT purls: [] - size: 28568852 - timestamp: 1689422936272 -- conda: https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda - sha256: 28e5f0a6293acba68ebc54694a2fc40b1897202735e8e8cbaaa0e975ba7b235b - md5: e6b9e71e5cb08f9ed0185d31d33a074b + size: 313184 + timestamp: 1751447310552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: b38117a3c920364aff79f870c984b4a3 depends: - - __osx >=10.13 - - clang 19.1.7.* - - compiler-rt_osx-64 19.1.7.* - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later purls: [] - size: 96722 - timestamp: 1757412473400 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda - sha256: b58a481828aee699db7f28bfcbbe72fb133277ac60831dfe70ee2465541bcb93 - md5: 39451684370ae65667fa5c11222e43f7 + size: 134088 + timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 + md5: fb53fb07ce46a575c5d004bbc96032c2 depends: - - __osx >=11.0 - - clang 19.1.7.* - - compiler-rt_osx-arm64 19.1.7.* - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE + - __glibc >=2.17,<3.0.a0 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT purls: [] - size: 97085 - timestamp: 1757411887557 -- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda - sha256: e6effe89523fc6143819f7a68372b28bf0c176af5b050fe6cf75b62e9f6c6157 - md5: 32deecb68e11352deaa3235b709ddab2 + size: 1386730 + timestamp: 1769769569681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda + sha256: eb89c6c39f2f6a93db55723dbb2f6bba8c8e63e6312bf1abf13e6e9ff45849c8 + md5: f92f984b558e6e6204014b16d212b271 depends: - - clang 19.1.7.* - constrains: - - compiler-rt 19.1.7 - - clangxx 19.1.7 - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: MIT + license_family: MIT purls: [] - size: 10425780 - timestamp: 1757412396490 -- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda - sha256: 8c32a3db8adf18ed58197e8895ce4f24a83ed63c817512b9a26724753b116f2a - md5: 8d99c82e0f5fed6cc36fcf66a11e03f0 + size: 251086 + timestamp: 1778079286384 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c + md5: 18335a698559cdbcd86150a48bf54ba6 depends: - - clang 19.1.7.* + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 constrains: - - compiler-rt 19.1.7 - - clangxx 19.1.7 - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE + - binutils_impl_linux-64 2.45.1 + license: GPL-3.0-only + license_family: GPL purls: [] - size: 10490535 - timestamp: 1757411851093 -- conda: https://conda.anaconda.org/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - sha256: 5709f2cbfeb8690317ba702611bdf711a502b417fecda6ad3313e501f6f8bd61 - md5: fdcf2e31dd960ef7c5daa9f2c95eff0e + size: 728002 + timestamp: 1774197446916 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 + md5: a752488c68f2e7c456bcbd8f16eec275 depends: - - c-compiler 1.11.0 h4d9bdce_0 - - cxx-compiler 1.11.0 hfcd1e18_0 - - fortran-compiler 1.11.0 h9bea470_0 - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: Apache purls: [] - size: 7482 - timestamp: 1753098722454 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - sha256: 7713d1af8c67d3052e2fb0a9d12cb6098210342995e5db4fd70fc9aae0630465 - md5: 10cfd53906b539dc866c79f5837ab577 + size: 261513 + timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.7-gpl_hc2c16d8_101.conda + sha256: 78dd3d493d72c7d7c7647912fe383a3545a2695ee308037b64e9d0752ccedbe9 + md5: bb1483d91797dae0b466cab86ceb59a7 depends: - - c-compiler 1.11.0 hdceaead_0 - - cxx-compiler 1.11.0 h7b35c40_0 - - fortran-compiler 1.11.0 h151373c_0 - license: BSD-3-Clause + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - liblzma >=5.8.3,<6.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause license_family: BSD purls: [] - size: 7575 - timestamp: 1753098689062 -- conda: https://conda.anaconda.org/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda - sha256: d95722dfe9a45b22fbb4e8d4f9531ac5ef7d829f3bfd2ed399d45d7590681bd0 - md5: 308ed38aeff454285547012272cb59f5 + size: 890218 + timestamp: 1778486345922 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c + md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 depends: - - c-compiler 1.11.0 h7a00415_0 - - cxx-compiler 1.11.0 h307afc9_0 - - fortran-compiler 1.11.0 h9ab62e8_0 - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: Apache purls: [] - size: 7509 - timestamp: 1753098827841 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda - sha256: 01f02e9baa51ef2debfdc55df57ea6a7fce9b5fb9356c3267afb517e1dc4363a - md5: aac0d423ecfd95bde39582d0de9ca657 + size: 4518030 + timestamp: 1770902209173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda + sha256: 75963a5dd913311f59a35dbd307592f4fa754c4808aff9c33edb430c415e38eb + md5: c3cc2864f82a944bc90a7beb4d3b0e88 depends: - - c-compiler 1.11.0 h61f9b84_0 - - cxx-compiler 1.11.0 h88570a1_0 - - fortran-compiler 1.11.0 h81a4f41_0 - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.68.1,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT purls: [] - size: 7525 - timestamp: 1753098740763 -- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda - sha256: b90ec0e6a9eb22f7240b3584fe785457cff961fec68d40e6aece5d596f9bbd9a - md5: 0e3e144115c43c9150d18fa20db5f31c + size: 468706 + timestamp: 1777461492876 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 + md5: 6c77a605a7a689d17d4819c0f8ac9a00 depends: - - gcc_impl_linux-64 >=14.3.0,<14.3.1.0a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT purls: [] - size: 31705 - timestamp: 1771378159534 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_18.conda - sha256: 7b018e74d2f828e887faabc9d5c5bef6d432c3356dcac3e691ee6b24bc82ef52 - md5: 184c1aba41c40e6bc59fa91b37cd7c3f + size: 73490 + timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b depends: - - gcc_impl_linux-aarch64 >=14.3.0,<14.3.1.0a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD purls: [] - size: 31474 - timestamp: 1771377963347 -- pypi: https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl - name: conda-inject - version: 1.3.2 - sha256: 6e641b408980c2814e3e527008c30749117909a21ff47392f07ef807da93a564 - requires_dist: - - pyyaml>=6.0,<7.0 - requires_python: '>=3.9,<4.0' -- pypi: https://files.pythonhosted.org/packages/31/28/d28211d29bcc3620b1fece85a65ce5bb22f18670a03cd28ea4b75ede270c/configargparse-1.7.1-py3-none-any.whl - name: configargparse - version: 1.7.1 - sha256: 8b586a31f9d873abd1ca527ffbe58863c99f36d896e2829779803125e83be4b6 - requires_dist: - - pyyaml ; extra == 'yaml' - - mock ; extra == 'test' - - pyyaml ; extra == 'test' - - pytest ; extra == 'test' - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz - name: connection-pool - version: 0.0.3 - sha256: bf429e7aef65921c69b4ed48f3d48d3eac1383b05d2df91884705842d974d0dc -- conda: https://conda.anaconda.org/conda-forge/linux-64/coreutils-9.5-hd590300_0.conda - sha256: 7cd3b0f55aa55bb27b045c30f32b3f6b874ecc006f3abcb274c71a3bcbacb358 - md5: 126d457e0e7a535278e808a7d8960015 + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 depends: - libgcc-ng >=12 - license: GPL-3.0-or-later + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + sha256: ea33c40977ea7a2c3658c522230058395bc2ee0d89d99f0711390b6a1ee80d12 + md5: a3b390520c563d78cc58974de95a03e5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.8.0.* + license: MIT + license_family: MIT + purls: [] + size: 77241 + timestamp: 1777846112704 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 + md5: a360c33a5abe61c07959e449fa1453eb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 58592 + timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 + md5: e289f3d17880e44b633ba911d57a321b + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 8049 + timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d + md5: fb16b4b69e3f1dcfe79d80db8fd0c55d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 384575 + timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfuse3-3.18.2-h9a46e9c_0.conda + sha256: 6dbd3f81d880e413d2dcc297402cd04a7aaae478a4311d571969a35cd40e7b45 + md5: 8ce5d9a85764b06a0e16f03e65445024 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + constrains: + - libfuse <3 + license: LGPL-2.1-only AND GPL-2.0-only license_family: GPL purls: [] - size: 3014238 - timestamp: 1711655132451 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coreutils-9.5-h31becfc_0.conda - sha256: 812c6f285b0073d93f3c5148d15f27cde85a29dbb8bf234c309a4696cc2aeabf - md5: 1c1921fdfebcaa18132711524e64259b + size: 444900 + timestamp: 1773963276297 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 + md5: 57736f29cc2b0ec0b6c2952d3f101b6a depends: - - libgcc-ng >=12 - license: GPL-3.0-or-later + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 he0feb66_19 + license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 3334202 - timestamp: 1711658928010 -- conda: https://conda.anaconda.org/conda-forge/osx-64/coreutils-9.5-h10d778d_0.conda - sha256: 7a29ae82cf1c455b4956c8311ae97832460c3585f0d8789fd82161dd2a20d1fd - md5: 8332c7ae324c9fc4b22cc3d84a0582e8 - license: GPL-3.0-or-later + size: 1041084 + timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 + md5: 331ee9b72b9dff570d56b1302c5ab37d + depends: + - libgcc 15.2.0 he0feb66_19 + license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 1374585 - timestamp: 1711655512907 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coreutils-9.5-h93a5062_0.conda - sha256: 70e50f2f1458e7c172c9b1c149a4289e8eecc9b53e06ab9de0b3572cdbd30a61 - md5: 75840e25e62a109b1d25043c63a4f36c - license: GPL-3.0-or-later + size: 27694 + timestamp: 1778269016987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f + md5: 42bf7eca1a951735fa06c0e3c0d5c8e6 + depends: + - libgfortran5 15.2.0 h68bc16d_19 + constrains: + - libgfortran-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 1478098 - timestamp: 1711655465375 -- conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.18.0-hcf29cc6_1.conda - sha256: 267d0d8b65f2bb16f09c8af393d5089537849f740c2b9c54ef47980418a5c6ed - md5: 5382de77de69b4a10310be3266b60480 + size: 27655 + timestamp: 1778269042954 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.2.0-h69a702a_19.conda + sha256: 9ca1d254a3e44e608abec6186b18d372cec21e5253e6da9750f4a8f4780ea0bb + md5: 35d07243abf828674d273aecd1dd537e + depends: + - libgfortran 15.2.0 h69a702a_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 27727 + timestamp: 1778269220455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda + sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4 + md5: 85072b0ad177c966294f129b7c04a2d5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 2483673 + timestamp: 1778269025089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda + sha256: 33eb5d5310a5c2c0a4707a0afa644801c2e08c8f70c45e1f62f354116dfe0970 + md5: 17d484ab9c8179c6a6e5b7dbb5065afc depends: - __glibc >=2.17,<3.0.a0 - - krb5 >=1.22.2,<1.23.0a0 - - libcurl 8.18.0 hcf29cc6_1 - libgcc >=14 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT + - libffi >=3.5.2,<3.6.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libzlib >=1.3.2,<2.0a0 + - libiconv >=1.18,<2.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later purls: [] - size: 190606 - timestamp: 1770892822497 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/curl-8.18.0-hc57f145_1.conda - sha256: 4649d7bfa807c6d8edebac68341866170217d2eecc75a4b73fb3c13e18efa52a - md5: e982d2b926368a46804c4a697e92dc2c + size: 4754097 + timestamp: 1778508800134 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b + md5: faac990cb7aedc7f3a2224f2c9b0c26c depends: - - krb5 >=1.22.2,<1.23.0a0 - - libcurl 8.18.0 hc57f145_1 + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 603817 + timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda + sha256: 2bdd1cdd677b119abc5e83069bec2e28fe6bfb21ebaea3cd07acee67f38ea274 + md5: c2a0c1d0120520e979685034e0b79859 + depends: + - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT + - libstdcxx >=14 + license: Apache-2.0 OR BSD-3-Clause purls: [] - size: 196252 - timestamp: 1770892781505 -- conda: https://conda.anaconda.org/conda-forge/osx-64/curl-8.18.0-h9a2545f_1.conda - sha256: 5b7ae5c217db39abcf27d6ade57767f2e236665dbbb57c78ba24bfe9d24bad28 - md5: 29f6cb87eb384d24e61dfd36db1ef78f + size: 1448617 + timestamp: 1758894401402 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 depends: - - __osx >=10.13 - - krb5 >=1.22.2,<1.23.0a0 - - libcurl 8.18.0 h9a2545f_1 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only purls: [] - size: 179654 - timestamp: 1770893418532 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/curl-8.18.0-hd5a2499_1.conda - sha256: 02dfeeafde40f0305f817ab0dd98432453383f376b72302b491539283b27a6ce - md5: 1c31070994c1896ec110846f2ab57747 + size: 790176 + timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda + sha256: cc38c900b9a20fe75e61cbb594e749c57a06d96510722f5ddfa309682062b065 + md5: 842a81de672ddcf476337c8bde3cad33 depends: - - __osx >=11.0 - - krb5 >=1.22.2,<1.23.0a0 - - libcurl 8.18.0 hd5a2499_1 - - libssh2 >=1.11.1,<2.0a0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libunistring >=0,<1.0a0 + license: LGPL-2.0-only + license_family: LGPL + purls: [] + size: 139036 + timestamp: 1760385590993 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + sha256: 10056646c28115b174de81a44e23e3a0a3b95b5347d2e6c45cc6d49d35294256 + md5: 6178c6f2fb254558238ef4e6c56fb782 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 633831 + timestamp: 1775962768273 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d + md5: b88d90cad08e6bc8ad540cb310a761fb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - xz 5.8.3.* + license: 0BSD + purls: [] + size: 113478 + timestamp: 1775825492909 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 + md5: 2c21e66f50753a083cbe6b80f38268fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 92400 + timestamp: 1769482286018 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + sha256: 663444d77a42f2265f54fb8b48c5450bfff4388d9c0f8253dd7855f0d993153f + md5: 2a45e7f8af083626f009645a6481f12d + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.6,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=14 + - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.5,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl + license: MIT license_family: MIT purls: [] - size: 176523 - timestamp: 1770893204600 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - sha256: 3fcc97ae3e89c150401a50a4de58794ffc67b1ed0e1851468fcc376980201e25 - md5: 5da8c935dca9186673987f79cef0b2a5 + size: 663344 + timestamp: 1773854035739 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89 + md5: eba48a68a1a2b9d3c0d9511548db85db depends: - - c-compiler 1.11.0 h4d9bdce_0 - - gxx - - gxx_linux-64 14.* - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement purls: [] - size: 6635 - timestamp: 1753098722177 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - sha256: b87cd33501867d999caa1a57e488e69dc9e08011ec8685586df754302247a7a4 - md5: 0234c63e6b36b1677fd6c5238ef0a4ec + size: 317729 + timestamp: 1776315175087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_19.conda + sha256: 8766de5423b0a510e2b1bdd1963d0554bdad2119f3e31d8fbd4189af434235ca + md5: 007796e5a595bbc7df4a5e1580d72e1a depends: - - c-compiler 1.11.0 hdceaead_0 - - gxx - - gxx_linux-aarch64 14.* - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.3.0 + - libstdcxx >=14.3.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 6705 - timestamp: 1753098688728 -- conda: https://conda.anaconda.org/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda - sha256: d6976f8d8b51486072abfe1e76a733688380dcbd1a8e993a43d59b80f7288478 - md5: 463bb03bb27f9edc167fb3be224efe96 + size: 7947790 + timestamp: 1778268494844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libseccomp-2.6.0-hb03c661_0.conda + sha256: 5702c323cc6e1b9327f4f2aad32269301a4189944cdc847ee3ac9d6f96694d24 + md5: 6b17df90864bfc2b42881b42365968de depends: - - c-compiler 1.11.0 h7a00415_0 - - clangxx_osx-64 19.* - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only purls: [] - size: 6732 - timestamp: 1753098827160 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda - sha256: 99800d97a3a2ee9920dfc697b6d4c64e46dc7296c78b1b6c746ff1c24dea5e6c - md5: 043afed05ca5a0f2c18252ae4378bdee + size: 95153 + timestamp: 1764897052812 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d + md5: 7dc38adcbf71e6b38748e919e16e0dce depends: - - c-compiler 1.11.0 h61f9b84_0 - - clangxx_osx-arm64 19.* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: blessing + purls: [] + size: 954962 + timestamp: 1777986471789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 + md5: eecce068c7e4eddeb169591baac20ac4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 6715 - timestamp: 1753098739952 -- conda: https://conda.anaconda.org/bioconda/linux-64/deacon-0.13.2-h7ef3eeb_1.conda - sha256: b4e81a5e90ec60e11078c84a80ab2e47f38bf546c338c873bb6152d3dc40c4ec - md5: f5188f509977462fb8a32fe4d5b79e30 + size: 304790 + timestamp: 1745608545575 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc + md5: 5794b3bdc38177caf969dabd3af08549 depends: - - openssl >=3.6.0,<4.0a0 + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_19 constrains: - - __glibc >=2.17 - license: MIT + - libstdcxx-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 2195960 - timestamp: 1763750010069 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/deacon-0.13.2-h1529f91_1.conda - sha256: 78fcd602a431c54d89c9849f18d52145af29c7ebca18ce2062c844e7b0208994 - md5: c20aff2cec8306bdf37ea8671eef39f9 + size: 5852044 + timestamp: 1778269036376 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + sha256: 0672b6b6e1791c92e8eccad58081a99d614fcf82bca5841f9dfa3c3e658f83b9 + md5: e5ce228e579726c07255dbf90dc62101 depends: - - openssl >=3.6.0,<4.0a0 - constrains: - - __glibc >=2.17 - license: MIT + - libstdcxx 15.2.0 h934c35e_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 2226181 - timestamp: 1763749841717 -- conda: https://conda.anaconda.org/bioconda/osx-64/deacon-0.13.2-hc8bee9e_1.conda - sha256: f4d0bfe9a685481d93e3c8bc5402cfcf652179c093511b61195a1e8e13d8e6d2 - md5: e3febc6a62cf6e9e571defe9d29d8a9d - depends: - - openssl >=3.6.0,<4.0a0 - constrains: - - __osx >=10.13 - license: MIT - purls: [] - size: 1431193 - timestamp: 1763751311095 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/deacon-0.13.2-hc12438c_1.conda - sha256: e0a1e650be9816d132d8e8028b4b5a8c47fc9347de9a77389c25d25263d79d12 - md5: da5a53c437863c6dd705ff1c29b7ebce + size: 27776 + timestamp: 1778269074600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 + md5: cd5a90476766d53e901500df9215e927 depends: - - openssl >=3.6.0,<4.0a0 - constrains: - - __osx >=11.0 - license: MIT + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND purls: [] - size: 1325263 - timestamp: 1763749605148 -- pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl - name: docutils - version: 0.22.4 - sha256: d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/05/d1/8952806fbf9583004ab479d8f58a9496c3d35f6b6009ddd458bdd9978eaf/dpath-2.2.0-py3-none-any.whl - name: dpath - version: 2.2.0 - sha256: b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/09/5b/3e7aa490841784d223de61beb2ae64e82331501bf5a415dc87a0e27b4663/duckdb-1.4.4-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl - name: duckdb - version: 1.4.4 - sha256: 0d636ceda422e7babd5e2f7275f6a0d1a3405e6a01873f00d38b72118d30c10b - requires_dist: - - ipython ; extra == 'all' - - fsspec ; extra == 'all' - - numpy ; extra == 'all' - - pandas ; extra == 'all' - - pyarrow ; extra == 'all' - - adbc-driver-manager ; extra == 'all' - requires_python: '>=3.9.0' -- pypi: https://files.pythonhosted.org/packages/53/32/256df3dbaa198c58539ad94f9a41e98c2c8ff23f126b8f5f52c7dcd0a738/duckdb-1.4.4-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - name: duckdb - version: 1.4.4 - sha256: 7df7351328ffb812a4a289732f500d621e7de9942a3a2c9b6d4afcf4c0e72526 - requires_dist: - - ipython ; extra == 'all' - - fsspec ; extra == 'all' - - numpy ; extra == 'all' - - pandas ; extra == 'all' - - pyarrow ; extra == 'all' - - adbc-driver-manager ; extra == 'all' - requires_python: '>=3.9.0' -- pypi: https://files.pythonhosted.org/packages/9c/9b/3c7c5e48456b69365d952ac201666053de2700f5b0144a699a4dc6854507/duckdb-1.4.4-cp313-cp313-macosx_10_13_x86_64.whl - name: duckdb - version: 1.4.4 - sha256: 0509b39ea7af8cff0198a99d206dca753c62844adab54e545984c2e2c1381616 - requires_dist: - - ipython ; extra == 'all' - - fsspec ; extra == 'all' - - numpy ; extra == 'all' - - pandas ; extra == 'all' - - pyarrow ; extra == 'all' - - adbc-driver-manager ; extra == 'all' - requires_python: '>=3.9.0' -- pypi: https://files.pythonhosted.org/packages/a6/7b/64e68a7b857ed0340045501535a0da99ea5d9d5ea3708fec0afb8663eb27/duckdb-1.4.4-cp313-cp313-macosx_11_0_arm64.whl - name: duckdb - version: 1.4.4 - sha256: fb94de6d023de9d79b7edc1ae07ee1d0b4f5fa8a9dcec799650b5befdf7aafec - requires_dist: - - ipython ; extra == 'all' - - fsspec ; extra == 'all' - - numpy ; extra == 'all' - - pandas ; extra == 'all' - - pyarrow ; extra == 'all' - - adbc-driver-manager ; extra == 'all' - requires_python: '>=3.9.0' -- conda: https://conda.anaconda.org/bioconda/linux-64/entrez-direct-24.0-he881be0_0.tar.bz2 - sha256: 71a8f349659c9c18efa544663de2db1a20b5e3d32f8e4e88cd33110a0caf4eb3 - md5: 52a3fabee9201c2c6093c13b4eaf29b4 + size: 435273 + timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 + sha256: e88c45505921db29c08df3439ddb7f771bbff35f95e7d3103bf365d5d6ce2a6d + md5: 7245a044b4a1980ed83196176b78b73a depends: - - wget - license: Public Domain + - libgcc-ng >=9.3.0 + license: GPL-3.0-only OR LGPL-3.0-only purls: [] - size: 17127014 - timestamp: 1748473197798 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/entrez-direct-22.4-h8865c2f_0.tar.bz2 - sha256: 2ed85538e2e3ae19129faf078afed08b44b32ba12ff3d6982176ccb7879adf75 - md5: 289ba7576234e65af7824ef380db651a + size: 1433436 + timestamp: 1626955018689 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 + md5: 38ffe67b78c9d4de527be8315e5ada2c depends: - - wget - license: PUBLIC DOMAIN + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 13695014 - timestamp: 1721746273382 -- conda: https://conda.anaconda.org/bioconda/osx-64/entrez-direct-24.0-h193322a_0.tar.bz2 - sha256: a9257df9c0f41436190e6161fca969308b082b4a6b51e50f27600dfd035637c7 - md5: 1a3b2f781a1a9f3a14f26dd9d7660998 + size: 40297 + timestamp: 1775052476770 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b + md5: aea31d2e5b1091feca96fcfe945c3cf9 depends: - - wget + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 constrains: - - __osx>=10.12 - license: Public Domain - purls: [] - size: 16468613 - timestamp: 1748473889737 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/entrez-direct-22.4-hd5f1084_0.tar.bz2 - sha256: 46efea9f61526340ae8db2c1e25666fc46a259f5a52e8d69d5ca62fedf46774d - md5: 56c3860d52479d20d86dd78f24947e8e - depends: - - wget - license: PUBLIC DOMAIN - purls: [] - size: 13706791 - timestamp: 1721746465282 -- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl - name: fastjsonschema - version: 2.21.2 - sha256: 1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463 - requires_dist: - - colorama ; extra == 'devel' - - jsonschema ; extra == 'devel' - - json-spec ; extra == 'devel' - - pylint ; extra == 'devel' - - pytest ; extra == 'devel' - - pytest-benchmark ; extra == 'devel' - - pytest-cache ; extra == 'devel' - - validictory ; extra == 'devel' -- conda: https://conda.anaconda.org/bioconda/linux-64/fastp-1.1.0-heae3180_0.conda - sha256: be74fbaf0affc0b245fb13ce465780fe3050707b1f0fc56a64da539c51c8cd3c - md5: 8f88e230c714ffb89f900eedb8fb3aae - depends: - - isa-l >=2.31.1,<3.0a0 - - libdeflate >=1.22,<1.23.0a0 - - libgcc >=13 - - libstdcxx >=13 - license: MIT - license_family: MIT + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 240830 - timestamp: 1769261565731 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/fastp-1.1.0-h7dc49d2_0.conda - sha256: 60a461b2d0e880cb057c3fd49544abf7ab5206a008d6f4b1deef836cad79e77f - md5: c908ce869d540ba4de643c7345edb7f5 + size: 429011 + timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 depends: - - isa-l >=2.31.1,<3.0a0 - - libdeflate >=1.22,<1.23.0a0 + - __glibc >=2.17,<3.0.a0 - libgcc >=13 - - libstdcxx >=13 - license: MIT - license_family: MIT - purls: [] - size: 223118 - timestamp: 1769261396606 -- conda: https://conda.anaconda.org/bioconda/osx-64/fastp-1.1.0-h9ea9c2a_0.conda - sha256: 0de398887bb9b5a7b287d3697b5c4db9b90093dd2b0f8ab710cd76acf3656222 - md5: f81ab80838fba1f7b7439cfe95224da2 - depends: - - isa-l >=2.31.1,<3.0a0 - - libcxx >=18 - - libdeflate >=1.22,<1.23.0a0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp license: MIT license_family: MIT purls: [] - size: 215873 - timestamp: 1769262260330 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/fastp-1.1.0-hee05c9d_0.conda - sha256: 5bea4352a061d9b616d6ad945bcbf9f8e1d4b2d8903c2837a7004408df58d577 - md5: 13557deb249ac3a84ddd144c11debbde + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc depends: - - isa-l >=2.31.1,<3.0a0 - - libcxx >=18 - - libdeflate >=1.22,<1.23.0a0 - license: MIT - license_family: MIT - purls: [] - size: 205002 - timestamp: 1769261254600 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b - md5: 0c96522c6bdaed4b1566d11387caaf45 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 397370 - timestamp: 1566932522327 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c - md5: 34893075a5c9e55cdafac56607368fc6 - license: OFL-1.1 - license_family: Other - purls: [] - size: 96530 - timestamp: 1620479909603 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 - md5: 4d59c254e01d9cde7957100457e2d5fb - license: OFL-1.1 - license_family: Other - purls: [] - size: 700814 - timestamp: 1620479612257 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 - md5: 49023d73832ef61042f6a237cb2687e7 - license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 - license_family: Other + - libgcc-ng >=12 + license: LGPL-2.1-or-later purls: [] - size: 1620504 - timestamp: 1727511233259 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c - md5: 867127763fbe935bab59815b6e0b7b5c + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + sha256: 71436e72a286ef8b57d6f4287626ff91991eb03c7bdbe835280521791efd1434 + md5: e7733bc6785ec009e47a224a71917e84 depends: - __glibc >=2.17,<3.0.a0 - - libexpat >=2.7.4,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - icu >=75.1,<76.0a0 - libgcc >=14 - - libuuid >=2.41.3,<3.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 license: MIT license_family: MIT purls: [] - size: 270705 - timestamp: 1771382710863 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda - sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c - md5: 0fed1ff55f4938a65907f3ecf62609db + size: 556302 + timestamp: 1761015637262 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + sha256: ec0735ae56c3549149eebd7dc22c0bed91fd50c02eaa77ff418613ddda190aa8 + md5: e512be7dc1f84966d50959e900ca121f depends: - - libexpat >=2.7.4,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 - libgcc >=14 - - libuuid >=2.41.3,<3.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 ha9997c6_0 - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] - size: 279044 - timestamp: 1771382728182 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 - md5: fee5683a3f04bd15cbd8318b096a27ab + size: 45283 + timestamp: 1761015644057 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 + md5: d87ff7921124eccd67248aa483c23fec depends: - - fonts-conda-forge - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other purls: [] - size: 3667 - timestamp: 1566974674465 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 - md5: a7970cd949a077b7cb9696379d338681 + size: 63629 + timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 depends: - - font-ttf-ubuntu - - font-ttf-inconsolata - - font-ttf-dejavu-sans-mono - - font-ttf-source-code-pro - license: BSD-3-Clause + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause license_family: BSD purls: [] - size: 4059 - timestamp: 1762351264405 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - sha256: 53e5562ede83b478ebe9f4fc3d3b4eff5b627883f48aa0bf412e8fd90b5d6113 - md5: d5596f445a1273ddc5ea68864c01b69f + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + sha256: 5c6bbeec116e29f08e3dad3d0524e9bc5527098e12fc432c0e5ca53ea16337d4 + md5: 45161d96307e3a447cc3eb5896cf6f8c depends: - - binutils - - c-compiler 1.11.0 h4d9bdce_0 - - gfortran - - gfortran_linux-64 14.* - license: BSD-3-Clause - license_family: BSD + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: GPL-2.0-or-later + license_family: GPL purls: [] - size: 6656 - timestamp: 1753098722318 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - sha256: 3cbb537a1548455d1dcf49ebff80fa28c7448ec87c3e14779d3cc8f99a77fd29 - md5: b2ad788bde8ea90d5572bc2510e7d321 + size: 191060 + timestamp: 1753889274283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-openmpi.tar.bz2 + sha256: 54cf44ee2c122bce206f834a825af06e3b14fc4fd58c968ae9329715cc281d1e + md5: 1dcc49e16749ff79ba2194fa5d4ca5e7 + license: BSD 3-clause + purls: [] + size: 4204 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 + md5: fc21868a1a5aacc937e7a18747acb8a5 depends: - - binutils - - c-compiler 1.11.0 hdceaead_0 - - gfortran - - gfortran_linux-aarch64 14.* - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: X11 AND BSD-3-Clause purls: [] - size: 6740 - timestamp: 1753098688910 -- conda: https://conda.anaconda.org/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda - sha256: 21e2ec84b7b152daa22fa8cc98be5d4ba9ff93110bbc99e05dfd45eb6f7e8b77 - md5: ee1a3ecd568a695ea16747198df983eb + size: 918956 + timestamp: 1777422145199 +- conda: https://conda.anaconda.org/conda-forge/linux-64/oniguruma-6.9.10-hb9d3cd8_0.conda + sha256: bbff8a60f70d5ebab138b564554f28258472e1e63178614562d4feee29d10da2 + md5: 6ce853cb231f18576d2db5c2d4cb473e depends: - - cctools >=949.0.1 - - gfortran - - gfortran_osx-64 14.* - - ld64 >=530 - - llvm-openmp - license: BSD-3-Clause + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause license_family: BSD purls: [] - size: 6749 - timestamp: 1753098826431 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda - sha256: 1a030edc0e79e4e7a4ed9736ec6925303940148d00f20faf3a7abf0565de181e - md5: d221c62af175b83186f96d8b0880bff6 + size: 248670 + timestamp: 1735727084819 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-23.0.2-h53dfc1b_2.conda + sha256: aac6fe6db0841e77f832fc21132ac7ebec1a9b5bae004b5e69e3a210e53e3bf8 + md5: 47eea31e0c3f960459237823e5e21a32 depends: - - cctools >=949.0.1 - - gfortran - - gfortran_osx-arm64 14.* - - ld64 >=530 - - llvm-openmp + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.13,<1.3.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.13.3,<3.0a0 + - giflib >=5.2.2,<5.3.0a0 + - harfbuzz >=11.0.0,<12.0a0 + - lcms2 >=2.17,<3.0a0 + - libcups >=2.3.3,<2.4.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxi >=1.8.2,<2.0a0 + - xorg-libxrandr >=1.5.4,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + - xorg-libxt >=1.3.1,<2.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 + license: GPL-2.0-or-later WITH Classpath-exception-2.0 + license_family: GPL + purls: [] + size: 190220381 + timestamp: 1743201357942 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-4.1.6-hc5af2df_101.conda + sha256: f0769dd891e1735be4606ec8643951e5cbca199f774e58c7d933f70a70134ce4 + md5: f9a2ad0088ee38f396350515fa37d243 + depends: + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - mpi 1.0 openmpi + - zlib + constrains: + - cudatoolkit >= 10.2 + - ucx >=1.15.0,<2.0a0 + - libpmix ==0.0.0 + - libprrte ==0.0.0 license: BSD-3-Clause license_family: BSD purls: [] - size: 6723 - timestamp: 1753098739029 -- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda - sha256: bf8e4dffe46f7d25dc06f31038cacb01672c47b9f45201f065b0f4d00ab0a83e - md5: 4afc585cd97ba8a23809406cd8a9eda8 + size: 4069632 + timestamp: 1696593196408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb + md5: da1b85b6a87e141f5140bb9924cecab0 depends: - - libfreetype 2.14.1 ha770c72_0 - - libfreetype6 2.14.1 h73754d4_0 - license: GPL-2.0-only OR FTL + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache purls: [] - size: 173114 - timestamp: 1757945422243 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.1-h8af1aa0_0.conda - sha256: 9f8de35e95ce301cecfe01bc9d539c7cc045146ffba55efe9733ff77ad1cfb21 - md5: 0c8f36ebd3678eed1685f0fc93fc2175 + size: 3167099 + timestamp: 1775587756857 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff + md5: 7a3bff861a6583f1889021facefc08b1 depends: - - libfreetype 2.14.1 h8af1aa0_0 - - libfreetype6 2.14.1 hdae7a39_0 - license: GPL-2.0-only OR FTL + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 173174 - timestamp: 1757945489158 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fuse-overlayfs-1.16-ha5fcf3e_1.conda - sha256: 52b5405b80340544b77d4b50081a7c97a43364991649325ebd84ac334e0bd919 - md5: f2266d4f0c70e1188e532b5b3f7c1503 + size: 1222481 + timestamp: 1763655398280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + build_number: 7 + sha256: 9ec32b6936b0e37bcb0ed34f22ec3116e75b3c0964f9f50ecea5f58734ed6ce9 + md5: f2cfec9406850991f4e3d960cc9e3321 + depends: + - libgcc-ng >=12 + - libxcrypt >=4.4.36 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + purls: [] + size: 13344463 + timestamp: 1703310653947 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-compress-raw-bzip2-2.214-pl5321hda65f42_0.conda + sha256: 2cbd3fcb7028415654057ab3142cee1e5cc4cf9bdd0e590f072e8ecd29cb6382 + md5: 1ec33b9f74a71c17cc5579e35027832a depends: - __glibc >=2.17,<3.0.a0 - - libfuse3 >=3.18.0,<4.0a0 - libgcc >=14 - license: GPL-3.0-or-later - license_family: GPL + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 58878 - timestamp: 1766170267806 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fuse-overlayfs-1.16-hde7ff99_1.conda - sha256: f757049e625cdfa8c85f4bb5ae1113466db327666e3817b90f152a8b284f52ff - md5: 5fccda530a5f21f8604b414c7d0b0f73 + size: 55733 + timestamp: 1761332551110 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-compress-raw-zlib-2.214-pl5321h4dac143_0.conda + sha256: 4fd3a11f8dbd2c9d1a1c5547e344ad20412a3f0d36967502d9764e1b2734dd47 + md5: 943e7033e6f709adf0d89a3af51ab81b depends: - - libfuse3 >=3.18.0,<4.0a0 + - __glibc >=2.17,<3.0.a0 - libgcc >=14 - license: GPL-3.0-or-later - license_family: GPL + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 62687 - timestamp: 1766170300730 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gawk-5.3.1-hcd3d067_0.conda - sha256: ec4ebb9444dccfcbff8a2d19b2811b48a20a58dcd08b29e3851cb930fc0f00d8 - md5: 91d4414ab699180b2b0b10b8112c5a2f + size: 81114 + timestamp: 1761332700914 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-encode-3.21-pl5321hb9d3cd8_1.conda + sha256: 4cbe4125efe8763e1ad44448852b04481002f1dac84b6052cec1626df79e3a16 + md5: a418a0e7010007df65768e4e4b96dd14 depends: - __glibc >=2.17,<3.0.a0 - - gmp >=6.3.0,<7.0a0 - - libasprintf >=0.22.5,<1.0a0 - libgcc >=13 - - libgettextpo >=0.22.5,<1.0a0 - - mpfr >=4.2.1,<5.0a0 - - readline >=8.2,<9.0a0 - license: GPL-3.0-or-later - license_family: GPL + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-exporter + - perl-parent + - perl-storable + license: GPL-1.0-or-later OR Artistic-1.0-Perl purls: [] - size: 1202471 - timestamp: 1726677363710 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gawk-5.3.1-h01806b3_0.conda - sha256: c6d0245483a00dbe6e460dd61891c59eb0bb2197d00f0e70c6c010658c5c14ca - md5: 3c72369316211f41c69ca0b7359b76ee + size: 1731511 + timestamp: 1728247059262 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-pathtools-3.75-pl5321hb9d3cd8_2.conda + sha256: a80bc265aa749ae03fdd6d5f2098312ea6f43cc193ea7aba0e6e4304d84ce8c0 + md5: 03d88c89dfac8a26adcdeff242f94007 depends: - - gmp >=6.3.0,<7.0a0 - - libasprintf >=0.22.5,<1.0a0 + - __glibc >=2.17,<3.0.a0 - libgcc >=13 - - libgettextpo >=0.22.5,<1.0a0 - - mpfr >=4.2.1,<5.0a0 - - readline >=8.2,<9.0a0 - license: GPL-3.0-or-later - license_family: GPL + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-carp + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 1245465 - timestamp: 1726679980735 -- conda: https://conda.anaconda.org/conda-forge/osx-64/gawk-5.3.1-h0631170_0.conda - sha256: 289022e6e9d82a88b09f6e95fac5b6e818708bd181679a009740c58004c273af - md5: b6e1434b21225b3f8d5dfa8e7aee72b0 + size: 50681 + timestamp: 1741783312134 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-scalar-list-utils-1.70-pl5321hb03c661_0.conda + sha256: 00678b34a57df53fa31585ff1579f42a6dfc8b1b059fd1b386c6e89573959a9f + md5: 046486011bf7674e3c2f2a1513ac4f3d depends: - - __osx >=10.13 - - gmp >=6.3.0,<7.0a0 - - libasprintf >=0.22.5,<1.0a0 - - libgettextpo >=0.22.5,<1.0a0 - - libintl >=0.22.5,<1.0a0 - - mpfr >=4.2.1,<5.0a0 - - readline >=8.2,<9.0a0 - license: GPL-3.0-or-later - license_family: GPL + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 1185588 - timestamp: 1726677504554 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gawk-5.3.1-h8a92848_0.conda - sha256: d5423de17a56f40c8e091bd471c3a3f942f0d78e89e029a7398cdf3a9fda4447 - md5: c5a8bf0b848565f613f44915bad8bc44 + size: 51958 + timestamp: 1753965684679 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-storable-3.15-pl5321hb9d3cd8_2.conda + sha256: 25beba40154a394189d0ff2afd31683d79c9106d47e77e12d20900d053dffaf6 + md5: 212f63a5c7c753ecf0a74c349b9270c5 depends: - - __osx >=11.0 - - gmp >=6.3.0,<7.0a0 - - libasprintf >=0.22.5,<1.0a0 - - libgettextpo >=0.22.5,<1.0a0 - - libintl >=0.22.5,<1.0a0 - - mpfr >=4.2.1,<5.0a0 - - readline >=8.2,<9.0a0 - license: GPL-3.0-or-later - license_family: GPL + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 1150948 - timestamp: 1726677426423 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - sha256: 9b34b57b06b485e33a40d430f71ac88c8f381673592507cf7161c50ff0832772 - md5: 52d6457abc42e320787ada5f9033fa99 + size: 71475 + timestamp: 1741353849888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a + md5: c01af13bdc553d1a8fbfff6e8db075f0 depends: - - conda-gcc-specs - - gcc_impl_linux-64 14.3.0 hbdf3cc3_18 - license: BSD-3-Clause - license_family: BSD + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT purls: [] - size: 29506 - timestamp: 1771378321585 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_18.conda - sha256: debc5c801b3af35f1d474aead8621c4869a022d35ca3c5195a9843d81c1c9ab4 - md5: db4bf1a70c2481c06fe8174390a325c0 + size: 450960 + timestamp: 1754665235234 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda + sha256: c9601efb1af5391317e04eca77c6fe4d716bf1ca1ad8da2a05d15cb7c28d7d4e + md5: 1bee70681f504ea424fb07cdb090c001 depends: - - conda-gcc-specs - - gcc_impl_linux-aarch64 14.3.0 h533bfc8_18 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 29438 - timestamp: 1771378102660 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - sha256: 3b31a273b806c6851e16e9cf63ef87cae28d19be0df148433f3948e7da795592 - md5: 30bb690150536f622873758b0e8d6712 - depends: - - binutils_impl_linux-64 >=2.45 - - libgcc >=14.3.0 - - libgcc-devel_linux-64 14.3.0 hf649bbc_118 - - libgomp >=14.3.0 - - libsanitizer 14.3.0 h8f1669f_18 - - libstdcxx >=14.3.0 - - libstdcxx-devel_linux-64 14.3.0 h9f08a49_118 - - sysroot_linux-64 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 76302378 - timestamp: 1771378056505 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-h533bfc8_18.conda - sha256: e2488aac8472cfdff4f8a893861acd1ce1c66eafb28e7585ec52fe4e7546df7e - md5: 2ac1b579c1560e021a4086d0d704e2be - depends: - - binutils_impl_linux-aarch64 >=2.45 - - libgcc >=14.3.0 - - libgcc-devel_linux-aarch64 14.3.0 h25ba3ff_118 - - libgomp >=14.3.0 - - libsanitizer 14.3.0 hedb4206_18 - - libstdcxx >=14.3.0 - - libstdcxx-devel_linux-aarch64 14.3.0 h57c8d61_118 - - sysroot_linux-aarch64 - license: GPL-3.0-only WITH GCC-exception-3.1 + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: GPL-2.0-or-later license_family: GPL purls: [] - size: 69149627 - timestamp: 1771377858762 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda - sha256: 27ad0cd10dccffca74e20fb38c9f8643ff8fce56eee260bf89fa257d5ab0c90a - md5: 1403ed5fe091bd7442e4e8a229d14030 - depends: - - gcc_impl_linux-64 14.3.0.* - - binutils_linux-64 - - sysroot_linux-64 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 28946 - timestamp: 1770908213807 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_21.conda - sha256: 2b4c579549e63f8f7e29aa332a95b85a5a33976d6caf42d7c3dc147d2939d7a0 - md5: dfe811f86ef2d8f511263ef38b773a39 - depends: - - gcc_impl_linux-aarch64 14.3.0.* - - binutils_linux-aarch64 - - sysroot_linux-aarch64 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 28666 - timestamp: 1770908257439 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-14.3.0-h76987e4_18.conda - sha256: c216b97f00973fc6c37af16d1d974635e81cfc93462123b1d0ffc93fe509ea01 - md5: 958a6ecb4188cce9edbd9bbd2831a61d + size: 115175 + timestamp: 1720805894943 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e depends: - - gcc 14.3.0 h0dff253_18 - - gcc_impl_linux-64 14.3.0 hbdf3cc3_18 - - gfortran_impl_linux-64 14.3.0 h1a219da_18 - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT purls: [] - size: 28880 - timestamp: 1771378338951 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran-14.3.0-ha384071_18.conda - sha256: ba77c66ed4f1475493f61bcfad4d6133926b09d532ce26b575c48f914c5c463a - md5: 714666fb5477ba93f945d422ad16c698 + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.13-h6add32d_100_cp313.conda + build_number: 100 + sha256: 7f77eb57648f545c1f58e10035d0d9d66b0a0efb7c4b58d3ed89ec7269afdde1 + md5: 05051be49267378d2fcd12931e319ac3 depends: - - gcc 14.3.0 h2e72a27_18 - - gcc_impl_linux-aarch64 14.3.0 h533bfc8_18 - - gfortran_impl_linux-aarch64 14.3.0 h6b0ea1e_18 - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.5,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libuuid >=2.42,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.6,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 purls: [] - size: 28772 - timestamp: 1771378115762 -- conda: https://conda.anaconda.org/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda - sha256: e99605f629a4baceba28bfda6305f6898a42a1a05a5833a92808b737457a0711 - md5: 6077316830986f224d771f9e6ba5c516 + size: 37358322 + timestamp: 1775614712638 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec depends: - - cctools - - gfortran_osx-64 14.3.0 - - ld64 - license: GPL-3.0-or-later WITH GCC-exception-3.1 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only license_family: GPL purls: [] - size: 32631 - timestamp: 1751220511321 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda - sha256: cfdf9b4dd37ddfc15ea1c415619d4137004fa135d7192e5cdcea8e3944dc9df7 - md5: e148e0bc9bbc90b6325a479a5501786d + size: 345073 + timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_1.conda + sha256: be1a6c99d1b9b03d6154a1de8580c8368753c8cd857f90f92298447bc206cff3 + md5: 20fe8f4601442dc28bb966eaa0ea40ed depends: - - cctools - - gfortran_osx-arm64 14.3.0 - - ld64 - license: GPL-3.0-or-later WITH GCC-exception-3.1 - license_family: GPL + - __glibc >=2.17,<3.0.a0 + - gcc_impl_linux-64 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + - rust-std-x86_64-unknown-linux-gnu 1.94.0 h2c6d0dc_1 + - sysroot_linux-64 >=2.17 + license: MIT + license_family: MIT purls: [] - size: 32740 - timestamp: 1751220440768 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_18.conda - sha256: d8c8ba10471d4ec6e9d28b5a61982b0f49cb6ad55a6c84cb85b71f026329bd09 - md5: 91531d5176126c652e8b8dfcfa263dcd + size: 178651484 + timestamp: 1777308797383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rust-script-0.36.0-hdab8a38_0.conda + sha256: 888f4c0abacd567184ff15c44f670f038ab4120954ebbda98dd701440705435b + md5: 57bd0970753bcb5a1f20d8f96accdc7c depends: - - gcc_impl_linux-64 >=14.3.0 - - libgcc >=14.3.0 - - libgfortran5 >=14.3.0 - - libstdcxx >=14.3.0 - - sysroot_linux-64 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - rust >=1.74 + constrains: + - __glibc >=2.17 + license: MIT AND Apache-2.0 purls: [] - size: 18544424 - timestamp: 1771378230570 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_18.conda - sha256: 1c14463bf8c434cc97bb7dd889a7fff16edcef0ff52b4701f25acf658f96ddbb - md5: acc280aa03c9f88dd8ca419341e88b1a + size: 1164833 + timestamp: 1755479555168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda + sha256: d167fa92781bcdcd3b9aaa6bb1cd50c5b108f6190c170098a118b5cf5df2f881 + md5: 8e0b8654ead18e50af552e54b5a08a61 depends: - - gcc_impl_linux-aarch64 >=14.3.0 - - libgcc >=14.3.0 - - libgfortran5 >=14.3.0 - - libstdcxx >=14.3.0 - - sysroot_linux-aarch64 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libsqlite 3.53.1 h0c1763c_0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - readline >=8.3,<9.0a0 + license: blessing purls: [] - size: 14636716 - timestamp: 1771378028447 -- conda: https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda - sha256: 7a2a952ffee0349147768c1d6482cb0933349017056210118ebd5f0fb688f5d5 - md5: 1a81d1a0cb7f241144d9f10e55a66379 + size: 205399 + timestamp: 1777986477546 +- conda: https://conda.anaconda.org/conda-forge/linux-64/squashfs-tools-4.7.5-h7b2cdf3_0.conda + sha256: 26ff56e6971967fb3db558522bd7c48be138a6dd4d89a3f0d1da7fc193f2fa85 + md5: 6736d727970007fe6822334502eaabc5 depends: - - __osx >=10.13 - - cctools_osx-64 - - clang - - gmp >=6.3.0,<7.0a0 - - isl 0.26.* - - libcxx >=17 - - libgfortran-devel_osx-64 14.3.0.* - - libgfortran5 >=14.3.0 - - libiconv >=1.18,<2.0a0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - zstd >=1.5.7,<1.6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - liblzma >=5.8.2,<6.0a0 + - lzo >=2.10,<3.0a0 - libzlib >=1.3.1,<2.0a0 - - mpc >=1.3.1,<2.0a0 - - mpfr >=4.2.1,<5.0a0 - - zlib - license: GPL-3.0-only WITH GCC-exception-3.1 + license: GPL-2.0-or-later license_family: GPL purls: [] - size: 23083852 - timestamp: 1759709470800 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda - sha256: c05c634388e180f79c70a5989d2b25977716b7f6d5e395119ad0007cf4a7bcbf - md5: 1e9ec88ecc684d92644a45c6df2399d0 + size: 282115 + timestamp: 1772548039399 +- conda: https://conda.anaconda.org/conda-forge/linux-64/squashfuse-0.6.1-hb8971b7_1.conda + sha256: 44e9cba06e0fdce1520891f0bda7691e1f41ab221e5773016e45cb0dda21a47d + md5: b900adfc16e5367aa80929e66809aff2 depends: - - __osx >=11.0 - - cctools_osx-arm64 - - clang - - gmp >=6.3.0,<7.0a0 - - isl 0.26.* - - libcxx >=17 - - libgfortran-devel_osx-arm64 14.3.0.* - - libgfortran5 >=14.3.0 - - libiconv >=1.18,<2.0a0 + - __glibc >=2.17,<3.0.a0 + - libfuse3 >=3.18.0,<4.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 - libzlib >=1.3.1,<2.0a0 - - mpc >=1.3.1,<2.0a0 - - mpfr >=4.2.1,<5.0a0 - - zlib - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 20286770 - timestamp: 1759712171482 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-hfa02b96_21.conda - sha256: 406e1b10478b29795377cc2ad561618363aaf37b208e5cb3de7858256f73276a - md5: 234863e90d09d229043af1075fcf8204 - depends: - - gfortran_impl_linux-64 14.3.0.* - - gcc_linux-64 ==14.3.0 h298d278_21 - - binutils_linux-64 - - sysroot_linux-64 - license: BSD-3-Clause + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause license_family: BSD purls: [] - size: 27130 - timestamp: 1770908213808 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h4f85a2c_21.conda - sha256: 005ef6a3b9025faa43ffd14db9876c6978259205dea3a520af0e1b6ba5a3bc34 - md5: a171bf2d076aa473e90ef1b3d1b1206d + size: 64133 + timestamp: 1766138155082 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac + md5: cffd3bdd58090148f4cfcd831f4b26ab depends: - - gfortran_impl_linux-aarch64 14.3.0.* - - gcc_linux-aarch64 ==14.3.0 h118592a_21 - - binutils_linux-aarch64 - - sysroot_linux-aarch64 - license: BSD-3-Clause + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL license_family: BSD purls: [] - size: 26877 - timestamp: 1770908257439 -- conda: https://conda.anaconda.org/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda - sha256: 14014ad4d46e894645979cbad42dd509482172095c756bdb5474918e0638bd57 - md5: 979b3c36c57d31e1112fa1b1aec28e02 + size: 3301196 + timestamp: 1769460227866 +- conda: https://conda.anaconda.org/conda-forge/linux-64/unzip-6.0-hb03c661_4.conda + sha256: 489ee14dcc1080e45d07531e89b1c690a8df68ca6a817ade536e6ef4cdc77b9e + md5: 7f58240fa4cd5b42607606333cf8b550 depends: - - cctools_osx-64 - - clang - - clang_osx-64 - - gfortran_impl_osx-64 14.3.0 - - ld64_osx-64 - - libgfortran - - libgfortran-devel_osx-64 14.3.0 - - libgfortran5 >=14.3.0 - license: GPL-3.0-or-later WITH GCC-exception-3.1 - license_family: GPL + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LicenseRef-BSD-like purls: [] - size: 35767 - timestamp: 1751220493617 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda - sha256: 2644e5f4b4eed171b12afb299e2413be5877db92f30ec03690621d1ae648502c - md5: 8db8c0061c0f3701444b7b9cc9966511 + size: 146901 + timestamp: 1754913060109 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wget-1.25.0-h653f8fd_1.conda + sha256: 66a5a05e0e44fd7a57e24d77665d5d6672646a7b316575b2f679108966d9124e + md5: 3b97a15e7345c7f6c51bb57bffad7c93 depends: - - cctools_osx-arm64 - - clang - - clang_osx-arm64 - - gfortran_impl_osx-arm64 14.3.0 - - ld64_osx-arm64 - - libgfortran - - libgfortran-devel_osx-arm64 14.3.0 - - libgfortran5 >=14.3.0 - license: GPL-3.0-or-later WITH GCC-exception-3.1 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libidn2 >=2,<3.0a0 + - libunistring >=0,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - zlib + license: GPL-3.0-or-later license_family: GPL purls: [] - size: 35951 - timestamp: 1751220424258 -- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda - sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff - md5: 3bf7b9fd5a7136126e0234db4b87c8b6 + size: 746336 + timestamp: 1772232737502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b + md5: fb901ff28063514abb6046c9ec2c4a45 depends: - - libgcc-ng >=12 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 license: MIT license_family: MIT purls: [] - size: 77248 - timestamp: 1712692454246 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda - sha256: a79dc3bd54c4fb1f249942ee2d5b601a76ecf9614774a4cff9af49adfa458db2 - md5: 2f809afaf0ba1ea4135dce158169efac + size: 58628 + timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 + md5: 1c74ff8c35dcadf952a16f752ca5aa49 depends: - - libgcc-ng >=12 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.2,<2.0a0 license: MIT license_family: MIT purls: [] - size: 82124 - timestamp: 1712692444545 -- pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl - name: gitdb - version: 4.0.12 - sha256: 67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf - requires_dist: - - smmap>=3.0.1,<6 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - name: gitpython - version: 3.1.46 - sha256: 79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058 - requires_dist: - - gitdb>=4.0.1,<5 - - typing-extensions>=3.10.0.2 ; python_full_version < '3.10' - - coverage[toml] ; extra == 'test' - - ddt>=1.1.1,!=1.4.3 ; extra == 'test' - - mock ; python_full_version < '3.8' and extra == 'test' - - mypy==1.18.2 ; python_full_version >= '3.9' and extra == 'test' - - pre-commit ; extra == 'test' - - pytest>=7.3.1 ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-instafail ; extra == 'test' - - pytest-mock ; extra == 'test' - - pytest-sugar ; extra == 'test' - - typing-extensions ; python_full_version < '3.11' and extra == 'test' - - sphinx>=7.1.2,<7.2 ; extra == 'doc' - - sphinx-rtd-theme ; extra == 'doc' - - sphinx-autodoc-typehints ; extra == 'doc' - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda - sha256: 309cf4f04fec0c31b6771a5809a1909b4b3154a2208f52351e1ada006f4c750c - md5: c94a5994ef49749880a8139cf9afcbe1 + size: 27590 + timestamp: 1741896361728 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda + sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 + md5: 861fb6ccbc677bb9a9fb2468430b9c6a depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: GPL-2.0-or-later OR LGPL-3.0-or-later + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 460055 - timestamp: 1718980856608 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h0a1ffab_2.conda - sha256: a5e341cbf797c65d2477b27d99091393edbaa5178c7d69b7463bb105b0488e69 - md5: 7cbfb3a8bb1b78a7f5518654ac6725ad + size: 839652 + timestamp: 1770819209719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b + md5: b2895afaf55bf96a8c8282a2e47a5de0 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: GPL-2.0-or-later OR LGPL-3.0-or-later + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT purls: [] - size: 417323 - timestamp: 1718980707330 -- conda: https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda - sha256: 75aa5e7a875afdcf4903b7dc98577672a3dc17b528ac217b915f9528f93c85fc - md5: 427101d13f19c4974552a4e5b072eef1 + size: 15321 + timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda + sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 + md5: 1dafce8548e38671bea82e3f5c6ce22f depends: - - __osx >=10.13 - - libcxx >=16 - license: GPL-2.0-or-later OR LGPL-3.0-or-later + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT purls: [] - size: 428919 - timestamp: 1718981041839 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd - md5: eed7278dfbab727b56f2c0b64330814b + size: 20591 + timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f + md5: 34e54f03dfea3e7a2dcf1453a85f1085 depends: - - __osx >=11.0 - - libcxx >=16 - license: GPL-2.0-or-later OR LGPL-3.0-or-later + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 365188 - timestamp: 1718981343258 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gocryptfs-2.6.1-ha770c72_0.conda - sha256: ce4a5def3bb39644f1b3b9e948a6c897dbae5b3a47d93011447757990d257838 - md5: bb437fbff41ae6014e00e92a3121ab9f + size: 50326 + timestamp: 1769445253162 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 + md5: ba231da7fccf9ea1e768caf5c7099b84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT purls: [] - size: 3874149 - timestamp: 1754972186137 -- conda: https://conda.anaconda.org/bioconda/noarch/gottcha2-2.1.9-pyhdfd78af_0.tar.bz2 - sha256: 39e09ae60dfe203ba560a830ba08e7cd62171a6d3214739109984183eee7393c - md5: 355b6d6a78a929dcee2f7cf37c4807a5 + size: 20071 + timestamp: 1759282564045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a + md5: 17dcc85db3c7886650b8908b183d6876 depends: - - biom-format >=2.1.7 - - gawk - - minimap2 >=2.17 - - numpy - - pandas - - python >=3.6 - - requests - - tqdm - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/gottcha2?source=hash-mapping - size: 39004 - timestamp: 1744758713139 -- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c - md5: 2cd94587f3a401ae05e03a6caf09539d + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 47179 + timestamp: 1727799254088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda + sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 + md5: e192019153591938acf7322b6459d36e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libstdcxx >=14 - license: LGPL-2.0-or-later - license_family: LGPL + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: MIT + license_family: MIT purls: [] - size: 99596 - timestamp: 1755102025473 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda - sha256: c9b1781fe329e0b77c5addd741e58600f50bef39321cae75eba72f2f381374b7 - md5: 4aa540e9541cc9d6581ab23ff2043f13 + size: 30456 + timestamp: 1769445263457 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e depends: - - libgcc >=14 - - libstdcxx >=14 - license: LGPL-2.0-or-later - license_family: LGPL + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 102400 - timestamp: 1755102000043 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - sha256: 1b490c9be9669f9c559db7b2a1f7d8b973c58ca0c6f21a5d2ba3f0ab2da63362 - md5: 19189121d644d4ef75fed05383bc75f5 + size: 33005 + timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda + sha256: a8afba4a55b7b530eb5c8ad89737d60d60bc151a03fbef7a2182461256953f0e + md5: 279b0de5f6ba95457190a1c459a64e31 depends: - - gcc 14.3.0 h0dff253_18 - - gxx_impl_linux-64 14.3.0 h2185e75_18 - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 28883 - timestamp: 1771378355605 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-14.3.0-ha384071_18.conda - sha256: 09fb56bcb1594d667e39b1ff4fced377f1b3f6c83f5b651d500db0b4865df68a - md5: 3d5380505980f8859a796af4c1b49452 + size: 379686 + timestamp: 1731860547604 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a + md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f depends: - - gcc 14.3.0 h2e72a27_18 - - gxx_impl_linux-aarch64 14.3.0 h0d4f5d4_18 - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxi >=1.7.10,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 28822 - timestamp: 1771378129202 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - sha256: 38ffca57cc9c264d461ac2ce9464a9d605e0f606d92d831de9075cb0d95fc68a - md5: 6514b3a10e84b6a849e1b15d3753eb22 + size: 32808 + timestamp: 1727964811275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad + md5: a77f85f77be52ff59391544bfe73390a depends: - - gcc_impl_linux-64 14.3.0 hbdf3cc3_18 - - libstdcxx-devel_linux-64 14.3.0 h9f08a49_118 - - sysroot_linux-64 - - tzdata - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT purls: [] - size: 14566100 - timestamp: 1771378271421 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_18.conda - sha256: 859a78ff16bef8d1d1d89d0604929c3c256ac0248b9a688e8defe9bbc027c886 - md5: a12277d1ec675dbb993ad72dce735530 + size: 85189 + timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + sha256: 245c9ee8d688e23661b95e3c6dd7272ca936fabc03d423cdb3cdee1bbcf9f2f2 + md5: c2a01a08fc991620a74b32420e97868a depends: - - gcc_impl_linux-aarch64 14.3.0 h533bfc8_18 - - libstdcxx-devel_linux-aarch64 14.3.0 h57c8d61_118 - - sysroot_linux-aarch64 - - tzdata - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - __glibc >=2.17,<3.0.a0 + - libzlib 1.3.2 h25fd6f3_2 + license: Zlib + license_family: Other purls: [] - size: 13513218 - timestamp: 1771378064341 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda - sha256: 1e07c197e0779fa9105e59cd55a835ded96bfde59eb169439736a89b27b48e5d - md5: 7b51f4ff82eeb1f386bfee20a7bed3ed + size: 95931 + timestamp: 1774072620848 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 depends: - - gxx_impl_linux-64 14.3.0.* - - gcc_linux-64 ==14.3.0 h298d278_21 - - binutils_linux-64 - - sysroot_linux-64 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 27503 - timestamp: 1770908213813 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h32e4f2e_21.conda - sha256: 10059135f9960de93f991ce7fb6ef9d833dc2ac675459a1a08def052e5a29667 - md5: 3114b029596eff0aeb9fc0c81f598211 + size: 601375 + timestamp: 1764777111296 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 + md5: 468fd3bb9e1f671d36c2cbc677e56f1d depends: - - gxx_impl_linux-aarch64 14.3.0.* - - gcc_linux-aarch64 ==14.3.0 h118592a_21 - - binutils_linux-aarch64 - - sysroot_linux-aarch64 + - libgomp >=7.5.0 + constrains: + - openmp_impl <0.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 27275 - timestamp: 1770908257444 -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 - md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + size: 28926 + timestamp: 1770939656741 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda + sha256: ea2233e2db9908c2e5f29d3ca420a546b4583253f4f70abb5494cdd676866d42 + md5: 4a98cbc4ade694520227402ff8880630 depends: - - python >=3.10 - - hyperframe >=6.1,<7 - - hpack >=4.1,<5 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/h2?source=hash-mapping - size: 95967 - timestamp: 1756364871835 -- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.15.1-nompi_py313h253c126_101.conda - sha256: 2de2c63ad6e7483456f6ff359380df63edf32770c140ec08c904ff89b6ed3903 - md5: 5d90c98527ecc832287115d57c121062 + - libgcc >=14 + license: LGPL-2.1-or-later + license_family: GPL + purls: [] + size: 615729 + timestamp: 1768327548407 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/apptainer-1.4.5-hb8e6bbc_0.conda + sha256: fc35c3f913f57b5ea36fc79499422e1c15416ec3a89dc0488b8cad8c8ec68cf9 + md5: 45f8e4f2c287437bc63309a99ede05f7 depends: - - __glibc >=2.17,<3.0.a0 - - cached-property - - hdf5 >=1.14.6,<1.14.7.0a0 + - cni-plugins >=0.7.4 + - fuse-overlayfs + - libarchive >=3.8.2,<3.9.0a0 - libgcc >=14 - - numpy >=1.23,<3 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - libseccomp >=2.4.4,<3.0a0 + - libstdcxx >=14 + - libuuid >=2.41.2,<3.0a0 + - openssl >=3.5.4,<4.0a0 + - squashfs-tools + - squashfuse + constrains: + - singularity ==9999999999 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/h5py?source=hash-mapping - size: 1285688 - timestamp: 1764016673819 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/h5py-3.15.1-nompi_py313h624fb37_101.conda - sha256: 9b1e98bac62ef66d1c1cc158145ab286420c62d2e07c2272648b844926b0bcac - md5: 068d33684b43b2e83d77db6e70085f0a - depends: - - cached-property - - hdf5 >=1.14.6,<1.14.7.0a0 - - libgcc >=14 - - numpy >=1.23,<3 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause + purls: [] + size: 19747442 + timestamp: 1764725021123 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45.1-default_hf1166c9_102.conda + sha256: 63a1bec2fc966476bf7a387a20e8987edd5640d37a40ffb2f6e2217ef82b816b + md5: 3a238b9dcf59d03a379712f270867d80 + depends: + - binutils_impl_linux-aarch64 >=2.45.1,<2.45.2.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 35511 + timestamp: 1774197558632 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_102.conda + sha256: 7fd4ddde2f0150d015dfa9f2db5f428bd1570078f270e4bd4f116487a52de169 + md5: 56a04d796d7e3cdc9f8d2e1278e91bff + depends: + - ld_impl_linux-aarch64 2.45.1 default_h1979696_102 + - sysroot_linux-aarch64 + - zstd >=1.5.7,<1.6.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 4683754 + timestamp: 1774197535605 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45.1-default_hf1166c9_102.conda + sha256: ad076ff5f3d7734c48ea241a99c16336c278081a5f7a523329d0d5956723c481 + md5: 68d0661516aed9cab68d2ad6e287941f + depends: + - binutils_impl_linux-aarch64 2.45.1 default_h5f4c503_102 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 36267 + timestamp: 1774197561368 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c + md5: 840d8fc0d7b3209be93080bc20e07f2d + depends: + - libgcc >=14 + license: bzip2-1.0.6 license_family: BSD - purls: - - pkg:pypi/h5py?source=hash-mapping - size: 1252914 - timestamp: 1764016755530 -- conda: https://conda.anaconda.org/conda-forge/osx-64/h5py-3.15.1-nompi_py313h2a429bc_101.conda - sha256: 61343fbe32e8f665918f4e976bb0bcc217ed2ca2aab3f182f479f76ff15188b2 - md5: de9fd6ce4bb0957d1909069fad48aafb + purls: [] + size: 192412 + timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda + sha256: 7ec8a68efe479e2e298558cbc2e79d29430d5c7508254268818c0ae19b206519 + md5: 1dfbec0d08f112103405756181304c16 depends: - - __osx >=10.13 - - cached-property - - hdf5 >=1.14.6,<1.14.7.0a0 - - numpy >=1.23,<3 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 217215 + timestamp: 1765214743735 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-1.11.0-hdceaead_0.conda + sha256: a16c5078619d60e54f75336ed2bbb4ee0fb6f711de02dd364983748beda31e04 + md5: 89bc32110bba0dc160bb69427e196dc4 + depends: + - binutils + - gcc + - gcc_linux-aarch64 14.* license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/h5py?source=hash-mapping - size: 1153942 - timestamp: 1764017163770 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.15.1-nompi_py313h7aa1c8b_101.conda - sha256: 72261e805d73e520417a1b0f659968ea410be925bda8e808bf1c78f1fb4270da - md5: af275e004ef52480fccdde18f4bdcd12 + purls: [] + size: 6721 + timestamp: 1753098688332 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda + sha256: 37cfff940d2d02259afdab75eb2dbac42cf830adadee78d3733d160a1de2cc66 + md5: cd55953a67ec727db5dc32b167201aa6 depends: - - __osx >=11.0 - - cached-property - - hdf5 >=1.14.6,<1.14.7.0a0 - - numpy >=1.23,<3 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.5,<2.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + size: 966667 + timestamp: 1741554768968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cni-1.0.1-h80d9677_0.tar.bz2 + sha256: b69b11a48a19a4421d2f2a53e065b36c4cd0e7d44956f826c7b34730d9472b73 + md5: 5f67bbbf4b7d6151b8f4d085441b3322 + depends: + - jq + - libgcc-ng >=9.4.0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1674303 + timestamp: 1631546880145 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cni-plugins-1.3.0-h652cbe9_0.conda + sha256: 177428c64357552d553a868c90a764f7aabe0457bf2cfa92562dbb509a92c35d + md5: 8b8de8bfad2fe81a71bb14ce41363629 + depends: + - cni 1.0.1.* + license: Apache-2.0 + license_family: Apache + purls: [] + size: 28568852 + timestamp: 1689422936272 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda + sha256: 7713d1af8c67d3052e2fb0a9d12cb6098210342995e5db4fd70fc9aae0630465 + md5: 10cfd53906b539dc866c79f5837ab577 + depends: + - c-compiler 1.11.0 hdceaead_0 + - cxx-compiler 1.11.0 h7b35c40_0 + - fortran-compiler 1.11.0 h151373c_0 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/h5py?source=hash-mapping - size: 1149087 - timestamp: 1764018311867 -- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.3.2-h6083320_0.conda - sha256: 92015faf283f9c0a8109e2761042cd47ae7a4505e24af42a53bc3767cb249912 - md5: d170a70fc1d5c605fcebdf16851bd54a + purls: [] + size: 7575 + timestamp: 1753098689062 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_19.conda + sha256: 10c8b60befb95c62662821b381f4bb0fa9b7108bdff9bc0971043d5b7f88cda1 + md5: a1123d27b812e311753af9b5987cf401 depends: - - __glibc >=2.17,<3.0.a0 - - cairo >=1.18.4,<2.0a0 - - graphite2 >=1.3.14,<2.0a0 - - icu >=78.2,<79.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - gcc_impl_linux-aarch64 >=14.3.0,<14.3.1.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 31704 + timestamp: 1778268711052 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coreutils-9.5-h31becfc_0.conda + sha256: 812c6f285b0073d93f3c5148d15f27cde85a29dbb8bf234c309a4696cc2aeabf + md5: 1c1921fdfebcaa18132711524e64259b + depends: + - libgcc-ng >=12 + license: GPL-3.0-or-later + license_family: GPL + purls: [] + size: 3334202 + timestamp: 1711658928010 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/curl-8.20.0-hc57f145_0.conda + sha256: 7812bfa95c64f6900deff0d26091599a969b216b9bec1c3156f974cf060e5ca7 + md5: bf7d70846cc20c1bfdc229784c615103 + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libcurl 8.20.0 hc57f145_0 - libgcc >=14 - - libglib >=2.86.3,<3.0a0 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - license: MIT + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl license_family: MIT purls: [] - size: 2035859 - timestamp: 1769445400168 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-12.3.2-h1134a53_0.conda - sha256: 2256234188df4651a202f5bd1428b6b11ce1442a4a2fc6baf403c293c1ff752e - md5: f8ab08bc3716972b7bd47e48a6884260 + size: 197100 + timestamp: 1777461491381 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda + sha256: b87cd33501867d999caa1a57e488e69dc9e08011ec8685586df754302247a7a4 + md5: 0234c63e6b36b1677fd6c5238ef0a4ec depends: - - cairo >=1.18.4,<2.0a0 - - graphite2 >=1.3.14,<2.0a0 - - icu >=78.2,<79.0a0 - - libexpat >=2.7.3,<3.0a0 + - c-compiler 1.11.0 hdceaead_0 + - gxx + - gxx_linux-aarch64 14.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6705 + timestamp: 1753098688728 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda + sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c + md5: 0fed1ff55f4938a65907f3ecf62609db + depends: + - libexpat >=2.7.4,<3.0a0 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 - libgcc >=14 - - libglib >=2.86.3,<3.0a0 - - libstdcxx >=14 + - libuuid >=2.41.3,<3.0a0 - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] - size: 2046698 - timestamp: 1769449788963 -- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda - sha256: 1fc50ce3b86710fba3ec9c5714f1612b5ffa4230d70bfe43e2a1436eacba1621 - md5: c223ee1429ba538f3e48cfb4a0b97357 + size: 279044 + timestamp: 1771382728182 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda + sha256: 3cbb537a1548455d1dcf49ebff80fa28c7448ec87c3e14779d3cc8f99a77fd29 + md5: b2ad788bde8ea90d5572bc2510e7d321 depends: - - __glibc >=2.17,<3.0.a0 - - libaec >=1.1.5,<2.0a0 - - libcurl >=8.18.0,<9.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - binutils + - c-compiler 1.11.0 hdceaead_0 + - gfortran + - gfortran_linux-aarch64 14.* license: BSD-3-Clause license_family: BSD purls: [] - size: 3708864 - timestamp: 1770390337946 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.6-nompi_hf95b8e7_106.conda - sha256: d906752d30d5d2c15667e38fd68cadb5010cc2fadaad42655a346452ecc2c722 - md5: 438cd796f1a3f98637c0bdd1691564b7 + size: 6740 + timestamp: 1753098688910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_0.conda + sha256: 5594df70ef3df016b99de44e61b4024b7f3ec3472db83c7ac7723eafa8b26d95 + md5: f11edf8adf0d119148b97f745548390d + depends: + - libfreetype 2.14.3 h8af1aa0_0 + - libfreetype6 2.14.3 hdae7a39_0 + license: GPL-2.0-only OR FTL + purls: [] + size: 173735 + timestamp: 1774301100144 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fuse-overlayfs-1.16-hde7ff99_1.conda + sha256: f757049e625cdfa8c85f4bb5ae1113466db327666e3817b90f152a8b284f52ff + md5: 5fccda530a5f21f8604b414c7d0b0f73 depends: - - libaec >=1.1.5,<2.0a0 - - libcurl >=8.18.0,<9.0a0 + - libfuse3 >=3.18.0,<4.0a0 - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 + license: GPL-3.0-or-later + license_family: GPL + purls: [] + size: 62687 + timestamp: 1766170300730 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_19.conda + sha256: 438e0f5a198bc752db3c1693371c20ac50347f0dae56e95d15a6e86f79bb1980 + md5: 72f889bb53eae093f7276b7ef1911cb2 + depends: + - conda-gcc-specs + - gcc_impl_linux-aarch64 14.3.0 h398eab4_19 license: BSD-3-Clause license_family: BSD purls: [] - size: 3913046 - timestamp: 1770397827092 -- conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hf563b80_106.conda - sha256: 4bcc7d54a011f1d515da2fb3406659574bae5f284bced126c756ed9ef151459f - md5: b74e900265ad3808337cd542cfad6733 + size: 29621 + timestamp: 1778268825860 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-h398eab4_19.conda + sha256: 48ad41e482417ecb1b0c608139192ccb35ab09df195df69085b9b9378000287b + md5: ad45f72d96f497f6cdfc31c86534c47f depends: - - __osx >=10.13 - - libaec >=1.1.5,<2.0a0 - - libcurl >=8.18.0,<9.0a0 - - libcxx >=19 - - libgfortran - - libgfortran5 >=14.3.0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - binutils_impl_linux-aarch64 >=2.45 + - libgcc >=14.3.0 + - libgcc-devel_linux-aarch64 14.3.0 h25ba3ff_119 + - libgomp >=14.3.0 + - libsanitizer 14.3.0 hedb4206_19 + - libstdcxx >=14.3.0 + - libstdcxx-devel_linux-aarch64 14.3.0 h57c8d61_119 + - sysroot_linux-aarch64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 68567347 + timestamp: 1778268606528 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h140ef2e_24.conda + sha256: 146e927a74c63a0b0767b50bf383c035bb9a08d9528dc7ff5532b4d7e51c88cf + md5: c4af9ee1622243ea5c22596656adc406 + depends: + - gcc_impl_linux-aarch64 14.3.0.* + - binutils_linux-aarch64 + - sysroot_linux-aarch64 license: BSD-3-Clause license_family: BSD purls: [] - size: 3526365 - timestamp: 1770391694712 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_106.conda - sha256: e91c2b8fe62d73bb56bdb9b5adcdcbedbd164ced288e0f361b8eb3f017ddcd7b - md5: 2d1270d283403c542680e969bea70355 + size: 28833 + timestamp: 1777144728101 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran-14.3.0-ha28f942_7.conda + sha256: a37a752156776aea2e6976a1bbba87b1160d1d4259a2455d956163b936fc665d + md5: 033c55ed42edc3d21528c6bc3f11421a depends: - - __osx >=11.0 - - libaec >=1.1.5,<2.0a0 - - libcurl >=8.18.0,<9.0a0 - - libcxx >=19 - - libgfortran - - libgfortran5 >=14.3.0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - gcc 14.3.0.* + - gcc_impl_linux-aarch64 14.3.0.* + - gfortran_impl_linux-aarch64 14.3.0.* license: BSD-3-Clause license_family: BSD purls: [] - size: 3299759 - timestamp: 1770390513189 -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba - md5: 0a802cb9888dd14eeefc611f05c40b6e + size: 30531 + timestamp: 1759967819421 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_19.conda + sha256: a32795b0cfae3bfa59359857865d20dc82ab142b1bc17b4ddc0c9f08bb50806b + md5: 7741f3d34cb2552da0b1975ea488fcb2 depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/hpack?source=hash-mapping - size: 30731 - timestamp: 1737618390337 -- conda: https://conda.anaconda.org/bioconda/linux-64/htslib-1.23-h566b1c6_0.conda - sha256: 71f16369db0a32da447e7f244f2e9db5db801335a0dbc9189adf0d0d673fb779 - md5: 307124911d36a3d976cd76f350085ead + - gcc_impl_linux-aarch64 >=14.3.0 + - libgcc >=14.3.0 + - libgfortran5 >=14.3.0 + - libstdcxx >=14.3.0 + - sysroot_linux-aarch64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 14838254 + timestamp: 1778268770944 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h56f1849_24.conda + sha256: e45b0d1fc96648609d31133353dcc9036b894390021c61357ec8024e861a9240 + md5: fc551b6938d7b2bff7ff69770b7675ca depends: - - bzip2 >=1.0.8,<2.0a0 - - libcurl >=8.17.0,<9.0a0 - - libdeflate >=1.22,<1.23.0a0 - - libgcc >=13 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.6.0,<4.0a0 - license: MIT - license_family: MIT - size: 1197549 - timestamp: 1765902682113 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/htslib-1.23-h7068f72_0.conda - sha256: 88acb19e6f9e90a3f3f1ef30c8d236f37305220e209069f7c89734c35e75fbaa - md5: 311f989d4154e720d136ef8901935def + - gfortran_impl_linux-aarch64 14.3.0.* + - gcc_linux-aarch64 ==14.3.0 h140ef2e_24 + - binutils_linux-aarch64 + - sysroot_linux-aarch64 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 27064 + timestamp: 1777144728101 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda + sha256: a79dc3bd54c4fb1f249942ee2d5b601a76ecf9614774a4cff9af49adfa458db2 + md5: 2f809afaf0ba1ea4135dce158169efac depends: - - bzip2 >=1.0.8,<2.0a0 - - libcurl >=8.17.0,<9.0a0 - - libdeflate >=1.22,<1.23.0a0 - - libgcc >=13 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.6.0,<4.0a0 + - libgcc-ng >=12 license: MIT license_family: MIT - size: 1379928 - timestamp: 1765902557577 -- conda: https://conda.anaconda.org/bioconda/osx-64/htslib-1.23-h9f635df_0.conda - sha256: 25b5078ec74b99d13fd5ef9d28c57698ec946a2b2f56a069d465501da5cecb11 - md5: 263ebc6f46dcd93365741ac7a70cd377 + purls: [] + size: 82124 + timestamp: 1712692444545 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda + sha256: c9b1781fe329e0b77c5addd741e58600f50bef39321cae75eba72f2f381374b7 + md5: 4aa540e9541cc9d6581ab23ff2043f13 depends: - - bzip2 >=1.0.8,<2.0a0 - - libcurl >=8.17.0,<9.0a0 - - libdeflate >=1.22,<1.23.0a0 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT - size: 989724 - timestamp: 1765903732305 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/htslib-1.23-hfcd771d_0.conda - sha256: 6891c85e61b76953c82116cc210712ed9a62f22d749df92fe52fa932e4996555 - md5: 72877077c08fb32e6cc19911f95710ad + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 102400 + timestamp: 1755102000043 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-14.3.0-ha28f942_7.conda + sha256: 7f38940a42d43bf7b969625686b64a11d52348d899d4487ed50673a09e7faece + md5: dac1f319c6157797289c174d062f87a1 depends: - - bzip2 >=1.0.8,<2.0a0 - - libcurl >=8.17.0,<9.0a0 - - libdeflate >=1.22,<1.23.0a0 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT - size: 982764 - timestamp: 1765902373405 -- pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl - name: humanfriendly - version: '10.0' - sha256: 1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477 - requires_dist: - - monotonic ; python_full_version == '2.7.*' - - pyreadline ; python_full_version < '3.8' and sys_platform == 'win32' - - pyreadline3 ; python_full_version >= '3.8' and sys_platform == 'win32' - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*' -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 - md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + - gcc 14.3.0.* + - gxx_impl_linux-aarch64 14.3.0.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 30526 + timestamp: 1759967828504 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_19.conda + sha256: d83ab2a25d52a2f564c9692aae1ef876a66ca2815f9997812df6babcf37d9e6e + md5: e0761ef9f08505f6d1544ab0e202c764 depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/hyperframe?source=hash-mapping - size: 17397 - timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - sha256: 142a722072fa96cf16ff98eaaf641f54ab84744af81754c292cb81e0881c0329 - md5: 186a18e3ba246eccfc7cff00cd19a870 + - gcc_impl_linux-aarch64 14.3.0 h398eab4_19 + - libstdcxx-devel_linux-aarch64 14.3.0 h57c8d61_119 + - sysroot_linux-aarch64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 13722799 + timestamp: 1778268804579 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h4116b17_24.conda + sha256: f5d76c1835c8fabbf5ad60f1e04ab4cff90741d2fe973741d973da26652985e6 + md5: 75e9e043f2ff48fd67b0854b6da5d5e4 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT + - gxx_impl_linux-aarch64 14.3.0.* + - gcc_linux-aarch64 ==14.3.0 h140ef2e_24 + - binutils_linux-aarch64 + - sysroot_linux-aarch64 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 12728445 - timestamp: 1767969922681 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - sha256: 09f7f9213eb68e7e4291cd476e72b37f3ded99ed957528567f32f5ba6b611043 - md5: 15b35dc33e185e7d2aac1cfcd6778627 + size: 27411 + timestamp: 1777144728101 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-11.5.1-he4899c9_0.conda + sha256: c12b8f527fac572307d00ebf407b7663d23f19406d7ccdc02eafb168ff3d09ad + md5: 7f100c1ba5a0f5f3a23bb9481c70e880 depends: + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 - libgcc >=14 + - libglib >=2.86.0,<3.0a0 - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] - size: 12852963 - timestamp: 1767975394622 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - sha256: d4cefbca587429d1192509edc52c88de52bc96c2447771ddc1f8bee928aed5ef - md5: 1e93aca311da0210e660d2247812fa02 + size: 2073367 + timestamp: 1758644209045 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c depends: - - __osx >=11.0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 license: MIT license_family: MIT purls: [] - size: 12358010 - timestamp: 1767970350308 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 - md5: 53abe63df7e10a6ba605dc5f9f961d36 - depends: - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/idna?source=hash-mapping - size: 50721 - timestamp: 1760286526795 -- pypi: https://files.pythonhosted.org/packages/5e/db/60da6f5a3c3f64e0b3940c4ad86e1971d9d2eb8b13a179c26eda5ec6a298/immutables-0.21-cp313-cp313-macosx_10_13_x86_64.whl - name: immutables - version: '0.21' - sha256: 79674b51aa8dd983f9ac55f7f67b433b1df84a6b4f28ab860588389a5659485b - requires_dist: - - flake8~=5.0 ; extra == 'test' - - pycodestyle~=2.9 ; extra == 'test' - - mypy~=1.4 ; extra == 'test' - - pytest~=7.4 ; extra == 'test' - requires_python: '>=3.8.0' -- pypi: https://files.pythonhosted.org/packages/9b/89/5420f1d16a652024fcccc9c07d46d4157fcaf33ff37c82412c83fc16ef36/immutables-0.21-cp313-cp313-macosx_11_0_arm64.whl - name: immutables - version: '0.21' - sha256: 93c8350f8f7d0d9693f708229d9d0578e6f3b785ce6da4bced1da97137aacfad - requires_dist: - - flake8~=5.0 ; extra == 'test' - - pycodestyle~=2.9 ; extra == 'test' - - mypy~=1.4 ; extra == 'test' - - pytest~=7.4 ; extra == 'test' - requires_python: '>=3.8.0' -- pypi: https://files.pythonhosted.org/packages/d2/d0/a5fb7c164ddb298ec37537e618b70dfa30c7cae9fac01de374c36489cbc9/immutables-0.21-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - name: immutables - version: '0.21' - sha256: 583d2a63e444ce1538cc2bda56ae1f4a1a11473dbc0377c82b516bc7eec3b81e - requires_dist: - - flake8~=5.0 ; extra == 'test' - - pycodestyle~=2.9 ; extra == 'test' - - mypy~=1.4 ; extra == 'test' - - pytest~=7.4 ; extra == 'test' - requires_python: '>=3.8.0' -- pypi: https://files.pythonhosted.org/packages/f3/a5/5fda0ee4a261a85124011ac0750fec678f00e1b2d4a5502b149a3b4d86d9/immutables-0.21-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: immutables - version: '0.21' - sha256: b274a52da9b106db55eceb93fc1aea858c4e6f4740189e3548e38613eafc2021 - requires_dist: - - flake8~=5.0 ; extra == 'test' - - pycodestyle~=2.9 ; extra == 'test' - - mypy~=1.4 ; extra == 'test' - - pytest~=7.4 ; extra == 'test' - requires_python: '>=3.8.0' -- conda: https://conda.anaconda.org/conda-forge/linux-64/isa-l-2.31.1-hb9d3cd8_1.conda - sha256: 75b15f01a6b286630c4a98be0d05e286275a5ef3868e23e6d9644e51b73650e1 - md5: 00f364ec0a7e975ec9d2fc720b19c129 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 157291 - timestamp: 1736497194571 + size: 12282786 + timestamp: 1720853454991 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/isa-l-2.31.1-h86ecc28_1.conda sha256: b0fca0395284e8a8c49b8f5e7ff30f6de7af1cca687ee91ef7ef24be89423ad3 md5: 181f534bcae7310bf7448513c91c24f9 @@ -3728,1344 +3873,1233 @@ packages: purls: [] size: 142570 timestamp: 1736497228613 -- conda: https://conda.anaconda.org/conda-forge/osx-64/isa-l-2.31.1-h6e16a3a_1.conda - sha256: 067aa4c822a9fa93eddd4f1f849da15a16c594d6ab97bd86d5a0a9d08705e0b5 - md5: ce862c9411f9c675a0d322a049b8689f +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.8.1-h06eaf92_0.conda + sha256: 1a37728f3ba8d1091be43437821a9e81830d8d2761955476d8533065854cdd4f + md5: a0d5124dde80081976ff6f1418571e94 depends: - - __osx >=10.13 - license: BSD-3-Clause - license_family: BSD + - oniguruma 6.9.* + - libgcc >=13 + - oniguruma >=6.9.10,<6.10.0a0 + license: MIT + license_family: MIT purls: [] - size: 148427 - timestamp: 1736497384136 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/isa-l-2.31.1-h5505292_1.conda - sha256: f0cad459ebfc209269cb7a964fc37d811aa973876c5508e529e414f379a38c23 - md5: 00c87ad2b46e1863f514b831674f1a43 + size: 344137 + timestamp: 1751447450170 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 + md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 depends: - - __osx >=11.0 - license: BSD-3-Clause - license_family: BSD + - libgcc >=13 + license: LGPL-2.1-or-later purls: [] - size: 122475 - timestamp: 1736497418302 -- conda: https://conda.anaconda.org/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda - sha256: d39bf147cb9958f197dafa0b8ad8c039b7374778edac05b5c78b712786e305c7 - md5: d06222822a9144918333346f145b68c6 + size: 129048 + timestamp: 1754906002667 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba + md5: d9ca108bd680ea86a963104b6b3e95ca depends: - - libcxx >=14.0.6 - track_features: - - isl_imath-32 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 894410 - timestamp: 1680649639107 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda - sha256: fc9272371750c56908b8e535755b1e23cf7803a2cc4a7d9ae539347baa14f740 - md5: e80e44a3f4862b1da870dc0557f8cf3b + size: 1517436 + timestamp: 1769773395215 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_0.conda + sha256: 1e5f68e4b36a0e1a278c6dc026bc3d7775518a15832cbc9d7fc1c0e4c47784b1 + md5: b1f8bee3c53a6d2c103fb4a1ae44f5c4 depends: - - libcxx >=14.0.6 - track_features: - - isl_imath-32 + - libgcc >=14 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 license: MIT license_family: MIT purls: [] - size: 819937 - timestamp: 1680649567633 -- pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - name: jinja2 - version: 3.1.6 - sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 - requires_dist: - - markupsafe>=2.0 - - babel>=2.7 ; extra == 'i18n' - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/linux-64/jq-1.8.1-h73b1eb8_0.conda - sha256: ab26cb11ad0d10f5c6637d925b044c74a3eacb5825686d3720313b3cb6d40cef - md5: 2714e43bfc035f7ef26796632aa1b523 + size: 296899 + timestamp: 1778079402392 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 + md5: a21644fc4a83da26452a718dc9468d5f depends: - - oniguruma 6.9.* - - libgcc >=13 - - __glibc >=2.17,<3.0.a0 - - oniguruma >=6.9.10,<6.10.0a0 - license: MIT + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-aarch64 2.45.1 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 875596 + timestamp: 1774197520746 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda + sha256: 8957fd460c1c132c8031f65fd5f56ec3807fd71b7cab2c5e2b0937b13404ab36 + md5: d13423b06447113a90b5b1366d4da171 + depends: + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 240444 + timestamp: 1773114901155 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarchive-3.8.7-gpl_hbe7d12b_101.conda + sha256: 48382f97e0ab02d758cfaec81d7df6fd1ee665c4e917c02d36b7e1a15369396e + md5: 5420789510bfaf085262fec8f15b7a64 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - liblzma >=5.8.3,<6.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 1006349 + timestamp: 1778486388260 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda + sha256: 41b04f995c9f63af8c4065a35931e46cbc2fdd6b9bf7e4c19f90d53cbb2bc8e5 + md5: 67828c963b17db7dc989fe5d509ef04a + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 4553739 + timestamp: 1770903929794 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.20.0-hc57f145_0.conda + sha256: 1607d3caf58f7d9e9ad9e5f0841737d0cfa47b5501d4e36fbf98e1c645d7393e + md5: 88da514c8db1a7f6a05297941a897af2 + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.68.1,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl license_family: MIT purls: [] - size: 313184 - timestamp: 1751447310552 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.8.1-h06eaf92_0.conda - sha256: 1a37728f3ba8d1091be43437821a9e81830d8d2761955476d8533065854cdd4f - md5: a0d5124dde80081976ff6f1418571e94 + size: 488942 + timestamp: 1777461485901 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda + sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 + md5: a9138815598fe6b91a1d6782ca657b0c depends: - - oniguruma 6.9.* - - libgcc >=13 - - oniguruma >=6.9.10,<6.10.0a0 + - libgcc >=14 license: MIT license_family: MIT purls: [] - size: 344137 - timestamp: 1751447450170 -- pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - name: jsonschema - version: 4.26.0 - sha256: d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce - requires_dist: - - attrs>=22.2.0 - - jsonschema-specifications>=2023.3.6 - - referencing>=0.28.4 - - rpds-py>=0.25.0 - - fqdn ; extra == 'format' - - idna ; extra == 'format' - - isoduration ; extra == 'format' - - jsonpointer>1.13 ; extra == 'format' - - rfc3339-validator ; extra == 'format' - - rfc3987 ; extra == 'format' - - uri-template ; extra == 'format' - - webcolors>=1.11 ; extra == 'format' - - fqdn ; extra == 'format-nongpl' - - idna ; extra == 'format-nongpl' - - isoduration ; extra == 'format-nongpl' - - jsonpointer>1.13 ; extra == 'format-nongpl' - - rfc3339-validator ; extra == 'format-nongpl' - - rfc3986-validator>0.1.0 ; extra == 'format-nongpl' - - rfc3987-syntax>=1.1.0 ; extra == 'format-nongpl' - - uri-template ; extra == 'format-nongpl' - - webcolors>=24.6.0 ; extra == 'format-nongpl' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl - name: jsonschema-specifications - version: 2025.9.1 - sha256: 98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe - requires_dist: - - referencing>=0.31.0 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl - name: jupyter-core - version: 5.9.1 - sha256: ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407 - requires_dist: - - platformdirs>=2.5 - - traitlets>=5.3 - - intersphinx-registry ; extra == 'docs' - - myst-parser ; extra == 'docs' - - pydata-sphinx-theme ; extra == 'docs' - - sphinx-autodoc-typehints ; extra == 'docs' - - sphinxcontrib-spelling ; extra == 'docs' - - traitlets ; extra == 'docs' - - ipykernel ; extra == 'test' - - pre-commit ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-timeout ; extra == 'test' - - pytest<9 ; extra == 'test' - requires_python: '>=3.10' -- conda: https://conda.anaconda.org/bioconda/linux-64/k8-1.2-he8db53b_6.tar.bz2 - sha256: 35143205ef4684f417f047c649aea110e0ceb1d6891001511dbceb2dea08be3d - md5: 6c44663f234185cc54d7a90c4d7a555a + size: 71117 + timestamp: 1761979776756 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 depends: - - __glibc >=2.17,<3.0.a0 + - ncurses - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - sysroot_linux-64 >=2.17 - license: MIT - license_family: MIT + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD purls: [] - size: 7535090 - timestamp: 1748942479223 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/k8-1.2-h1e84f2d_6.tar.bz2 - sha256: 0ba6fa95ab90f65baf3745503fab10b4af06547d896b210512fd33e3db849a73 - md5: fcf1913feb88f8be96f878bebf1fa5e9 + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 depends: - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD purls: [] - size: 9023150 - timestamp: 1748941474816 -- conda: https://conda.anaconda.org/bioconda/osx-64/k8-1.2-h2ec61ea_6.tar.bz2 - sha256: 596c13ecad0e679a907c229b9fcd07f649235ad25abbf783e8910a449ec60f2d - md5: 917525300d56b7a7ddac9e1bde2dd4ba + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.0-hfae3067_0.conda + sha256: 206c422a7f4b462d1dc17d558f0299088d0992bd3309ae83f5440fcc4f130602 + md5: 3bacd6171f0a3f8fddd06c3d5ae01955 depends: - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 + - libgcc >=14 + constrains: + - expat 2.8.0.* license: MIT license_family: MIT purls: [] - size: 8484801 - timestamp: 1748948933576 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/k8-1.2-hda5e58c_6.tar.bz2 - sha256: 71a5f0bcdb892760556b741fcba8b52d9824a414097cc5e877f36e89b093e3c0 - md5: 7564d9ace7ab6eed5f972bf2a799b166 + size: 76996 + timestamp: 1777846096032 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda + sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 + md5: 2f364feefb6a7c00423e80dcb12db62a depends: - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 + - libgcc >=14 license: MIT license_family: MIT purls: [] - size: 8068855 - timestamp: 1748940155242 -- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a - md5: 86d9cba083cd041bfbf242a01a7a1999 + size: 55952 + timestamp: 1769456078358 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda + sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a + md5: a229e22d4d8814a07702b0919d8e6701 + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 8125 + timestamp: 1774301094057 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda + sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c + md5: b99ed99e42dafb27889483b3098cace7 + depends: + - libgcc >=14 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - sysroot_linux-64 ==2.28 - license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + size: 422941 + timestamp: 1774301093473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfuse3-3.18.2-hdcbcb3a_0.conda + sha256: e12deec780906a3a3b8d12cd6123da9d5fbec7c34f00e249056fb05285fb9cf4 + md5: e6ae764fab4dcaf53eeeff43ef85bd91 + depends: + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + constrains: + - libfuse <3 + license: LGPL-2.1-only AND GPL-2.0-only license_family: GPL purls: [] - size: 1278712 - timestamp: 1765578681495 -- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - sha256: 5d224bf4df9bac24e69de41897c53756108c5271a0e5d2d2f66fd4e2fbc1d84b - md5: bb3b7cad9005f2cbf9d169fb30263f3e + size: 447176 + timestamp: 1773963288649 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda + sha256: 4592b096e553f67799ae70d4b6167eeda3ec74587d68c7aecbf4e7b1df136681 + md5: f35b3f52d0a2ec4ffe3c89ba135cdb9a + depends: + - _openmp_mutex >=4.5 constrains: - - sysroot_linux-aarch64 ==2.28 - license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + - libgomp 15.2.0 h8acb6b2_19 + - libgcc-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 1248134 - timestamp: 1765578613607 -- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 - md5: b38117a3c920364aff79f870c984b4a3 + size: 622462 + timestamp: 1778268755949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_19.conda + sha256: 1137f93f477f56199ded24117430045a0c02cbe8b10031beac3b9ad2138539d3 + md5: 770cf892e5530f43e63cadc673e85653 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: LGPL-2.1-or-later + - libgcc 15.2.0 h8acb6b2_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 134088 - timestamp: 1754905959823 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 - md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 + size: 27738 + timestamp: 1778268759211 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_19.conda + sha256: e5ad94be72634233510b33ba792a3339921bd468f0b8bc6961ea05eded251d9b + md5: c7a5b5decf969ead5ecada83654164cf depends: - - libgcc >=13 + - libgfortran5 15.2.0 h1b7bec0_19 + constrains: + - libgfortran-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 27728 + timestamp: 1778268784621 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-15.2.0-he9431aa_19.conda + sha256: acdf40833bd2bbcea971f46e4bfa86268e6aa5ea2a18ff23393ea737d7acef2e + md5: f034c1f3b3698a0fce2c121358c5d31e + depends: + - libgfortran 15.2.0 he9431aa_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 27757 + timestamp: 1778268971051 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_19.conda + sha256: af8e9bdcaa77f133a8ee4c1ef57ef564d9c45aa262abf9f5ef9b50eb99d96407 + md5: 779dbb494de6d3d6477cab52eb34285a + depends: + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1487244 + timestamp: 1778268767295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.1-h96a7f82_2.conda + sha256: 050285afdb7bd98b1b8fb052af9da31fafde586a49d3b56dd33d5338b2d0e411 + md5: 16d72f76bf6fead4a29efb2fede0a06b + depends: + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libffi >=3.5.2,<3.6.0a0 + constrains: + - glib >2.66 license: LGPL-2.1-or-later purls: [] - size: 129048 - timestamp: 1754906002667 -- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 - md5: fb53fb07ce46a575c5d004bbc96032c2 + size: 4946648 + timestamp: 1778508920982 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda + sha256: 2370ef0ffcbae5bede3c4bf136add4abc257245eb91f724c99bb4a43116c5a83 + md5: c5e8a379c4a2ec2aea4ba22758c001d9 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 587387 + timestamp: 1778268674393 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwy-1.3.0-h81d0cf9_1.conda + sha256: a6a441692b27606f8ef64ee9e6a0c72c615c2e25b01c282ee080ee8f97861943 + md5: d5b93534e24e7c15792b3f336c52af07 depends: - - __glibc >=2.17,<3.0.a0 - - keyutils >=1.6.3,<2.0a0 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 - libgcc >=14 - libstdcxx >=14 - - openssl >=3.5.5,<4.0a0 - license: MIT - license_family: MIT + license: Apache-2.0 OR BSD-3-Clause purls: [] - size: 1386730 - timestamp: 1769769569681 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda - sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba - md5: d9ca108bd680ea86a963104b6b3e95ca + size: 1180000 + timestamp: 1758894754411 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 + md5: 5a86bf847b9b926f3a4f203339748d78 depends: - - keyutils >=1.6.3,<2.0a0 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + license: LGPL-2.1-only + purls: [] + size: 791226 + timestamp: 1754910975665 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libidn2-2.3.8-h99ff5a0_1.conda + sha256: 24a063e235affa6a3232c7b66057c34450376204ada660823715353f57a0465f + md5: 8b950427dd67ee2e967604f7e448c383 + depends: + - libgcc >=14 + - libunistring >=0,<1.0a0 + license: LGPL-2.0-only + license_family: LGPL + purls: [] + size: 147165 + timestamp: 1760387531719 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda + sha256: e97ec2af5f09f8f6ea8ecd550055c95ae80fae22015fcfadaa94eafe025c9ccc + md5: a85ba48648f6868016f2741fd9170250 + depends: + - libgcc >=14 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 693143 + timestamp: 1775962625956 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda + sha256: d61962b9cd54c3554361550203c64d5b65b71e3058a285b66e4b04b9769f0a5c + md5: 76298a9e6d71ee6e832a8d0d7373b261 + depends: + - libgcc >=14 + constrains: + - xz 5.8.3.* + license: 0BSD + purls: [] + size: 126102 + timestamp: 1775828008518 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 + md5: 7b9813e885482e3ccb1fa212b86d7fd0 + depends: + - libgcc >=14 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 114056 + timestamp: 1769482343003 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-hd3077d7_0.conda + sha256: 13782715b9eeebc4ad16d36e84ca569d1495e3516aea3fe546a32caa0a597d82 + md5: be5f0f007a4500a226ef001115535a3d + depends: + - c-ares >=1.34.6,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 - libgcc >=14 - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 1517436 - timestamp: 1769773395215 -- conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda - sha256: df009385e8262c234c0dae9016540b86dad3d299f0d9366d08e327e8e7731634 - md5: e66e2c52d2fdddcf314ad750fb4ebb4a + size: 726928 + timestamp: 1773854039807 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda + sha256: 483eaa53da40a6a3e558709d9f7b1ca388735364ae21a1ba58cf942514649c92 + md5: f51503ac45a4888bce71af9027a2ecc9 depends: - - __osx >=10.13 - - libcxx >=19 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 - - openssl >=3.5.5,<4.0a0 - license: MIT - license_family: MIT + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement purls: [] - size: 1193620 - timestamp: 1769770267475 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed - md5: e446e1822f4da8e5080a9de93474184d + size: 341202 + timestamp: 1776315188425 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_19.conda + sha256: d5bfc6472141488dccf7addade6e85574497a0cb3fe8ee10efb308eeffcea874 + md5: dde53e47246d01641cc9093aa9a66681 depends: - - __osx >=11.0 - - libcxx >=19 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 - - openssl >=3.5.5,<4.0a0 - license: MIT - license_family: MIT + - libgcc >=14.3.0 + - libstdcxx >=14.3.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 1160828 - timestamp: 1769770119811 -- pypi: https://files.pythonhosted.org/packages/80/11/30b00f60b2841f9d615cf2714a9edd04c123bfcf3972e05dd0746b74e207/labkey-4.0.1-py3-none-any.whl - name: labkey - version: 4.0.1 - sha256: eadbaa4813df9061b0de5c0c3f6194e6d176ec3a1bce7856d8ac3b8be24a2e13 - requires_dist: - - requests - - pytest ; extra == 'test' - - requests ; extra == 'test' - - mock ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest ; extra == 'dev' - - requests ; extra == 'dev' - - mock ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - black ; extra == 'dev' - - setuptools ; extra == 'build' - - build ; extra == 'build' - - twine ; extra == 'build' - - wheel ; extra == 'build' - - packaging ; extra == 'build' - requires_python: '>=3.11' -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda - sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 - md5: 000e85703f0fd9594c81710dd5066471 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - license: MIT - license_family: MIT - purls: [] - size: 248046 - timestamp: 1739160907615 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.17-hc88f144_0.conda - sha256: 47cf6a4780dc41caa9bc95f020eed485b07010c9ccc85e9ef44b538fedb5341d - md5: b87b1abd2542cf65a00ad2e2461a3083 - depends: - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - license: MIT - license_family: MIT - purls: [] - size: 287007 - timestamp: 1739161069194 -- conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_4.conda - sha256: 6f821c4c6a19722162ef2905c45e0f8034544dab70bb86c647fb4e022a9c27b4 - md5: 4d51a4b9f959c1fac780645b9d480a82 - depends: - - ld64_osx-64 956.6 llvm19_1_hcae3351_4 - - libllvm19 >=19.1.7,<19.2.0a0 - constrains: - - cctools 1030.6.3.* - - cctools_osx-64 1030.6.3.* - license: APSL-2.0 - license_family: Other - purls: [] - size: 21560 - timestamp: 1768852832804 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda - sha256: d6197b4825ece12ab63097bd677294126439a1a6222c7098885aa23464ef280c - md5: 22eb76f8d98f4d3b8319d40bda9174de + size: 7199495 + timestamp: 1778268550110 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libseccomp-2.6.0-he30d5cf_0.conda + sha256: 5f436181473e0eba30760c921ad9e7fbeb42cb151103d9edcdd0701b2ac4cae5 + md5: 39eda47603cb48668b3f26270634283a depends: - - ld64_osx-arm64 956.6 llvm19_1_ha2625f7_4 - - libllvm19 >=19.1.7,<19.2.0a0 - constrains: - - cctools_osx-arm64 1030.6.3.* - - cctools 1030.6.3.* - license: APSL-2.0 - license_family: Other + - libgcc >=14 + license: LGPL-2.1-only purls: [] - size: 21592 - timestamp: 1768852886875 -- conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_hcae3351_4.conda - sha256: 2ae4c885ea34bc976232fbfb8129a2a3f0a79b0f42a8f7437e06d571d1b6760c - md5: 2329a96b45c853dd22af9d11762f9057 + size: 99944 + timestamp: 1764896963537 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda + sha256: ad03b7d8e4d08001f0df88ee7a56108bb35bae4795a42b9a04cc1abfa822bd07 + md5: 2ec1119217d8f0d086e9a62f3cb0e5ea depends: - - __osx >=10.13 - - libcxx - - libllvm19 >=19.1.7,<19.2.0a0 - - sigtool-codesign - - tapi >=1600.0.11.8,<1601.0a0 - constrains: - - cctools 1030.6.3.* - - clang 19.1.* - - cctools_impl_osx-64 1030.6.3.* - - ld64 956.6.* - license: APSL-2.0 - license_family: Other + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: blessing purls: [] - size: 1110678 - timestamp: 1768852747927 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_ha2625f7_4.conda - sha256: 4161eec579cea07903ee2fafdde6f8f9991dabd54f3ca6609a1bf75bed3dc788 - md5: eaf3d06e3a8a10dee7565e8d76ae618d + size: 955361 + timestamp: 1777986487553 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + sha256: 1e289bcce4ee6a5817a19c66e296f3c644dcfa6e562e5c1cba807270798814e7 + md5: eecc495bcfdd9da8058969656f916cc2 depends: - - __osx >=11.0 - - libcxx - - libllvm19 >=19.1.7,<19.2.0a0 - - sigtool-codesign - - tapi >=1600.0.11.8,<1601.0a0 - constrains: - - cctools_impl_osx-arm64 1030.6.3.* - - ld64 956.6.* - - cctools 1030.6.3.* - - clang 19.1.* - license: APSL-2.0 - license_family: Other + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 1040464 - timestamp: 1768852821767 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - sha256: 565941ac1f8b0d2f2e8f02827cbca648f4d18cd461afc31f15604cd291b5c5f3 - md5: 12bd9a3f089ee6c9266a37dab82afabd + size: 311396 + timestamp: 1745609845915 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda + sha256: 1dadc45e599f510dd5f97141dddcdbb9844d9f1430c1f3a38075cf1c58f87b4e + md5: 543fbc8d71f2a0baf04cf88ce96cb8bb depends: - - __glibc >=2.17,<3.0.a0 - - zstd >=1.5.7,<1.6.0a0 + - libgcc 15.2.0 h8acb6b2_19 constrains: - - binutils_impl_linux-64 2.45.1 - license: GPL-3.0-only + - libstdcxx-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 725507 - timestamp: 1770267139900 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.conda - sha256: 44527364aa333be631913451c32eb0cae1e09343827e9ce3ccabd8d962584226 - md5: 35b2ae7fadf364b8e5fb8185aaeb80e5 + size: 5546559 + timestamp: 1778268777463 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_19.conda + sha256: 56b5ec297a988961486694f1c598889c3a697d77a0b42b8cea3faaa12e9bd360 + md5: c82ed61c3ec470c5ec624580e6ba16e4 depends: - - zstd >=1.5.7,<1.6.0a0 - constrains: - - binutils_impl_linux-aarch64 2.45.1 - license: GPL-3.0-only + - libstdcxx 15.2.0 hef695bb_19 + license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 875924 - timestamp: 1770267209884 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda - sha256: 412381a43d5ff9bbed82cd52a0bbca5b90623f62e41007c9c42d3870c60945ff - md5: 9344155d33912347b37f0ae6c410a835 + size: 27803 + timestamp: 1778268813278 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda + sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 + md5: 8c6fd84f9c87ac00636007c6131e457d depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - license: Apache-2.0 - license_family: Apache + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND purls: [] - size: 264243 - timestamp: 1745264221534 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-hfdc4d58_1.conda - sha256: f01df5bbf97783fac9b89be602b4d02f94353f5221acfd80c424ec1c9a8d276c - md5: 60dceb7e876f4d74a9cbd42bbbc6b9cf + size: 488407 + timestamp: 1762022048105 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libunistring-0.9.10-hf897c2e_0.tar.bz2 + sha256: 03acebd5a01a255fe40d47f941c6cab4dc7829206d86d990b0c88cf0ff66e646 + md5: 7c68521243dc20afba4c4c05eb09586e depends: - - libgcc >=13 - - libstdcxx >=13 - license: Apache-2.0 - license_family: Apache + - libgcc-ng >=9.3.0 + license: GPL-3.0-only OR LGPL-3.0-only purls: [] - size: 227184 - timestamp: 1745265544057 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - sha256: 822e4ae421a7e9c04e841323526321185f6659222325e1a9aedec811c686e688 - md5: 86f7414544ae606282352fa1e116b41f + size: 1409624 + timestamp: 1626959749923 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda + sha256: 7d427edf58c702c337bf62bc90f355b7fc374a65fd9f70ea7a490f13bb76b1b9 + md5: a0b5de740d01c390bdbb46d7503c9fab depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libstdcxx >=14 - license: BSD-2-Clause + license: BSD-3-Clause license_family: BSD purls: [] - size: 36544 - timestamp: 1769221884824 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.5-hff7e48a_0.conda - sha256: 8b74acb52cda5f4ba91f59c85132f582de5db9dceff4e252f49c2525d14c600c - md5: 345c7bf559743adb5375ee3603911065 + size: 43567 + timestamp: 1775052485727 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda + sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 + md5: 24e92d0942c799db387f5c9d7b81f1af depends: - libgcc >=14 - - libstdcxx >=14 - license: BSD-2-Clause + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause license_family: BSD purls: [] - size: 37745 - timestamp: 1769221878827 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.5-he7c3a48_0.conda - sha256: b42ac9c684c730cb97cb3931a0a97aaf791da38bace4f6944eca10de609e5946 - md5: 975f98248cde8d54884c6d1eb5184e13 + size: 359496 + timestamp: 1752160685488 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b + md5: cd14ee5cca2464a425b1dbfc24d90db2 depends: - - __osx >=10.13 - - libcxx >=19 - license: BSD-2-Clause - license_family: BSD + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT purls: [] - size: 30555 - timestamp: 1769222189944 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - sha256: af9cd8db11eb719e38a3340c88bb4882cf19b5b4237d93845224489fc2a13b46 - md5: 13e6d9ae0efbc9d2e9a01a91f4372b41 + size: 397493 + timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e depends: - - __osx >=11.0 - - libcxx >=19 - license: BSD-2-Clause - license_family: BSD + - libgcc-ng >=12 + license: LGPL-2.1-or-later purls: [] - size: 30390 - timestamp: 1769222133373 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.5-gpl_hc2c16d8_100.conda - sha256: ee2cf1499a5a5fd5f03c6203597fe14bf28c6ca2a8fffb761e41f3cf371e768e - md5: 5fdaa8b856683a5598459dead3976578 + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda + sha256: 7a13450bce2eeba8f8fb691868b79bf0891377b707493a527bd930d64d9b98af + md5: e7177c6fbbf815da7b215b4cc3e70208 depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 + - icu >=75.1,<76.0a0 - libgcc >=14 + - libiconv >=1.18,<2.0a0 - liblzma >=5.8.1,<6.0a0 - - libxml2 - - libxml2-16 >=2.14.6 - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - lzo >=2.10,<3.0a0 - - openssl >=3.5.4,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-2-Clause - license_family: BSD + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT purls: [] - size: 886102 - timestamp: 1767630453053 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarchive-3.8.5-gpl_hbe7d12b_100.conda - sha256: 23422c1eb7f5f05a1cd4acab5ed4d8ae4abf360eda52628ea3f05230bef917b3 - md5: a3926f266064d00a31cb00510ebb031d + size: 597078 + timestamp: 1761015734476 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda + sha256: db0a568e0853ee38b7a4db1cb4ee76e57fe7c32ccb1d5b75f6618a1041d3c6e4 + md5: a0e7779b7625b88e37df9bd73f0638dc depends: - - bzip2 >=1.0.8,<2.0a0 + - icu >=75.1,<76.0a0 - libgcc >=14 + - libiconv >=1.18,<2.0a0 - liblzma >=5.8.1,<6.0a0 - - libxml2 - - libxml2-16 >=2.14.6 + - libxml2-16 2.15.1 h8591a01_0 - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - lzo >=2.10,<3.0a0 - - openssl >=3.5.4,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-2-Clause - license_family: BSD + license: MIT + license_family: MIT purls: [] - size: 1002688 - timestamp: 1767630660506 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda - sha256: cb728a2a95557bb6a5184be2b8be83a6f2083000d0c7eff4ad5bbe5792133541 - md5: 3b0d184bc9404516d418d4509e418bdc - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: LGPL-2.1-or-later + size: 47192 + timestamp: 1761015739999 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f + md5: 502006882cf5461adced436e410046d1 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other purls: [] - size: 53582 - timestamp: 1753342901341 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.25.1-h5e0f5ae_0.conda - sha256: 146be90c237cf3d8399e44afe5f5d21ef9a15a7983ccea90e72d4ae0362f9b28 - md5: 1c5813f6be57f087b6659593248daf00 + size: 69833 + timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 depends: - libgcc >=13 - libstdcxx >=13 - license: LGPL-2.1-or-later + license: BSD-2-Clause + license_family: BSD purls: [] - size: 53434 - timestamp: 1751557548397 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.25.1-h3184127_1.conda - sha256: 44e703d8fe739a71e9f7b89d04b56ccfaf488989f7712256bc0fcaf101e796a4 - md5: 37398594a1ede86a90c0afac95e1ffea + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lzo-2.10-h80f16a2_1002.conda + sha256: 036428c7b9fd22889108d04c91cecc431f95dc3dba2ede3057330c8125080fd5 + md5: 97af2e332449dd9e92ad7db93b02e918 depends: - - __osx >=10.13 - - libcxx >=19 - license: LGPL-2.1-or-later + - libgcc >=14 + license: GPL-2.0-or-later + license_family: GPL purls: [] - size: 51955 - timestamp: 1753343931663 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.25.1-h493aca8_0.conda - sha256: 7265547424e978ea596f51cc8e7b81638fb1c660b743e98cc4deb690d9d524ab - md5: 0deb80a2d6097c5fb98b495370b2435b - depends: - - __osx >=11.0 - - libcxx >=18 - license: LGPL-2.1-or-later + size: 190187 + timestamp: 1753889356434 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpi-1.0-openmpi.tar.bz2 + sha256: 91d52da0222cbfc7fa2621893867d6c40fa9943ceb07a6d02adb6546e102727f + md5: e24a82352a69336645b8fd24e0b41d86 + license: BSD 3-clause purls: [] - size: 52316 - timestamp: 1751558366611 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - build_number: 5 - sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c - md5: c160954f7418d7b6e87eaf05a8913fa9 + size: 3995 + timestamp: 1558804009811 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda + sha256: 369db85c5cd8d99dde364ce70725d76511d9c8199e5b820c740414091bf5bcca + md5: b2a43456aa56fe80c2477a5094899eff depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 - constrains: - - mkl <2026 - - liblapack 3.11.0 5*_openblas - - libcblas 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD + - libgcc >=14 + license: X11 AND BSD-3-Clause purls: [] - size: 18213 - timestamp: 1765818813880 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda - build_number: 5 - sha256: 700f3c03d0fba8e687a345404a45fbabe781c1cf92242382f62cef2948745ec4 - md5: 5afcea37a46f76ec1322943b3c4dfdc0 + size: 960036 + timestamp: 1777422174534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/oniguruma-6.9.10-h86ecc28_0.conda + sha256: c876e7bde137d7fdf065fb16e5e2969026fafa6420e71f93e4abe43bccbfa0c4 + md5: 35c0c3113a0cfd9381940ba7f01a961e depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 - constrains: - - mkl <2026 - - libcblas 3.11.0 5*_openblas - - liblapack 3.11.0 5*_openblas - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas - license: BSD-3-Clause + - libgcc >=13 + license: BSD-2-Clause license_family: BSD purls: [] - size: 18369 - timestamp: 1765818610617 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - build_number: 5 - sha256: 4754de83feafa6c0b41385f8dab1b13f13476232e16f524564a340871a9fc3bc - md5: 36d2e68a156692cbae776b75d6ca6eae + size: 253511 + timestamp: 1735729164909 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-23.0.2-h0f44c73_2.conda + sha256: 31aa240e08251e156a79fee6f6a208371b815a12348d6e87cce1ed8312ff090f + md5: e9cecaf9a388498dfab36ffceef59e2d depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 - constrains: - - liblapack 3.11.0 5*_openblas - - blas 2.305 openblas - - libcblas 3.11.0 5*_openblas - - mkl <2026 - - liblapacke 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD + - alsa-lib >=1.2.13,<1.3.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.13.3,<3.0a0 + - giflib >=5.2.2,<5.3.0a0 + - harfbuzz >=11.0.0,<12.0a0 + - lcms2 >=2.17,<3.0a0 + - libcups >=2.3.3,<2.4.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxi >=1.8.2,<2.0a0 + - xorg-libxrandr >=1.5.4,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + - xorg-libxt >=1.3.1,<2.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 + license: GPL-2.0-or-later WITH Classpath-exception-2.0 + license_family: GPL purls: [] - size: 18476 - timestamp: 1765819054657 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - build_number: 5 - sha256: 620a6278f194dcabc7962277da6835b1e968e46ad0c8e757736255f5ddbfca8d - md5: bcc025e2bbaf8a92982d20863fe1fb69 + size: 182714024 + timestamp: 1743203374299 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openmpi-4.1.6-h1f4154d_101.conda + sha256: 67c1269f98d4d2d4e45f6c0f59051111e00c0a867671ffada4b640b1752d35a2 + md5: aaccc242a1665d7cfff249195868788a depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - mpi 1.0 openmpi + - zlib constrains: - - libcblas 3.11.0 5*_openblas - - liblapack 3.11.0 5*_openblas - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas - - mkl <2026 + - cudatoolkit >= 11.0 + - ucx >=1.15.0,<2.0a0 + - libpmix ==0.0.0 + - libprrte ==0.0.0 license: BSD-3-Clause license_family: BSD purls: [] - size: 18546 - timestamp: 1765819094137 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - build_number: 5 - sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 - md5: 6636a2b6f1a87572df2970d3ebc87cc0 + size: 4041594 + timestamp: 1696611221404 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda + sha256: 348cb74c1530ac241215d047ef65d134cf797af935c97a68655319362b7e6a01 + md5: 3b129669089e4d6a5c6871dbb4669b99 depends: - - libblas 3.11.0 5_h4a7cf45_openblas - constrains: - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapack 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache purls: [] - size: 18194 - timestamp: 1765818837135 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda - build_number: 5 - sha256: 3fad5c9de161dccb4e42c8b1ae8eccb33f4ed56bccbcced9cbb0956ae7869e61 - md5: 0b2f1143ae2d0aa4c991959d0daaf256 + size: 3706406 + timestamp: 1775589602258 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda + sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 + md5: 1a30c42e32ca0ea216bd0bfe6f842f0b depends: - - libblas 3.11.0 5_haddc8a3_openblas - constrains: - - liblapack 3.11.0 5*_openblas - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 18371 - timestamp: 1765818618899 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - build_number: 5 - sha256: 8077c29ea720bd152be6e6859a3765228cde51301fe62a3b3f505b377c2cb48c - md5: b31d771cbccff686e01a687708a7ca41 + size: 1166552 + timestamp: 1763655534263 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda + build_number: 7 + sha256: d78296134263b5bf476cad838ded65451e7162db756f9997c5d06b08122572ed + md5: 17d019cb2a6c72073c344e98e40dfd61 depends: - - libblas 3.11.0 5_he492b99_openblas - constrains: - - liblapack 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD + - libgcc-ng >=12 + - libxcrypt >=4.4.36 + license: GPL-1.0-or-later OR Artistic-1.0-Perl purls: [] - size: 18484 - timestamp: 1765819073006 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - build_number: 5 - sha256: 38809c361bbd165ecf83f7f05fae9b791e1baa11e4447367f38ae1327f402fc0 - md5: efd8bd15ca56e9d01748a3beab8404eb + size: 13338804 + timestamp: 1703310557094 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-compress-raw-bzip2-2.214-pl5321h4777abc_0.conda + sha256: 55c31397194bf13d45d4c4745656dc3d5f456234085a97c425f7769ea857310d + md5: 95b5350d7705940debe7508d0439b755 depends: - - libblas 3.11.0 5_h51639a9_openblas - constrains: - - liblapacke 3.11.0 5*_openblas - - liblapack 3.11.0 5*_openblas - - blas 2.305 openblas - license: BSD-3-Clause - license_family: BSD + - libgcc >=14 + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 18548 - timestamp: 1765819108956 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hd70426c_7.conda - sha256: 3e8588828d2586722328ea39a7cf48c50a32f7661b55299075741ef7c8875ad5 - md5: b671ac86f33848f3bc3a6066d21c37dd + size: 55009 + timestamp: 1761334157742 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-compress-raw-zlib-2.214-pl5321hf8147d9_0.conda + sha256: 96d4f725f1489c2826bc3bf67043ca5dfe38775d74df0548335b87002fd3c1f3 + md5: b0b7b330e5438414f1a48c832939c0cb depends: - - __osx >=10.13 - - libcxx >=19.1.7 - - libllvm19 >=19.1.7,<19.2.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - libgcc >=14 + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 14856190 - timestamp: 1767958815491 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_7.conda - sha256: 89b8aed26ef89c9e56939d1acefa91ecf2e198923bfcc41f116c0de42ce869cb - md5: 5600ae1b88144099572939e773f4b20b + size: 78369 + timestamp: 1761334606067 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-encode-3.21-pl5321h86ecc28_1.conda + sha256: 11a63652bf66cd5bf036f0da892f1f8ba5922c65cb3a3f9fcc48d3845e85c9cb + md5: c7423ef0d75902ace96153a6500c0018 depends: - - __osx >=11.0 - - libcxx >=19.1.7 - - libllvm19 >=19.1.7,<19.2.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - libgcc >=13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-exporter + - perl-parent + - perl-storable + license: GPL-1.0-or-later OR Artistic-1.0-Perl purls: [] - size: 14062741 - timestamp: 1767957389675 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda - sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c - md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 + size: 1744815 + timestamp: 1728247108191 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-pathtools-3.75-pl5321h86ecc28_2.conda + sha256: 1ce7d5f0623bdb7dc5b1479949190406c443c0d3ad76796401cf3c761129248c + md5: af9bc42695de103aaf57007cae8f2708 depends: - - __glibc >=2.17,<3.0.a0 - - krb5 >=1.22.2,<1.23.0a0 - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - license: Apache-2.0 - license_family: Apache + - libgcc >=13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-carp + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 4518030 - timestamp: 1770902209173 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda - sha256: 41b04f995c9f63af8c4065a35931e46cbc2fdd6b9bf7e4c19f90d53cbb2bc8e5 - md5: 67828c963b17db7dc989fe5d509ef04a + size: 50835 + timestamp: 1741784515350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-scalar-list-utils-1.70-pl5321he30d5cf_0.conda + sha256: 61e0c9575a885501d363e2a63f94639eaff7e84cb7dc96b969c34b4329ee708e + md5: 5c510e02b5cae9df70df1f65f143bd65 depends: - - krb5 >=1.22.2,<1.23.0a0 - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - license: Apache-2.0 - license_family: Apache + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 4553739 - timestamp: 1770903929794 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda - sha256: c84e8dccb65ad5149c0121e4b54bdc47fa39303fd5f4979b8c44bb51b39a369b - md5: 1707cdd636af2ff697b53186572c9f77 + size: 52388 + timestamp: 1753966867451 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-storable-3.15-pl5321h86ecc28_2.conda + sha256: df3398d36cbe101e7b19ab573a04747ac83deb6d27bf84e354f538f7831cd45e + md5: 58c10819dafa98f35e2c92b4fa11d39c depends: - - __glibc >=2.17,<3.0.a0 - - krb5 >=1.22.2,<1.23.0a0 - - libgcc >=14 - - libnghttp2 >=1.67.0,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT + - libgcc >=13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 463621 - timestamp: 1770892808818 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.18.0-hc57f145_1.conda - sha256: a4677f2684e5298b27617deb3d524b940401e8eb6a58aa21531d5554c0395b13 - md5: 0406a63cbcc9262d31907b8a8487b597 + size: 70181 + timestamp: 1741355285769 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda + sha256: e6b0846a998f2263629cfeac7bca73565c35af13251969f45d385db537a514e4 + md5: 1587081d537bd4ae77d1c0635d465ba5 depends: - - krb5 >=1.22.2,<1.23.0a0 - libgcc >=14 - - libnghttp2 >=1.67.0,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl + - libstdcxx >=14 + - libgcc >=14 + license: MIT license_family: MIT purls: [] - size: 483167 - timestamp: 1770892771161 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.18.0-h9a2545f_1.conda - sha256: e2d8cb7c6d8dfb6c277eddbb9cf099805f40957877a48347cafddeade02f143a - md5: a6c0494188638d4bfe767f195619bb93 + size: 357913 + timestamp: 1754665583353 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda + sha256: 6468cbfaf1d3140be46dd315ec383d373dbbafd770ce2efe77c3f0cdbc4576c1 + md5: 05eda637f6465f7e8c5ab7e341341ea9 depends: - - __osx >=10.13 - - krb5 >=1.22.2,<1.23.0a0 - - libnghttp2 >=1.67.0,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT + - libgcc-ng >=12 + - libglib >=2.80.3,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL purls: [] - size: 419351 - timestamp: 1770893388507 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-hd5a2499_1.conda - sha256: dbc34552fc6f040bbcd52b4246ec068ce8d82be0e76bfe45c6984097758d37c2 - md5: 2742a933ef07e91f38e3d33ad6fe937c + size: 54834 + timestamp: 1720806008171 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba + md5: bb5a90c93e3bac3d5690acf76b4a6386 depends: - - __osx >=11.0 - - krb5 >=1.22.2,<1.23.0a0 - - libnghttp2 >=1.67.0,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl + - libgcc >=13 + license: MIT license_family: MIT purls: [] - size: 402616 - timestamp: 1770893178846 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h4fb565c_2.conda - sha256: 2619d471c50c466320e2aea906a4363e34efe181e61346e4453bc68264c5185f - md5: 1ac756454e65fb3fd7bc7de599526e43 + size: 8342 + timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.13-h11c0449_100_cp313.conda + build_number: 100 + sha256: d14e731e871d6379f8b82f3af5eb3382caa444880a9fc9d1d12033748277eb14 + md5: 81809cabd4647dee1127f2623a6a3005 depends: - - __osx >=10.13 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.7.5,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libuuid >=2.42,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.6,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 purls: [] - size: 571912 - timestamp: 1770237202404 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-h55c6f16_2.conda - sha256: 5fbeb2fc2673f0455af6079abf93faaf27f11a92574ad51565fa1ecac9a4e2aa - md5: 4cb5878bdb9ebfa65b7cdff5445087c5 + size: 34042952 + timestamp: 1775613691000 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 + md5: 3d49cad61f829f4f0e0611547a9cda12 depends: - - __osx >=11.0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL purls: [] - size: 570068 - timestamp: 1770238262922 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - sha256: 760af3509e723d8ee5a9baa7f923a213a758b3a09e41ffdaf10f3a474898ab3f - md5: 52031c3ab8857ea8bcc96fe6f1b6d778 + size: 357597 + timestamp: 1765815673644 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rust-1.94.0-h6cf38e9_1.conda + sha256: 9b2093a45d969da7ade0fa297aab86f45945633fb27db485ff74c21168fb7936 + md5: 41faf801d6033e7bb936f3395ab22444 depends: - - libcxx >=19.1.7 - - libcxx-headers >=19.1.7,<19.1.8.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - gcc_impl_linux-aarch64 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + - rust-std-aarch64-unknown-linux-gnu 1.94.0 hbe8e118_1 + - sysroot_linux-aarch64 >=2.17 + license: MIT + license_family: MIT purls: [] - size: 23069 - timestamp: 1764648572536 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - sha256: ec07ebaa226792f4e2bf0f5dba50325632a7474d5f04b951d8291be70af215da - md5: 9f7810b7c0a731dbc84d46d6005890ef + size: 140695500 + timestamp: 1777309623379 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.1-he8854b5_0.conda + sha256: 27467e4bfb0681546f149718c33b806fec078185fbaa6a4d17d440bc8f56185c + md5: 46009bdca2315a99e0a3a7d0ba1af3b9 depends: - - libcxx >=19.1.7 - - libcxx-headers >=19.1.7,<19.1.8.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 23000 - timestamp: 1764648270121 -- conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - sha256: 36485e6807e03a4f15a8018ec982457a9de0a1318b4b49a44c5da75849dbe24f - md5: de91b5ce46dc7968b6e311f9add055a2 - depends: - - __unix - constrains: - - libcxx-devel 19.1.7 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 830747 - timestamp: 1764647922410 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda - sha256: 780f0530a3adfc1497ba49d626931c6afc978c540e1abfde6ccd57128ded6ad6 - md5: b422943d5d772b7cc858b36ad2a92db5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 72242 - timestamp: 1728177071251 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.22-h86ecc28_0.conda - sha256: 986207f130703897300ddc3637c52e86a5b21c735fe384bf48554d9a6d91c56d - md5: ff6a44e8b1707d02be2fe9a36ea88d4a - depends: - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 69601 - timestamp: 1728177137503 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.22-h00291cd_0.conda - sha256: 681035346974c3315685dc40898e26f65f1c00cbb0b5fd80cc2599e207a34b31 - md5: a15785ccc62ae2a8febd299424081efb - depends: - - __osx >=10.13 - license: MIT - license_family: MIT + - libgcc >=14 + - libsqlite 3.53.1 h022381a_0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - readline >=8.3,<9.0a0 + license: blessing purls: [] - size: 70407 - timestamp: 1728177128525 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda - sha256: 3552894ca62bebc33d05982937cda25a4fa19e56a82af2ff20944ff4c2532fda - md5: 2d3e3f3d8ab315748420ef58d5a3ae0f + size: 209964 + timestamp: 1777986493350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/squashfs-tools-4.7.5-h3aea78d_0.conda + sha256: ca48e9e230c28297f3fef0aab9e33ba4654d0057922b420ed6fc1b0ce6ad92d1 + md5: 7cd4f36c2141d518b38223aef7264228 depends: - - __osx >=11.0 - license: MIT - license_family: MIT + - libgcc >=14 + - lzo >=2.10,<3.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.2,<6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + license: GPL-2.0-or-later + license_family: GPL purls: [] - size: 54089 - timestamp: 1728177149927 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 - md5: c277e0a4d549b03ac1e9d6cbbe3d017b + size: 293490 + timestamp: 1772548058185 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/squashfuse-0.6.1-h46c73cc_1.conda + sha256: 0795996d9c47b8d06563d343671166b5e2ef3404c0f14f465c807cdeaf89d821 + md5: 6da50895dbc892fb7ef91995282f2c06 depends: - - ncurses - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - ncurses >=6.5,<7.0a0 + - libfuse3 >=3.18.0,<4.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - zstd >=1.5.7,<1.6.0a0 license: BSD-2-Clause license_family: BSD purls: [] - size: 134676 - timestamp: 1738479519902 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 - md5: fb640d776fc92b682a14e001980825b1 + size: 73821 + timestamp: 1766141061115 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda + sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 + md5: 7fc6affb9b01e567d2ef1d05b84aa6ed depends: - - ncurses - - libgcc >=13 - - ncurses >=6.5,<7.0a0 - license: BSD-2-Clause + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL license_family: BSD purls: [] - size: 148125 - timestamp: 1738479808948 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - sha256: 6cc49785940a99e6a6b8c6edbb15f44c2dd6c789d9c283e5ee7bdfedd50b4cd6 - md5: 1f4ed31220402fcddc083b4bff406868 + size: 3368666 + timestamp: 1769464148928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unzip-6.0-he30d5cf_4.conda + sha256: 49f58bfa1b1ec914a827a238c84cc1929af30b83e3ee0875bdc6402295a324e2 + md5: 8b8239bcb89e6710d7c3ef9d9398216f depends: - - ncurses - - __osx >=10.13 - - ncurses >=6.5,<7.0a0 - license: BSD-2-Clause - license_family: BSD + - libgcc >=14 + license: LicenseRef-BSD-like purls: [] - size: 115563 - timestamp: 1738479554273 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 - md5: 44083d2d2c2025afca315c7a172eab2b + size: 162036 + timestamp: 1754913052303 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wget-1.25.0-h4f42960_1.conda + sha256: 8fbf0209ec0ec6d1bd4412dc624f5c74c4d3e9b9a4d54995956fa1a6dfb6ad7d + md5: 4e6bb4b78d687478c5f22770aa555162 depends: - - ncurses - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: BSD-2-Clause - license_family: BSD + - libgcc >=14 + - libidn2 >=2,<3.0a0 + - libunistring >=0,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - zlib + license: GPL-3.0-or-later + license_family: GPL purls: [] - size: 107691 - timestamp: 1738479560845 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 - md5: 172bf1cd1ff8629f2b1179945ed45055 + size: 811793 + timestamp: 1772232759430 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda + sha256: a2ba1864403c7eb4194dacbfe2777acf3d596feae43aada8d1b478617ce45031 + md5: c8d8ec3e00cd0fd8a231789b91a7c5b7 depends: - - libgcc-ng >=12 - license: BSD-2-Clause - license_family: BSD + - libgcc >=13 + license: MIT + license_family: MIT purls: [] - size: 112766 - timestamp: 1702146165126 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 - md5: a9a13cb143bbaa477b1ebaefbe47a302 + size: 60433 + timestamp: 1734229908988 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda + sha256: b86a819cd16f90c01d9d81892155126d01555a20dabd5f3091da59d6309afd0a + md5: 2d1409c50882819cb1af2de82e2b7208 depends: - - libgcc-ng >=12 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 115123 - timestamp: 1702146237623 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - sha256: 0d238488564a7992942aa165ff994eca540f687753b4f0998b29b4e4d030ff43 - md5: 899db79329439820b7e8f8de41bca902 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 106663 - timestamp: 1702146352558 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f - md5: 36d33e440c31857372a72137f78bacf5 - license: BSD-2-Clause - license_family: BSD + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.2,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 107458 - timestamp: 1702146414478 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 - md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 + size: 28701 + timestamp: 1741897678254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda + sha256: cf886160e2ff580d77f7eb8ec1a77c41c2c5b05343e329bc35f0ddf40b8d92ab + md5: 22dd10425ef181e80e130db50675d615 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - constrains: - - expat 2.7.4.* + - libxcb >=1.17.0,<2.0a0 license: MIT license_family: MIT purls: [] - size: 76798 - timestamp: 1771259418166 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda - sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 - md5: 57f3b3da02a50a1be2a6fe847515417d + size: 869058 + timestamp: 1770819244991 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda + sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 + md5: 1c246e1105000c3660558459e2fd6d43 depends: - libgcc >=14 - constrains: - - expat 2.7.4.* license: MIT license_family: MIT purls: [] - size: 76564 - timestamp: 1771259530958 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.4-h991f03e_0.conda - sha256: 8d9d79b2de7d6f335692391f5281607221bf5d040e6724dad4c4d77cd603ce43 - md5: a684eb8a19b2aa68fde0267df172a1e3 + size: 16317 + timestamp: 1762977521691 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda + sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 + md5: bff06dcde4a707339d66d45d96ceb2e2 depends: - - __osx >=10.13 - constrains: - - expat 2.7.4.* + - libgcc >=14 license: MIT license_family: MIT purls: [] - size: 74578 - timestamp: 1771260142624 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda - sha256: 03887d8080d6a8fe02d75b80929271b39697ecca7628f0657d7afaea87761edf - md5: a92e310ae8dfc206ff449f362fc4217f + size: 21039 + timestamp: 1762979038025 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda + sha256: db2188bc0d844d4e9747bac7f6c1d067e390bd769c5ad897c93f1df759dc5dba + md5: fb42b683034619915863d68dd9df03a3 depends: - - __osx >=11.0 - constrains: - - expat 2.7.4.* + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT purls: [] - size: 68199 - timestamp: 1771260020767 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 - md5: a360c33a5abe61c07959e449fa1453eb + size: 52409 + timestamp: 1769446753771 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda + sha256: 8cb9c88e25c57e47419e98f04f9ef3154ad96b9f858c88c570c7b91216a64d0e + md5: e8b4056544341daf1d415eaeae7a040c depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT purls: [] - size: 58592 - timestamp: 1769456073053 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 - md5: 2f364feefb6a7c00423e80dcb12db62a + size: 20704 + timestamp: 1759284028146 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda + sha256: 7b587407ecb9ccd2bbaf0fb94c5dbdde4d015346df063e9502dc0ce2b682fb5e + md5: eeee3bdb31c6acde2b81ad1b8c287087 depends: - - libgcc >=14 + - libgcc >=13 + - xorg-libx11 >=1.8.9,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 license: MIT license_family: MIT purls: [] - size: 55952 - timestamp: 1769456078358 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - sha256: 951958d1792238006fdc6fce7f71f1b559534743b26cc1333497d46e5903a2d6 - md5: 66a0dc7464927d0853b590b6f53ba3ea + size: 48197 + timestamp: 1727801059062 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda + sha256: 9f5196665a8d72f4f119c40dcc4bafeb0b540b102cc7b8b299c2abf599e7919f + md5: 1f64c613f0b8d67e9fb0e165d898fb6b depends: - - __osx >=10.13 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 license: MIT license_family: MIT purls: [] - size: 53583 - timestamp: 1769456300951 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 - md5: 43c04d9cb46ef176bb2a4c77e324d599 + size: 31122 + timestamp: 1769445286951 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda + sha256: ffd77ee860c9635a28cfda46163dcfe9224dc6248c62404c544ae6b564a0be1f + md5: ae2c2dd0e2d38d249887727db2af960e depends: - - __osx >=11.0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 license: MIT license_family: MIT purls: [] - size: 40979 - timestamp: 1769456747661 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - sha256: 4641d37faeb97cf8a121efafd6afd040904d4bca8c46798122f417c31d5dfbec - md5: f4084e4e6577797150f9b04a4560ceb0 - depends: - - libfreetype6 >=2.14.1 - license: GPL-2.0-only OR FTL - purls: [] - size: 7664 - timestamp: 1757945417134 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.1-h8af1aa0_0.conda - sha256: 342c07e4be3d09d04b531c889182a11a488e7e9ba4b75f642040e4681c1e9b98 - md5: 1e61fb236ccd3d6ccaf9e91cb2d7e12d - depends: - - libfreetype6 >=2.14.1 - license: GPL-2.0-only OR FTL - purls: [] - size: 7753 - timestamp: 1757945484817 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - sha256: 4a7af818a3179fafb6c91111752954e29d3a2a950259c14a2fc7ba40a8b03652 - md5: 8e7251989bca326a28f4a5ffbd74557a + size: 33649 + timestamp: 1734229123157 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda + sha256: 7c109792b60720809a580612aba7f8eb2a0bd425b9fc078748a9d6ffc97cbfa8 + md5: a9e4852c8e0b68ee783e7240030b696f depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libpng >=1.6.50,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 - constrains: - - freetype >=2.14.1 - license: GPL-2.0-only OR FTL + - libgcc >=13 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.9,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 386739 - timestamp: 1757945416744 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.1-hdae7a39_0.conda - sha256: cedc83d9733363aca353872c3bfed2e188aa7caf57b57842ba0c6d2765652b7c - md5: 9c2f56b6e011c6d8010ff43b796aab2f + size: 384752 + timestamp: 1731860572314 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda + sha256: 6eaffce5a34fc0a16a21ddeaefb597e792a263b1b0c387c1ce46b0a967d558e1 + md5: c05698071b5c8e0da82a282085845860 depends: - - libgcc >=14 - - libpng >=1.6.50,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 - constrains: - - freetype >=2.14.1 - license: GPL-2.0-only OR FTL + - libgcc >=13 + - xorg-libx11 >=1.8.9,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxi >=1.7.10,<2.0a0 + license: MIT + license_family: MIT purls: [] - size: 423210 - timestamp: 1757945484108 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfuse3-3.18.1-h9a46e9c_0.conda - sha256: 78f7b5cdbe11de46ce002051b7f7704a5355adcd1981ef4bab5a257f2de768c0 - md5: 05fc8ed4897addcb7a3dacf828f0e64d + size: 33786 + timestamp: 1727964907993 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda + sha256: 66265e943f32ce02396ad214e27cb35f5b0490b3bd4f064446390f9d67fa5d88 + md5: 032d8030e4a24fe1f72c74423a46fb88 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libiconv >=1.18,<2.0a0 - constrains: - - libfuse <3 - license: LGPL-2.1-only AND GPL-2.0-only - license_family: GPL + license: MIT + license_family: MIT purls: [] - size: 444602 - timestamp: 1766280090297 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfuse3-3.18.1-hdcbcb3a_0.conda - sha256: 8513c0a90bfa26f5fa297dd2b1d328b004028c65106fcc1c113ab625c0575bf1 - md5: af19ddf73cc4053ca6146270c152bf3b + size: 88088 + timestamp: 1753484092643 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_2.conda + sha256: d651731b45f2d84591881da3ce3e4107a9ba6709fe790dbd5f7b8d9c89a02ed7 + md5: 493587274c81b34d198b085b46a86eaa depends: - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - constrains: - - libfuse <3 - license: LGPL-2.1-only AND GPL-2.0-only - license_family: GPL + - libzlib 1.3.2 hdc9db2a_2 + license: Zlib + license_family: Other purls: [] - size: 447792 - timestamp: 1766280162630 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 - md5: 0aa00f03f9e39fb9876085dee11a85d4 + size: 100515 + timestamp: 1774072641977 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 + md5: c3655f82dcea2aa179b291e7099c1fcc depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 he0feb66_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 1041788 - timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda - sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 - md5: 552567ea2b61e3a3035759b2fdb3f9a6 + size: 614429 + timestamp: 1764777145593 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda + sha256: c9dbcc8039a52023660d6d1bbf87594a93dd69c6ac5a2a44323af2c92976728d + md5: e18ad67cf881dcadee8b8d9e2f8e5f73 depends: - - _openmp_mutex >=4.5 - constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 h8acb6b2_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - __unix + license: ISC purls: [] - size: 622900 - timestamp: 1771378128706 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda - sha256: 83366f11615ab234aa1e0797393f9e07b78124b5a24c4a9f8af0113d02df818e - md5: 9a5cb96e43f5c2296690186e15b3296f + size: 131039 + timestamp: 1776865545798 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda + sha256: e6effe89523fc6143819f7a68372b28bf0c176af5b050fe6cf75b62e9f6c6157 + md5: 32deecb68e11352deaa3235b709ddab2 depends: - - _openmp_mutex + - clang 19.1.7.* constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - compiler-rt 19.1.7 + - clangxx 19.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE purls: [] - size: 423025 - timestamp: 1771378225170 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda - sha256: 1d9c4f35586adb71bcd23e31b68b7f3e4c4ab89914c26bed5f2859290be5560e - md5: 92df6107310b1fff92c4cc84f0de247b + size: 10425780 + timestamp: 1757412396490 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + sha256: 8c32a3db8adf18ed58197e8895ce4f24a83ed63c817512b9a26724753b116f2a + md5: 8d99c82e0f5fed6cc36fcf66a11e03f0 depends: - - _openmp_mutex + - clang 19.1.7.* constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 401974 - timestamp: 1771378877463 -- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda - sha256: 1abc6a81ee66e8ac9ac09a26e2d6ad7bba23f0a0cc3a6118654f036f9c0e1854 - md5: 06901733131833f5edd68cf3d9679798 - depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - compiler-rt 19.1.7 + - clangxx 19.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE purls: [] - size: 3084533 - timestamp: 1771377786730 -- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_118.conda - sha256: 058fab0156cb13897f7e4a2fc9d63c922d3de09b6429390365f91b62f1dddb0e - md5: 3733752e5a7a0737c8c4f1897f2074f9 - depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + size: 10490535 + timestamp: 1757411851093 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 2335839 - timestamp: 1771377646960 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda - sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 - md5: d5e96b1ed75ca01906b3d2469b4ce493 - depends: - - libgcc 15.2.0 he0feb66_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + size: 397370 + timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other purls: [] - size: 27526 - timestamp: 1771378224552 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda - sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f - md5: 4feebd0fbf61075a1a9c2e9b3936c257 - depends: - - libgcc 15.2.0 h8acb6b2_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + size: 96530 + timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other purls: [] - size: 27568 - timestamp: 1771378136019 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.25.1-h3f43e3d_1.conda - sha256: 50a9e9815cf3f5bce1b8c5161c0899cc5b6c6052d6d73a4c27f749119e607100 - md5: 2f4de899028319b27eb7a4023be5dfd2 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - license: GPL-3.0-or-later - license_family: GPL + size: 700814 + timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other purls: [] - size: 188293 - timestamp: 1753342911214 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgettextpo-0.25.1-h5ad3122_0.conda - sha256: c8e5590166f4931a3ab01e444632f326e1bb00058c98078eb46b6e8968f1b1e9 - md5: ad7b109fbbff1407b1a7eeaa60d7086a + size: 1620504 + timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab depends: - - libgcc >=13 - license: GPL-3.0-or-later - license_family: GPL + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD purls: [] - size: 225352 - timestamp: 1751557555903 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.25.1-h3184127_1.conda - sha256: 0509a41da5179727d24092020bc3d4addcb24a421c2e889d32a4035652fab2cf - md5: 711bff88af3b00283f7d8f32aff82e6a + size: 3667 + timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 + md5: a7970cd949a077b7cb9696379d338681 depends: - - __osx >=10.13 - - libiconv >=1.18,<2.0a0 - - libintl 0.25.1 h3184127_1 - license: GPL-3.0-or-later - license_family: GPL + - font-ttf-ubuntu + - font-ttf-inconsolata + - font-ttf-dejavu-sans-mono + - font-ttf-source-code-pro + license: BSD-3-Clause + license_family: BSD purls: [] - size: 198908 - timestamp: 1753344027461 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.25.1-h493aca8_0.conda - sha256: 3ba35ff26b3b9573b5df5b9bbec5c61476157ec3a9f12c698e2a9350cd4338fd - md5: 98acd9989d0d8d5914ccc86dceb6c6c2 - depends: - - __osx >=11.0 - - libiconv >=1.18,<2.0a0 - - libintl 0.25.1 h493aca8_0 - license: GPL-3.0-or-later + size: 4059 + timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a + md5: 86d9cba083cd041bfbf242a01a7a1999 + constrains: + - sysroot_linux-64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later license_family: GPL purls: [] - size: 183091 - timestamp: 1751558452316 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee - md5: 9063115da5bc35fdc3e1002e69b9ef6e - depends: - - libgfortran5 15.2.0 h68bc16d_18 + size: 1278712 + timestamp: 1765578681495 +- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + sha256: 5d224bf4df9bac24e69de41897c53756108c5271a0e5d2d2f66fd4e2fbc1d84b + md5: bb3b7cad9005f2cbf9d169fb30263f3e constrains: - - libgfortran-ng ==15.2.0=*_18 - license: GPL-3.0-only WITH GCC-exception-3.1 + - sysroot_linux-aarch64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later license_family: GPL purls: [] - size: 27523 - timestamp: 1771378269450 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda - sha256: 7dcd7dff2505d56fd5272a6e712ec912f50a46bf07dc6873a7e853694304e6e4 - md5: 41f261f5e4e2e8cbd236c2f1f15dae1b + size: 1248134 + timestamp: 1765578613607 +- conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + sha256: 36485e6807e03a4f15a8018ec982457a9de0a1318b4b49a44c5da75849dbe24f + md5: de91b5ce46dc7968b6e311f9add055a2 depends: - - libgfortran5 15.2.0 h1b7bec0_18 + - __unix constrains: - - libgfortran-ng ==15.2.0=*_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - libcxx-devel 19.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 27587 - timestamp: 1771378169244 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda - sha256: fb06c2a2ef06716a0f2a6550f5d13cdd1d89365993068512b7ae3c34e6e665d9 - md5: 34a9f67498721abcfef00178bcf4b190 + size: 830747 + timestamp: 1764647922410 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_119.conda + sha256: e1815bb11d5abe886979e95889d84310d83d078d36a3567ca67cbf57a3876d88 + md5: 7d517e32d656a8880d98c0e4fc8ddc2c depends: - - libgfortran5 15.2.0 hd16e46c_18 - constrains: - - libgfortran-ng ==15.2.0=*_18 + - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 139761 - timestamp: 1771378423828 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda - sha256: 63f89087c3f0c8621c5c89ecceec1e56e5e1c84f65fc9c5feca33a07c570a836 - md5: 26981599908ed2205366e8fc91b37fc6 + size: 3091520 + timestamp: 1778268364856 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_119.conda + sha256: e06d098cd33eac577b9c994a47243de5439ca8fd9ff6e790723fbfdc3d61a76c + md5: 970ca6cb337de6a7bccfaaa344e9863b depends: - - libgfortran5 15.2.0 hdae7583_18 - constrains: - - libgfortran-ng ==15.2.0=*_18 + - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 138973 - timestamp: 1771379054939 + size: 2346647 + timestamp: 1778268433769 - conda: https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-64-14.3.0-h660b60f_1.conda sha256: b60e918409b71302ee61b61080b1b254a902c03fbcbb415c81925dc016c5990e md5: 731190552d91ade042ddf897cfb361aa @@ -5082,1169 +5116,932 @@ packages: purls: [] size: 2035634 timestamp: 1756233109102 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-15.2.0-h69a702a_18.conda - sha256: cdc147bb0966be39b697b28d40b1ab5a2cd57fb29aff0fb0406598d419bddd70 - md5: 26d7b228de99d6fb032ba4d5c1679040 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_119.conda + sha256: 1b4263aa5d8c8c659e8e38b66868f42867347e0c8941513ee77269afc00a5186 + md5: d1a866495b9654ccfef5392b8541dc58 depends: - - libgfortran 15.2.0 h69a702a_18 + - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27532 - timestamp: 1771378479717 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-15.2.0-he9431aa_18.conda - sha256: 5bb6cd6fd091cb7252513574cbc588d691e93ee6bf82a05d29cb4a0d10e293d2 - md5: 482125507cbfe03275e023a7dbdf951d + size: 20199810 + timestamp: 1778268389428 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_119.conda + sha256: 918ae042d508617da3c06fb55332f1280340eb705a69a0b1d14fa6fddb790145 + md5: 8c7bc9930a1b7c38557311fbea9a433f depends: - - libgfortran 15.2.0 he9431aa_18 + - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27608 - timestamp: 1771378366650 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12 - md5: 646855f357199a12f02a87382d429b75 + size: 17587589 + timestamp: 1778268454520 +- conda: https://conda.anaconda.org/conda-forge/noarch/perl-carp-1.50-pl5321hd8ed1ab_0.tar.bz2 + sha256: 1981e31113e1e77a2cdc13db657c636f047cd3be2a64d9a0bffac03c5427c1bd + md5: bdddc03e28019b902da71b722f2288d7 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15.2.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - perl >=5.32.1,<6.0a0 *_perl5 + - perl-exporter + - perl-extutils-makemaker + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 2482475 - timestamp: 1771378241063 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda - sha256: 85347670dfb4a8d4c13cd7cae54138dcf2b1606b6bede42eef5507bf5f9660c6 - md5: 574d88ce3348331e962cfa5ed451b247 + size: 22257 + timestamp: 1636653208008 +- conda: https://conda.anaconda.org/conda-forge/noarch/perl-common-sense-3.75-pl5321hd8ed1ab_0.tar.bz2 + sha256: 38ef218e9b9d55b9fbdce6b31cf81bcf6f1b16f21b8e7cb9279b41399522a320 + md5: ef70dc77e8b10bbb62f5e843b401ef0e depends: - - libgcc >=15.2.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - perl >=5.32.1,<6.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 1486341 - timestamp: 1771378148102 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda - sha256: ddaf9dcf008c031b10987991aa78643e03c24a534ad420925cbd5851b31faa11 - md5: ca52daf58cea766656266c8771d8be81 + size: 20291 + timestamp: 1660429950685 +- conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-5.74-pl5321hd8ed1ab_0.tar.bz2 + sha256: 42271d0b79043a10a89044acb5febea50046b745dd2fc37e02943bc3bc75bf8e + md5: fd2eac4e35f8c970870a3961c1df3e29 depends: - - libgcc >=15.2.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - perl >=5.32.1,<6.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 1062274 - timestamp: 1771378232014 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda - sha256: 91033978ba25e6a60fb86843cf7e1f7dc8ad513f9689f991c9ddabfaf0361e7e - md5: c4a6f7989cffb0544bfd9207b6789971 + size: 19071 + timestamp: 1636696009075 +- conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-tiny-1.002002-pl5321hd8ed1ab_0.tar.bz2 + sha256: abdf86828a12a389d0feb0d70501b267842557bae11820e266526aeb6ab2bebe + md5: 48d709826875be1f2c108d3d1d8efec7 depends: - - libgcc >=15.2.0 + - perl >=5.32.1,<6.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER + purls: [] + size: 28592 + timestamp: 1660341479867 +- conda: https://conda.anaconda.org/conda-forge/noarch/perl-extutils-makemaker-7.70-pl5321hd8ed1ab_0.conda + sha256: 1d3f342ca74cf2948c3edcfe0d3367b1db0fc64bb163393a2e025336dec3a40c + md5: ec3e57ed34f7765bfc7054a05868ce5d + depends: + - perl >=5.32.1,<6.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER + purls: [] + size: 157323 + timestamp: 1679847836884 +- conda: https://conda.anaconda.org/conda-forge/noarch/perl-parent-0.243-pl5321hd8ed1ab_0.conda + sha256: ec57d9e56ba86d840d5a9e65c665365fb6a290851cd13e6719628f3295eabf34 + md5: 314caa3b72d65f8078d426c6721dcacc + depends: + - perl >=5.32.1,<6.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER + purls: [] + size: 13933 + timestamp: 1733429736293 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + build_number: 8 + sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 + md5: 94305520c52a4aa3f6c2b1ff6008d9f8 constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 598634 - timestamp: 1771378886363 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_0.conda - sha256: 0d8cf491cb00aeb35fcfb68dfcb5b0ad188a98fb35c21c2421d2b2acc128cbf5 - md5: b7113551db5a3e2403cdd052c66e9999 + size: 7002 + timestamp: 1752805902938 +- conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.94.0-hf6ec828_1.conda + sha256: a88f7dbed29a411eee3eeb8428003426bdc8923488d93586ca3f787b15ae4294 + md5: 24c709eb82e4bc16f39736aaadee9bbb depends: - - __glibc >=2.17,<3.0.a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - pcre2 >=10.47,<10.48.0a0 + - __unix constrains: - - glib 2.86.4 *_0 - license: LGPL-2.1-or-later + - rust >=1.94.0,<1.94.1.0a0 + license: MIT + license_family: MIT purls: [] - size: 4432190 - timestamp: 1771291719860 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_0.conda - sha256: 5eaa95bd67b70752ee7b4b17826b1a5f29dc72c089ddc7c341f85827071dd397 - md5: 81dd1078cd9366563f977918f60a1b31 + size: 32533703 + timestamp: 1777308231146 +- conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-aarch64-unknown-linux-gnu-1.94.0-hbe8e118_1.conda + sha256: 758b55b01968a994592a778d35927934fb09379c3ab122293ff771a25ec44a19 + md5: 61c7bf59128df2cabac864ddd4aa70db depends: - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - pcre2 >=10.47,<10.48.0a0 + - __unix constrains: - - glib 2.86.4 *_0 - license: LGPL-2.1-or-later + - rust >=1.94.0,<1.94.1.0a0 + license: MIT + license_family: MIT purls: [] - size: 4511499 - timestamp: 1771291669413 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_0.conda - sha256: e305f7b1f2202d4efcdb8856abb28d79dc012d85a2155fbfbfee96069e017073 - md5: 2d02b60ec23066e45c578c1524e9ca12 + size: 34945224 + timestamp: 1777309136957 +- conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.94.0-h38e4360_1.conda + sha256: e08f589ba23d754bc385dcfa80d7f01f30a71f0b8e9198bf0b8cc62e07ca1b9a + md5: 390296cf86f2b06d44bd3fe8cff13df1 depends: - - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 - - libiconv >=1.18,<2.0a0 - - libintl >=0.25.1,<1.0a0 - - libzlib >=1.3.1,<2.0a0 - - pcre2 >=10.47,<10.48.0a0 + - __unix constrains: - - glib 2.86.4 *_0 - license: LGPL-2.1-or-later + - rust >=1.94.0,<1.94.1.0a0 + license: MIT + license_family: MIT purls: [] - size: 4124444 - timestamp: 1771293559119 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 - md5: 239c5e9546c38a1e884d69effcf4c882 + size: 34351256 + timestamp: 1777308129451 +- conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_1.conda + sha256: d8a988a8d49c4f3c769ef9871e500512c3a8103003e632b683a35031da5d7e36 + md5: 0a574d07bd755991d6592d7de69ec29f depends: - - __glibc >=2.17,<3.0.a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - __unix + constrains: + - rust >=1.94.0,<1.94.1.0a0 + license: MIT + license_family: MIT purls: [] - size: 603262 - timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda - sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 - md5: 4faa39bf919939602e594253bd673958 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + size: 36530266 + timestamp: 1777308727026 +- conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda + sha256: 7e7e2556978bc9bd9628c6e39138c684082320014d708fbca0c9050df98c0968 + md5: 68a978f77c0ba6ca10ce55e188a21857 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 588060 - timestamp: 1771378040807 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f - md5: 915f5995e94f60e9a4826e0b0920ee88 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: LGPL-2.1-only + size: 4948 + timestamp: 1771434185960 +- conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda + sha256: fabfe031ede99898cb2b0b805f6c0d64fcc24ecdb444de3a83002d8135bf4804 + md5: 5f0ebbfea12d8e5bddff157e271fdb2f + license: BSD-3-Clause + license_family: BSD purls: [] - size: 790176 - timestamp: 1754908768807 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 - md5: 5a86bf847b9b926f3a4f203339748d78 + size: 4971 + timestamp: 1771434195389 +- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + sha256: c47299fe37aebb0fcf674b3be588e67e4afb86225be4b0d452c7eb75c086b851 + md5: 13dc3adbc692664cd3beabd216434749 depends: - - libgcc >=14 - license: LGPL-2.1-only + - __glibc >=2.28 + - kernel-headers_linux-64 4.18.0 he073ed8_9 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL purls: [] - size: 791226 - timestamp: 1754910975665 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - sha256: a1c8cecdf9966921e13f0ae921309a1f415dfbd2b791f2117cf7e8f5e61a48b6 - md5: 210a85a1119f97ea7887188d176db135 + size: 24008591 + timestamp: 1765578833462 +- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + sha256: 1bd2db6b2e451247bab103e4a0128cf6c7595dd72cb26d70f7fadd9edd1d1bc3 + md5: fdf07ab944a222ff28c754914fdb0740 depends: - - __osx >=10.13 - license: LGPL-2.1-only + - __glibc >=2.28 + - kernel-headers_linux-aarch64 4.18.0 h05a177a_9 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL purls: [] - size: 737846 - timestamp: 1754908900138 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 - md5: 4d5a7445f0b25b6a3ddbb56e790f5251 - depends: - - __osx >=11.0 - license: LGPL-2.1-only + size: 23644746 + timestamp: 1765578629426 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain purls: [] - size: 750379 - timestamp: 1754909073836 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda - sha256: cc38c900b9a20fe75e61cbb594e749c57a06d96510722f5ddfa309682062b065 - md5: 842a81de672ddcf476337c8bde3cad33 + size: 119135 + timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda + build_number: 7 + sha256: 30006902a9274de8abdad5a9f02ef7c8bb3d69a503486af0c1faee30b023e5b7 + md5: eaac87c21aff3ed21ad9656697bb8326 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libunistring >=0,<1.0a0 - license: LGPL-2.0-only - license_family: LGPL + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 139036 - timestamp: 1760385590993 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libidn2-2.3.8-h99ff5a0_1.conda - sha256: 24a063e235affa6a3232c7b66057c34450376204ada660823715353f57a0465f - md5: 8b950427dd67ee2e967604f7e448c383 + size: 8328 + timestamp: 1764092562779 +- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + sha256: 9f242f13537ef1ce195f93f0cc162965d6cc79da578568d6d8e50f70dd025c42 + md5: 4173ac3b19ec0a4f400b4f782910368b depends: - - libgcc >=14 - - libunistring >=0,<1.0a0 - license: LGPL-2.0-only - license_family: LGPL + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD purls: [] - size: 147165 - timestamp: 1760387531719 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libidn2-2.3.8-h13f126c_1.conda - sha256: 12d9d76ad7101ded05b13a4ab51862bef5731d6715f7f0eb85718a91fbafdcd0 - md5: 50b332868597b9c70f493ae5c7df6560 + size: 133427 + timestamp: 1771350680709 +- conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + sha256: 2f5bc0292d595399df0d168355b4e9820affc8036792d6984bd751fdda2bcaea + md5: fc9a153c57c9f070bebaa7eef30a8f17 depends: - __osx >=10.13 - - libintl >=0.25.1,<1.0a0 - - libunistring >=0,<1.0a0 - license: LGPL-2.0-only - license_family: LGPL + license: MIT + license_family: MIT purls: [] - size: 145122 - timestamp: 1760386407257 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libidn2-2.3.8-ha90df94_1.conda - sha256: 6d9d2db2c8a645f63073553e9497ea266507c940de42800f2f0faddbf00149cd - md5: d4b2e2dd2a1a1e2df8b4a3f05034beb4 + size: 186122 + timestamp: 1765215100384 +- conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda + sha256: 2bd1cf3d26789b7e1d04e914ccd169bd618fceed68abf7b6a305266b88dcf861 + md5: 2b23ec416cef348192a5a17737ddee60 depends: - - __osx >=11.0 - - libintl >=0.25.1,<1.0a0 - - libunistring >=0,<1.0a0 - license: LGPL-2.0-only - license_family: LGPL + - cctools >=949.0.1 + - clang_osx-64 19.* + - ld64 >=530 + - llvm-openmp + license: BSD-3-Clause + license_family: BSD purls: [] - size: 145706 - timestamp: 1760385907428 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - sha256: 8c352744517bc62d24539d1ecc813b9fdc8a785c780197c5f0b84ec5b0dfe122 - md5: a8e54eefc65645193c46e8b180f62d22 + size: 6695 + timestamp: 1753098825695 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda + sha256: 0563fb193edde8002059e1a7fc32b23b5bd48389d9abdf5e49ff81e7490da722 + md5: 7b4852df7d4ed4e45bcb70c5d4b08cd0 depends: - - __osx >=10.13 - - libiconv >=1.18,<2.0a0 - license: LGPL-2.1-or-later + - cctools_impl_osx-64 1030.6.3 llvm19_1_h7d82c7c_4 + - ld64 956.6 llvm19_1_hc3792c1_4 + - libllvm19 >=19.1.7,<19.2.0a0 + license: APSL-2.0 + license_family: Other purls: [] - size: 96909 - timestamp: 1753343977382 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a - md5: 5103f6a6b210a3912faf8d7db516918c + size: 24262 + timestamp: 1768852850946 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda + sha256: 43928e68f59a8e4135d20df702cf97073b07a162979a30258d93f6e44b1220db + md5: bb274e464cf9479e0a6da2cf2e33bc16 depends: - - __osx >=11.0 - - libiconv >=1.18,<2.0a0 - license: LGPL-2.1-or-later - purls: [] - size: 90957 - timestamp: 1751558394144 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 - md5: 8397539e3a0bbd1695584fb4f927485a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 + - __osx >=10.13 + - ld64_osx-64 >=956.6,<956.7.0a0 + - libcxx + - libllvm19 >=19.1.7,<19.2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools 19.1.* + - sigtool-codesign constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib + - cctools 1030.6.3.* + - clang 19.1.* + - ld64 956.6.* + license: APSL-2.0 + license_family: Other purls: [] - size: 633710 - timestamp: 1762094827865 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda - sha256: 84064c7c53a64291a585d7215fe95ec42df74203a5bf7615d33d49a3b0f08bb6 - md5: 5109d7f837a3dfdf5c60f60e311b041f + size: 745672 + timestamp: 1768852809822 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda + sha256: 258f7bde2b5f664f60130d0066f5cee96a308d946e95bacc82b44b76c776124a + md5: fdef8a054844f72a107dfd888331f4a7 depends: - - libgcc >=14 + - cctools_impl_osx-64 1030.6.3 llvm19_1_h7d82c7c_4 + - ld64_osx-64 956.6 llvm19_1_hcae3351_4 constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other purls: [] - size: 691818 - timestamp: 1762094728337 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda - build_number: 5 - sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053 - md5: b38076eb5c8e40d0106beda6f95d7609 + size: 23193 + timestamp: 1768852854819 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19-19.1.7-default_h9399c5b_9.conda + sha256: bdc69de3f6fdf17c4a86b5bdf2072ac7baf9b69734ee2f573822b8c46fe64b39 + md5: 664c48272c72fb25f3b6e1031ebc6a3f depends: - - libblas 3.11.0 5_h4a7cf45_openblas - constrains: - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas - - libcblas 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD + - __osx >=11.0 + - libclang-cpp19.1 19.1.7 default_h9399c5b_9 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 18200 - timestamp: 1765818857876 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda - build_number: 5 - sha256: 692222d186d3ffbc99eaf04b5b20181fd26aee1edec1106435a0a755c57cce86 - md5: 88d1e4133d1182522b403e9ba7435f04 + size: 770717 + timestamp: 1776984724776 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19.1.7-default_h1323312_9.conda + sha256: c4b6b048f5666b12c6a1710181c639240c31763dd9b9d540709cf9e37b8a32db + md5: 3435d8341fc397a5c6a8676abd28e2ee depends: - - libblas 3.11.0 5_haddc8a3_openblas - constrains: - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas - - libcblas 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD + - cctools + - clang-19 19.1.7.* default_* + - clang_impl_osx-64 19.1.7 default_ha1a018a_9 + - ld64 + - ld64_osx-64 * llvm19_1_* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 18392 - timestamp: 1765818627104 -- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-5_h859234e_openblas.conda - build_number: 5 - sha256: 2c915fe2b3d806d4b82776c882ba66ba3e095e9e2c41cc5c3375bffec6bddfdc - md5: eb5b1c25d4ac30813a6ca950a58710d6 + size: 24913 + timestamp: 1776984881267 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_9.conda + sha256: dcf0d1bd251ac9c48875d38cd9434edf9833d7d23a26fc3b1f33c18181441c09 + md5: 72a199c17b7f87cad5e965a3c0352f9b depends: - - libblas 3.11.0 5_he492b99_openblas - constrains: - - libcblas 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas - license: BSD-3-Clause - license_family: BSD + - cctools_impl_osx-64 + - clang-19 19.1.7.* default_* + - compiler-rt 19.1.7.* + - compiler-rt_osx-64 + - ld64_osx-64 * llvm19_1_* + - llvm-openmp >=19.1.7 + - llvm-tools 19.1.7.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 18491 - timestamp: 1765819090240 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda - build_number: 5 - sha256: 735a6e6f7d7da6f718b6690b7c0a8ae4815afb89138aa5793abe78128e951dbb - md5: ca9d752201b7fa1225bca036ee300f2b + size: 24878 + timestamp: 1776984866319 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_31.conda + sha256: aa12658e55300efcdc34010312ee62d350464ae0ae8c30d1f7340153c9baa5aa + md5: faf4b6245c4287a4f13e793ca2826842 depends: - - libblas 3.11.0 5_h51639a9_openblas - constrains: - - libcblas 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas + - cctools_osx-64 + - clang 19.* + - clang_impl_osx-64 19.1.7.* + - sdkroot_env_osx-64 license: BSD-3-Clause license_family: BSD purls: [] - size: 18551 - timestamp: 1765819121855 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - sha256: 375a634873b7441d5101e6e2a9d3a42fec51be392306a03a2fa12ae8edecec1a - md5: 05a54b479099676e75f80ad0ddd38eff + size: 21157 + timestamp: 1769482965411 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_9.conda + sha256: 667214e74fe71858640e1d94f0ca0fe37e2e6e8dd0ddbcc373695adfa1185bf7 + md5: 875ce008f7b606030e29b3b9f34df10c depends: - - __osx >=10.13 - - libcxx >=19 - - libxml2 - - libxml2-16 >=2.14.5 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 + - clang 19.1.7 default_h1323312_9 + - clangxx_impl_osx-64 19.1.7.* default_* + - libcxx-devel 19.1.* license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 28801374 - timestamp: 1757354631264 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - sha256: 46f8ff3d86438c0af1bebe0c18261ce5de9878d58b4fe399a3a125670e4f0af5 - md5: d1d9b233830f6631800acc1e081a9444 + size: 24855 + timestamp: 1776985026294 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_9.conda + sha256: 7b1cb2b97c9c4af22d44c1175b9d99a73cab0c2588b38b2fc25e4350f6c959f3 + md5: a3f63cb2e69da3700555541b67b864b9 depends: - - __osx >=11.0 - - libcxx >=19 - - libxml2 - - libxml2-16 >=2.14.5 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 + - clang-19 19.1.7.* default_* + - clang_impl_osx-64 19.1.7 default_ha1a018a_9 + - libcxx-devel 19.1.* license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 26914852 - timestamp: 1757353228286 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb - md5: c7c83eecbb72d88b940c249af56c8b17 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - constrains: - - xz 5.8.2.* - license: 0BSD - purls: [] - size: 113207 - timestamp: 1768752626120 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - sha256: 843c46e20519651a3e357a8928352b16c5b94f4cd3d5481acc48be2e93e8f6a3 - md5: 96944e3c92386a12755b94619bae0b35 - depends: - - libgcc >=14 - constrains: - - xz 5.8.2.* - license: 0BSD - purls: [] - size: 125916 - timestamp: 1768754941722 -- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - sha256: 7ab3c98abd3b5d5ec72faa8d9f5d4b50dcee4970ed05339bc381861199dabb41 - md5: 688a0c3d57fa118b9c97bf7e471ab46c - depends: - - __osx >=10.13 - constrains: - - xz 5.8.2.* - license: 0BSD - purls: [] - size: 105482 - timestamp: 1768753411348 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e - md5: 009f0d956d7bfb00de86901d16e486c7 - depends: - - __osx >=11.0 - constrains: - - xz 5.8.2.* - license: 0BSD - purls: [] - size: 92242 - timestamp: 1768752982486 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 - md5: 2c21e66f50753a083cbe6b80f38268fa - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 92400 - timestamp: 1769482286018 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 - md5: 7b9813e885482e3ccb1fa212b86d7fd0 + size: 24811 + timestamp: 1776985012470 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_31.conda + sha256: 308df8233f2a7a258e6441fb02553a1b5a54afe5e93d63b016dd9c0f1d28d5ab + md5: c3b46b5d6cd2a6d1f12b870b2c69aed4 depends: - - libgcc >=14 - license: BSD-2-Clause + - cctools_osx-64 + - clang_osx-64 19.1.7 h8a78ed7_31 + - clangxx 19.* + - clangxx_impl_osx-64 19.1.7.* + - sdkroot_env_osx-64 + license: BSD-3-Clause license_family: BSD purls: [] - size: 114056 - timestamp: 1769482343003 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - sha256: 1096c740109386607938ab9f09a7e9bca06d86770a284777586d6c378b8fb3fd - md5: ec88ba8a245855935b871a7324373105 + size: 19974 + timestamp: 1769482973715 +- conda: https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda + sha256: 28e5f0a6293acba68ebc54694a2fc40b1897202735e8e8cbaaa0e975ba7b235b + md5: e6b9e71e5cb08f9ed0185d31d33a074b depends: - __osx >=10.13 - license: BSD-2-Clause - license_family: BSD + - clang 19.1.7.* + - compiler-rt_osx-64 19.1.7.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE purls: [] - size: 79899 - timestamp: 1769482558610 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 - md5: 57c4be259f5e0b99a5983799a228ae55 + size: 96722 + timestamp: 1757412473400 +- conda: https://conda.anaconda.org/conda-forge/osx-64/compilers-1.11.0-h694c41f_0.conda + sha256: d95722dfe9a45b22fbb4e8d4f9531ac5ef7d829f3bfd2ed399d45d7590681bd0 + md5: 308ed38aeff454285547012272cb59f5 depends: - - __osx >=11.0 - license: BSD-2-Clause + - c-compiler 1.11.0 h7a00415_0 + - cxx-compiler 1.11.0 h307afc9_0 + - fortran-compiler 1.11.0 h9ab62e8_0 + license: BSD-3-Clause license_family: BSD purls: [] - size: 73690 - timestamp: 1769482560514 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 - md5: b499ce4b026493a13774bcf0f4c33849 - depends: - - __glibc >=2.17,<3.0.a0 - - c-ares >=1.34.5,<2.0a0 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.2,<4.0a0 - license: MIT - license_family: MIT - purls: [] - size: 666600 - timestamp: 1756834976695 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - sha256: b03f406fd5c3f865a5e08c89b625245a9c4e026438fd1a445e45e6a0d69c2749 - md5: 981082c1cc262f514a5a2cf37cab9b81 - depends: - - c-ares >=1.34.5,<2.0a0 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.2,<4.0a0 - license: MIT - license_family: MIT - purls: [] - size: 728661 - timestamp: 1756835019535 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - sha256: c48d7e1cc927aef83ff9c48ae34dd1d7495c6ccc1edc4a3a6ba6aff1624be9ac - md5: e7630cef881b1174d40f3e69a883e55f - depends: - - __osx >=10.13 - - c-ares >=1.34.5,<2.0a0 - - libcxx >=19 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.2,<4.0a0 - license: MIT - license_family: MIT + size: 7509 + timestamp: 1753098827841 +- conda: https://conda.anaconda.org/conda-forge/osx-64/coreutils-9.5-h10d778d_0.conda + sha256: 7a29ae82cf1c455b4956c8311ae97832460c3585f0d8789fd82161dd2a20d1fd + md5: 8332c7ae324c9fc4b22cc3d84a0582e8 + license: GPL-3.0-or-later + license_family: GPL purls: [] - size: 605680 - timestamp: 1756835898134 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - sha256: a07cb53b5ffa2d5a18afc6fd5a526a5a53dd9523fbc022148bd2f9395697c46d - md5: a4b4dd73c67df470d091312ab87bf6ae + size: 1374585 + timestamp: 1711655512907 +- conda: https://conda.anaconda.org/conda-forge/osx-64/curl-8.20.0-h8f0b9e4_0.conda + sha256: caba0869bb0d18de3ce8eeda0ae4a0b988ff907faa9b5d94aea38d703d09413d + md5: af6b1246193c8db5da3c91594336293b depends: - __osx >=11.0 - - c-ares >=1.34.5,<2.0a0 - - libcxx >=19 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.2,<4.0a0 - license: MIT + - krb5 >=1.22.2,<1.23.0a0 + - libcurl 8.20.0 h8f0b9e4_0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl license_family: MIT purls: [] - size: 575454 - timestamp: 1756835746393 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 - md5: be43915efc66345cccb3c310b6ed0374 + size: 182564 + timestamp: 1777462268628 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda + sha256: d6976f8d8b51486072abfe1e76a733688380dcbd1a8e993a43d59b80f7288478 + md5: 463bb03bb27f9edc167fb3be224efe96 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - constrains: - - openblas >=0.3.30,<0.3.31.0a0 + - c-compiler 1.11.0 h7a00415_0 + - clangxx_osx-64 19.* license: BSD-3-Clause license_family: BSD purls: [] - size: 5927939 - timestamp: 1763114673331 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda - sha256: 794a7270ea049ec931537874cd8d2de0ef4b3cef71c055cfd8b4be6d2f4228b0 - md5: 11d7d57b7bdd01da745bbf2b67020b2e + size: 6732 + timestamp: 1753098827160 +- conda: https://conda.anaconda.org/conda-forge/osx-64/fortran-compiler-1.11.0-h9ab62e8_0.conda + sha256: 21e2ec84b7b152daa22fa8cc98be5d4ba9ff93110bbc99e05dfd45eb6f7e8b77 + md5: ee1a3ecd568a695ea16747198df983eb depends: - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - constrains: - - openblas >=0.3.30,<0.3.31.0a0 + - cctools >=949.0.1 + - gfortran + - gfortran_osx-64 14.* + - ld64 >=530 + - llvm-openmp license: BSD-3-Clause license_family: BSD purls: [] - size: 4959359 - timestamp: 1763114173544 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - sha256: ba642353f7f41ab2d2eb6410fbe522238f0f4483bcd07df30b3222b4454ee7cd - md5: 9241a65e6e9605e4581a2a8005d7f789 + size: 6749 + timestamp: 1753098826431 +- conda: https://conda.anaconda.org/conda-forge/osx-64/gfortran-14.3.0-hcc3c99d_0.conda + sha256: e99605f629a4baceba28bfda6305f6898a42a1a05a5833a92808b737457a0711 + md5: 6077316830986f224d771f9e6ba5c516 depends: - - __osx >=10.13 - - libgfortran - - libgfortran5 >=14.3.0 - - llvm-openmp >=19.1.7 - constrains: - - openblas >=0.3.30,<0.3.31.0a0 - license: BSD-3-Clause - license_family: BSD + - cctools + - gfortran_osx-64 14.3.0 + - ld64 + license: GPL-3.0-or-later WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 6268795 - timestamp: 1763117623665 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda - sha256: ebbbc089b70bcde87c4121a083c724330f02a690fb9d7c6cd18c30f1b12504fa - md5: a6f6d3a31bb29e48d37ce65de54e2df0 + size: 32631 + timestamp: 1751220511321 +- conda: https://conda.anaconda.org/conda-forge/osx-64/gfortran_impl_osx-64-14.3.0-h94fe04d_1.conda + sha256: 7a2a952ffee0349147768c1d6482cb0933349017056210118ebd5f0fb688f5d5 + md5: 1a81d1a0cb7f241144d9f10e55a66379 depends: - - __osx >=11.0 - - libgfortran + - __osx >=10.13 + - cctools_osx-64 + - clang + - gmp >=6.3.0,<7.0a0 + - isl 0.26.* + - libcxx >=17 + - libgfortran-devel_osx-64 14.3.0.* - libgfortran5 >=14.3.0 - - llvm-openmp >=19.1.7 - constrains: - - openblas >=0.3.30,<0.3.31.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 4284132 - timestamp: 1768547079205 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda - sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c - md5: 5f13ffc7d30ffec87864e678df9957b4 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.1,<2.0a0 - license: zlib-acknowledgement - purls: [] - size: 317669 - timestamp: 1770691470744 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda - sha256: c7378c6b79de4d571d00ad1caf0a4c19d43c9c94077a761abb6ead44d891f907 - md5: be4088903b94ea297975689b3c3aeb27 - depends: - - libgcc >=14 + - libiconv >=1.18,<2.0a0 - libzlib >=1.3.1,<2.0a0 - license: zlib-acknowledgement - purls: [] - size: 340156 - timestamp: 1770691477245 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - sha256: e03ed186eefb46d7800224ad34bad1268c9d19ecb8f621380a50601c6221a4a7 - md5: ad3a0e2dc4cce549b2860e2ef0e6d75b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14.3.0 - - libstdcxx >=14.3.0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - zlib license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 7949259 - timestamp: 1771377982207 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_18.conda - sha256: 48641a458e3da681038af7ebdab143f9b6861ad9d1dcc2b4997ff2b744709423 - md5: 03feac8b6e64b72ae536fdb264e2618d + size: 23083852 + timestamp: 1759709470800 +- conda: https://conda.anaconda.org/conda-forge/osx-64/gfortran_osx-64-14.3.0-h3223c34_0.conda + sha256: 14014ad4d46e894645979cbad42dd509482172095c756bdb5474918e0638bd57 + md5: 979b3c36c57d31e1112fa1b1aec28e02 depends: - - libgcc >=14.3.0 - - libstdcxx >=14.3.0 - license: GPL-3.0-only WITH GCC-exception-3.1 + - cctools_osx-64 + - clang + - clang_osx-64 + - gfortran_impl_osx-64 14.3.0 + - ld64_osx-64 + - libgfortran + - libgfortran-devel_osx-64 14.3.0 + - libgfortran5 >=14.3.0 + license: GPL-3.0-or-later WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 7526147 - timestamp: 1771377792671 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libseccomp-2.6.0-hb03c661_0.conda - sha256: 5702c323cc6e1b9327f4f2aad32269301a4189944cdc847ee3ac9d6f96694d24 - md5: 6b17df90864bfc2b42881b42365968de + size: 35767 + timestamp: 1751220493617 +- conda: https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda + sha256: 75aa5e7a875afdcf4903b7dc98577672a3dc17b528ac217b915f9528f93c85fc + md5: 427101d13f19c4974552a4e5b072eef1 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: LGPL-2.1-only + - __osx >=10.13 + - libcxx >=16 + license: GPL-2.0-or-later OR LGPL-3.0-or-later purls: [] - size: 95153 - timestamp: 1764897052812 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libseccomp-2.6.0-he30d5cf_0.conda - sha256: 5f436181473e0eba30760c921ad9e7fbeb42cb151103d9edcdd0701b2ac4cae5 - md5: 39eda47603cb48668b3f26270634283a + size: 428919 + timestamp: 1718981041839 +- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + sha256: 1294117122d55246bb83ad5b589e2a031aacdf2d0b1f99fd338aa4394f881735 + md5: 627eca44e62e2b665eeec57a984a7f00 depends: - - libgcc >=14 - license: LGPL-2.1-only + - __osx >=11.0 + license: MIT + license_family: MIT purls: [] - size: 99944 - timestamp: 1764896963537 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - sha256: f87b743d5ab11c1a8ddd800dd9357fc0fabe47686068232ddc1d1eed0d7321ec - md5: 3576aba85ce5e9ab15aa0ea376ab864b + size: 12273764 + timestamp: 1773822733780 +- conda: https://conda.anaconda.org/conda-forge/osx-64/isa-l-2.31.1-h6e16a3a_1.conda + sha256: 067aa4c822a9fa93eddd4f1f849da15a16c594d6ab97bd86d5a0a9d08705e0b5 + md5: ce862c9411f9c675a0d322a049b8689f depends: - __osx >=10.13 - - openssl >=3.5.4,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 148427 + timestamp: 1736497384136 +- conda: https://conda.anaconda.org/conda-forge/osx-64/isl-0.26-imath32_h2e86a7b_101.conda + sha256: d39bf147cb9958f197dafa0b8ad8c039b7374778edac05b5c78b712786e305c7 + md5: d06222822a9144918333346f145b68c6 + depends: + - libcxx >=14.0.6 + track_features: + - isl_imath-32 license: MIT license_family: MIT purls: [] - size: 38085 - timestamp: 1767044977731 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - sha256: 421f7bd7caaa945d9cd5d374cc3f01e75637ca7372a32d5e7695c825a48a30d1 - md5: c08557d00807785decafb932b5be7ef5 + size: 894410 + timestamp: 1680649639107 +- conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda + sha256: df009385e8262c234c0dae9016540b86dad3d299f0d9366d08e327e8e7731634 + md5: e66e2c52d2fdddcf314ad750fb4ebb4a depends: - - __osx >=11.0 - - openssl >=3.5.4,<4.0a0 + - __osx >=10.13 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 36416 - timestamp: 1767045062496 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 - md5: da5be73701eecd0e8454423fd6ffcf30 + size: 1193620 + timestamp: 1769770267475 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_4.conda + sha256: 6f821c4c6a19722162ef2905c45e0f8034544dab70bb86c647fb4e022a9c27b4 + md5: 4d51a4b9f959c1fac780645b9d480a82 depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: blessing + - ld64_osx-64 956.6 llvm19_1_hcae3351_4 + - libllvm19 >=19.1.7,<19.2.0a0 + constrains: + - cctools 1030.6.3.* + - cctools_osx-64 1030.6.3.* + license: APSL-2.0 + license_family: Other purls: [] - size: 942808 - timestamp: 1768147973361 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda - sha256: 5f8230ccaf9ffaab369adc894ef530699e96111dac0a8ff9b735a871f8ba8f8b - md5: 4e3ba0d5d192f99217b85f07a0761e64 + size: 21560 + timestamp: 1768852832804 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_hcae3351_4.conda + sha256: 2ae4c885ea34bc976232fbfb8129a2a3f0a79b0f42a8f7437e06d571d1b6760c + md5: 2329a96b45c853dd22af9d11762f9057 depends: - - icu >=78.2,<79.0a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: blessing + - __osx >=10.13 + - libcxx + - libllvm19 >=19.1.7,<19.2.0a0 + - sigtool-codesign + - tapi >=1600.0.11.8,<1601.0a0 + constrains: + - cctools 1030.6.3.* + - clang 19.1.* + - cctools_impl_osx-64 1030.6.3.* + - ld64 956.6.* + license: APSL-2.0 + license_family: Other purls: [] - size: 944688 - timestamp: 1768147991301 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda - sha256: 710a7ea27744199023c92e66ad005de7f8db9cf83f10d5a943d786f0dac53b7c - md5: d910105ce2b14dfb2b32e92ec7653420 + size: 1110678 + timestamp: 1768852747927 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_h9399c5b_9.conda + sha256: 05845abab074f2fe17f2abe7d96eef967b3fa6552799399a00331995f6e5ffa2 + md5: 9382ae02bf45b4f8bd1e0fb0e5ee936c depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: blessing + - __osx >=11.0 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 987506 - timestamp: 1768148247615 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - sha256: 6e9b9f269732cbc4698c7984aa5b9682c168e2a8d1e0406e1ff10091ca046167 - md5: 4b0bf313c53c3e89692f020fb55d5f2c + size: 14856061 + timestamp: 1776984570408 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.20.0-h8f0b9e4_0.conda + sha256: 5d3d8a82ca43347e96f1d79048921f3a7c25e32514bc7feb53ed2a040dcca54d + md5: 4a0085ccf90dc514f0fc0909a874045e depends: - __osx >=11.0 - - icu >=78.2,<79.0a0 - - libzlib >=1.3.1,<2.0a0 - license: blessing + - krb5 >=1.22.2,<1.23.0a0 + - libnghttp2 >=1.68.1,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT purls: [] - size: 909777 - timestamp: 1768148320535 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 - md5: eecce068c7e4eddeb169591baac20ac4 + size: 419676 + timestamp: 1777462238769 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda + sha256: 8f3d495df4427d9285ae25a51d32123ca251c32abebcef020fddb8ac1f200894 + md5: 56fa8b3e43d26c97da88aea4e958f616 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.0,<4.0a0 - license: BSD-3-Clause - license_family: BSD + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 304790 - timestamp: 1745608545575 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - sha256: 1e289bcce4ee6a5817a19c66e296f3c644dcfa6e562e5c1cba807270798814e7 - md5: eecc495bcfdd9da8058969656f916cc2 + size: 567420 + timestamp: 1778192020253 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda + sha256: 760af3509e723d8ee5a9baa7f923a213a758b3a09e41ffdaf10f3a474898ab3f + md5: 52031c3ab8857ea8bcc96fe6f1b6d778 depends: - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.0,<4.0a0 - license: BSD-3-Clause - license_family: BSD + - libcxx >=19.1.7 + - libcxx-headers >=19.1.7,<19.1.8.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 311396 - timestamp: 1745609845915 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - sha256: 00654ba9e5f73aa1f75c1f69db34a19029e970a4aeb0fa8615934d8e9c369c3c - md5: a6cb15db1c2dc4d3a5f6cf3772e09e81 + size: 23069 + timestamp: 1764648572536 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda + sha256: 025f8b1e85dd8254e0ca65f011919fb1753070eb507f03bca317871a884d24de + md5: 31aa65919a729dc48180893f62c25221 depends: - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.0,<4.0a0 - license: BSD-3-Clause - license_family: BSD + license: MIT + license_family: MIT purls: [] - size: 284216 - timestamp: 1745608575796 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a - md5: b68e8f66b94b44aaa8de4583d3d4cc40 + size: 70840 + timestamp: 1761980008502 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + sha256: 6cc49785940a99e6a6b8c6edbb15f44c2dd6c789d9c283e5ee7bdfedd50b4cd6 + md5: 1f4ed31220402fcddc083b4bff406868 depends: - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.0,<4.0a0 - license: BSD-3-Clause + - ncurses + - __osx >=10.13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause license_family: BSD purls: [] - size: 279193 - timestamp: 1745608793272 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e - md5: 1b08cd684f34175e4514474793d44bcb - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_18 - constrains: - - libstdcxx-ng ==15.2.0=*_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + size: 115563 + timestamp: 1738479554273 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + sha256: 0d238488564a7992942aa165ff994eca540f687753b4f0998b29b4e4d030ff43 + md5: 899db79329439820b7e8f8de41bca902 + license: BSD-2-Clause + license_family: BSD purls: [] - size: 5852330 - timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 - md5: f56573d05e3b735cb03efeb64a15f388 + size: 106663 + timestamp: 1702146352558 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda + sha256: 5ebcc413d0a75da926a8b9b681d7d12c9562993991ba49c90a9881c4a59bdc11 + md5: d2e01f78c1daaeb4d2aa870125ebcd7e depends: - - libgcc 15.2.0 h8acb6b2_18 + - __osx >=11.0 constrains: - - libstdcxx-ng ==15.2.0=*_18 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - expat 2.8.0.* + license: MIT + license_family: MIT purls: [] - size: 5541411 - timestamp: 1771378162499 -- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - sha256: b1c3824769b92a1486bf3e2cc5f13304d83ae613ea061b7bc47bb6080d6dfdba - md5: 865a399bce236119301ebd1532fced8d + size: 75242 + timestamp: 1777846416221 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + sha256: 951958d1792238006fdc6fce7f71f1b559534743b26cc1333497d46e5903a2d6 + md5: 66a0dc7464927d0853b590b6f53ba3ea depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - __osx >=10.13 + license: MIT + license_family: MIT purls: [] - size: 20171098 - timestamp: 1771377827750 -- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_118.conda - sha256: 609585a02b05a2b0f2cabb18849328455cbce576f2e3eb8108f3ef7f4cb165a6 - md5: bcf29f2ed914259a258204b05346abb1 + size: 53583 + timestamp: 1769456300951 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda + sha256: 17a5dcd818f89173db51d7d1acd77615cb77db7b4c2b5f571d4dafe559430ab5 + md5: 4bf33d5ca73f4b89d3495285a42414a4 depends: - - __unix + - _openmp_mutex + constrains: + - libgomp 15.2.0 19 + - libgcc-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 17565700 - timestamp: 1771377672552 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145 - md5: 6235adb93d064ecdf3d44faee6f468de + size: 424164 + timestamp: 1778271183296 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda + sha256: 519045363b87b870be779d38f0bfd325d4b787acdaa0a2136a92c1081eff5112 + md5: d362f41203d0a1d2d4940446f95374c9 depends: - - libstdcxx 15.2.0 h934c35e_18 + - libgfortran5 15.2.0 hd16e46c_19 + constrains: + - libgfortran-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27575 - timestamp: 1771378314494 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda - sha256: 035a31cde134e706e30029a837a31f729ad32b7c5bca023271dfe91a8ba6c896 - md5: 699d294376fe18d80b7ce7876c3a875d + size: 139925 + timestamp: 1778271458366 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda + sha256: c7f5f6e80357d6d5bc69588c16144205b0c79cf32cd090ccb5afef9d557632af + md5: 1cddb3f7e54f5871297afc0fafa61c2c depends: - - libstdcxx 15.2.0 hef695bb_18 + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27645 - timestamp: 1771378204663 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hc4654cb_2.conda - sha256: 18653b4a5c73e19c5e86ff72dab9bf59f5cc43d7f404a6be705d152dfd5e0660 - md5: be54fb40ea32e8fe9dbaa94d4528b57e - depends: - - __glibc >=2.17,<3.0.a0 - - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.22,<1.23.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - liblzma >=5.6.3,<6.0a0 - - libstdcxx >=13 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: HPND - purls: [] - size: 429018 - timestamp: 1733443013288 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-hca96517_2.conda - sha256: d736d840d1f2446234195adfcb51b132c85797730b6f42ebf058d350fa9d20e8 - md5: 278dcef6d1ea28c04109c3f5dea126cb + size: 1063687 + timestamp: 1778271196574 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libhwy-1.3.0-hab838a1_1.conda + sha256: 2f49632a3fd9ec5e38a45738f495f8c665298b0b35e6c89cef8e0fbc39b3f791 + md5: bb8ff4fec8150927a54139af07ef8069 depends: - - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.22,<1.23.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - liblzma >=5.6.3,<6.0a0 - - libstdcxx >=13 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: HPND + - __osx >=10.13 + - libcxx >=19 + license: Apache-2.0 OR BSD-3-Clause purls: [] - size: 464857 - timestamp: 1733443105529 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 - sha256: e88c45505921db29c08df3439ddb7f771bbff35f95e7d3103bf365d5d6ce2a6d - md5: 7245a044b4a1980ed83196176b78b73a + size: 1003288 + timestamp: 1758894613094 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + sha256: a1c8cecdf9966921e13f0ae921309a1f415dfbd2b791f2117cf7e8f5e61a48b6 + md5: 210a85a1119f97ea7887188d176db135 depends: - - libgcc-ng >=9.3.0 - license: GPL-3.0-only OR LGPL-3.0-only + - __osx >=10.13 + license: LGPL-2.1-only purls: [] - size: 1433436 - timestamp: 1626955018689 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libunistring-0.9.10-hf897c2e_0.tar.bz2 - sha256: 03acebd5a01a255fe40d47f941c6cab4dc7829206d86d990b0c88cf0ff66e646 - md5: 7c68521243dc20afba4c4c05eb09586e + size: 737846 + timestamp: 1754908900138 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libidn2-2.3.8-h13f126c_1.conda + sha256: 12d9d76ad7101ded05b13a4ab51862bef5731d6715f7f0eb85718a91fbafdcd0 + md5: 50b332868597b9c70f493ae5c7df6560 depends: - - libgcc-ng >=9.3.0 - license: GPL-3.0-only OR LGPL-3.0-only - purls: [] - size: 1409624 - timestamp: 1626959749923 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libunistring-0.9.10-h0d85af4_0.tar.bz2 - sha256: c5805a58cd2b211bffdc8b7cdeba9af3cee456196ab52ab9a30e0353bc95beb7 - md5: 40f27dc16f73256d7b93e53c4f03d92f - license: GPL-3.0-only OR LGPL-3.0-only - purls: [] - size: 1392865 - timestamp: 1626955817826 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libunistring-0.9.10-h3422bc3_0.tar.bz2 - sha256: a1afe12ab199f82f339eae83405d293d197f2485d45346a709703bc7e8299949 - md5: d88e77a4861e20bd96bde6628ee7a5ae - license: GPL-3.0-only OR LGPL-3.0-only + - __osx >=10.13 + - libintl >=0.25.1,<1.0a0 + - libunistring >=0,<1.0a0 + license: LGPL-2.0-only + license_family: LGPL purls: [] - size: 1577561 - timestamp: 1626955172521 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee - md5: db409b7c1720428638e7c0d509d3e1b5 + size: 145122 + timestamp: 1760386407257 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + sha256: 8c352744517bc62d24539d1ecc813b9fdc8a785c780197c5f0b84ec5b0dfe122 + md5: a8e54eefc65645193c46e8b180f62d22 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD + - __osx >=10.13 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later purls: [] - size: 40311 - timestamp: 1766271528534 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 - md5: cf2861212053d05f27ec49c3784ff8bb + size: 96909 + timestamp: 1753343977382 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda + sha256: 375a634873b7441d5101e6e2a9d3a42fec51be392306a03a2fa12ae8edecec1a + md5: 05a54b479099676e75f80ad0ddd38eff depends: - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD + - __osx >=10.13 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 43453 - timestamp: 1766271546875 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b - md5: aea31d2e5b1091feca96fcfe945c3cf9 + size: 28801374 + timestamp: 1757354631264 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + sha256: d9e2006051529aec5578c6efeb13bb6a7200a014b2d5a77a579e83a8049d5f3c + md5: becdfbfe7049fa248e52aa37a9df09e2 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 + - __osx >=11.0 constrains: - - libwebp 1.6.0 - license: BSD-3-Clause - license_family: BSD + - xz 5.8.3.* + license: 0BSD purls: [] - size: 429011 - timestamp: 1752159441324 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda - sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 - md5: 24e92d0942c799db387f5c9d7b81f1af + size: 105724 + timestamp: 1775826029494 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda + sha256: 1096c740109386607938ab9f09a7e9bca06d86770a284777586d6c378b8fb3fd + md5: ec88ba8a245855935b871a7324373105 depends: - - libgcc >=14 - constrains: - - libwebp 1.6.0 - license: BSD-3-Clause + - __osx >=10.13 + license: BSD-2-Clause license_family: BSD purls: [] - size: 359496 - timestamp: 1752160685488 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa - md5: 92ed62436b625154323d40d5f2f11dd7 + size: 79899 + timestamp: 1769482558610 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda + sha256: 899551e16aac9dfb85bfc2fd98b655f4d1b7fea45720ec04ccb93d95b4d24798 + md5: dba4c95e2fe24adcae4b77ebf33559ae depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp + - __osx >=11.0 + - c-ares >=1.34.6,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 395888 - timestamp: 1727278577118 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda - sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b - md5: cd14ee5cca2464a425b1dbfc24d90db2 + size: 606749 + timestamp: 1773854765508 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda + sha256: f87b743d5ab11c1a8ddd800dd9357fc0fabe47686068232ddc1d1eed0d7321ec + md5: 3576aba85ce5e9ab15aa0ea376ab864b depends: - - libgcc >=13 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp + - __osx >=10.13 + - openssl >=3.5.4,<4.0a0 license: MIT license_family: MIT purls: [] - size: 397493 - timestamp: 1727280745441 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - purls: [] - size: 100393 - timestamp: 1702724383534 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f - md5: b4df5d7d4b63579d081fd3a4cf99740e + size: 38085 + timestamp: 1767044977731 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda + sha256: 5e964e07a14180ce20decfd4897e8f81d48ec78c1cbf4af85c5520f535d9510c + md5: 9273c877f78b7486b0dfdd9268327a79 depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libzlib >=1.3.2,<2.0a0 + license: blessing purls: [] - size: 114269 - timestamp: 1702724369203 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - sha256: 047be059033c394bd32ae5de66ce389824352120b3a7c0eff980195f7ed80357 - md5: 417955234eccd8f252b86a265ccdab7f + size: 1007171 + timestamp: 1777987093870 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + sha256: 00654ba9e5f73aa1f75c1f69db34a19029e970a4aeb0fa8615934d8e9c369c3c + md5: a6cb15db1c2dc4d3a5f6cf3772e09e81 depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.1,<79.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 hca6bf5a_1 + - __osx >=10.13 - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 45402 - timestamp: 1766327161688 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.1-h825857f_1.conda - sha256: 9fe997c3e5a8207161d093a5d73f586ae46dc319cb054220086395e150dd1469 - md5: eb4665cdf78fd02d4abc4edf8c15b7b9 - depends: - - icu >=78.1,<79.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 h79dcc73_1 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT + size: 284216 + timestamp: 1745608575796 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libunistring-0.9.10-h0d85af4_0.tar.bz2 + sha256: c5805a58cd2b211bffdc8b7cdeba9af3cee456196ab52ab9a30e0353bc95beb7 + md5: 40f27dc16f73256d7b93e53c4f03d92f + license: GPL-3.0-only OR LGPL-3.0-only purls: [] - size: 47725 - timestamp: 1766327143205 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h745d5cb_1.conda - sha256: 96fe14f775ae1bd9a3c464898fbc3fa6d784b867eadcf7d58a2d510d80a6fbfb - md5: 1fd2c75a8a9adc629983ed629dec42e1 + size: 1392865 + timestamp: 1626955817826 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + sha256: 437f003e299d77403db42d17e532d686236f357ac5c3d6bf466558c697902597 + md5: c74ae93cd7876e3a9c4b5569d5e29e34 depends: - - __osx >=10.13 + - __osx >=11.0 + - icu >=78.3,<79.0a0 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 hd57b93d_1 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - icu <0.0a0 + - libxml2 2.15.3 license: MIT license_family: MIT purls: [] - size: 40460 - timestamp: 1766327727478 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda - sha256: 59f96fa27cce6a9a27414c5bb301eedda1a1b85cd0d8f5d68f77e46b86e7c95f - md5: fd804ee851e20faca4fecc7df0901d07 + size: 496338 + timestamp: 1776377250079 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda + sha256: 24248928e63b5de45012c8ad3fd6b350ae1fe2fc355613bb89ee5f0a35835bea + md5: 33f30d4878d1f047da82a669c33b307d depends: - __osx >=11.0 - - icu >=78.1,<79.0a0 + - icu >=78.3,<79.0a0 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 h5ef1a60_1 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h7a90416_0 + - libzlib >=1.3.2,<2.0a0 license: MIT license_family: MIT purls: [] - size: 40607 - timestamp: 1766327501392 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda - sha256: 8331284bf9ae641b70cdc0e5866502dd80055fc3b9350979c74bb1d192e8e09e - md5: 3fdd8d99683da9fe279c2f4cecd1e048 + size: 40836 + timestamp: 1776377277986 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + sha256: 4c6da089952b2d70150c74234679d6f7ac04f4a98f9432dec724968f912691e7 + md5: 30439ff30578e504ee5e0b390afc8c65 depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.1,<79.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 + - __osx >=11.0 constrains: - - libxml2 2.15.1 - license: MIT - license_family: MIT + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other purls: [] - size: 555747 - timestamp: 1766327145986 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.1-h79dcc73_1.conda - sha256: c76951407554d69dd348151f91cc2dc164efbd679b4f4e77deb2f9aa6eba3c12 - md5: e42758e7b065c34fd1b0e5143752f970 + size: 59000 + timestamp: 1774073052242 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.5-h0d3cbff_1.conda + sha256: aeb3719ccd1102005388a134896bef4a4060f9368612637b94f065b1e1f6213b + md5: d801d0ce2eab00dbb0178b196d0ce754 depends: - - icu >=78.1,<79.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 + - __osx >=11.0 constrains: - - libxml2 2.15.1 - license: MIT - license_family: MIT + - openmp 22.1.5|22.1.5.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE purls: [] - size: 599721 - timestamp: 1766327134458 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-hd57b93d_1.conda - sha256: abdeaea43d0e882679942cc2385342d701873e18669828e40637a70a140ce614 - md5: 060f6892620dc862f3b54b9b2da8f177 + size: 311468 + timestamp: 1778448112705 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda + sha256: fd281acb243323087ce672139f03a1b35ceb0e864a3b4e8113b9c23ca1f83bf0 + md5: bf644c6f69854656aa02d1520175840e depends: - __osx >=10.13 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 + - libcxx >=19 + - libllvm19 19.1.7 h56e7563_2 - libzlib >=1.3.1,<2.0a0 - constrains: - - libxml2 2.15.1 - - icu <0.0a0 - license: MIT - license_family: MIT - purls: [] - size: 493505 - timestamp: 1766327696842 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda - sha256: 2d5ab15113b0ba21f4656d387d26ab59e4fbaf3027f5e58a2a4fe370821eb106 - md5: 7eed1026708e26ee512f43a04d9d0027 - depends: - - __osx >=11.0 - - icu >=78.1,<79.0a0 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - constrains: - - libxml2 2.15.1 - license: MIT - license_family: MIT - purls: [] - size: 464886 - timestamp: 1766327479416 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 - md5: edb0dca6bc32e4f4789199455a1dbeb8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 60963 - timestamp: 1727963148474 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 - md5: 08aad7cbe9f5a6b460d0976076b6ae64 - depends: - - libgcc >=13 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 66657 - timestamp: 1727963199518 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 - md5: 003a54a4e32b02f7355b50a837e699da - depends: - - __osx >=10.13 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 57133 - timestamp: 1727963183990 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b - md5: 369964e85dc26bfe78f41399b366c435 - depends: - - __osx >=11.0 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 46438 - timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda - sha256: 2a41885f44cbc1546ff26369924b981efa37a29d20dc5445b64539ba240739e6 - md5: e2d811e9f464dd67398b4ce1f9c7c872 - depends: - - __osx >=10.13 - constrains: - - openmp 21.1.8|21.1.8.* - - intel-openmp <0.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - purls: [] - size: 311405 - timestamp: 1765965194247 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda - sha256: 56bcd20a0a44ddd143b6ce605700fdf876bcf5c509adc50bf27e76673407a070 - md5: 206ad2df1b5550526e386087bef543c7 - depends: - - __osx >=11.0 - constrains: - - openmp 21.1.8|21.1.8.* - - intel-openmp <0.0a0 + - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception - license_family: APACHE + license_family: Apache purls: [] - size: 285974 - timestamp: 1765964756583 + size: 17198870 + timestamp: 1757354915882 - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda sha256: 8d042ee522bc9eb12c061f5f7e53052aeb4f13e576e624c8bebaf493725b95a0 md5: 0f79b23c03d80f22ce4fe0022d12f6d2 @@ -6262,1554 +6059,1242 @@ packages: purls: [] size: 87962 timestamp: 1757355027273 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - sha256: 09750c33b5d694c494cad9eafda56c61a62622264173d760341b49fb001afe82 - md5: 3e3ac06efc5fdc1aa675ca30bf7d53df +- conda: https://conda.anaconda.org/conda-forge/osx-64/mpc-1.4.0-h31caf2d_0.conda + sha256: 272ac1d9a2db3c9dbe2359c79784558a4e9b38624a0cc07c8f50b500a1b95d25 + md5: 52b3fbb35494ec12913a308397f52a9d depends: - __osx >=11.0 - - libllvm19 19.1.7 h8e0c9ce_2 - - llvm-tools-19 19.1.7 h91fd4e7_2 - constrains: - - llvm 19.1.7 - - llvmdev 19.1.7 - - clang-tools 19.1.7 - - clang 19.1.7 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.2,<5.0a0 + license: LGPL-3.0-or-later + license_family: LGPL purls: [] - size: 88390 - timestamp: 1757353535760 -- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - sha256: fd281acb243323087ce672139f03a1b35ceb0e864a3b4e8113b9c23ca1f83bf0 - md5: bf644c6f69854656aa02d1520175840e + size: 91763 + timestamp: 1774472790640 +- conda: https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.2-h31caf2d_0.conda + sha256: 0a238d8500b2206b04f780093c25d83694c8c9628ea50f4376463c608168bf95 + md5: bc5ac4d19d24a6062f60560aab0e8976 depends: - - __osx >=10.13 - - libcxx >=19 - - libllvm19 19.1.7 h56e7563_2 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + license: LGPL-3.0-only + license_family: LGPL purls: [] - size: 17198870 - timestamp: 1757354915882 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - sha256: 73f9506f7c32a448071340e73a0e8461e349082d63ecc4849e3eb2d1efc357dd - md5: 8237b150fcd7baf65258eef9a0fc76ef + size: 374756 + timestamp: 1773414598704 +- conda: https://conda.anaconda.org/conda-forge/osx-64/mpi-1.0-openmpi.tar.bz2 + sha256: 1326b28195e8808cebc18a593f84c5cbd606826a150dd7e0365f11b86238b5df + md5: 8c3bc725bf4d10fc6e56031f7543771f + license: BSD 3-clause + purls: [] + size: 4394 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + sha256: f5f7e006ff4271305ab4cc08eedd855c67a571793c3d18aff73f645f088a8cae + md5: 31b8740cf1b2588d4e61c81191004061 depends: - __osx >=11.0 - - libcxx >=19 - - libllvm19 19.1.7 h8e0c9ce_2 + license: X11 AND BSD-3-Clause + purls: [] + size: 831711 + timestamp: 1777423052277 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openjdk-23.0.2-h18c9476_2.conda + sha256: 00a2381baecf707b4cb6ed74c4d91ede955e8f6f859e7caba35aa11720af8dd6 + md5: e8b746e8947c0dab5aeb7a26b8bce2ad + depends: - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache + license: GPL-2.0-or-later WITH Classpath-exception-2.0 + license_family: GPL purls: [] - size: 16376095 - timestamp: 1757353442671 -- pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl - name: loguru - version: 0.7.3 - sha256: 31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c - requires_dist: - - colorama>=0.3.4 ; sys_platform == 'win32' - - aiocontextvars>=0.2.0 ; python_full_version < '3.7' - - win32-setctime>=1.0.0 ; sys_platform == 'win32' - - pre-commit==4.0.1 ; python_full_version >= '3.9' and extra == 'dev' - - tox==3.27.1 ; python_full_version < '3.8' and extra == 'dev' - - tox==4.23.2 ; python_full_version >= '3.8' and extra == 'dev' - - pytest==6.1.2 ; python_full_version < '3.8' and extra == 'dev' - - pytest==8.3.2 ; python_full_version >= '3.8' and extra == 'dev' - - pytest-cov==2.12.1 ; python_full_version < '3.8' and extra == 'dev' - - pytest-cov==5.0.0 ; python_full_version == '3.8.*' and extra == 'dev' - - pytest-cov==6.0.0 ; python_full_version >= '3.9' and extra == 'dev' - - pytest-mypy-plugins==1.9.3 ; python_full_version >= '3.6' and python_full_version < '3.8' and extra == 'dev' - - pytest-mypy-plugins==3.1.0 ; python_full_version >= '3.8' and extra == 'dev' - - colorama==0.4.5 ; python_full_version < '3.8' and extra == 'dev' - - colorama==0.4.6 ; python_full_version >= '3.8' and extra == 'dev' - - freezegun==1.1.0 ; python_full_version < '3.8' and extra == 'dev' - - freezegun==1.5.0 ; python_full_version >= '3.8' and extra == 'dev' - - exceptiongroup==1.1.3 ; python_full_version >= '3.7' and python_full_version < '3.11' and extra == 'dev' - - mypy==0.910 ; python_full_version < '3.6' and extra == 'dev' - - mypy==0.971 ; python_full_version == '3.6.*' and extra == 'dev' - - mypy==1.4.1 ; python_full_version == '3.7.*' and extra == 'dev' - - mypy==1.13.0 ; python_full_version >= '3.8' and extra == 'dev' - - sphinx==8.1.3 ; python_full_version >= '3.11' and extra == 'dev' - - sphinx-rtd-theme==3.0.2 ; python_full_version >= '3.11' and extra == 'dev' - - myst-parser==4.0.0 ; python_full_version >= '3.11' and extra == 'dev' - - build==1.2.2 ; python_full_version >= '3.11' and extra == 'dev' - - twine==6.0.1 ; python_full_version >= '3.11' and extra == 'dev' - requires_python: '>=3.5,<4.0' -- pypi: https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl - name: lxml - version: 6.0.2 - sha256: 9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77 - requires_dist: - - cssselect>=0.7 ; extra == 'cssselect' - - html5lib ; extra == 'html5' - - beautifulsoup4 ; extra == 'htmlsoup' - - lxml-html-clean ; extra == 'html-clean' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl - name: lxml - version: 6.0.2 - sha256: 6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f - requires_dist: - - cssselect>=0.7 ; extra == 'cssselect' - - html5lib ; extra == 'html5' - - beautifulsoup4 ; extra == 'htmlsoup' - - lxml-html-clean ; extra == 'html-clean' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl - name: lxml - version: 6.0.2 - sha256: eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df - requires_dist: - - cssselect>=0.7 ; extra == 'cssselect' - - html5lib ; extra == 'html5' - - beautifulsoup4 ; extra == 'htmlsoup' - - lxml-html-clean ; extra == 'html-clean' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - name: lxml - version: 6.0.2 - sha256: ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd - requires_dist: - - cssselect>=0.7 ; extra == 'cssselect' - - html5lib ; extra == 'html5' - - beautifulsoup4 ; extra == 'htmlsoup' - - lxml-html-clean ; extra == 'html-clean' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 - md5: 9de5350a85c4a20c685259b889aa6393 + size: 185314361 + timestamp: 1743198593451 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openmpi-4.1.6-h7406208_101.conda + sha256: ec9826d23e72acc6311e3e8a96a340d22b8ec9b72a66567c7fe21853e422851e + md5: ed5a66d291ed28e1e1f9153ab24c3132 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - license: BSD-2-Clause + - __osx >=10.9 + - libcxx >=16.0.6 + - libgfortran >=5 + - libgfortran5 >=12.3.0 + - libgfortran5 >=13.2.0 + - libzlib >=1.2.13,<2.0.0a0 + - mpi 1.0 openmpi + - zlib + constrains: + - libpmix ==0.0.0 + - libprrte ==0.0.0 + license: BSD-3-Clause license_family: BSD purls: [] - size: 167055 - timestamp: 1733741040117 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 - md5: 6654e411da94011e8fbe004eacb8fe11 + size: 2893100 + timestamp: 1696593921818 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + sha256: 334fd49ea31b99114f5afb1ec44555dc8c90640648302a4f8f838ee345d1ec50 + md5: 5cf0ece4375c73d7a5765e83565a69c7 depends: - - libgcc >=13 - - libstdcxx >=13 - license: BSD-2-Clause - license_family: BSD + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache purls: [] - size: 184953 - timestamp: 1733740984533 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda - sha256: 5c6bbeec116e29f08e3dad3d0524e9bc5527098e12fc432c0e5ca53ea16337d4 - md5: 45161d96307e3a447cc3eb5896cf6f8c + size: 2776564 + timestamp: 1775589970694 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda + sha256: 8d64a9d36073346542e5ea042ef8207a45a0069a2e65ce3323ee3146db78134c + md5: 08f970fb2b75f5be27678e077ebedd46 depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: GPL-2.0-or-later - license_family: GPL + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 191060 - timestamp: 1753889274283 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lzo-2.10-h80f16a2_1002.conda - sha256: 036428c7b9fd22889108d04c91cecc431f95dc3dba2ede3057330c8125080fd5 - md5: 97af2e332449dd9e92ad7db93b02e918 + size: 1106584 + timestamp: 1763655837207 +- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda + build_number: 7 + sha256: 8ebd35e2940055a93135b9fd11bef3662cecef72d6ee651f68d64a2f349863c7 + md5: dc442e0885c3a6b65e61c61558161a9e + license: GPL-1.0-or-later OR Artistic-1.0-Perl + purls: [] + size: 12334471 + timestamp: 1703311001432 +- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-compress-raw-bzip2-2.214-pl5321h500dc9f_0.conda + sha256: bc7ea5f147849e9ff9f96efa47bbc64f12ec5e123ead7aa035f1b4a547c56dc7 + md5: 5e5ba05b49747543e70b0b5466a9d672 depends: - - libgcc >=14 - license: GPL-2.0-or-later - license_family: GPL + - __osx >=10.13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 190187 - timestamp: 1753889356434 -- pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - name: markdown-it-py - version: 4.0.0 - sha256: 87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147 - requires_dist: - - mdurl~=0.1 - - psutil ; extra == 'benchmarking' - - pytest ; extra == 'benchmarking' - - pytest-benchmark ; extra == 'benchmarking' - - commonmark~=0.9 ; extra == 'compare' - - markdown~=3.4 ; extra == 'compare' - - mistletoe~=1.0 ; extra == 'compare' - - mistune~=3.0 ; extra == 'compare' - - panflute~=2.3 ; extra == 'compare' - - markdown-it-pyrs ; extra == 'compare' - - linkify-it-py>=1,<3 ; extra == 'linkify' - - mdit-py-plugins>=0.5.0 ; extra == 'plugins' - - gprof2dot ; extra == 'profiling' - - mdit-py-plugins>=0.5.0 ; extra == 'rtd' - - myst-parser ; extra == 'rtd' - - pyyaml ; extra == 'rtd' - - sphinx ; extra == 'rtd' - - sphinx-copybutton ; extra == 'rtd' - - sphinx-design ; extra == 'rtd' - - sphinx-book-theme~=1.0 ; extra == 'rtd' - - jupyter-sphinx ; extra == 'rtd' - - ipykernel ; extra == 'rtd' - - coverage ; extra == 'testing' - - pytest ; extra == 'testing' - - pytest-cov ; extra == 'testing' - - pytest-regressions ; extra == 'testing' - - requests ; extra == 'testing' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - name: markupsafe - version: 3.0.3 - sha256: 133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - name: markupsafe - version: 3.0.3 - sha256: e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - name: markupsafe - version: 3.0.3 - sha256: 116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: markupsafe - version: 3.0.3 - sha256: ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - name: mdurl - version: 0.1.2 - sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/bioconda/linux-64/minimap2-2.30-h577a1d6_0.tar.bz2 - sha256: a82a861a2c0e5a01bbe73701dcc6af8ba3f1da430a9fa6c94ed53b5c4a7a2b55 - md5: c90788b08f45337f68b717ee8fd10fea + size: 58124 + timestamp: 1761333098955 +- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-compress-raw-zlib-2.214-pl5321h62fca4e_0.conda + sha256: 827fa7b71f7c1231bb409dfd1618a47147f7a102609df167a0c4b591e85924ff + md5: 0090066bf25d244a443ffef4caf8e213 depends: - - k8 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT + - __osx >=10.13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 1357974 - timestamp: 1750025868795 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/minimap2-2.30-h0cbc5ad_0.tar.bz2 - sha256: 6bc060cce9fcdc7ed0a8a2f95765068a332afba5e32f311cde78f62d5aa7565f - md5: 8f9fb52be4709d829016f8601b5ccf20 + size: 76505 + timestamp: 1761332750742 +- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-encode-3.21-pl5321h6e16a3a_1.conda + sha256: 2076098715d5ca61c043f88048b06c1218e7ce87a196a3132467620a78844a43 + md5: 36bce9916ae172be82e3d65a6fdb2171 depends: - - k8 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT + - __osx >=10.13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-exporter + - perl-parent + - perl-storable + license: GPL-1.0-or-later OR Artistic-1.0-Perl purls: [] - size: 1092467 - timestamp: 1750025704782 -- conda: https://conda.anaconda.org/bioconda/osx-64/minimap2-2.30-h7f84b70_0.tar.bz2 - sha256: 6c854e221a8d7656a55d48cfbf8812c71bb3f9dbbda2bea7cce4b871b78fddbb - md5: d9f37632e58c407cd23cb39277502a6f + size: 1051857 + timestamp: 1741897736721 +- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-pathtools-3.75-pl5321h6e16a3a_2.conda + sha256: f04c191928f2ca80470cceb51fe40c3482f691424a54bd6b8081256dc0dcdf99 + md5: 8b5ca77bb3f633c6b837c31c71d3a255 depends: - - k8 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT + - __osx >=10.13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-carp + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 571104 - timestamp: 1750026467075 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/minimap2-2.30-hba9b596_0.tar.bz2 - sha256: cdb32f97fa222a0113dea48dab8a3b0bc251f270f1140733f9ba59be981c6404 - md5: 227f3a61a8a0df309eff38a5635640a0 + size: 48818 + timestamp: 1741783288987 +- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-scalar-list-utils-1.70-pl5321h1c43f85_0.conda + sha256: 68501bec90dc97610a230baf139c7f3b9f0785f7f0296d03b105162124c85d7b + md5: f8c03e9da8b66368b5bcc7c3eed47324 depends: - - k8 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT + - __osx >=10.13 + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER purls: [] - size: 493142 - timestamp: 1750027275243 -- pypi: https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl - name: more-itertools - version: 10.8.0 - sha256: 52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b - requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/osx-64/mpc-1.3.1-h9d8efa1_1.conda - sha256: dcf91571da6c2f0db96d43a1b639047def05a0e1b6436d42c9129ab14af47b10 - md5: 0520855aaae268ea413d6bc913f1384c + size: 47621 + timestamp: 1753965888767 +- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-storable-3.15-pl5321h6e16a3a_2.conda + sha256: 99f7c02df7d6a3d1649903dad9088b24a0c1fc71f3ed42dd8603e7b5c7cb1413 + md5: 6210779889244bfdf2a339a6f00cdb7c depends: - __osx >=10.13 - - gmp >=6.3.0,<7.0a0 - - mpfr >=4.2.1,<5.0a0 - license: LGPL-3.0-or-later - license_family: LGPL + - perl >=5.32.1,<5.33.0a0 *_perl5 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + license_family: OTHER + purls: [] + size: 65428 + timestamp: 1741353959926 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda + sha256: 636122606556b651ad4d0ac60c7ab6b379e98f390359a1f0c05ad6ba6fb3837f + md5: 0b1b9f9e420e4a0e40879b61f94ae646 + depends: + - __osx >=10.13 + - libiconv >=1.17,<2.0a0 + license: GPL-2.0-or-later + license_family: GPL purls: [] - size: 107774 - timestamp: 1725629348601 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda - sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 - md5: a5635df796b71f6ca400fc7026f50701 + size: 239818 + timestamp: 1720806136579 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.13-h3d5d122_100_cp313.conda + build_number: 100 + sha256: 6f71b48fe93ebc0dd42c80358b75020f6ad12ed4772fb3555da36000139c0dc7 + md5: 8948c8c7c653ad668d55bbbd6836178b depends: - __osx >=11.0 - - gmp >=6.3.0,<7.0a0 - - mpfr >=4.2.1,<5.0a0 - license: LGPL-3.0-or-later - license_family: LGPL + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.5,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.6,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 purls: [] - size: 104766 - timestamp: 1725629165420 -- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 - md5: 2eeb50cab6652538eee8fc0bc3340c81 + size: 17650454 + timestamp: 1775616128232 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + sha256: 4614af680aa0920e82b953fece85a03007e0719c3399f13d7de64176874b80d5 + md5: eefd65452dfe7cce476a519bece46704 depends: - - __glibc >=2.17,<3.0.a0 - - gmp >=6.3.0,<7.0a0 - - libgcc >=13 - license: LGPL-3.0-only - license_family: LGPL + - __osx >=10.13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL purls: [] - size: 634751 - timestamp: 1725746740014 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.1-h2305555_3.conda - sha256: abb35c37de2ec6c9ee89995142b1cfea9e6547202ba5578e5307834eca6d436f - md5: 65b21e8d5f0ec6a2f7e87630caed3318 + size: 317819 + timestamp: 1765813692798 +- conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_1.conda + sha256: 129d41561d2bb93a2708bd575b47a02afb27f057e338534b5e2c1cb38ffa7d01 + md5: b22cd898bfafe477143feabb8e5123eb depends: - - gmp >=6.3.0,<7.0a0 - - libgcc >=13 - license: LGPL-3.0-only - license_family: LGPL + - rust-std-x86_64-apple-darwin 1.94.0 h38e4360_1 + license: MIT + license_family: MIT purls: [] - size: 1841314 - timestamp: 1725746723157 -- conda: https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda - sha256: dddb6721dff05b8dfb654c532725330231fcb81ff1e27d885ee0cdcc9fccf1c4 - md5: d511e58aaaabfc23136880d9956fa7a6 + size: 203590240 + timestamp: 1777308246732 +- conda: https://conda.anaconda.org/conda-forge/osx-64/rust-script-0.36.0-hb440939_0.conda + sha256: 63f861fb7f9f447cd1655d2ee100be7e602432b7a7c610b2cc1501a5656bb2fc + md5: 0527f2e7037039cb94786f9a1411f3e5 depends: - __osx >=10.13 - - gmp >=6.3.0,<7.0a0 - license: LGPL-3.0-only - license_family: LGPL + - rust >=1.74 + constrains: + - __osx >=10.13 + license: MIT AND Apache-2.0 purls: [] - size: 373396 - timestamp: 1725746891597 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda - sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 - md5: 4e4ea852d54cc2b869842de5044662fb + size: 1086801 + timestamp: 1755479827342 +- conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda + sha256: b89d89d0b62e0a84093205607d071932cca228d4d6982a5b073eec7e765b146d + md5: 1261fc730f1d8af7eeea8a0024b23493 depends: - - __osx >=11.0 - - gmp >=6.3.0,<7.0a0 - license: LGPL-3.0-only - license_family: LGPL + - __osx >=10.13 + - libsigtool 0.1.3 hc0f2934_0 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT purls: [] - size: 345517 - timestamp: 1725746730583 -- conda: https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-openmpi.tar.bz2 - sha256: 54cf44ee2c122bce206f834a825af06e3b14fc4fd58c968ae9329715cc281d1e - md5: 1dcc49e16749ff79ba2194fa5d4ca5e7 - license: BSD 3-clause + size: 123083 + timestamp: 1767045007433 +- conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.53.1-h6775aab_0.conda + sha256: 0e956bcb99103410108808019f4c85267e1f4ba74250e9f966a29f3e5d854330 + md5: 3056144f84229311f525e2dfdd51a775 + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libsqlite 3.53.1 h8f8c405_0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - readline >=8.3,<9.0a0 + license: blessing purls: [] - size: 4204 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpi-1.0-openmpi.tar.bz2 - sha256: 91d52da0222cbfc7fa2621893867d6c40fa9943ceb07a6d02adb6546e102727f - md5: e24a82352a69336645b8fd24e0b41d86 - license: BSD 3-clause + size: 191591 + timestamp: 1777987116542 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda + sha256: 0e814730160c8e214eadd7905e3659d8f52af86fd37d85fd287060748948a2b8 + md5: 524528dee57e42d77b1af677137de5a5 + depends: + - libcxx >=19.0.0.a0 + - __osx >=10.13 + - ncurses >=6.5,<7.0a0 + license: NCSA purls: [] - size: 3995 - timestamp: 1558804009811 -- conda: https://conda.anaconda.org/conda-forge/osx-64/mpi-1.0-openmpi.tar.bz2 - sha256: 1326b28195e8808cebc18a593f84c5cbd606826a150dd7e0365f11b86238b5df - md5: 8c3bc725bf4d10fc6e56031f7543771f - license: BSD 3-clause + size: 213790 + timestamp: 1775657389876 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda + sha256: 7f0d9c320288532873e2d8486c331ec6d87919c9028208d3f6ac91dc8f99a67b + md5: 6e6efb7463f8cef69dbcb4c2205bf60e + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD purls: [] - size: 4394 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpi-1.0-openmpi.tar.bz2 - sha256: 7051ff40ca1208c06db24f8bf5cf72ee7ad03891e7fd365c3f7a4190938ae83a - md5: cb269c879b1ac5e5ab62a3c17528c40f - license: BSD 3-clause + size: 3282953 + timestamp: 1769460532442 +- conda: https://conda.anaconda.org/conda-forge/osx-64/unzip-6.0-h1c43f85_4.conda + sha256: 427e586d62bf1ba9663c39fd6d4fad3e235d0cda80b6a33ce7eb15158da5ee7f + md5: ad412e69da4be5b80bbfe9a238323340 + depends: + - __osx >=10.13 + license: LicenseRef-BSD-like purls: [] - size: 4294 - timestamp: 1605464601195 -- pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - name: nbformat - version: 5.10.4 - sha256: 3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b - requires_dist: - - fastjsonschema>=2.15 - - jsonschema>=2.6 - - jupyter-core>=4.12,!=5.0.* - - traitlets>=5.1 - - myst-parser ; extra == 'docs' - - pydata-sphinx-theme ; extra == 'docs' - - sphinx ; extra == 'docs' - - sphinxcontrib-github-alt ; extra == 'docs' - - sphinxcontrib-spelling ; extra == 'docs' - - pep440 ; extra == 'test' - - pre-commit ; extra == 'test' - - pytest ; extra == 'test' - - testpath ; extra == 'test' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/bioconda/linux-64/ncbi-vdb-3.3.0-h9948957_0.conda - sha256: 5b3ce8c12fa3487dc1ee788ed2e5b16a7df03c61c8e2f87c36aa3842e6be3f99 - md5: fcbe7bfc1d5cb8be9b2cab49eb16b6a7 + size: 148716 + timestamp: 1754913371098 +- conda: https://conda.anaconda.org/conda-forge/osx-64/wget-1.25.0-hf06ceb5_1.conda + sha256: 08bb2b6a831e9d6483d0213602c7362a7ce2267a5be579297e5a94fd341ef421 + md5: 1522ffd1e3c3934588906f6d808a367f depends: - - libgcc >=13 - - libstdcxx >=13 - license: Public Domain + - __osx >=11.0 + - libidn2 >=2,<3.0a0 + - libunistring >=0,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - zlib + license: GPL-3.0-or-later + license_family: GPL purls: [] - size: 8642414 - timestamp: 1764728276889 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/ncbi-vdb-3.3.0-h163da20_0.conda - sha256: e704a61ddc312e797ce78be7a5882a8e674da00a6c1994f5bc0919f25d36b9b5 - md5: 70330490bb753430286dfb58fe15f1fe + size: 338832 + timestamp: 1772233182753 +- conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda + sha256: a335161bfa57b64e6794c3c354e7d49449b28b8d8a7c4ed02bf04c3f009953f9 + md5: a645bb90997d3fc2aea0adf6517059bd depends: - - libgcc >=13 - - libstdcxx >=13 - license: Public Domain + - __osx >=10.13 + license: MIT + license_family: MIT purls: [] - size: 7920113 - timestamp: 1764728138966 -- conda: https://conda.anaconda.org/bioconda/osx-64/ncbi-vdb-3.3.0-h5fa12a8_0.conda - sha256: 87fc3f49c84b2e8e77a804e89f92d7ea5127ddf570b3d6b739fff1080030e632 - md5: 637efddc12dd85b3fd3d53c2fa7ca34b + size: 79419 + timestamp: 1753484072608 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.2-hbb4bfdb_2.conda + sha256: 5dd728cebca2e96fa48d41661f1a35ed0ee3cb722669eee4e2d854c6745655eb + md5: 6276aa61ffc361cbf130d78cfb88a237 depends: - - libcxx >=18 - license: Public Domain + - __osx >=11.0 + - libzlib 1.3.2 hbb4bfdb_2 + license: Zlib + license_family: Other purls: [] - size: 4011489 - timestamp: 1764729251917 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/ncbi-vdb-3.3.0-h4675bf2_0.conda - sha256: 73aaa6767c81308e8295e34145fdd4cbf110116796d96ee0bb2cbc5dab9d9261 - md5: da5b7631056680f0c3e0a732271b246d + size: 92411 + timestamp: 1774073075482 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + sha256: 47101a4055a70a4876ffc87b750ab2287b67eca793f21c8224be5e1ee6394d3f + md5: 727109b184d680772e3122f40136d5ca depends: - - libcxx >=18 - license: Public Domain + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 4944593 - timestamp: 1764727940292 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 - md5: 47e340acb35de30501a76c7c799c41d7 + size: 528148 + timestamp: 1764777156963 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + build_number: 7 + sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd + md5: a44032f282e7d2acdeb1c240308052dd depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: X11 AND BSD-3-Clause + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 891641 - timestamp: 1738195959188 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 - md5: 182afabe009dc78d8b73100255ee6868 + size: 8325 + timestamp: 1764092507920 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 depends: - - libgcc >=13 - license: X11 AND BSD-3-Clause + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD purls: [] - size: 926034 - timestamp: 1738196018799 -- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - sha256: ea4a5d27ded18443749aefa49dc79f6356da8506d508b5296f60b8d51e0c4bd9 - md5: ced34dd9929f491ca6dab6a2927aff25 + size: 124834 + timestamp: 1771350416561 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196 + md5: bcb3cba70cf1eec964a03b4ba7775f01 depends: - - __osx >=10.13 - license: X11 AND BSD-3-Clause + - __osx >=11.0 + license: MIT + license_family: MIT purls: [] - size: 822259 - timestamp: 1738196181298 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 - md5: 068d497125e4bf8a66bf707254fff5ae + size: 180327 + timestamp: 1765215064054 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda + sha256: b51bd1551cfdf41500f732b4bd1e4e70fb1e74557165804a648f32fa9c671eec + md5: 148516e0c9edf4e9331a4d53ae806a9b depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause + - cctools >=949.0.1 + - clang_osx-arm64 19.* + - ld64 >=530 + - llvm-openmp + license: BSD-3-Clause + license_family: BSD purls: [] - size: 797030 - timestamp: 1738196177597 -- conda: https://conda.anaconda.org/bioconda/noarch/nextflow-25.10.4-h2a3209d_0.conda - sha256: 26917ebbec4133e8d15a6557e3234a976573e46fafda62a28d37d6916d7ad9f9 - md5: 1fc010bbb636e291ca5812bc1a53917b + size: 6697 + timestamp: 1753098737760 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda + sha256: 4f408036b5175be0d2c7940250d00dae5ea7a71d194a1ffb35881fb9df6211fc + md5: caf7c8e48827c2ad0c402716159fe0a2 depends: - - coreutils - - curl - - openjdk >=17,<=24 - license: Apache-2.0 + - cctools_impl_osx-arm64 1030.6.3 llvm19_1_he8a363d_4 + - ld64 956.6 llvm19_1_he86490a_4 + - libllvm19 >=19.1.7,<19.2.0a0 + license: APSL-2.0 + license_family: Other purls: [] - size: 34829682 - timestamp: 1770744718359 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py313hf6604e3_1.conda - sha256: 2eb8be25a7504f058a153a84be70471e0ebbf6bd0411ae2b6d34904b89d86fe3 - md5: ca9c6ba4beac38cb3d0a85afde27f94c + size: 24313 + timestamp: 1768852906882 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda + sha256: c444442e0c01de92a75b58718a100f2e272649658d4f3dd915bbfc2316b25638 + md5: 76c651b923e048f3f3e0ecb22c966f70 depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - liblapack >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - python_abi 3.13.* *_cp313 - - libblas >=3.9.0,<4.0a0 + - __osx >=11.0 + - ld64_osx-arm64 >=956.6,<956.7.0a0 + - libcxx + - libllvm19 >=19.1.7,<19.2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools 19.1.* + - sigtool-codesign constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - size: 8857152 - timestamp: 1770098515258 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.2-py313h11e5ff7_1.conda - sha256: 7acd65fef10bb9bb6385e154e3a55c60b3320b0886005bf93ef14f3ea027d4e9 - md5: b40ed3c04212930574f77fc500436106 + - ld64 956.6.* + - cctools 1030.6.3.* + - clang 19.1.* + license: APSL-2.0 + license_family: Other + purls: [] + size: 749918 + timestamp: 1768852866532 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda + sha256: 684a19ab44f3d32c668cf1f509bbac20b10f7e9990c7449a2739930915cda8b4 + md5: 0d059c5db9d880ff37b2da53bf06509e depends: - - python - - libgcc >=14 - - libstdcxx >=14 - - python 3.13.* *_cp313 - - python_abi 3.13.* *_cp313 - - libcblas >=3.9.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - libblas >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - size: 7931090 - timestamp: 1770098524373 -- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.2-py313hf1665ba_1.conda - sha256: 681170d36570e9f7575540a1609c853512374473eb2b317d3c75ca0dd45f50c9 - md5: cff600662a8355987c574be24d68998b - depends: - - python - - __osx >=10.13 - - libcxx >=19 - - python_abi 3.13.* *_cp313 - - libblas >=3.9.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 + - cctools_impl_osx-arm64 1030.6.3 llvm19_1_he8a363d_4 + - ld64_osx-arm64 956.6 llvm19_1_ha2625f7_4 constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - size: 8061406 - timestamp: 1770098398011 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py313h16eae64_1.conda - sha256: 3e23ed9eb63d9ce4dc585aad6b65e0197d7e9f28877acf7114cc64f33763a420 - md5: e34e9c58a0ee3eca3def3bb477797621 - depends: - - python + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + purls: [] + size: 23429 + timestamp: 1772019026855 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_9.conda + sha256: a1449c64f455d43153036f54c68cb075a52c1d9f3350a91f4a8936ecf1675c6b + md5: 5a77d772c22448f6ab340fbfff55db48 + depends: - __osx >=11.0 - - python 3.13.* *_cp313 - - libcxx >=19 - - liblapack >=3.9.0,<4.0a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - numpy-base <0a0 + - libclang-cpp19.1 19.1.7 default_hf3020a7_9 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 763361 + timestamp: 1776988759708 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_9.conda + sha256: 8268c23a000cfeee1b83e19c59eb018ec07583905f69bfee01beac8aedd8c4df + md5: 20056c993a8c9df01e04a0e165579ec1 + depends: + - cctools + - clang-19 19.1.7.* default_* + - clang_impl_osx-arm64 19.1.7 default_hc11f16d_9 + - ld64 + - ld64_osx-arm64 * llvm19_1_* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 24962 + timestamp: 1776989044302 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_9.conda + sha256: 56db3a98eda7032a0aefe38f146a4b29df9d75d08c71bf7f7d6412effe775dd1 + md5: 2aec2e39be3b4999bda2a3e5bd4cd2e6 + depends: + - cctools_impl_osx-arm64 + - clang-19 19.1.7.* default_* + - compiler-rt 19.1.7.* + - compiler-rt_osx-arm64 + - ld64_osx-arm64 * llvm19_1_* + - llvm-openmp >=19.1.7 + - llvm-tools 19.1.7.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 24905 + timestamp: 1776989025990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_31.conda + sha256: c9daaa0e7785fe7c5799e3d691c6aa5ab8b4a54bbf49835037068dd78e0a7b35 + md5: 6645630920c0980a33f055a49fbdb88e + depends: + - cctools_osx-arm64 + - clang 19.* + - clang_impl_osx-arm64 19.1.7.* + - sdkroot_env_osx-arm64 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - size: 6925963 - timestamp: 1770098439599 -- pypi: ./ - name: nvd - version: 2.5.0 - sha256: a815595678f65bb3f2d1d57f51dde2e051fea2a44ca60cea66bada4c5a6595be - requires_dist: - - biopython>=1.85 - - blake3>=1.0.8 - - duckdb>=1.2.2 - - jsonschema>=4.23.0 - - labkey>=3.4.0 - - loguru>=0.7.3 - - lxml>=5.4.0 - - more-itertools>=10.7.0 - - pandas>=2.2.3 - - polars>=1.27.1 - - pydantic>=2.12.5 - - pysam>=0.23.0 - - pyyaml>=6.0.2 - - rich>=14.0.0 - - slack-sdk>=3.39.0 - - snakemake>=9.3.1 - - taxopy>=0.14.0 - - typer>=0.15.2 - requires_python: '>=3.11,<3.14' - editable: true -- conda: https://conda.anaconda.org/conda-forge/linux-64/oniguruma-6.9.10-hb9d3cd8_0.conda - sha256: bbff8a60f70d5ebab138b564554f28258472e1e63178614562d4feee29d10da2 - md5: 6ce853cb231f18576d2db5c2d4cb473e + purls: [] + size: 21135 + timestamp: 1769482854554 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_9.conda + sha256: 88697ecd1e5689e15c12d334bae2bb3900dffd91efd4686cd9eea9e1095ee986 + md5: 9a1ac8e5124fcc201adb20a103d51cc6 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: BSD-2-Clause - license_family: BSD + - clang 19.1.7 default_hf9bcbb7_9 + - clangxx_impl_osx-arm64 19.1.7.* default_* + - libcxx-devel 19.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 248670 - timestamp: 1735727084819 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/oniguruma-6.9.10-h86ecc28_0.conda - sha256: c876e7bde137d7fdf065fb16e5e2969026fafa6420e71f93e4abe43bccbfa0c4 - md5: 35c0c3113a0cfd9381940ba7f01a961e + size: 24924 + timestamp: 1776989215095 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_9.conda + sha256: 6b5ebc5f369ad5373091edc3d4c4d2e1f39169b7adb080395965646eb8aee7c9 + md5: 8b7425e84f940861653c919142435bde depends: - - libgcc >=13 - license: BSD-2-Clause - license_family: BSD + - clang-19 19.1.7.* default_* + - clang_impl_osx-arm64 19.1.7 default_hc11f16d_9 + - libcxx-devel 19.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 253511 - timestamp: 1735729164909 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-23.0.2-h68779a4_1.conda - sha256: b58613309978d6dbe779bc2e87d123b591ee0da2a9b139dced848ea4b5398585 - md5: 64f73cc54c693c6be95518d6f186e657 + size: 24861 + timestamp: 1776989199328 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_31.conda + sha256: f3a81f8e5451377d2b84a31f4a4e305cb92f5a4c4ba0126e7d1a3cfa4d66bf47 + md5: bd6926e81dc196064373b614af3bc9ff depends: - - __glibc >=2.17,<3.0.a0 - - alsa-lib >=1.2.13,<1.3.0a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - freetype >=2.12.1,<3.0a0 - - giflib >=5.2.2,<5.3.0a0 - - harfbuzz >=10.3.0 - - lcms2 >=2.17,<3.0a0 - - libcups >=2.3.3,<2.4.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libpng >=1.6.47,<1.7.0a0 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - xorg-libx11 >=1.8.11,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxi >=1.8.2,<2.0a0 - - xorg-libxrandr >=1.5.4,<2.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - - xorg-libxt >=1.3.1,<2.0a0 - - xorg-libxtst >=1.2.5,<2.0a0 - license: GPL-2.0-or-later WITH Classpath-exception-2.0 - license_family: GPL + - cctools_osx-arm64 + - clang_osx-arm64 19.1.7 h75f8d18_31 + - clangxx 19.* + - clangxx_impl_osx-arm64 19.1.7.* + - sdkroot_env_osx-arm64 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 190075759 - timestamp: 1740896285095 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-23.0.2-h2a0fa0e_1.conda - sha256: af33e173cca5c5f78449593a9aabfef9d2f239b79f60702ea0e60fb4f93c312b - md5: 2441a5047cf17fc6cf9db6f16b250c58 + size: 19914 + timestamp: 1769482862579 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + sha256: b58a481828aee699db7f28bfcbbe72fb133277ac60831dfe70ee2465541bcb93 + md5: 39451684370ae65667fa5c11222e43f7 depends: - - alsa-lib >=1.2.13,<1.3.0a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - freetype >=2.12.1,<3.0a0 - - giflib >=5.2.2,<5.3.0a0 - - harfbuzz >=10.3.0 - - lcms2 >=2.17,<3.0a0 - - libcups >=2.3.3,<2.4.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libpng >=1.6.47,<1.7.0a0 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - xorg-libx11 >=1.8.11,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxi >=1.8.2,<2.0a0 - - xorg-libxrandr >=1.5.4,<2.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - - xorg-libxt >=1.3.1,<2.0a0 - - xorg-libxtst >=1.2.5,<2.0a0 - license: GPL-2.0-or-later WITH Classpath-exception-2.0 - license_family: GPL + - __osx >=11.0 + - clang 19.1.7.* + - compiler-rt_osx-arm64 19.1.7.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE purls: [] - size: 182773953 - timestamp: 1740898261519 -- conda: https://conda.anaconda.org/conda-forge/osx-64/openjdk-23.0.2-h18c9476_2.conda - sha256: 00a2381baecf707b4cb6ed74c4d91ede955e8f6f859e7caba35aa11720af8dd6 - md5: e8b746e8947c0dab5aeb7a26b8bce2ad + size: 97085 + timestamp: 1757411887557 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compilers-1.11.0-hce30654_0.conda + sha256: 01f02e9baa51ef2debfdc55df57ea6a7fce9b5fb9356c3267afb517e1dc4363a + md5: aac0d423ecfd95bde39582d0de9ca657 depends: - - libzlib >=1.3.1,<2.0a0 - license: GPL-2.0-or-later WITH Classpath-exception-2.0 - license_family: GPL + - c-compiler 1.11.0 h61f9b84_0 + - cxx-compiler 1.11.0 h88570a1_0 + - fortran-compiler 1.11.0 h81a4f41_0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 185314361 - timestamp: 1743198593451 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjdk-23.0.2-hfb9339a_2.conda - sha256: f16143181808731b74e03b191a1d859cfb6dc7ed066f9d567808c438e9770f85 - md5: 6e330bfe359f78e2313eaecf8ca1529c - depends: - - libzlib >=1.3.1,<2.0a0 - license: GPL-2.0-or-later WITH Classpath-exception-2.0 + size: 7525 + timestamp: 1753098740763 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coreutils-9.5-h93a5062_0.conda + sha256: 70e50f2f1458e7c172c9b1c149a4289e8eecc9b53e06ab9de0b3572cdbd30a61 + md5: 75840e25e62a109b1d25043c63a4f36c + license: GPL-3.0-or-later license_family: GPL purls: [] - size: 183373664 - timestamp: 1743198731576 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-4.1.6-hc5af2df_101.conda - sha256: f0769dd891e1735be4606ec8643951e5cbca199f774e58c7d933f70a70134ce4 - md5: f9a2ad0088ee38f396350515fa37d243 + size: 1478098 + timestamp: 1711655465375 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/curl-8.20.0-hd5a2499_0.conda + sha256: 2e531e953f62c6703ab9ea8bd6e62011a1760be0fa808b97ef5f3156956b421e + md5: 88cce35a3cb20623c1bc5be5e4dca9a5 depends: - - libgcc-ng >=12 - - libgfortran-ng - - libgfortran5 >=12.3.0 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - - mpi 1.0 openmpi - - zlib - constrains: - - cudatoolkit >= 10.2 - - ucx >=1.15.0,<2.0a0 - - libpmix ==0.0.0 - - libprrte ==0.0.0 - license: BSD-3-Clause - license_family: BSD + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libcurl 8.20.0 hd5a2499_0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT purls: [] - size: 4069632 - timestamp: 1696593196408 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openmpi-4.1.6-h1f4154d_101.conda - sha256: 67c1269f98d4d2d4e45f6c0f59051111e00c0a867671ffada4b640b1752d35a2 - md5: aaccc242a1665d7cfff249195868788a + size: 179176 + timestamp: 1777462274250 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda + sha256: 99800d97a3a2ee9920dfc697b6d4c64e46dc7296c78b1b6c746ff1c24dea5e6c + md5: 043afed05ca5a0f2c18252ae4378bdee depends: - - libgcc-ng >=12 - - libgfortran-ng - - libgfortran5 >=12.3.0 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - - mpi 1.0 openmpi - - zlib - constrains: - - cudatoolkit >= 11.0 - - ucx >=1.15.0,<2.0a0 - - libpmix ==0.0.0 - - libprrte ==0.0.0 + - c-compiler 1.11.0 h61f9b84_0 + - clangxx_osx-arm64 19.* license: BSD-3-Clause license_family: BSD purls: [] - size: 4041594 - timestamp: 1696611221404 -- conda: https://conda.anaconda.org/conda-forge/osx-64/openmpi-4.1.6-h7406208_101.conda - sha256: ec9826d23e72acc6311e3e8a96a340d22b8ec9b72a66567c7fe21853e422851e - md5: ed5a66d291ed28e1e1f9153ab24c3132 + size: 6715 + timestamp: 1753098739952 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fortran-compiler-1.11.0-h81a4f41_0.conda + sha256: 1a030edc0e79e4e7a4ed9736ec6925303940148d00f20faf3a7abf0565de181e + md5: d221c62af175b83186f96d8b0880bff6 depends: - - __osx >=10.9 - - libcxx >=16.0.6 - - libgfortran >=5 - - libgfortran5 >=12.3.0 - - libgfortran5 >=13.2.0 - - libzlib >=1.2.13,<2.0.0a0 - - mpi 1.0 openmpi - - zlib - constrains: - - libpmix ==0.0.0 - - libprrte ==0.0.0 + - cctools >=949.0.1 + - gfortran + - gfortran_osx-arm64 14.* + - ld64 >=530 + - llvm-openmp license: BSD-3-Clause license_family: BSD purls: [] - size: 2893100 - timestamp: 1696593921818 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openmpi-4.1.6-h526c993_101.conda - sha256: 641f44ea7e91c08c722d3d7c66939f67b1cf2dd94c576a898f0b1a08e7db861a - md5: fa9afd3a548f6206422e16969a0b6ffe + size: 6723 + timestamp: 1753098739029 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran-14.3.0-h3ef1dbf_0.conda + sha256: cfdf9b4dd37ddfc15ea1c415619d4137004fa135d7192e5cdcea8e3944dc9df7 + md5: e148e0bc9bbc90b6325a479a5501786d depends: - - __osx >=10.9 - - libcxx >=16.0.6 - - libgfortran >=5 - - libgfortran5 >=12.3.0 - - libgfortran5 >=13.2.0 - - libzlib >=1.2.13,<2.0.0a0 - - mpi 1.0 openmpi - - zlib - constrains: - - libpmix ==0.0.0 - - libprrte ==0.0.0 - license: BSD-3-Clause - license_family: BSD + - cctools + - gfortran_osx-arm64 14.3.0 + - ld64 + license: GPL-3.0-or-later WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 2760344 - timestamp: 1696593859968 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c - md5: f61eb8cd60ff9057122a3d338b99c00f + size: 32740 + timestamp: 1751220440768 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda + sha256: c05c634388e180f79c70a5989d2b25977716b7f6d5e395119ad0007cf4a7bcbf + md5: 1e9ec88ecc684d92644a45c6df2399d0 depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc >=14 - license: Apache-2.0 - license_family: Apache + - __osx >=11.0 + - cctools_osx-arm64 + - clang + - gmp >=6.3.0,<7.0a0 + - isl 0.26.* + - libcxx >=17 + - libgfortran-devel_osx-arm64 14.3.0.* + - libgfortran5 >=14.3.0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - zlib + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 3164551 - timestamp: 1769555830639 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - sha256: 7f8048c0e75b2620254218d72b4ae7f14136f1981c5eb555ef61645a9344505f - md5: 25f5885f11e8b1f075bccf4a2da91c60 + size: 20286770 + timestamp: 1759712171482 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda + sha256: 2644e5f4b4eed171b12afb299e2413be5877db92f30ec03690621d1ae648502c + md5: 8db8c0061c0f3701444b7b9cc9966511 depends: - - ca-certificates - - libgcc >=14 - license: Apache-2.0 - license_family: Apache + - cctools_osx-arm64 + - clang + - clang_osx-arm64 + - gfortran_impl_osx-arm64 14.3.0 + - ld64_osx-arm64 + - libgfortran + - libgfortran-devel_osx-arm64 14.3.0 + - libgfortran5 >=14.3.0 + license: GPL-3.0-or-later WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 3692030 - timestamp: 1769557678657 -- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - sha256: e02e5639b0e4d6d4fcf0f3b082642844fb5a37316f5b0a1126c6271347462e90 - md5: 30bb8d08b99b9a7600d39efb3559fff0 + size: 35951 + timestamp: 1751220424258 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b depends: - - __osx >=10.13 - - ca-certificates - license: Apache-2.0 - license_family: Apache + - __osx >=11.0 + - libcxx >=16 + license: GPL-2.0-or-later OR LGPL-3.0-or-later purls: [] - size: 2777136 - timestamp: 1769557662405 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67 - md5: f4f6ad63f98f64191c3e77c5f5f29d76 + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/isa-l-2.31.1-h5505292_1.conda + sha256: f0cad459ebfc209269cb7a964fc37d811aa973876c5508e529e414f379a38c23 + md5: 00c87ad2b46e1863f514b831674f1a43 depends: - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache + license: BSD-3-Clause + license_family: BSD purls: [] - size: 3104268 - timestamp: 1769556384749 -- pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - name: packaging - version: '25.0' - sha256: 29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.1-py313hbfd7664_0.conda - sha256: 01a14cb74d9773674d07ab250b70a7fbd140edfb19cf3ec2ba70147bdaec13d2 - md5: 1c8807728f0333228766dee685394e16 + size: 122475 + timestamp: 1736497418302 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda + sha256: fc9272371750c56908b8e535755b1e23cf7803a2cc4a7d9ae539347baa14f740 + md5: e80e44a3f4862b1da870dc0557f8cf3b + depends: + - libcxx >=14.0.6 + track_features: + - isl_imath-32 + license: MIT + license_family: MIT + purls: [] + size: 819937 + timestamp: 1680649567633 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed + md5: e446e1822f4da8e5080a9de93474184d depends: - - python - - numpy >=1.26.0 - - python-dateutil >=2.8.2 - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - numpy >=1.23,<3 - - python_abi 3.13.* *_cp313 - constrains: - - adbc-driver-postgresql >=1.2.0 - - adbc-driver-sqlite >=1.2.0 - - beautifulsoup4 >=4.12.3 - - blosc >=1.21.3 - - bottleneck >=1.4.2 - - fastparquet >=2024.11.0 - - fsspec >=2024.10.0 - - gcsfs >=2024.10.0 - - html5lib >=1.1 - - hypothesis >=6.116.0 - - jinja2 >=3.1.5 - - lxml >=5.3.0 - - matplotlib >=3.9.3 - - numba >=0.60.0 - - numexpr >=2.10.2 - - odfpy >=1.4.1 - - openpyxl >=3.1.5 - - psycopg2 >=2.9.10 - - pyarrow >=13.0.0 - - pyiceberg >=0.8.1 - - pymysql >=1.1.1 - - pyqt5 >=5.15.9 - - pyreadstat >=1.2.8 - - pytables >=3.10.1 - - pytest >=8.3.4 - - pytest-xdist >=3.6.1 - - python-calamine >=0.3.0 - - pytz >=2024.2 - - pyxlsb >=1.0.10 - - qtpy >=2.4.2 - - scipy >=1.14.1 - - s3fs >=2024.10.0 - - sqlalchemy >=2.0.36 - - tabulate >=0.9.0 - - xarray >=2024.10.0 - - xlrd >=2.0.1 - - xlsxwriter >=3.2.0 - - zstandard >=0.23.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pandas?source=compressed-mapping - size: 14972232 - timestamp: 1771408987551 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.1-py313h9226a20_0.conda - sha256: 455faf9437f06d469b12f7460e94281b63924c6f9a802902ba88af00960e0e21 - md5: feac7f5e15a122bd37e29ea9ebd73eaf - depends: - - python - - numpy >=1.26.0 - - python-dateutil >=2.8.2 - - libgcc >=14 - - libstdcxx >=14 - - python 3.13.* *_cp313 - - numpy >=1.23,<3 - - python_abi 3.13.* *_cp313 - constrains: - - adbc-driver-postgresql >=1.2.0 - - adbc-driver-sqlite >=1.2.0 - - beautifulsoup4 >=4.12.3 - - blosc >=1.21.3 - - bottleneck >=1.4.2 - - fastparquet >=2024.11.0 - - fsspec >=2024.10.0 - - gcsfs >=2024.10.0 - - html5lib >=1.1 - - hypothesis >=6.116.0 - - jinja2 >=3.1.5 - - lxml >=5.3.0 - - matplotlib >=3.9.3 - - numba >=0.60.0 - - numexpr >=2.10.2 - - odfpy >=1.4.1 - - openpyxl >=3.1.5 - - psycopg2 >=2.9.10 - - pyarrow >=13.0.0 - - pyiceberg >=0.8.1 - - pymysql >=1.1.1 - - pyqt5 >=5.15.9 - - pyreadstat >=1.2.8 - - pytables >=3.10.1 - - pytest >=8.3.4 - - pytest-xdist >=3.6.1 - - python-calamine >=0.3.0 - - pytz >=2024.2 - - pyxlsb >=1.0.10 - - qtpy >=2.4.2 - - scipy >=1.14.1 - - s3fs >=2024.10.0 - - sqlalchemy >=2.0.36 - - tabulate >=0.9.0 - - xarray >=2024.10.0 - - xlrd >=2.0.1 - - xlsxwriter >=3.2.0 - - zstandard >=0.23.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pandas?source=compressed-mapping - size: 14766794 - timestamp: 1771408988752 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-3.0.1-py313hfd25234_0.conda - sha256: c4a8f0980a036e73d7e60e6852e58c70b585de24081ad78d6899bb1a5b8bf295 - md5: 7bfcfb0c9857e5884ff7c2f2bf23ec88 - depends: - - python - - numpy >=1.26.0 - - python-dateutil >=2.8.2 - - libcxx >=19 - __osx >=11.0 - - python_abi 3.13.* *_cp313 - - numpy >=1.23,<3 - constrains: - - adbc-driver-postgresql >=1.2.0 - - adbc-driver-sqlite >=1.2.0 - - beautifulsoup4 >=4.12.3 - - blosc >=1.21.3 - - bottleneck >=1.4.2 - - fastparquet >=2024.11.0 - - fsspec >=2024.10.0 - - gcsfs >=2024.10.0 - - html5lib >=1.1 - - hypothesis >=6.116.0 - - jinja2 >=3.1.5 - - lxml >=5.3.0 - - matplotlib >=3.9.3 - - numba >=0.60.0 - - numexpr >=2.10.2 - - odfpy >=1.4.1 - - openpyxl >=3.1.5 - - psycopg2 >=2.9.10 - - pyarrow >=13.0.0 - - pyiceberg >=0.8.1 - - pymysql >=1.1.1 - - pyqt5 >=5.15.9 - - pyreadstat >=1.2.8 - - pytables >=3.10.1 - - pytest >=8.3.4 - - pytest-xdist >=3.6.1 - - python-calamine >=0.3.0 - - pytz >=2024.2 - - pyxlsb >=1.0.10 - - qtpy >=2.4.2 - - scipy >=1.14.1 - - s3fs >=2024.10.0 - - sqlalchemy >=2.0.36 - - tabulate >=0.9.0 - - xarray >=2024.10.0 - - xlrd >=2.0.1 - - xlsxwriter >=3.2.0 - - zstandard >=0.23.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pandas?source=compressed-mapping - size: 14259868 - timestamp: 1771409287844 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.1-py313h6974306_0.conda - sha256: 2407cc540bcfcc74657730f66b0741920f0a4e037027402d0544795514bc6ef6 - md5: 346e7db4e1eeed5d50df059013d1849a - depends: - - python - - numpy >=1.26.0 - - python-dateutil >=2.8.2 - libcxx >=19 - - __osx >=11.0 - - python 3.13.* *_cp313 - - numpy >=1.23,<3 - - python_abi 3.13.* *_cp313 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1160828 + timestamp: 1769770119811 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda + sha256: d6197b4825ece12ab63097bd677294126439a1a6222c7098885aa23464ef280c + md5: 22eb76f8d98f4d3b8319d40bda9174de + depends: + - ld64_osx-arm64 956.6 llvm19_1_ha2625f7_4 + - libllvm19 >=19.1.7,<19.2.0a0 constrains: - - adbc-driver-postgresql >=1.2.0 - - adbc-driver-sqlite >=1.2.0 - - beautifulsoup4 >=4.12.3 - - blosc >=1.21.3 - - bottleneck >=1.4.2 - - fastparquet >=2024.11.0 - - fsspec >=2024.10.0 - - gcsfs >=2024.10.0 - - html5lib >=1.1 - - hypothesis >=6.116.0 - - jinja2 >=3.1.5 - - lxml >=5.3.0 - - matplotlib >=3.9.3 - - numba >=0.60.0 - - numexpr >=2.10.2 - - odfpy >=1.4.1 - - openpyxl >=3.1.5 - - psycopg2 >=2.9.10 - - pyarrow >=13.0.0 - - pyiceberg >=0.8.1 - - pymysql >=1.1.1 - - pyqt5 >=5.15.9 - - pyreadstat >=1.2.8 - - pytables >=3.10.1 - - pytest >=8.3.4 - - pytest-xdist >=3.6.1 - - python-calamine >=0.3.0 - - pytz >=2024.2 - - pyxlsb >=1.0.10 - - qtpy >=2.4.2 - - scipy >=1.14.1 - - s3fs >=2024.10.0 - - sqlalchemy >=2.0.36 - - tabulate >=0.9.0 - - xarray >=2024.10.0 - - xlrd >=2.0.1 - - xlsxwriter >=3.2.0 - - zstandard >=0.23.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pandas?source=compressed-mapping - size: 14024089 - timestamp: 1771409122467 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff - md5: 7a3bff861a6583f1889021facefc08b1 + - cctools_osx-arm64 1030.6.3.* + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + purls: [] + size: 21592 + timestamp: 1768852886875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_ha2625f7_4.conda + sha256: 4161eec579cea07903ee2fafdde6f8f9991dabd54f3ca6609a1bf75bed3dc788 + md5: eaf3d06e3a8a10dee7565e8d76ae618d depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD + - __osx >=11.0 + - libcxx + - libllvm19 >=19.1.7,<19.2.0a0 + - sigtool-codesign + - tapi >=1600.0.11.8,<1601.0a0 + constrains: + - cctools_impl_osx-arm64 1030.6.3.* + - ld64 956.6.* + - cctools 1030.6.3.* + - clang 19.1.* + license: APSL-2.0 + license_family: Other purls: [] - size: 1222481 - timestamp: 1763655398280 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 - md5: 1a30c42e32ca0ea216bd0bfe6f842f0b + size: 1040464 + timestamp: 1768852821767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_9.conda + sha256: e05c4830a117492996bac1ad55cd7ee3e57f63b46da8a324862efbee9279ab44 + md5: ddb70ebdcbf3a44bddc2657a51faf490 depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD + - __osx >=11.0 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 1166552 - timestamp: 1763655534263 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.45-hf733adb_0.conda - sha256: 5b2c93ee8714c17682cd926127f1e712efef00441a79732635a80b24f5adc212 - md5: d9f1976154f2f45588251dcfc48bcdda + size: 14064699 + timestamp: 1776988581784 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda + sha256: 38c0bc634b61e542776e97cfd15d5d41edd304d4e47c333004d2d622439b2381 + md5: 2f57b7d0c6adda88957586b7afd78438 depends: - - __osx >=10.13 - - bzip2 >=1.0.8,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libnghttp2 >=1.68.1,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT purls: [] - size: 1086588 - timestamp: 1745955211398 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - sha256: 5e2e443f796f2fd92adf7978286a525fb768c34e12b1ee9ded4000a41b2894ba - md5: 9b4190c4055435ca3502070186eba53a + size: 400568 + timestamp: 1777462251987 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda + sha256: dddd01bd6b338221342a89530a1caffe6051a70cc8f8b1d8bb591d5447a3c603 + md5: ff484b683fecf1e875dfc7aa01d19796 depends: - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 850231 - timestamp: 1763655726735 -- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - build_number: 7 - sha256: 9ec32b6936b0e37bcb0ed34f22ec3116e75b3c0964f9f50ecea5f58734ed6ce9 - md5: f2cfec9406850991f4e3d960cc9e3321 + size: 569359 + timestamp: 1778191546305 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + sha256: ec07ebaa226792f4e2bf0f5dba50325632a7474d5f04b951d8291be70af215da + md5: 9f7810b7c0a731dbc84d46d6005890ef depends: - - libgcc-ng >=12 - - libxcrypt >=4.4.36 - license: GPL-1.0-or-later OR Artistic-1.0-Perl + - libcxx >=19.1.7 + - libcxx-headers >=19.1.7,<19.1.8.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 13344463 - timestamp: 1703310653947 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - build_number: 7 - sha256: d78296134263b5bf476cad838ded65451e7162db756f9997c5d06b08122572ed - md5: 17d019cb2a6c72073c344e98e40dfd61 + size: 23000 + timestamp: 1764648270121 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c + md5: a6130c709305cd9828b4e1bd9ba0000c depends: - - libgcc-ng >=12 - - libxcrypt >=4.4.36 - license: GPL-1.0-or-later OR Artistic-1.0-Perl + - __osx >=11.0 + license: MIT + license_family: MIT purls: [] - size: 13338804 - timestamp: 1703310557094 -- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - build_number: 7 - sha256: 8ebd35e2940055a93135b9fd11bef3662cecef72d6ee651f68d64a2f349863c7 - md5: dc442e0885c3a6b65e61c61558161a9e - license: GPL-1.0-or-later OR Artistic-1.0-Perl + size: 55420 + timestamp: 1761980066242 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD purls: [] - size: 12334471 - timestamp: 1703311001432 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - build_number: 7 - sha256: b0c55040d2994fd6bf2f83786561d92f72306d982d6ea12889acad24a9bf43b8 - md5: ba3cbe93f99e896765422cc5f7c3a79e - license: GPL-1.0-or-later OR Artistic-1.0-Perl + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + license: BSD-2-Clause + license_family: BSD purls: [] - size: 14439531 - timestamp: 1703311335652 -- conda: https://conda.anaconda.org/bioconda/noarch/perl-archive-tar-3.04-pl5321hdfd78af_0.tar.bz2 - sha256: ff80ba34551d4e051f4eaff48df53a6c63695dcf00e670c89a241a04f0b662ae - md5: 27d0df347c48c48b363651b64fb6fb4c + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + sha256: f4b1cafc59afaede8fa0a2d9cf376840f1c553001acd72f6ead18bbc8ac8c49c + md5: 65466e82c09e888ca7560c11a97d5450 depends: - - perl >=5.32.1,<6.0a0 *_perl5 - - perl-io-compress - - perl-io-zlib - - perl-pathtools - license: Perl_5 + - __osx >=11.0 + constrains: + - expat 2.8.0.* + license: MIT + license_family: MIT purls: [] - size: 35243 - timestamp: 1749770047223 -- conda: https://conda.anaconda.org/conda-forge/noarch/perl-carp-1.50-pl5321hd8ed1ab_0.tar.bz2 - sha256: 1981e31113e1e77a2cdc13db657c636f047cd3be2a64d9a0bffac03c5427c1bd - md5: bdddc03e28019b902da71b722f2288d7 + size: 68789 + timestamp: 1777846180142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 + md5: 43c04d9cb46ef176bb2a4c77e324d599 depends: - - perl >=5.32.1,<6.0a0 *_perl5 - - perl-exporter - - perl-extutils-makemaker - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - __osx >=11.0 + license: MIT + license_family: MIT purls: [] - size: 22257 - timestamp: 1636653208008 -- conda: https://conda.anaconda.org/conda-forge/noarch/perl-common-sense-3.75-pl5321hd8ed1ab_0.tar.bz2 - sha256: 38ef218e9b9d55b9fbdce6b31cf81bcf6f1b16f21b8e7cb9279b41399522a320 - md5: ef70dc77e8b10bbb62f5e843b401ef0e + size: 40979 + timestamp: 1769456747661 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + sha256: 06644fa4d34d57c9e48f4d84b1256f9e5f654fdb37f43acc8a58a396952d42b7 + md5: 644058123986582db33aebd4ae2ca184 depends: - - perl >=5.32.1,<6.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - _openmp_mutex + constrains: + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 20291 - timestamp: 1660429950685 -- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-compress-raw-bzip2-2.214-pl5321hda65f42_0.conda - sha256: 2cbd3fcb7028415654057ab3142cee1e5cc4cf9bdd0e590f072e8ecd29cb6382 - md5: 1ec33b9f74a71c17cc5579e35027832a + size: 404080 + timestamp: 1778273064154 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + sha256: d4837b3b9b30af3132d260225e91ab9dde83be04c59513f500cc81050fb37486 + md5: 1ea03f87cdb1078fbc0e2b2deb63752c depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - libgfortran5 15.2.0 hdae7583_19 + constrains: + - libgfortran-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 55733 - timestamp: 1761332551110 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-compress-raw-bzip2-2.214-pl5321h4777abc_0.conda - sha256: 55c31397194bf13d45d4c4745656dc3d5f456234085a97c425f7769ea857310d - md5: 95b5350d7705940debe7508d0439b755 + size: 139675 + timestamp: 1778273280875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + sha256: d0a68b7a121d115b80c169e24d1265dcc25a3fe58d107df1bbc430797e226d88 + md5: ba36d8c606a6a53fe0b8c12d47267b3d depends: - - libgcc >=14 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER - purls: [] - size: 55009 - timestamp: 1761334157742 -- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-compress-raw-bzip2-2.214-pl5321h500dc9f_0.conda - sha256: bc7ea5f147849e9ff9f96efa47bbc64f12ec5e123ead7aa035f1b4a547c56dc7 - md5: 5e5ba05b49747543e70b0b5466a9d672 + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 599691 + timestamp: 1778273075448 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.1-ha08bb59_2.conda + sha256: 3b32a7a710132d509f2ea38b2f0384414c863533e0fc7ac71b6a0763e4c67424 + md5: 62d6f3b832d7d79ae0c0aa1bb3c325fa depends: - - __osx >=10.13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - __osx >=11.0 + - libintl >=0.25.1,<1.0a0 + - libffi >=3.5.2,<3.6.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later purls: [] - size: 58124 - timestamp: 1761333098955 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-compress-raw-bzip2-2.214-pl5321h2ddc596_0.conda - sha256: ef4c03b93bda20fbf1e14aaed8d2dfab47be84c87a2ebcad33304dcd91ff963e - md5: 11449b58306c8d2334895cee4420b73b + size: 4439458 + timestamp: 1778508895255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.3.0-h48b13b8_1.conda + sha256: 837fe775ba8ec9f08655bb924e28dba390d917423350333a75fd5eeac0776174 + md5: 6375717f5fcd756de929a06d0e40fab0 depends: - __osx >=11.0 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - libcxx >=19 + license: Apache-2.0 OR BSD-3-Clause purls: [] - size: 53995 - timestamp: 1761332770399 -- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-compress-raw-zlib-2.214-pl5321h4dac143_0.conda - sha256: 4fd3a11f8dbd2c9d1a1c5547e344ad20412a3f0d36967502d9764e1b2734dd47 - md5: 943e7033e6f709adf0d89a3af51ab81b + size: 581579 + timestamp: 1758894814983 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - __osx >=11.0 + license: LGPL-2.1-only purls: [] - size: 81114 - timestamp: 1761332700914 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-compress-raw-zlib-2.214-pl5321hf8147d9_0.conda - sha256: 96d4f725f1489c2826bc3bf67043ca5dfe38775d74df0548335b87002fd3c1f3 - md5: b0b7b330e5438414f1a48c832939c0cb + size: 750379 + timestamp: 1754909073836 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libidn2-2.3.8-ha90df94_1.conda + sha256: 6d9d2db2c8a645f63073553e9497ea266507c940de42800f2f0faddbf00149cd + md5: d4b2e2dd2a1a1e2df8b4a3f05034beb4 depends: - - libgcc >=14 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - __osx >=11.0 + - libintl >=0.25.1,<1.0a0 + - libunistring >=0,<1.0a0 + license: LGPL-2.0-only + license_family: LGPL purls: [] - size: 78369 - timestamp: 1761334606067 -- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-compress-raw-zlib-2.214-pl5321h62fca4e_0.conda - sha256: 827fa7b71f7c1231bb409dfd1618a47147f7a102609df167a0c4b591e85924ff - md5: 0090066bf25d244a443ffef4caf8e213 + size: 145706 + timestamp: 1760385907428 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a + md5: 5103f6a6b210a3912faf8d7db516918c depends: - - __osx >=10.13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later purls: [] - size: 76505 - timestamp: 1761332750742 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-compress-raw-zlib-2.214-pl5321ha1c2b25_0.conda - sha256: 4f52ea95e8d3ffcb2b0d330dd45300f930565d76852795f1dd26970930855ffd - md5: ea7d19c2d6142748d7a8b4e71fb1616e + size: 90957 + timestamp: 1751558394144 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda + sha256: 46f8ff3d86438c0af1bebe0c18261ce5de9878d58b4fe399a3a125670e4f0af5 + md5: d1d9b233830f6631800acc1e081a9444 depends: - __osx >=11.0 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 74597 - timestamp: 1761332854921 -- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-encode-3.21-pl5321hb9d3cd8_1.conda - sha256: 4cbe4125efe8763e1ad44448852b04481002f1dac84b6052cec1626df79e3a16 - md5: a418a0e7010007df65768e4e4b96dd14 + size: 26914852 + timestamp: 1757353228286 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e + md5: b1fd823b5ae54fbec272cea0811bd8a9 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-exporter - - perl-parent - - perl-storable - license: GPL-1.0-or-later OR Artistic-1.0-Perl + - __osx >=11.0 + constrains: + - xz 5.8.3.* + license: 0BSD purls: [] - size: 1731511 - timestamp: 1728247059262 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-encode-3.21-pl5321h86ecc28_1.conda - sha256: 11a63652bf66cd5bf036f0da892f1f8ba5922c65cb3a3f9fcc48d3845e85c9cb - md5: c7423ef0d75902ace96153a6500c0018 + size: 92472 + timestamp: 1775825802659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 + md5: 57c4be259f5e0b99a5983799a228ae55 depends: - - libgcc >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-exporter - - perl-parent - - perl-storable - license: GPL-1.0-or-later OR Artistic-1.0-Perl + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD purls: [] - size: 1744815 - timestamp: 1728247108191 -- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-encode-3.21-pl5321h6e16a3a_1.conda - sha256: 2076098715d5ca61c043f88048b06c1218e7ce87a196a3132467620a78844a43 - md5: 36bce9916ae172be82e3d65a6fdb2171 + size: 73690 + timestamp: 1769482560514 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + sha256: 2bc7bc3978066f2c274ebcbf711850cc9ab92e023e433b9631958a098d11e10a + md5: 6ea18834adbc3b33df9bd9fb45eaf95b depends: - - __osx >=10.13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-exporter - - perl-parent - - perl-storable - license: GPL-1.0-or-later OR Artistic-1.0-Perl + - __osx >=11.0 + - c-ares >=1.34.6,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT purls: [] - size: 1051857 - timestamp: 1741897736721 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-encode-3.21-pl5321h5505292_1.conda - sha256: 7a781b37b0100f61d07136dce26d3f5730ae47b65918ceacf7b9fe9742c41049 - md5: 42eb64f1b92569f629eb7da894bbfaf0 + size: 576526 + timestamp: 1773854624224 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + sha256: 421f7bd7caaa945d9cd5d374cc3f01e75637ca7372a32d5e7695c825a48a30d1 + md5: c08557d00807785decafb932b5be7ef5 depends: - __osx >=11.0 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-exporter - - perl-parent - - perl-storable - license: GPL-1.0-or-later OR Artistic-1.0-Perl + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT purls: [] - size: 1086399 - timestamp: 1741897764138 -- conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-5.74-pl5321hd8ed1ab_0.tar.bz2 - sha256: 42271d0b79043a10a89044acb5febea50046b745dd2fc37e02943bc3bc75bf8e - md5: fd2eac4e35f8c970870a3961c1df3e29 + size: 36416 + timestamp: 1767045062496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + sha256: 49daec7c83e70d4efc17b813547824bc2bcf2f7256d84061d24fbfe537da9f74 + md5: 6681822ea9d362953206352371b6a904 depends: - - perl >=5.32.1,<6.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: blessing purls: [] - size: 19071 - timestamp: 1636696009075 -- conda: https://conda.anaconda.org/conda-forge/noarch/perl-exporter-tiny-1.002002-pl5321hd8ed1ab_0.tar.bz2 - sha256: abdf86828a12a389d0feb0d70501b267842557bae11820e266526aeb6ab2bebe - md5: 48d709826875be1f2c108d3d1d8efec7 + size: 920047 + timestamp: 1777987051643 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a + md5: b68e8f66b94b44aaa8de4583d3d4cc40 depends: - - perl >=5.32.1,<6.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 28592 - timestamp: 1660341479867 -- conda: https://conda.anaconda.org/conda-forge/noarch/perl-extutils-makemaker-7.70-pl5321hd8ed1ab_0.conda - sha256: 1d3f342ca74cf2948c3edcfe0d3367b1db0fc64bb163393a2e025336dec3a40c - md5: ec3e57ed34f7765bfc7054a05868ce5d + size: 279193 + timestamp: 1745608793272 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libunistring-0.9.10-h3422bc3_0.tar.bz2 + sha256: a1afe12ab199f82f339eae83405d293d197f2485d45346a709703bc7e8299949 + md5: d88e77a4861e20bd96bde6628ee7a5ae + license: GPL-3.0-only OR LGPL-3.0-only + purls: [] + size: 1577561 + timestamp: 1626955172521 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + sha256: 43895a7517c055b8893531290f9dc48bd751eb04be04f14bbce3b6c71b052be6 + md5: 6c8292c2ee808aeef2406083beaa6da7 depends: - - perl >=5.32.1,<6.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libxml2 2.15.3 + - icu <0.0a0 + license: MIT + license_family: MIT purls: [] - size: 157323 - timestamp: 1679847836884 -- conda: https://conda.anaconda.org/bioconda/linux-64/perl-io-compress-2.216-pl5321h503566f_0.conda - sha256: 5241c33cf55ba0cbfc0ccab96b4a31123761db00310eab4fedd7a95226c4fca7 - md5: 0784cb3c120f934a5fe61961c8238330 + size: 465820 + timestamp: 1776377317454 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda + sha256: 4d9c117b2dd222cf891710d5f6a570ebb275479979843a1477ac54ed50907b40 + md5: 0c1fdc80534d8f25fd74722aba81f044 depends: - - libgcc >=13 - - libstdcxx >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-compress-raw-bzip2 >=2.214 - - perl-compress-raw-zlib >=2.214 - - perl-encode - - perl-scalar-list-utils - license: Perl_5 + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h6967ea9_0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - icu <0.0a0 + license: MIT + license_family: MIT purls: [] - size: 87231 - timestamp: 1769815108308 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-io-compress-2.216-pl5321h80f0ee0_0.conda - sha256: e3b08da45be6608d51e20eb95832a505d6334f457a2d17857a905b114b6465dc - md5: 279724b023ac1c97903397f28de43f98 + size: 41663 + timestamp: 1776377341241 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 + md5: bc5a5721b6439f2f62a84f2548136082 depends: - - libgcc >=13 - - libstdcxx >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-compress-raw-bzip2 >=2.214 - - perl-compress-raw-zlib >=2.214 - - perl-encode - - perl-scalar-list-utils - license: Perl_5 + - __osx >=11.0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other purls: [] - size: 87307 - timestamp: 1769814902051 -- conda: https://conda.anaconda.org/bioconda/osx-64/perl-io-compress-2.216-pl5321h5eaf441_0.conda - sha256: a053f0721aa5718227e4dde2ea394d57f09cf0fd0454e522bc1865ff537483b9 - md5: 5475f28718f06211952ba02a4ae26245 + size: 47759 + timestamp: 1774072956767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda + sha256: 2cd49562feda2bf324651050b2b035080fd635ed0f1c96c9ce7a59eff3cc0029 + md5: 8a4e2a54034b35bc6fa5bf9282913f45 depends: - - libcxx >=18 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-compress-raw-bzip2 >=2.214 - - perl-compress-raw-zlib >=2.214 - - perl-encode - - perl-scalar-list-utils - license: Perl_5 + - __osx >=11.0 + constrains: + - openmp 22.1.5|22.1.5.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE purls: [] - size: 87863 - timestamp: 1769816012199 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-io-compress-2.216-pl5321haef7865_0.conda - sha256: 9e7fa17e5eca67ac395b97610deefd861ee6564c8e2f06ea1bfff782551c90f9 - md5: 0431eb5b4aeea11a058a3e639b7379d7 + size: 285806 + timestamp: 1778447786965 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + sha256: 73f9506f7c32a448071340e73a0e8461e349082d63ecc4849e3eb2d1efc357dd + md5: 8237b150fcd7baf65258eef9a0fc76ef depends: - - libcxx >=18 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-compress-raw-bzip2 >=2.214 - - perl-compress-raw-zlib >=2.214 - - perl-encode - - perl-scalar-list-utils - license: Perl_5 + - __osx >=11.0 + - libcxx >=19 + - libllvm19 19.1.7 h8e0c9ce_2 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 88298 - timestamp: 1769815017664 -- conda: https://conda.anaconda.org/bioconda/noarch/perl-io-zlib-1.15-pl5321hdfd78af_1.tar.bz2 - sha256: 771a44b338cac68a22893897450222b886e24bbb291b014897d561f2ba3b588f - md5: db92645dabe9467115729e4479841b5d + size: 16376095 + timestamp: 1757353442671 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda + sha256: 09750c33b5d694c494cad9eafda56c61a62622264173d760341b49fb001afe82 + md5: 3e3ac06efc5fdc1aa675ca30bf7d53df depends: - - perl >=5.32.1,<6.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl + - __osx >=11.0 + - libllvm19 19.1.7 h8e0c9ce_2 + - llvm-tools-19 19.1.7 h91fd4e7_2 + constrains: + - llvm 19.1.7 + - llvmdev 19.1.7 + - clang-tools 19.1.7 + - clang 19.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 12760 - timestamp: 1752069858135 -- conda: https://conda.anaconda.org/bioconda/noarch/perl-json-4.10-pl5321hdfd78af_1.tar.bz2 - sha256: c30768595793865d67fe2bf76a34e696a0664ae1f1cef34e31cb16618af22d61 - md5: c6c43c11e14d90b836f42c611e106ea9 + size: 88390 + timestamp: 1757353535760 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda + sha256: a9774664adea222e4165efddcd902641c03c7d08fda3a83a5b0885e675ead309 + md5: 2845c3a1d0d8da1db92aba8323892475 depends: - - perl >=5.32.1,<6.0a0 *_perl5 - - perl-json-xs - license: GPL-1.0-or-later OR Artistic-1.0-Perl + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.2,<5.0a0 + license: LGPL-3.0-or-later + license_family: LGPL purls: [] - size: 57728 - timestamp: 1722414214816 -- conda: https://conda.anaconda.org/bioconda/linux-64/perl-json-xs-4.04-pl5321h9948957_0.conda - sha256: f16cf35917a5d75fb55cfc69d8651dc72ff4e06370142b447a4864f5de7d97c6 - md5: 7916b2e794393b3389535ba750f489da + size: 86181 + timestamp: 1774472395307 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h6bc93b0_0.conda + sha256: af5eca85f7ffdd403275e916f1de40a7d4b48ae138f12479523d9500c6a073ba + md5: a47a14da2103c9c7a390f7c8bc8d7f9b depends: - - libgcc >=13 - - libstdcxx >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-common-sense - - perl-types-serialiser - license: GPL-1.0-or-later OR Artistic-1.0-Perl + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + license: LGPL-3.0-only + license_family: LGPL purls: [] - size: 70770 - timestamp: 1757352008878 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-json-xs-4.04-pl5321h163da20_0.conda - sha256: 913ca904aec0226af5c159be33cd1c18a027f340de4c863c6ac2c45f485a490d - md5: 8a7e13298e3a98dc25ed5418b0b3f99f - depends: - - libgcc >=13 - - libstdcxx >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-common-sense - - perl-types-serialiser - license: GPL-1.0-or-later OR Artistic-1.0-Perl - size: 69511 - timestamp: 1757351420227 -- conda: https://conda.anaconda.org/bioconda/osx-64/perl-json-xs-4.04-pl5321h5fa12a8_0.conda - sha256: 36d4985f1405ef0319d938656dfb748bbdf9b39795bd89e1f701e95d2f8c10ec - md5: 0c624f0a1c8680c7ea209f5cadc2387c - depends: - - libcxx >=18 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-common-sense - - perl-types-serialiser - license: GPL-1.0-or-later OR Artistic-1.0-Perl - size: 69555 - timestamp: 1757352915026 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-json-xs-4.04-pl5321h4675bf2_0.conda - sha256: 0a83c4cee65c1beb748948ad1017ff9fbdb3d64cc3eb13599e938f06cd609cbe - md5: 7b47788061026d732bab29c1b24a9c92 - depends: - - libcxx >=18 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-common-sense - - perl-types-serialiser - license: GPL-1.0-or-later OR Artistic-1.0-Perl - size: 68334 - timestamp: 1757351554241 -- conda: https://conda.anaconda.org/bioconda/noarch/perl-list-moreutils-0.430-pl5321hdfd78af_0.tar.bz2 - sha256: 2190cc8430bb218ea80f5fc5e2bf75e4e20a27fb83e8c3cb789a18c32854a56c - md5: 7f04c79d216d0f8e7b6d5a51de4aafa0 - depends: - - perl >=5.32.1,<6.0a0 *_perl5 - - perl-exporter-tiny - - perl-list-moreutils-xs >=0.430 - license: apache_2_0 + size: 348767 + timestamp: 1773414111071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpi-1.0-openmpi.tar.bz2 + sha256: 7051ff40ca1208c06db24f8bf5cf72ee7ad03891e7fd365c3f7a4190938ae83a + md5: cb269c879b1ac5e5ab62a3c17528c40f + license: BSD 3-clause purls: [] - size: 32468 - timestamp: 1644871004171 -- conda: https://conda.anaconda.org/bioconda/linux-64/perl-list-moreutils-xs-0.430-pl5321h7b50bb2_5.tar.bz2 - sha256: fe2d360770fe5b856ee1e625eac6b07cea386c64b0866e323c6535eb62b9ceee - md5: 9192770eb08524038c3fcf24e915b10c + size: 4294 + timestamp: 1605464601195 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d + md5: 343d10ed5b44030a2f67193905aea159 depends: - - libgcc >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: apache_2_0 + - __osx >=11.0 + license: X11 AND BSD-3-Clause purls: [] - size: 51506 - timestamp: 1741776389435 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/perl-list-moreutils-xs-0.430-pl5321h661a7b0_5.tar.bz2 - sha256: 373f7c8ec1260df64afd2c550cf83cfa19e7fddf3f615d6cf5e74a86a29f2b04 - md5: f127ef1c613b5170a2d59e8a43ea0e76 + size: 805509 + timestamp: 1777423252320 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjdk-23.0.2-hfb9339a_2.conda + sha256: f16143181808731b74e03b191a1d859cfb6dc7ed066f9d567808c438e9770f85 + md5: 6e330bfe359f78e2313eaecf8ca1529c depends: - - libgcc >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: apache_2_0 + - libzlib >=1.3.1,<2.0a0 + license: GPL-2.0-or-later WITH Classpath-exception-2.0 + license_family: GPL purls: [] - size: 51048 - timestamp: 1741776294812 -- conda: https://conda.anaconda.org/bioconda/osx-64/perl-list-moreutils-xs-0.430-pl5321h18d8cf3_5.tar.bz2 - sha256: eea554693fbc015804eec6c510cca54d0051bcd1d496bfbfac6fe4426f42503f - md5: 2a311e115963e9a985b1029d092a58d1 + size: 183373664 + timestamp: 1743198731576 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openmpi-4.1.6-h526c993_101.conda + sha256: 641f44ea7e91c08c722d3d7c66939f67b1cf2dd94c576a898f0b1a08e7db861a + md5: fa9afd3a548f6206422e16969a0b6ffe depends: - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: apache_2_0 + - __osx >=10.9 + - libcxx >=16.0.6 + - libgfortran >=5 + - libgfortran5 >=12.3.0 + - libgfortran5 >=13.2.0 + - libzlib >=1.2.13,<2.0.0a0 + - mpi 1.0 openmpi + - zlib + constrains: + - libpmix ==0.0.0 + - libprrte ==0.0.0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 44178 - timestamp: 1741776966235 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/perl-list-moreutils-xs-0.430-pl5321hbdacb55_5.tar.bz2 - sha256: 46d9645a60edde726f5891ae254db4bb2a17f0e32ff64a18160910c4a618d879 - md5: 4f44dd7b4232e9c202a72d17f9d1c287 + size: 2760344 + timestamp: 1696593859968 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + sha256: c91bf510c130a1ea1b6ff023e28bac0ccaef869446acd805e2016f69ebdc49ea + md5: 25dcccd4f80f1638428613e0d7c9b4e1 depends: - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: apache_2_0 + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache purls: [] - size: 43423 - timestamp: 1741776343291 -- conda: https://conda.anaconda.org/conda-forge/noarch/perl-parent-0.243-pl5321hd8ed1ab_0.conda - sha256: ec57d9e56ba86d840d5a9e65c665365fb6a290851cd13e6719628f3295eabf34 - md5: 314caa3b72d65f8078d426c6721dcacc + size: 3106008 + timestamp: 1775587972483 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + sha256: 5e2e443f796f2fd92adf7978286a525fb768c34e12b1ee9ded4000a41b2894ba + md5: 9b4190c4055435ca3502070186eba53a depends: - - perl >=5.32.1,<6.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 13933 - timestamp: 1733429736293 -- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-pathtools-3.75-pl5321hb9d3cd8_2.conda - sha256: a80bc265aa749ae03fdd6d5f2098312ea6f43cc193ea7aba0e6e4304d84ce8c0 - md5: 03d88c89dfac8a26adcdeff242f94007 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-carp + size: 850231 + timestamp: 1763655726735 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda + build_number: 7 + sha256: b0c55040d2994fd6bf2f83786561d92f72306d982d6ea12889acad24a9bf43b8 + md5: ba3cbe93f99e896765422cc5f7c3a79e license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER purls: [] - size: 50681 - timestamp: 1741783312134 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-pathtools-3.75-pl5321h86ecc28_2.conda - sha256: 1ce7d5f0623bdb7dc5b1479949190406c443c0d3ad76796401cf3c761129248c - md5: af9bc42695de103aaf57007cae8f2708 + size: 14439531 + timestamp: 1703311335652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-compress-raw-bzip2-2.214-pl5321h2ddc596_0.conda + sha256: ef4c03b93bda20fbf1e14aaed8d2dfab47be84c87a2ebcad33304dcd91ff963e + md5: 11449b58306c8d2334895cee4420b73b depends: - - libgcc >=13 + - __osx >=11.0 - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-carp license: GPL-1.0-or-later OR Artistic-1.0-Perl license_family: OTHER purls: [] - size: 50835 - timestamp: 1741784515350 -- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-pathtools-3.75-pl5321h6e16a3a_2.conda - sha256: f04c191928f2ca80470cceb51fe40c3482f691424a54bd6b8081256dc0dcdf99 - md5: 8b5ca77bb3f633c6b837c31c71d3a255 + size: 53995 + timestamp: 1761332770399 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-compress-raw-zlib-2.214-pl5321ha1c2b25_0.conda + sha256: 4f52ea95e8d3ffcb2b0d330dd45300f930565d76852795f1dd26970930855ffd + md5: ea7d19c2d6142748d7a8b4e71fb1616e depends: - - __osx >=10.13 + - __osx >=11.0 - perl >=5.32.1,<5.33.0a0 *_perl5 - - perl-carp license: GPL-1.0-or-later OR Artistic-1.0-Perl license_family: OTHER purls: [] - size: 48818 - timestamp: 1741783288987 + size: 74597 + timestamp: 1761332854921 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-encode-3.21-pl5321h5505292_1.conda + sha256: 7a781b37b0100f61d07136dce26d3f5730ae47b65918ceacf7b9fe9742c41049 + md5: 42eb64f1b92569f629eb7da894bbfaf0 + depends: + - __osx >=11.0 + - perl >=5.32.1,<5.33.0a0 *_perl5 + - perl-exporter + - perl-parent + - perl-storable + license: GPL-1.0-or-later OR Artistic-1.0-Perl + purls: [] + size: 1086399 + timestamp: 1741897764138 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-pathtools-3.75-pl5321hc71e825_2.conda sha256: 85eca77264dfe63673098dbc5d07a576c20f8aca6fada79041ad4ca24742d83d md5: c27e14dadd37c355bd3160a0a4830653 @@ -7822,40 +7307,6 @@ packages: purls: [] size: 49073 timestamp: 1741783420655 -- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-scalar-list-utils-1.70-pl5321hb03c661_0.conda - sha256: 00678b34a57df53fa31585ff1579f42a6dfc8b1b059fd1b386c6e89573959a9f - md5: 046486011bf7674e3c2f2a1513ac4f3d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER - purls: [] - size: 51958 - timestamp: 1753965684679 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-scalar-list-utils-1.70-pl5321he30d5cf_0.conda - sha256: 61e0c9575a885501d363e2a63f94639eaff7e84cb7dc96b969c34b4329ee708e - md5: 5c510e02b5cae9df70df1f65f143bd65 - depends: - - libgcc >=14 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER - purls: [] - size: 52388 - timestamp: 1753966867451 -- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-scalar-list-utils-1.70-pl5321h1c43f85_0.conda - sha256: 68501bec90dc97610a230baf139c7f3b9f0785f7f0296d03b105162124c85d7b - md5: f8c03e9da8b66368b5bcc7c3eed47324 - depends: - - __osx >=10.13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER - purls: [] - size: 47621 - timestamp: 1753965888767 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-scalar-list-utils-1.70-pl5321h44e845a_0.conda sha256: 6dea0dd8ea98d807866c3d469afe658dbbf6153f0ac9e9fecd15dc76c96225ef md5: aad96d9728726b11fc1b451c247a9fdb @@ -7867,40 +7318,6 @@ packages: purls: [] size: 46900 timestamp: 1753965963335 -- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-storable-3.15-pl5321hb9d3cd8_2.conda - sha256: 25beba40154a394189d0ff2afd31683d79c9106d47e77e12d20900d053dffaf6 - md5: 212f63a5c7c753ecf0a74c349b9270c5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER - purls: [] - size: 71475 - timestamp: 1741353849888 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-storable-3.15-pl5321h86ecc28_2.conda - sha256: df3398d36cbe101e7b19ab573a04747ac83deb6d27bf84e354f538f7831cd45e - md5: 58c10819dafa98f35e2c92b4fa11d39c - depends: - - libgcc >=13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER - purls: [] - size: 70181 - timestamp: 1741355285769 -- conda: https://conda.anaconda.org/conda-forge/osx-64/perl-storable-3.15-pl5321h6e16a3a_2.conda - sha256: 99f7c02df7d6a3d1649903dad9088b24a0c1fc71f3ed42dd8603e7b5c7cb1413 - md5: 6210779889244bfdf2a339a6f00cdb7c - depends: - - __osx >=10.13 - - perl >=5.32.1,<5.33.0a0 *_perl5 - license: GPL-1.0-or-later OR Artistic-1.0-Perl - license_family: OTHER - purls: [] - size: 65428 - timestamp: 1741353959926 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-storable-3.15-pl5321hc71e825_2.conda sha256: 7e0cfec98f6a4ee7f4ce7e18d9efc748a8bdf1462081a1897c445f709a791d0c md5: 8574488332db7649d4f87120553ec179 @@ -7912,196 +7329,685 @@ packages: purls: [] size: 63402 timestamp: 1741353964208 -- conda: https://conda.anaconda.org/bioconda/noarch/perl-types-serialiser-1.01-pl5321hdfd78af_0.tar.bz2 - sha256: 20f61217b16235d0161ad6fa0a234585afcc04ec5a6142c65b5867e26216dfe3 - md5: cfc65753e827bbef80c00eaa395f6ae7 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda + sha256: d82f4655b2d67fe12eefe1a3eea4cd27d33fa41dbc5e9aeab5fd6d3d2c26f18a + md5: b4f41e19a8c20184eec3aaf0f0953293 depends: - - perl >=5.32.1,<6.0a0 *_perl5 - - perl-common-sense - license: perl_5 + - __osx >=11.0 + - libglib >=2.80.3,<3.0a0 + - libiconv >=1.17,<2.0a0 + license: GPL-2.0-or-later + license_family: GPL purls: [] - size: 13136 - timestamp: 1644512391683 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a - md5: c01af13bdc553d1a8fbfff6e8db075f0 + size: 49724 + timestamp: 1720806128118 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.13-h20e6be0_100_cp313.conda + build_number: 100 + sha256: d0fffc5fde21d1ae350da545dfb9e115a8c53bed8a9c5761f9efd4a5581853c1 + md5: 9991a930e81d3873eba7a299ba783ec4 depends: - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.5,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.2,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.6,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + size: 12966447 + timestamp: 1775615694085 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 313930 + timestamp: 1765813902568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_1.conda + sha256: e37a5901d13a697f32e23bc56f1ac2d3ecefe9627a98ddc0f76ca1bd9ccf38e5 + md5: b3ff36b7d0373283eac0bf42b0a98202 + depends: + - rust-std-aarch64-apple-darwin 1.94.0 hf6ec828_1 license: MIT license_family: MIT purls: [] - size: 450960 - timestamp: 1754665235234 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda - sha256: e6b0846a998f2263629cfeac7bca73565c35af13251969f45d385db537a514e4 - md5: 1587081d537bd4ae77d1c0635d465ba5 + size: 183357842 + timestamp: 1777308503504 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-script-0.36.0-h0ca00b2_0.conda + sha256: b2d26e1606a04036b27970f04981dc4f4322ad57c3a5a68880debd06c2168953 + md5: 20dc45f7ef75dff7e8253e2c8370bd5a depends: - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 + - __osx >=11.0 + - rust >=1.74 + constrains: + - __osx >=11.0 + license: MIT AND Apache-2.0 + purls: [] + size: 1011047 + timestamp: 1755479797729 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + sha256: f3d006e2441f110160a684744d90921bbedbffa247d7599d7e76b5cd048116dc + md5: ade77ad7513177297b1d75e351e136ce + depends: + - __osx >=11.0 + - libsigtool 0.1.3 h98dc951_0 + - openssl >=3.5.4,<4.0a0 license: MIT license_family: MIT purls: [] - size: 357913 - timestamp: 1754665583353 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda - sha256: c9601efb1af5391317e04eca77c6fe4d716bf1ca1ad8da2a05d15cb7c28d7d4e - md5: 1bee70681f504ea424fb07cdb090c001 + size: 114331 + timestamp: 1767045086274 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.53.1-h85ec8f2_0.conda + sha256: b26e0b8d945799f53a505192694599c0dd0ee422d9afa7d98c15e6144b6f99f9 + md5: f7a7a885f173730179da53e02b98ca93 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - license: GPL-2.0-or-later - license_family: GPL + - __osx >=11.0 + - libsqlite 3.53.1 h1b79a29_0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - readline >=8.3,<9.0a0 + license: blessing purls: [] - size: 115175 - timestamp: 1720805894943 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pkg-config-0.29.2-hce167ba_1009.conda - sha256: 6468cbfaf1d3140be46dd315ec383d373dbbafd770ce2efe77c3f0cdbc4576c1 - md5: 05eda637f6465f7e8c5ab7e341341ea9 + size: 181970 + timestamp: 1777987071018 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda + sha256: de6893e53664e769c1b1c4103a666d436e3d307c0eb6a09a164e749d116e80f7 + md5: 555070ad1e18b72de36e9ee7ed3236b3 depends: - - libgcc-ng >=12 - - libglib >=2.80.3,<3.0a0 - license: GPL-2.0-or-later - license_family: GPL + - libcxx >=19.0.0.a0 + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: NCSA purls: [] - size: 54834 - timestamp: 1720806008171 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda - sha256: 636122606556b651ad4d0ac60c7ab6b379e98f390359a1f0c05ad6ba6fb3837f - md5: 0b1b9f9e420e4a0e40879b61f94ae646 + size: 200192 + timestamp: 1775657222120 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 + md5: a9d86bc62f39b94c4661716624eb21b0 depends: - - __osx >=10.13 - - libiconv >=1.17,<2.0a0 - license: GPL-2.0-or-later - license_family: GPL + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD purls: [] - size: 239818 - timestamp: 1720806136579 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda - sha256: d82f4655b2d67fe12eefe1a3eea4cd27d33fa41dbc5e9aeab5fd6d3d2c26f18a - md5: b4f41e19a8c20184eec3aaf0f0953293 + size: 3127137 + timestamp: 1769460817696 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unzip-6.0-h6caf38d_4.conda + sha256: 47cdb8893a679d2122e8eec28a4cf26010bdb177e694d1ab1fcd66b9ea0c3de6 + md5: d9521ca78166888a860e7e4c9ea30d2a depends: - __osx >=11.0 - - libglib >=2.80.3,<3.0a0 - - libiconv >=1.17,<2.0a0 - license: GPL-2.0-or-later + license: LicenseRef-BSD-like + purls: [] + size: 144569 + timestamp: 1754913257831 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wget-1.25.0-h7ba78b2_1.conda + sha256: ede2c595d4a2ccbf2b693cdf94162d485967a1f72b1d65067a5b1a5a7f930162 + md5: f0766e3a7c268c83c736b16059813a8b + depends: + - __osx >=11.0 + - libidn2 >=2,<3.0a0 + - libunistring >=0,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - zlib + license: GPL-3.0-or-later license_family: GPL purls: [] - size: 49724 - timestamp: 1720806128118 -- pypi: https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl - name: platformdirs - version: 4.9.2 - sha256: 9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/0a/49/737c1a6273c585719858261753da0b688454d1b634438ccba8a9c4eb5aab/polars-1.38.1-py3-none-any.whl - name: polars - version: 1.38.1 - sha256: a29479c48fed4984d88b656486d221f638cba45d3e961631a50ee5fdde38cb2c + size: 326073 + timestamp: 1772233693369 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac + md5: 78a0fe9e9c50d2c381e8ee47e3ea437d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 83386 + timestamp: 1753484079473 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda + sha256: 8dd2ac25f0ba714263aac5832d46985648f4bfb9b305b5021d702079badc08d2 + md5: f1c0bce276210bed45a04949cfe8dc20 + depends: + - __osx >=11.0 + - libzlib 1.3.2 h8088a28_2 + license: Zlib + license_family: Other + purls: [] + size: 81123 + timestamp: 1774072974535 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 + md5: ab136e4c34e97f34fb621d2592a393d8 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 433413 + timestamp: 1764777166076 +- pypi: . + name: nvd requires_dist: - - polars-runtime-32==1.38.1 - - polars-runtime-64==1.38.1 ; extra == 'rt64' - - polars-runtime-compat==1.38.1 ; extra == 'rtcompat' - - polars-cloud>=0.4.0 ; extra == 'polars-cloud' - - numpy>=1.16.0 ; extra == 'numpy' - - pandas ; extra == 'pandas' - - polars[pyarrow] ; extra == 'pandas' - - pyarrow>=7.0.0 ; extra == 'pyarrow' - - pydantic ; extra == 'pydantic' - - fastexcel>=0.9 ; extra == 'calamine' - - openpyxl>=3.0.0 ; extra == 'openpyxl' - - xlsx2csv>=0.8.0 ; extra == 'xlsx2csv' - - xlsxwriter ; extra == 'xlsxwriter' - - polars[calamine,openpyxl,xlsx2csv,xlsxwriter] ; extra == 'excel' - - adbc-driver-manager[dbapi] ; extra == 'adbc' - - adbc-driver-sqlite[dbapi] ; extra == 'adbc' - - connectorx>=0.3.2 ; extra == 'connectorx' - - sqlalchemy ; extra == 'sqlalchemy' - - polars[pandas] ; extra == 'sqlalchemy' - - polars[adbc,connectorx,sqlalchemy] ; extra == 'database' - - fsspec ; extra == 'fsspec' - - deltalake>=1.0.0 ; extra == 'deltalake' - - pyiceberg>=0.7.1 ; extra == 'iceberg' - - gevent ; extra == 'async' - - cloudpickle ; extra == 'cloudpickle' - - matplotlib ; extra == 'graph' - - altair>=5.4.0 ; extra == 'plot' - - great-tables>=0.8.0 ; extra == 'style' - - tzdata ; sys_platform == 'win32' and extra == 'timezone' - - cudf-polars-cu12 ; extra == 'gpu' - - polars[async,cloudpickle,database,deltalake,excel,fsspec,graph,iceberg,numpy,pandas,plot,pyarrow,pydantic,style,timezone] ; extra == 'all' + - biopython>=1.85 + - blake3>=1.0.8 + - duckdb>=1.2.2 + - jsonschema>=4.23.0 + - labkey>=3.4.0 + - loguru>=0.7.3 + - lxml>=5.4.0 + - more-itertools>=10.7.0 + - pandas>=2.2.3 + - polars>=1.27.1 + - pydantic>=2.12.5 + - pysam>=0.23.0 + - pyyaml>=6.0.2 + - rich>=14.0.0 + - slack-sdk>=3.39.0 + - snakemake>=9.3.1 + - taxopy>=0.14.0 + - typer>=0.15.2 + requires_python: '>=3.11,<3.14' +- pypi: https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + name: markupsafe + version: 3.0.3 + sha256: 133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + name: docutils + version: 0.22.4 + sha256: d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/03/a9/5b7d6a16fd6533fed2756900fc8fc923f678179aea62ada6d65c92718c00/wrapt-2.1.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + name: wrapt + version: 2.1.2 + sha256: bbac24d879aa22998e87f6b3f481a5216311e7d53c7db87f189a7a0266dafffb + requires_dist: + - pytest ; extra == 'dev' + - setuptools ; extra == 'dev' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + name: pydantic-core + version: 2.46.4 + sha256: f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/05/d1/8952806fbf9583004ab479d8f58a9496c3d35f6b6009ddd458bdd9978eaf/dpath-2.2.0-py3-none-any.whl + name: dpath + version: 2.2.0 + sha256: b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pydantic-core + version: 2.46.4 + sha256: 9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/08/03/69347590f1cf4a6d5a4944bb6099e6d37f334784f16062234e1f892fdb1d/lxml-6.1.0-cp313-cp313-macosx_10_13_universal2.whl + name: lxml + version: 6.1.0 + sha256: a0092f2b107b69601adf562a57c956fbb596e05e3e6651cabd3054113b007e45 + requires_dist: + - cssselect>=0.7 ; extra == 'cssselect' + - html5lib ; extra == 'html5' + - beautifulsoup4 ; extra == 'htmlsoup' + - lxml-html-clean ; extra == 'html-clean' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl + name: loguru + version: 0.7.3 + sha256: 31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c + requires_dist: + - colorama>=0.3.4 ; sys_platform == 'win32' + - aiocontextvars>=0.2.0 ; python_full_version < '3.7' + - win32-setctime>=1.0.0 ; sys_platform == 'win32' + - pre-commit==4.0.1 ; python_full_version >= '3.9' and extra == 'dev' + - tox==3.27.1 ; python_full_version < '3.8' and extra == 'dev' + - tox==4.23.2 ; python_full_version >= '3.8' and extra == 'dev' + - pytest==6.1.2 ; python_full_version < '3.8' and extra == 'dev' + - pytest==8.3.2 ; python_full_version >= '3.8' and extra == 'dev' + - pytest-cov==2.12.1 ; python_full_version < '3.8' and extra == 'dev' + - pytest-cov==5.0.0 ; python_full_version == '3.8.*' and extra == 'dev' + - pytest-cov==6.0.0 ; python_full_version >= '3.9' and extra == 'dev' + - pytest-mypy-plugins==1.9.3 ; python_full_version >= '3.6' and python_full_version < '3.8' and extra == 'dev' + - pytest-mypy-plugins==3.1.0 ; python_full_version >= '3.8' and extra == 'dev' + - colorama==0.4.5 ; python_full_version < '3.8' and extra == 'dev' + - colorama==0.4.6 ; python_full_version >= '3.8' and extra == 'dev' + - freezegun==1.1.0 ; python_full_version < '3.8' and extra == 'dev' + - freezegun==1.5.0 ; python_full_version >= '3.8' and extra == 'dev' + - exceptiongroup==1.1.3 ; python_full_version >= '3.7' and python_full_version < '3.11' and extra == 'dev' + - mypy==0.910 ; python_full_version < '3.6' and extra == 'dev' + - mypy==0.971 ; python_full_version == '3.6.*' and extra == 'dev' + - mypy==1.4.1 ; python_full_version == '3.7.*' and extra == 'dev' + - mypy==1.13.0 ; python_full_version >= '3.8' and extra == 'dev' + - sphinx==8.1.3 ; python_full_version >= '3.11' and extra == 'dev' + - sphinx-rtd-theme==3.0.2 ; python_full_version >= '3.11' and extra == 'dev' + - myst-parser==4.0.0 ; python_full_version >= '3.11' and extra == 'dev' + - build==1.2.2 ; python_full_version >= '3.11' and extra == 'dev' + - twine==6.0.1 ; python_full_version >= '3.11' and extra == 'dev' + requires_python: '>=3.5,<4.0' +- pypi: https://files.pythonhosted.org/packages/0c/58/fc576f99037ce19c5aa16628e4c3226b6d1419f72a62c79f5f40576e6eb3/greenlet-3.5.0-cp313-cp313-macosx_11_0_universal2.whl + name: greenlet + version: 3.5.0 + sha256: 5a5ed18de6a0f6cc7087f1563f6bd93fc7df1c19165ca01e9bde5a5dc281d106 + requires_dist: + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + - objgraph ; extra == 'test' + - psutil ; extra == 'test' + - setuptools ; extra == 'test' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/a7/fb/599ff3709e6a303024efd7edfd08cf8de55c6ac39527d8f41cbc4399385f/polars_runtime_32-1.38.1-cp310-abi3-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl + name: snakemake-interface-scheduler-plugins + version: 2.0.2 + sha256: b9ddfa508bd480711de1770dfb24f3b813cfa3cd0f862f0127ef721ae5346915 + requires_dist: + - snakemake-interface-common>=1.20.1,<2.0 + requires_python: '>=3.11,<4.0' +- pypi: https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl + name: numpy + version: 2.4.4 + sha256: 08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/14/78/0f68b93564b8c6b6987a0696c582ba2591a381ab2f733a501909e949f241/smart_open-7.6.1-py3-none-any.whl + name: smart-open + version: 7.6.1 + sha256: b4de6aebef023aca91cc9fb372052e1343ba3f152de215bd22391a663e3ddd21 + requires_dist: + - wrapt + - boto3>=1.9.17 ; extra == 's3' + - google-cloud-storage>=2.6.0 ; extra == 'gcs' + - google-api-core<2.28 ; python_full_version < '3.10' and extra == 'gcs' + - azure-storage-blob>=12.7.0 ; extra == 'azure' + - azure-common ; extra == 'azure' + - azure-core ; extra == 'azure' + - requests ; extra == 'http' + - requests ; extra == 'webhdfs' + - paramiko ; extra == 'ssh' + - backports-zstd>=1.0.0 ; python_full_version < '3.14' and extra == 'zst' + - smart-open[azure,gcs,http,s3,ssh,webhdfs,zst] ; extra == 'all' + - smart-open[all] ; extra == 'test' + - moto[server] ; extra == 'test' + - responses ; extra == 'test' + - pytest ; extra == 'test' + - pytest-rerunfailures ; extra == 'test' + - pytest-benchmark ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-xdist[psutil] ; extra == 'test' + - awscli ; extra == 'test' + - pyopenssl ; extra == 'test' + - numpy ; extra == 'test' + - flake8 ; extra == 'test' + requires_python: '>=3.10,<4.0' +- pypi: https://files.pythonhosted.org/packages/15/ef/7d57ceb0651af74194e97ed6583e148d352f03d696090221b8059cdfc90b/polars_runtime_32-1.40.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: polars-runtime-32 - version: 1.38.1 - sha256: c49acac34cc4049ed188f1eb67d6ff3971a39b4af7f7b734b367119970f313ac + version: 1.40.1 + sha256: 8d7f42a8b3f16fc66002cc0f6516f7dd7653396886ae0ed362ab95c0b3408b59 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/ae/a2/a00defbddadd8cf1042f52380dcba6b6592b03bac8e3b34c436b62d12d3b/polars_runtime_32-1.38.1-cp310-abi3-macosx_10_12_x86_64.whl - name: polars-runtime-32 - version: 1.38.1 - sha256: 18154e96044724a0ac38ce155cf63aa03c02dd70500efbbf1a61b08cadd269ef +- pypi: https://files.pythonhosted.org/packages/16/a7/15aaa59dbecc35e9711980fcdbf525b32a52470b32d18ef678193a146213/duckdb-1.5.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl + name: duckdb + version: 1.5.2 + sha256: 486c862bf7f163c0110b6d85b3e5c031d224a671cca468f12ebb1d3a348f6b39 + requires_dist: + - ipython ; extra == 'all' + - fsspec ; extra == 'all' + - numpy ; extra == 'all' + - pandas ; extra == 'all' + - pyarrow ; extra == 'all' + - adbc-driver-manager ; extra == 'all' + requires_python: '>=3.10.0' +- pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + name: typing-extensions + version: 4.15.0 + sha256: f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/1d/29/996c4334f8ec251a24fa6f7490a4319eade9936d5e4347cffc3f377073ff/snakemake_interface_logger_plugins-2.0.1-py3-none-any.whl + name: snakemake-interface-logger-plugins + version: 2.0.1 + sha256: 400dfdabd4ea9c93408dfece273d372470a09bf292f6a9eb7213bcd659425eb9 + requires_dist: + - snakemake-interface-common>=1.17.4 + requires_python: '>=3.11,<4.0' +- pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl + name: annotated-doc + version: 0.0.4 + sha256: 571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl + name: packaging + version: '25.0' + sha256: 29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl + name: gitpython + version: 3.1.50 + sha256: d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9 + requires_dist: + - gitdb>=4.0.1,<5 + - typing-extensions>=3.10.0.2 ; python_full_version < '3.10' + - coverage[toml] ; extra == 'test' + - ddt>=1.1.1,!=1.4.3 ; extra == 'test' + - mock ; python_full_version < '3.8' and extra == 'test' + - mypy==1.18.2 ; python_full_version >= '3.9' and extra == 'test' + - pre-commit ; extra == 'test' + - pytest>=7.3.1 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-instafail ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-sugar ; extra == 'test' + - typing-extensions ; python_full_version < '3.11' and extra == 'test' + - sphinx>=7.4.7,<8 ; extra == 'doc' + - sphinx-rtd-theme ; extra == 'doc' + - sphinx-autodoc-typehints ; extra == 'doc' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/21/ae/6e55c19c8460fada86cd1306a390a09b0c5a2e2e424f9317d2edacea439f/blake3-1.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: blake3 + version: 1.0.8 + sha256: e4072196547484c95a5a09adbb952e9bb501949f03f9e2a85e7249ef85faaba8 + requires_dist: + - typing-extensions>=4.6.0 ; python_full_version < '3.12' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl + name: certifi + version: 2026.4.22 + sha256: 3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/28/90/a4a3652e832667917383f8d34112bdb37b78a6d14efc049e22a2c8192524/snakemake_interface_common-1.23.0-py3-none-any.whl + name: snakemake-interface-common + version: 1.23.0 + sha256: 43bb10102d07149f27787dfc65a7342b86ff772973e7f9ca4940c89cb412a11e + requires_dist: + - argparse-dataclass>=2.0.0 + - configargparse>=1.7 + - packaging>=24.0,<26.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl + name: referencing + version: 0.37.0 + sha256: 381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231 + requires_dist: + - attrs>=22.2.0 + - rpds-py>=0.7.0 + - typing-extensions>=4.4.0 ; python_full_version < '3.13' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/dc/8c/3ac18d6f89dc05fe2c7c0ee1dc5b81f77a5c85ad59898232c2500fe2ebbf/polars_runtime_32-1.38.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - name: polars-runtime-32 - version: 1.38.1 - sha256: fef2ef2626a954e010e006cc8e4de467ecf32d08008f130cea1c78911f545323 +- pypi: https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + name: charset-normalizer + version: 3.4.7 + sha256: 0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl + name: markupsafe + version: 3.0.3 + sha256: e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/3f/58/25e00bb40b185c974cfe156c110474d9a8a8390d5f7c92a4e328189bb60e/lxml-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl + name: lxml + version: 6.1.0 + sha256: fc7140d7a7386e6b545d41b7358f4d02b656d4053f5fa6859f92f4b9c2572c4d + requires_dist: + - cssselect>=0.7 ; extra == 'cssselect' + - html5lib ; extra == 'html5' + - beautifulsoup4 ; extra == 'htmlsoup' + - lxml-html-clean ; extra == 'html-clean' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl + name: typer + version: 0.25.1 + sha256: 75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89 + requires_dist: + - click>=8.2.1 + - shellingham>=1.3.0 + - rich>=13.8.0 + - annotated-doc>=0.0.2 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/f2/5a/61d60ec5cc0ab37cbd5a699edb2f9af2875b7fdfdfb2a4608ca3cc5f0448/polars_runtime_32-1.38.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl + name: jsonschema-specifications + version: 2025.9.1 + sha256: 98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe + requires_dist: + - referencing>=0.31.0 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/43/e9/384bc069367a1a36ee31c13782c178dbd039b2b873b772d4a0fc23a2373d/polars_runtime_32-1.40.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl name: polars-runtime-32 - version: 1.38.1 - sha256: e8a5f7a8125e2d50e2e060296551c929aec09be23a9edcb2b12ca923f555a5ba + version: 1.40.1 + sha256: 5987b30e7aa1059d069498496e8dda35afd592b0ac3d46ed87e3ff8df1ad652c requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - name: psutil - version: 7.2.2 - sha256: b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e +- pypi: https://files.pythonhosted.org/packages/45/26/2cdb3d281ac1bd175603e290cbe4bad6eff127c0f8de90bafd6f8548f0fd/lxml-6.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl + name: lxml + version: 6.1.0 + sha256: a2853c8b2170cc6cd54a6b4d50d2c1a8a7aeca201f23804b4898525c7a152cfc requires_dist: - - psleak ; extra == 'dev' - - pytest ; extra == 'dev' - - pytest-instafail ; extra == 'dev' - - pytest-xdist ; extra == 'dev' - - setuptools ; extra == 'dev' - - abi3audit ; extra == 'dev' - - black ; extra == 'dev' - - check-manifest ; extra == 'dev' - - coverage ; extra == 'dev' - - packaging ; extra == 'dev' - - pylint ; extra == 'dev' - - pyperf ; extra == 'dev' - - pypinfo ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - requests ; extra == 'dev' - - rstcheck ; extra == 'dev' - - ruff ; extra == 'dev' - - sphinx ; extra == 'dev' - - sphinx-rtd-theme ; extra == 'dev' - - toml-sort ; extra == 'dev' - - twine ; extra == 'dev' - - validate-pyproject[all] ; extra == 'dev' - - virtualenv ; extra == 'dev' - - vulture ; extra == 'dev' - - wheel ; extra == 'dev' - - colorama ; os_name == 'nt' and extra == 'dev' - - pyreadline3 ; os_name == 'nt' and extra == 'dev' - - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - - psleak ; extra == 'test' - - pytest ; extra == 'test' - - pytest-instafail ; extra == 'test' - - pytest-xdist ; extra == 'test' + - cssselect>=0.7 ; extra == 'cssselect' + - html5lib ; extra == 'html5' + - beautifulsoup4 ; extra == 'htmlsoup' + - lxml-html-clean ; extra == 'html-clean' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/45/bb/34c443690c847835cfe9f892be78c533d4f32366ad2888972c094a897e39/wrapt-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + name: wrapt + version: 2.1.2 + sha256: 16997dfb9d67addc2e3f41b62a104341e80cac52f91110dece393923c0ebd5ca + requires_dist: + - pytest ; extra == 'dev' + - setuptools ; extra == 'dev' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/4a/ba/b28ddbe6bfad6a8ac196ef0e8cff37bc65b79735995b9e410923fffeeb70/greenlet-3.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl + name: greenlet + version: 3.5.0 + sha256: 3a717fbc46d8a354fa675f7c1e813485b6ba3885f9bef0cd56e5ba27d758ff5b + requires_dist: + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + - objgraph ; extra == 'test' + - psutil ; extra == 'test' - setuptools ; extra == 'test' - - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' - - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' - - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/4c/7a/d936840735c828b38d26a854e85d5338894cda544cb7a85a9d5b8b9c4df7/wrapt-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl + name: wrapt + version: 2.1.2 + sha256: 787fd6f4d67befa6fe2abdffcbd3de2d82dfc6fb8a6d850407c53332709d030b + requires_dist: + - pytest ; extra == 'dev' + - setuptools ; extra == 'dev' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl + name: yte + version: 1.9.4 + sha256: 5dac63303d3e6bc2ebadc36ece3c3fb09343772fe6e25e9356d9baf8f9dfaf6d + requires_dist: + - argparse-dataclass>=2.0.0,<3 + - dpath>=2.1,<3.0 + - pyyaml>=6.0,<7.0 + requires_python: '>=3.8,<4.0' +- pypi: https://files.pythonhosted.org/packages/50/26/f7668be55c909678b001ecacff11ad7016cd9b4e9c7cc87b5971d638c5a9/blake3-1.0.8-cp313-cp313-macosx_11_0_arm64.whl + name: blake3 + version: 1.0.8 + sha256: d17eb6382634b3a5bc0c0e0454d5265b0becaeeadb6801ed25150b39a999d0cc + requires_dist: + - typing-extensions>=4.6.0 ; python_full_version < '3.12' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + name: pyyaml + version: 6.0.3 + sha256: ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl + name: pydantic-core + version: 2.46.4 + sha256: 5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/55/b8/11de9528c257f7f1633f957ccaff253b706838d22c5d2908e4735798ec01/blake3-1.0.8-cp313-cp313-macosx_10_12_x86_64.whl + name: blake3 + version: 1.0.8 + sha256: 46dc20976bd6c235959ef0246ec73420d1063c3da2839a9c87ca395cf1fd7943 + requires_dist: + - typing-extensions>=4.6.0 ; python_full_version < '3.12' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + name: rpds-py + version: 0.30.0 + sha256: 2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/5c/2c/4422eb14884bb4955ce65819799ff6452dcd3aa5f8e158540a287877bbcf/snakemake_interface_executor_plugins-9.4.0-py3-none-any.whl + name: snakemake-interface-executor-plugins + version: 9.4.0 + sha256: d335c093185897e4e3654a39bab3a6f1c57dc1a54f998c92bd2d88640ab4a05e + requires_dist: + - argparse-dataclass>=2.0.0 + - snakemake-interface-common>=1.19.0 + - throttler>=1.2.2 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/5c/35/95ae2b839668c4fa729243f05a208afaba4a1007e7aaaabf54a409fb6cf8/pysam-0.24.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl + name: pysam + version: 0.24.0 + sha256: 37f82c603837f708cc46a29bd5819d35dbb061c90609c1088701ed3bfbce2f70 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/5c/4b/00b8005c24f7c36d8bdffae3354194a2221716004e39029528be923adeae/biopython-1.87-cp313-cp313-macosx_11_0_arm64.whl + name: biopython + version: '1.87' + sha256: e05ef5d632c319ab3ef77705c74061190d0792b07e1f2b9eee867401b2758e7e + requires_dist: + - numpy + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/5e/88/9a9b9a90ac8ca11c2fdb6a286cb3a1fc7dd774c00ed70929a6434f6bc634/wrapt-2.1.2-cp313-cp313-macosx_11_0_arm64.whl + name: wrapt + version: 2.1.2 + sha256: 4bdf26e03e6d0da3f0e9422fd36bcebf7bc0eeb55fdf9c727a09abc6b9fe472e + requires_dist: + - pytest ; extra == 'dev' + - setuptools ; extra == 'dev' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/5e/db/60da6f5a3c3f64e0b3940c4ad86e1971d9d2eb8b13a179c26eda5ec6a298/immutables-0.21-cp313-cp313-macosx_10_13_x86_64.whl + name: immutables + version: '0.21' + sha256: 79674b51aa8dd983f9ac55f7f67b433b1df84a6b4f28ab860588389a5659485b + requires_dist: + - flake8~=5.0 ; extra == 'test' + - pycodestyle~=2.9 ; extra == 'test' + - mypy~=1.4 ; extra == 'test' + - pytest~=7.4 ; extra == 'test' + requires_python: '>=3.8.0' +- pypi: https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl + name: pandas + version: 3.0.3 + sha256: d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; extra == 'sql-other' + - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' + - beautifulsoup4>=4.12.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2020.1 ; extra == 'timezone' + - adbc-driver-postgresql>=1.2.0 ; extra == 'all' + - adbc-driver-sqlite>=1.2.0 ; extra == 'all' + - beautifulsoup4>=4.12.3 ; extra == 'all' + - bottleneck>=1.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2020.1 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + name: jinja2 + version: 3.1.6 + sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl name: psutil version: 7.2.2 - sha256: 1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979 + sha256: b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e requires_dist: - psleak ; extra == 'dev' - pytest ; extra == 'dev' @@ -8142,54 +8048,209 @@ packages: - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - name: psutil - version: 7.2.2 - sha256: 076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9 +- pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + name: attrs + version: 26.1.0 + sha256: c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/66/70/42d8796acc57c8bcd9ae395b1a6a0bbc833f738492a8ed192a44ccd58035/throttler-1.2.3-py3-none-any.whl + name: throttler + version: 1.2.3 + sha256: 241ea3e97438dec4dc2f31ddc56dbd96262787a9b1d0598adfcc0bada1134b66 requires_dist: - - psleak ; extra == 'dev' + - aiohttp ; extra == 'dev' + - build ; extra == 'dev' + - codecov ; extra == 'dev' - pytest ; extra == 'dev' - - pytest-instafail ; extra == 'dev' - - pytest-xdist ; extra == 'dev' - - setuptools ; extra == 'dev' - - abi3audit ; extra == 'dev' - - black ; extra == 'dev' - - check-manifest ; extra == 'dev' - - coverage ; extra == 'dev' - - packaging ; extra == 'dev' - - pylint ; extra == 'dev' - - pyperf ; extra == 'dev' - - pypinfo ; extra == 'dev' + - pytest-asyncio ; extra == 'dev' - pytest-cov ; extra == 'dev' - - requests ; extra == 'dev' - - rstcheck ; extra == 'dev' - ruff ; extra == 'dev' - - sphinx ; extra == 'dev' - - sphinx-rtd-theme ; extra == 'dev' - - toml-sort ; extra == 'dev' - - twine ; extra == 'dev' - - validate-pyproject[all] ; extra == 'dev' - - virtualenv ; extra == 'dev' - - vulture ; extra == 'dev' - - wheel ; extra == 'dev' - - colorama ; os_name == 'nt' and extra == 'dev' - - pyreadline3 ; os_name == 'nt' and extra == 'dev' - - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - - psleak ; extra == 'test' - - pytest ; extra == 'test' - - pytest-instafail ; extra == 'test' - - pytest-xdist ; extra == 'test' - - setuptools ; extra == 'test' - - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' - - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' - - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl + name: jsonschema + version: 4.26.0 + sha256: d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce + requires_dist: + - attrs>=22.2.0 + - jsonschema-specifications>=2023.3.6 + - referencing>=0.28.4 + - rpds-py>=0.25.0 + - fqdn ; extra == 'format' + - idna ; extra == 'format' + - isoduration ; extra == 'format' + - jsonpointer>1.13 ; extra == 'format' + - rfc3339-validator ; extra == 'format' + - rfc3987 ; extra == 'format' + - uri-template ; extra == 'format' + - webcolors>=1.11 ; extra == 'format' + - fqdn ; extra == 'format-nongpl' + - idna ; extra == 'format-nongpl' + - isoduration ; extra == 'format-nongpl' + - jsonpointer>1.13 ; extra == 'format-nongpl' + - rfc3339-validator ; extra == 'format-nongpl' + - rfc3986-validator>0.1.0 ; extra == 'format-nongpl' + - rfc3987-syntax>=1.1.0 ; extra == 'format-nongpl' + - uri-template ; extra == 'format-nongpl' + - webcolors>=24.6.0 ; extra == 'format-nongpl' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/6b/55/59115001469e8b3decc8362e1e6e8201acd56cafab95f4f29f4d9994fb4c/biopython-1.87-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + name: biopython + version: '1.87' + sha256: 772539297fa16a78f38651c793f53f8c11bd18317b111982e72cf30a6e57512a + requires_dist: + - numpy + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/72/0d/f3dc1cf97e1267ca15e4307d456f96ce583961f0703fd75e62b2ad8d64fa/duckdb-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl + name: duckdb + version: 1.5.2 + sha256: bb42e6ed543902e14eae647850da24103a89f0bc2587dec5601b1c1f213bd2ed + requires_dist: + - ipython ; extra == 'all' + - fsspec ; extra == 'all' + - numpy ; extra == 'all' + - pandas ; extra == 'all' + - pyarrow ; extra == 'all' + - adbc-driver-manager ; extra == 'all' + requires_python: '>=3.10.0' +- pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: 0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl + name: platformdirs + version: 4.9.6 + sha256: e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/77/57/e8a85fa261894bf7ce7af928ff3408aab60287ab8d58b55d13a3f700b619/blake3-1.0.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + name: blake3 + version: 1.0.8 + sha256: 19fc6f2b7edab8acff6895fc6e38c19bd79f4c089e21153020c75dfc7397d52d + requires_dist: + - typing-extensions>=4.6.0 ; python_full_version < '3.12' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + name: annotated-types + version: 0.7.0 + sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 + requires_dist: + - typing-extensions>=4.0.0 ; python_full_version < '3.9' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/7d/46/22c8af5eed68ac2eeb556e0fa3ca8a7b798e984ceff4450888f3b5ac61fd/polars_runtime_32-1.40.1-cp310-abi3-macosx_10_12_x86_64.whl + name: polars-runtime-32 + version: 1.40.1 + sha256: b748ef652270cc49e9e69f99a035e0eb4d5f856d42bcd6ac4d9d80a40142aa1e + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl + name: numpy + version: 2.4.4 + sha256: 45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + name: urllib3 + version: 2.7.0 + sha256: 9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 + requires_dist: + - brotli>=1.2.0 ; platform_python_implementation == 'CPython' and extra == 'brotli' + - brotlicffi>=1.2.0.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' + - h2>=4,<5 ; extra == 'h2' + - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' + - backports-zstd>=1.0.0 ; python_full_version < '3.14' and extra == 'zstd' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl + name: pandas + version: 3.0.3 + sha256: 39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; extra == 'sql-other' + - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' + - beautifulsoup4>=4.12.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2020.1 ; extra == 'timezone' + - adbc-driver-postgresql>=1.2.0 ; extra == 'all' + - adbc-driver-sqlite>=1.2.0 ; extra == 'all' + - beautifulsoup4>=4.12.3 ; extra == 'all' + - bottleneck>=1.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2020.1 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl name: psutil version: 7.2.2 - sha256: ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486 + sha256: 1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979 requires_dist: - psleak ; extra == 'dev' - pytest ; extra == 'dev' @@ -8230,40 +8291,176 @@ packages: - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' -- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 - md5: b3c17d95b5a10c6e64a21fa17573e70e - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 8252 - timestamp: 1726802366959 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba - md5: bb5a90c93e3bac3d5690acf76b4a6386 - depends: - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 8342 - timestamp: 1726803319942 -- pypi: https://files.pythonhosted.org/packages/99/6c/64cafaceea3f99927e84b38a362ec6a8f24f33061c90bda77dfe1cd4c3c6/pulp-3.3.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + name: rich + version: 15.0.0 + sha256: 33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb + requires_dist: + - ipywidgets>=7.5.1,<9 ; extra == 'jupyter' + - markdown-it-py>=2.2.0 + - pygments>=2.13.0,<3.0.0 + requires_python: '>=3.9.0' +- pypi: https://files.pythonhosted.org/packages/84/98/06ba4db905613fa24d227bc81219b7b2e6d48f803eac407d86f2ca54991d/taxopy-0.14.0-py3-none-any.whl + name: taxopy + version: 0.14.0 + sha256: 1dabbd091d0be081462d03d57ad0143c73273897ec2e2dfba53758bd24e65ee5 + requires_dist: + - rapidfuzz ; extra == 'fuzzy-matching' + requires_python: '>=3.5' +- pypi: https://files.pythonhosted.org/packages/86/79/2f5151ac001d8c74fb047036bfea9e4e897939e6587d3c4d512e46c450b1/pysam-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl + name: pysam + version: 0.24.0 + sha256: c30f746060a8944adaf5004652b4a25b2460a07360fb01be2b6b38f883fae8e7 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl + name: conda-inject + version: 1.3.2 + sha256: 6e641b408980c2814e3e527008c30749117909a21ff47392f07ef807da93a564 + requires_dist: + - pyyaml>=6.0,<7.0 + requires_python: '>=3.9,<4.0' +- pypi: https://files.pythonhosted.org/packages/8a/17/a3918541fd0ddefe024a69de6d16aa7b46d36ac19562adaa63c7fa180eff/greenlet-3.5.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: greenlet + version: 3.5.0 + sha256: 2094acd54b272cb6eae8c03dd87b3fa1820a4cef18d6889c378d503500a1dc13 + requires_dist: + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + - objgraph ; extra == 'test' + - psutil ; extra == 'test' + - setuptools ; extra == 'test' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/92/ea/dc2840df6f676d69e898792a0cd6f1217754333ec0003ad3ed5bc7c75da7/biopython-1.87-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: biopython + version: '1.87' + sha256: 6d221b2e08e7e89713fdbfb15c8ea6744e908d59f672cd2b6fcf9ed47910d05e + requires_dist: + - numpy + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl + name: tabulate + version: 0.10.0 + sha256: f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3 + requires_dist: + - wcwidth ; extra == 'widechars' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: pandas + version: 3.0.3 + sha256: a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; extra == 'sql-other' + - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' + - beautifulsoup4>=4.12.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2020.1 ; extra == 'timezone' + - adbc-driver-postgresql>=1.2.0 ; extra == 'all' + - adbc-driver-sqlite>=1.2.0 ; extra == 'all' + - beautifulsoup4>=4.12.3 ; extra == 'all' + - bottleneck>=1.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2020.1 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/9b/89/5420f1d16a652024fcccc9c07d46d4157fcaf33ff37c82412c83fc16ef36/immutables-0.21-cp313-cp313-macosx_11_0_arm64.whl + name: immutables + version: '0.21' + sha256: 93c8350f8f7d0d9693f708229d9d0578e6f3b785ce6da4bced1da97137aacfad + requires_dist: + - flake8~=5.0 ; extra == 'test' + - pycodestyle~=2.9 ; extra == 'test' + - mypy~=1.4 ; extra == 'test' + - pytest~=7.4 ; extra == 'test' + requires_python: '>=3.8.0' +- pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl + name: markupsafe + version: 3.0.3 + sha256: 116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/9f/23/5a77fe2b50d962213338ae0fdd9832960186ebc423388fff1a56680e5114/pulp-3.3.1-py3-none-any.whl name: pulp - version: 3.3.0 - sha256: dd6ad2d63f196d1254eddf9dcff5cd224912c1f046120cb7c143c5b0eda63fae + version: 3.3.1 + sha256: 45aa73db3368eb13b156564e092784c8fa0c1feefa64c2afb0410d9dc0bb5cd9 requires_dist: - - cylp ; extra == 'open-py' - - highspy ; extra == 'open-py' + - highspy==1.13 ; extra == 'open-py' - pyscipopt ; extra == 'open-py' - gurobipy ; extra == 'public-py' - coptpy ; extra == 'public-py' - xpress ; extra == 'public-py' - cplex ; (python_full_version < '3.12' and extra == 'public-py') or (sys_platform != 'darwin' and extra == 'public-py') - - highspy ; extra == 'highs' + - highspy==1.13 ; extra == 'highs' - pyscipopt ; extra == 'scip' - gurobipy ; extra == 'gurobi' - xpress ; extra == 'xpress' @@ -8271,1702 +8468,836 @@ packages: - cplex ; (python_full_version < '3.12' and extra == 'cplex') or (sys_platform != 'darwin' and extra == 'cplex') - mosek ; extra == 'mosek' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl - name: pydantic - version: 2.12.5 - sha256: e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d - requires_dist: - - annotated-types>=0.6.0 - - pydantic-core==2.41.5 - - typing-extensions>=4.14.1 - - typing-inspection>=0.4.2 - - email-validator>=2.0.0 ; extra == 'email' - - tzdata ; python_full_version >= '3.9' and sys_platform == 'win32' and extra == 'timezone' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - name: pydantic-core - version: 2.41.5 - sha256: 0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0 +- pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + name: gitdb + version: 4.0.12 + sha256: 67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf requires_dist: - - typing-extensions>=4.14.1 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl - name: pydantic-core - version: 2.41.5 - sha256: 941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9 + - smmap>=3.0.1,<6 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl + name: requests + version: 2.34.2 + sha256: 2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 requires_dist: - - typing-extensions>=4.14.1 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl - name: pydantic-core - version: 2.41.5 - sha256: 112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34 + - charset-normalizer>=2,<4 + - idna>=2.5,<4 + - urllib3>=1.26,<3 + - certifi>=2023.5.7 + - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' + - chardet>=3.0.2,<8 ; extra == 'use-chardet-on-py3' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/a1/df/2e4be347ff98281b505cc0ccf141408cdd25eb5ca9f3830deb361b2472d3/slack_sdk-3.41.0-py2.py3-none-any.whl + name: slack-sdk + version: 3.41.0 + sha256: bb18dcdfff1413ec448e759cf807ec3324090993d8ab9111c74081623b692a89 requires_dist: - - typing-extensions>=4.14.1 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: pydantic-core - version: 2.41.5 - sha256: 406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586 + - aiodns>1.0 ; extra == 'optional' + - aiohttp>=3.7.3,<4 ; extra == 'optional' + - boto3<=2 ; extra == 'optional' + - sqlalchemy>=1.4,<3 ; extra == 'optional' + - websockets>=9.1,<16 ; extra == 'optional' + - websocket-client>=1,<2 ; extra == 'optional' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/a2/bc/3494270da80811d08bcfa247404292428c4fe16294932bce5593f215cad9/sqlalchemy-2.0.49-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + name: sqlalchemy + version: 2.0.49 + sha256: 8e20e511dc15265fb433571391ba313e10dd8ea7e509d51686a51313b4ac01a2 requires_dist: - - typing-extensions>=4.14.1 + - importlib-metadata ; python_full_version < '3.8' + - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' + - typing-extensions>=4.6.0 + - greenlet>=1 ; extra == 'asyncio' + - mypy>=0.910 ; extra == 'mypy' + - pyodbc ; extra == 'mssql' + - pymssql ; extra == 'mssql-pymssql' + - pyodbc ; extra == 'mssql-pyodbc' + - mysqlclient>=1.4.0 ; extra == 'mysql' + - mysql-connector-python ; extra == 'mysql-connector' + - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector' + - cx-oracle>=8 ; extra == 'oracle' + - oracledb>=1.0.1 ; extra == 'oracle-oracledb' + - psycopg2>=2.7 ; extra == 'postgresql' + - pg8000>=1.29.1 ; extra == 'postgresql-pg8000' + - greenlet>=1 ; extra == 'postgresql-asyncpg' + - asyncpg ; extra == 'postgresql-asyncpg' + - psycopg2-binary ; extra == 'postgresql-psycopg2binary' + - psycopg2cffi ; extra == 'postgresql-psycopg2cffi' + - psycopg>=3.0.7 ; extra == 'postgresql-psycopg' + - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary' + - pymysql ; extra == 'pymysql' + - greenlet>=1 ; extra == 'aiomysql' + - aiomysql>=0.2.0 ; extra == 'aiomysql' + - greenlet>=1 ; extra == 'aioodbc' + - aioodbc ; extra == 'aioodbc' + - greenlet>=1 ; extra == 'asyncmy' + - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy' + - greenlet>=1 ; extra == 'aiosqlite' + - aiosqlite ; extra == 'aiosqlite' + - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite' + - sqlcipher3-binary ; extra == 'sqlcipher' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: markupsafe + version: 3.0.3 + sha256: ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - name: pygments - version: 2.19.2 - sha256: 86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b +- pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl + name: nbformat + version: 5.10.4 + sha256: 3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b requires_dist: - - colorama>=0.4.6 ; extra == 'windows-terminal' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/1f/2f/4708f52028610af96fa82e3ef46bcf96a35f1bd3c38aa6f015b31b578fff/pysam-0.23.3-cp313-cp313-macosx_11_0_arm64.whl - name: pysam - version: 0.23.3 - sha256: 2b6f6891684213e89ee679c5ac786b4e845e7d39d24f6ea0e4d8ed8be9c34f48 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/3f/60/2c8574f13f5a9c07cc14f5b48f70591fcd1ccb50dd59ad9784d48ed31db4/pysam-0.23.3-cp313-cp313-manylinux_2_28_x86_64.whl - name: pysam - version: 0.23.3 - sha256: b721ae4c9118e0c27e1500be278c3b62022c886eeb913ecabc0463fdf98da38f + - fastjsonschema>=2.15 + - jsonschema>=2.6 + - jupyter-core>=4.12,!=5.0.* + - traitlets>=5.1 + - myst-parser ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinxcontrib-github-alt ; extra == 'docs' + - sphinxcontrib-spelling ; extra == 'docs' + - pep440 ; extra == 'test' + - pre-commit ; extra == 'test' + - pytest ; extra == 'test' + - testpath ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/88/87/55cabf614bcc96f4a548ab4cf5fe465dd562d193f4f4cd5246cc0a1a18ab/pysam-0.23.3-cp313-cp313-macosx_10_13_x86_64.whl - name: pysam - version: 0.23.3 - sha256: 2d3177c5b3e102bde297f86e079d23fa385ac88f16c4252502079ef368056d55 +- pypi: https://files.pythonhosted.org/packages/ad/c5/2455f7b26a7de342049bcc1c207852155229cb7dacbcd377817caba91655/snakemake-9.21.0-py3-none-any.whl + name: snakemake + version: 9.21.0 + sha256: 2250e656d28f8cf38f1218cc547fd48fa4c7a20ab2bd47a59346c624b7256793 + requires_dist: + - platformdirs + - immutables + - configargparse + - connection-pool>=0.0.3 + - docutils + - gitpython + - humanfriendly + - jinja2>=3.0,<4.0 + - jsonschema + - nbformat + - packaging>=24.0,<26 + - psutil + - pulp>=2.3.1,<3.4 + - pyyaml + - referencing + - requests>=2.8.1,<3.0 + - tenacity>=9.1.4,<10.0 + - smart-open>=4.0,<8.0 + - snakemake-interface-executor-plugins>=9.3.2,<10.0 + - snakemake-interface-common>=1.20.1,<2.0 + - snakemake-interface-storage-plugins>=4.4.1,<5.0 + - snakemake-interface-report-plugins>=1.2.0,<2.0.0 + - snakemake-interface-logger-plugins>=1.1.0,<3.0.0 + - snakemake-interface-scheduler-plugins>=2.0.0,<3.0.0 + - tabulate + - throttler + - wrapt + - yte>=1.5.5,<2.0 + - dpath>=2.1.6,<3.0.0 + - conda-inject>=1.3.1,<2.0 + - sqlmodel>=0.0.37,<0.0.38 + - eido ; extra == 'pep' + - peppy ; extra == 'pep' + - pygments ; extra == 'reports' + - eido ; extra == 'all' + - peppy ; extra == 'all' + - pygments ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl + name: click + version: 8.3.3 + sha256: a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613 + requires_dist: + - colorama ; sys_platform == 'win32' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ae/81/81755f50eb2478eaf2049728491d4ea4f416c1eb013338682173259efa09/sqlalchemy-2.0.49-cp313-cp313-macosx_11_0_arm64.whl + name: sqlalchemy + version: 2.0.49 + sha256: df2d441bacf97022e81ad047e1597552eb3f83ca8a8f1a1fdd43cd7fe3898120 + requires_dist: + - importlib-metadata ; python_full_version < '3.8' + - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' + - typing-extensions>=4.6.0 + - greenlet>=1 ; extra == 'asyncio' + - mypy>=0.910 ; extra == 'mypy' + - pyodbc ; extra == 'mssql' + - pymssql ; extra == 'mssql-pymssql' + - pyodbc ; extra == 'mssql-pyodbc' + - mysqlclient>=1.4.0 ; extra == 'mysql' + - mysql-connector-python ; extra == 'mysql-connector' + - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector' + - cx-oracle>=8 ; extra == 'oracle' + - oracledb>=1.0.1 ; extra == 'oracle-oracledb' + - psycopg2>=2.7 ; extra == 'postgresql' + - pg8000>=1.29.1 ; extra == 'postgresql-pg8000' + - greenlet>=1 ; extra == 'postgresql-asyncpg' + - asyncpg ; extra == 'postgresql-asyncpg' + - psycopg2-binary ; extra == 'postgresql-psycopg2binary' + - psycopg2cffi ; extra == 'postgresql-psycopg2cffi' + - psycopg>=3.0.7 ; extra == 'postgresql-psycopg' + - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary' + - pymysql ; extra == 'pymysql' + - greenlet>=1 ; extra == 'aiomysql' + - aiomysql>=0.2.0 ; extra == 'aiomysql' + - greenlet>=1 ; extra == 'aioodbc' + - aioodbc ; extra == 'aioodbc' + - greenlet>=1 ; extra == 'asyncmy' + - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy' + - greenlet>=1 ; extra == 'aiosqlite' + - aiosqlite ; extra == 'aiosqlite' + - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite' + - sqlcipher3-binary ; extra == 'sqlcipher' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl + name: pyyaml + version: 6.0.3 + sha256: 2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/d9/35/e65f76cfa17d680017bbb61f2a2b3ad34169de5c3747ed4273c194ad13b3/pysam-0.23.3-cp313-cp313-manylinux_2_28_aarch64.whl - name: pysam - version: 0.23.3 - sha256: 735b938b809f0dc19a389cf3cee04fe7a451e21e2b20d3e45fa6bc23016ae21d +- pypi: https://files.pythonhosted.org/packages/b1/e0/d5418def53ae4e05a63075705ff44ed5af5a1a5932627eb2b600c5df1c93/duckdb-1.5.2-cp313-cp313-macosx_11_0_arm64.whl + name: duckdb + version: 1.5.2 + sha256: 98c0535cd6d901f61a5ea3c2e26a1fd28482953d794deb183daf568e3aa5dda6 + requires_dist: + - ipython ; extra == 'all' + - fsspec ; extra == 'all' + - numpy ; extra == 'all' + - pandas ; extra == 'all' + - pyarrow ; extra == 'all' + - adbc-driver-manager ; extra == 'all' + requires_python: '>=3.10.0' +- pypi: https://files.pythonhosted.org/packages/b1/e1/7c8d18e737433f3b5bbe27b56a9072a9fcb36342b48f1bef34b6da1d61f2/sqlmodel-0.0.37-py3-none-any.whl + name: sqlmodel + version: 0.0.37 + sha256: 2137a4045ef3fd66a917a7717ada959a1ceb3630d95e1f6aaab39dd2c0aef278 + requires_dist: + - sqlalchemy>=2.0.14,<2.1.0 + - pydantic>=2.11.0 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + name: mdurl + version: 0.1.2 + sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl + name: argparse-dataclass + version: 2.0.0 + sha256: 3ffc8852a88d9d98d1364b4441a712491320afb91fb56049afd8a51d74bb52d2 requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 - md5: 461219d1a5bd61342293efa2c0c90eac - depends: - - __unix - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pysocks?source=hash-mapping - size: 21085 - timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda - build_number: 100 - sha256: 8a08fe5b7cb5a28aa44e2994d18dbf77f443956990753a4ca8173153ffb6eb56 - md5: 4c875ed0e78c2d407ec55eadffb8cf3d - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.3,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libuuid >=2.41.3,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - purls: [] - size: 37364553 - timestamp: 1770272309861 - python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.12-h4c0d347_100_cp313.conda - build_number: 100 - sha256: a6bdf48a245d70526b4e6a277a4b344ec3f7c787b358e5377d544ac9a303c111 - md5: 732a86d6786402b95e1dc68c32022500 - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-aarch64 >=2.36.1 - - libexpat >=2.7.3,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libuuid >=2.41.3,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - purls: [] - size: 33986700 - timestamp: 1770270924894 - python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.12-h894a449_100_cp313.conda - build_number: 100 - sha256: 9548dcf58cf6045aa4aa1f2f3fa6110115ca616a8d5fa142a24081d2b9d91291 - md5: 99b1fa1fe8a8ab58224969f4568aadca - depends: - - __osx >=10.13 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.3,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - purls: [] - size: 17570178 - timestamp: 1770272361922 - python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda - build_number: 100 - sha256: 9a4f16a64def0853f0a7b6a7beb40d498fd6b09bee10b90c3d6069b664156817 - md5: 179c0f5ae4f22bc3be567298ed0b17b9 - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.3,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - purls: [] - size: 12770674 - timestamp: 1770272314517 - python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 - md5: 5b8d21249ff20967101ffa321cab24e8 - depends: - - python >=3.9 - - six >=1.5 - - python - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/python-dateutil?source=hash-mapping - size: 233310 - timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - build_number: 8 - sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 - md5: 94305520c52a4aa3f6c2b1ff6008d9f8 - constrains: - - python 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 7002 - timestamp: 1752805902938 -- pypi: https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - name: pyyaml - version: 6.0.3 - sha256: ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: pyyaml - version: 6.0.3 - sha256: 0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl - name: pyyaml - version: 6.0.3 - sha256: 2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl - name: pyyaml - version: 6.0.3 - sha256: 8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 - md5: d7d95fc8287ea7bf33e0e7116d2b95ec - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 345073 - timestamp: 1765813471974 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 - md5: 3d49cad61f829f4f0e0611547a9cda12 - depends: - - libgcc >=14 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 357597 - timestamp: 1765815673644 -- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - sha256: 4614af680aa0920e82b953fece85a03007e0719c3399f13d7de64176874b80d5 - md5: eefd65452dfe7cce476a519bece46704 - depends: - - __osx >=10.13 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 317819 - timestamp: 1765813692798 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 - md5: f8381319127120ce51e081dce4865cf4 - depends: - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 313930 - timestamp: 1765813902568 -- pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - name: referencing - version: 0.37.0 - sha256: 381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231 +- pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + name: markdown-it-py + version: 4.2.0 + sha256: 9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a requires_dist: - - attrs>=22.2.0 - - rpds-py>=0.7.0 - - typing-extensions>=4.4.0 ; python_full_version < '3.13' + - mdurl~=0.1 + - psutil ; extra == 'benchmarking' + - pytest ; extra == 'benchmarking' + - pytest-benchmark ; extra == 'benchmarking' + - commonmark~=0.9 ; extra == 'compare' + - markdown~=3.4 ; extra == 'compare' + - mistletoe~=1.0 ; extra == 'compare' + - mistune~=3.0 ; extra == 'compare' + - panflute~=2.3 ; extra == 'compare' + - markdown-it-pyrs ; extra == 'compare' + - linkify-it-py>=1,<3 ; extra == 'linkify' + - mdit-py-plugins>=0.5.0 ; extra == 'plugins' + - gprof2dot ; extra == 'profiling' + - mdit-py-plugins>=0.5.0 ; extra == 'rtd' + - myst-parser ; extra == 'rtd' + - pyyaml ; extra == 'rtd' + - sphinx ; extra == 'rtd' + - sphinx-copybutton ; extra == 'rtd' + - sphinx-design ; extra == 'rtd' + - sphinx-book-theme~=1.0 ; extra == 'rtd' + - jupyter-sphinx ; extra == 'rtd' + - ipykernel ; extra == 'rtd' + - coverage ; extra == 'testing' + - pytest ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-regressions ; extra == 'testing' + - pytest-timeout ; extra == 'testing' + - requests ; extra == 'testing' requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 - md5: c65df89a0b2e321045a9e01d1337b182 - depends: - - python >=3.10 - - certifi >=2017.4.17 - - charset-normalizer >=2,<4 - - idna >=2.5,<4 - - urllib3 >=1.21.1,<3 - - python - constrains: - - chardet >=3.0.2,<6 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/requests?source=compressed-mapping - size: 63602 - timestamp: 1766926974520 -- pypi: https://files.pythonhosted.org/packages/66/11/e295e07d4ae500144177f875a8de11daa4d86b8246ab41c76a98ce9280ca/reretry-0.11.8-py2.py3-none-any.whl - name: reretry - version: 0.11.8 - sha256: 5ec1084cd9644271ee386d34cd5dd24bdb3e91d55961b076d1a31d585ad68a79 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl - name: rich - version: 14.3.3 - sha256: 793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d +- pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + name: psutil + version: 7.2.2 + sha256: 076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9 requires_dist: - - ipywidgets>=7.5.1,<9 ; extra == 'jupyter' - - markdown-it-py>=2.2.0 - - pygments>=2.13.0,<3.0.0 - requires_python: '>=3.8.0' -- pypi: https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - name: rpds-py - version: 0.30.0 - sha256: 2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4 + - psleak ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-instafail ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - setuptools ; extra == 'dev' + - abi3audit ; extra == 'dev' + - black ; extra == 'dev' + - check-manifest ; extra == 'dev' + - coverage ; extra == 'dev' + - packaging ; extra == 'dev' + - pylint ; extra == 'dev' + - pyperf ; extra == 'dev' + - pypinfo ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - requests ; extra == 'dev' + - rstcheck ; extra == 'dev' + - ruff ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-rtd-theme ; extra == 'dev' + - toml-sort ; extra == 'dev' + - twine ; extra == 'dev' + - validate-pyproject[all] ; extra == 'dev' + - virtualenv ; extra == 'dev' + - vulture ; extra == 'dev' + - wheel ; extra == 'dev' + - colorama ; os_name == 'nt' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - psleak ; extra == 'test' + - pytest ; extra == 'test' + - pytest-instafail ; extra == 'test' + - pytest-xdist ; extra == 'test' + - setuptools ; extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/b6/49/1f72d8c05d8588f06a61f1af3deb125a4ff8169d2a41f1b839d62c824d1c/snakemake_interface_storage_plugins-4.4.1-py3-none-any.whl + name: snakemake-interface-storage-plugins + version: 4.4.1 + sha256: 6e075f448543cc3d0cb1ee5e6e5a83af9761e7085f3ce0922011685d098f231e + requires_dist: + - humanfriendly>=10.0,<11 + - snakemake-interface-common>=1.12.0 + - tenacity>=9.1.4,<10.0 + - throttler>=1.2.2 + - wrapt>=1.15.0 requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + name: six + version: 1.17.0 + sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' - pypi: https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: rpds-py version: 0.30.0 sha256: 9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6 requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl - name: rpds-py - version: 0.30.0 - sha256: f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2 +- pypi: https://files.pythonhosted.org/packages/bd/21/d903cc63a5140c822b7b62b373a87dc557e60c29b321dfb435061c5e67cf/duckdb-1.5.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + name: duckdb + version: 1.5.2 + sha256: 70631c847ca918ee710ec874241b00cf9d2e5be90762cbb2a0389f17823c08f7 + requires_dist: + - ipython ; extra == 'all' + - fsspec ; extra == 'all' + - numpy ; extra == 'all' + - pandas ; extra == 'all' + - pyarrow ; extra == 'all' + - adbc-driver-manager ; extra == 'all' + requires_python: '>=3.10.0' +- pypi: https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz + name: connection-pool + version: 0.0.3 + sha256: bf429e7aef65921c69b4ed48f3d48d3eac1383b05d2df91884705842d974d0dc +- pypi: https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl + name: charset-normalizer + version: 3.4.7 + sha256: f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl + name: numpy + version: 2.4.4 + sha256: e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl + name: pydantic-core + version: 2.46.4 + sha256: c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl + name: smmap + version: 5.0.3 + sha256: c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/c4/ea/066ce356c5df3c2d42b72801f768d41bf691f58f6d2a90f6334fbed39785/pysam-0.24.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: pysam + version: 0.24.0 + sha256: 1448b3100f79bd00830c586a256ea21b1f701d937f5ad4318adffdb5b2933478 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl + name: pandas + version: 3.0.3 + sha256: 67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; extra == 'sql-other' + - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' + - beautifulsoup4>=4.12.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2020.1 ; extra == 'timezone' + - adbc-driver-postgresql>=1.2.0 ; extra == 'all' + - adbc-driver-sqlite>=1.2.0 ; extra == 'all' + - beautifulsoup4>=4.12.3 ; extra == 'all' + - bottleneck>=1.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2020.1 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/c6/3e/48599a38009ca60ff82a6f38c8a621ce3c0286aa7397c7d79e741bd9060e/polars_runtime_32-1.40.1-cp310-abi3-macosx_11_0_arm64.whl + name: polars-runtime-32 + version: 1.40.1 + sha256: d249b3743e05986060cec0a7aaa542d020df6c6b876e556023a310efd581f9be requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl - name: rpds-py - version: 0.30.0 - sha256: e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8 +- pypi: https://files.pythonhosted.org/packages/cb/98/6af411189d9413534c3eb691182bff1f5c6d44ed2f93f2edfe52a1bbceb8/more_itertools-11.0.2-py3-none-any.whl + name: more-itertools + version: 11.0.2 + sha256: 6e35b35f818b01f691643c6c611bc0902f2e92b46c18fffa77ae1e7c46e912e4 requires_python: '>=3.10' -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/rpsbproc-0.5.1-h7645e38_0.conda - sha256: 277aa2f124627062c768367ce9b73c0d27c6f0481518ad0339276d4e48d69c45 - md5: 52d43ad51789a1b1b25c7684829bc85c - depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=13 - - libsqlite >=3.51.2,<4.0a0 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - license: Public Domain - purls: [] - size: 5897387 - timestamp: 1769077825923 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/rpsbproc-0.5.1-hf8bb5b5_0.conda - sha256: c21fa5d3126918e83cc60acff94c2c57bd8f8c640bf44083012e3fa6fb3132a5 - md5: 48fe2982f2d5d721008d7d2c670b377b - depends: - - bzip2 >=1.0.8,<2.0a0 - - libcxx >=18 - - libsqlite >=3.51.2,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - license: Public Domain - purls: [] - size: 4227660 - timestamp: 1769076585440 -- conda: https://conda.anaconda.org/bioconda/linux-64/samtools-1.23-h96c455f_0.conda - sha256: baf3fcf005aac25034ec33debc40946b618b72c9e1da5287b1d468317c0da570 - md5: f5426f4f0024640896a5582a5e75f285 - depends: - - htslib >=1.23,<1.24.0a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - license: MIT - size: 488688 - timestamp: 1765917481431 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/samtools-1.23-h0b41a95_0.conda - sha256: b1122e35559fc19695d2abc1c184d68524526a185c341d1268908263823318c6 - md5: a9b08b434a2c71b611139de3e2d2d66f - depends: - - htslib >=1.23,<1.24.0a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - license: MIT - size: 541233 - timestamp: 1765917531100 -- conda: https://conda.anaconda.org/bioconda/osx-64/samtools-1.23-ha21ef43_0.conda - sha256: a0c80bc0dba393ae5da1f85d767012836579abbb9553ebbcbf7089db39b9f2b2 - md5: 0da4b924b988ffad44f5d8f56c0b2380 - depends: - - htslib >=1.23,<1.24.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - license: MIT - size: 475583 - timestamp: 1765918544006 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/samtools-1.23-h267f7b9_0.conda - sha256: e8e1752b65d037cb2da8c55c78ff5df8274c4fc4c16b53c866de37318269ddff - md5: acad57bbe191969152060051cc342f96 - depends: - - htslib >=1.23,<1.24.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - license: MIT - size: 446942 - timestamp: 1765917344142 -- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py313h4b8bb8b_1.conda - sha256: e812ebe8115f8daf005f5788ed8f05a0fdabe47eeb4c30bf0a190f2d1d1da0b6 - md5: 2b18fe5b4b2d1611ddf8c2f080a46563 - depends: - - __glibc >=2.17,<3.0.a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=14 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=1.25.2 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - size: 16857028 - timestamp: 1768801011489 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.17.0-py313he1a02db_1.conda - sha256: d214f18629dc9392869accc0794b895427580f017358c4788baddac319852cb0 - md5: 4d34c60874fbde07560248bb114da349 - depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=14 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=1.25.2 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - size: 16391026 - timestamp: 1768801135680 -- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.17.0-py313h2bd7e7a_1.conda - sha256: c30ec7d0e2571f6f2ddaddf3eb64e0e2e16e58c0a4f724f2ee2b894e0ce1a8e4 - md5: 076afc646e5b800ab4adece0310795db - depends: - - __osx >=10.13 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=19 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=1.25.2 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - size: 15299524 - timestamp: 1768800867425 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.0-py313hc753a45_1.conda - sha256: 2ea17fc46533e8789881732f42265e32c7ae376344cc3d53683e7b2179d947bb - md5: 5b73b1e6d191aac48960c50d65372f19 - depends: - - __osx >=11.0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=19 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=1.25.2 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=compressed-mapping - size: 13888560 - timestamp: 1768801587965 -- conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - sha256: 7e7e2556978bc9bd9628c6e39138c684082320014d708fbca0c9050df98c0968 - md5: 68a978f77c0ba6ca10ce55e188a21857 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 4948 - timestamp: 1771434185960 -- conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - sha256: fabfe031ede99898cb2b0b805f6c0d64fcc24ecdb444de3a83002d8135bf4804 - md5: 5f0ebbfea12d8e5bddff157e271fdb2f - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 4971 - timestamp: 1771434195389 -- conda: https://conda.anaconda.org/bioconda/linux-64/seqkit-2.12.0-he881be0_1.conda - sha256: 447200218444d57d8a63cd0e2432e2eb5b22f5cf90cede94c31d19cfdc2b3129 - md5: f4aaad7eb59f508aca96c808304e2172 - license: MIT - license_family: MIT - purls: [] - size: 6833789 - timestamp: 1766200236530 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/seqkit-2.12.0-h8865c2f_1.conda - sha256: cdfae0280a9720931d121b204ea16572a2a0711375d8bc8ffac09334c36fcaa7 - md5: b66ad9a004372718ad1833206c987c2e - license: MIT - license_family: MIT - purls: [] - size: 6273975 - timestamp: 1766200289312 -- conda: https://conda.anaconda.org/bioconda/osx-64/seqkit-2.12.0-h193322a_1.conda - sha256: 006fae82393fb16cf88a69c581b8e8789949c8c396f180cc753eb1a5dca32de2 - md5: cfea80c0d0b25d0c7f40497c0973bdc2 - constrains: - - __osx>=10.12 - license: MIT - license_family: MIT - purls: [] - size: 6681735 - timestamp: 1766201928324 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/seqkit-2.12.0-hd5f1084_1.conda - sha256: b96adcd68bd0a0d30182b90acb7ca75d4dbe927dc6bb2dbd96fd74748f91370f - md5: 649a3ae1cd2a9aca179d7f80a7f86691 - license: MIT - license_family: MIT - purls: [] - size: 6271292 - timestamp: 1766200072050 -- pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - name: shellingham - version: 1.5.4 - sha256: 7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - sha256: b89d89d0b62e0a84093205607d071932cca228d4d6982a5b073eec7e765b146d - md5: 1261fc730f1d8af7eeea8a0024b23493 - depends: - - __osx >=10.13 - - libsigtool 0.1.3 hc0f2934_0 - - openssl >=3.5.4,<4.0a0 - license: MIT - license_family: MIT - purls: [] - size: 123083 - timestamp: 1767045007433 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - sha256: f3d006e2441f110160a684744d90921bbedbffa247d7599d7e76b5cd048116dc - md5: ade77ad7513177297b1d75e351e136ce - depends: - - __osx >=11.0 - - libsigtool 0.1.3 h98dc951_0 - - openssl >=3.5.4,<4.0a0 - license: MIT - license_family: MIT - purls: [] - size: 114331 - timestamp: 1767045086274 -- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d - md5: 3339e3b65d58accf4ca4fb8748ab16b3 - depends: - - python >=3.9 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/six?source=hash-mapping - size: 18455 - timestamp: 1753199211006 -- pypi: https://files.pythonhosted.org/packages/6e/e1/bb81f93c9f403e3b573c429dd4838ec9b44e4ef35f3b0759eb49557ab6e3/slack_sdk-3.40.1-py2.py3-none-any.whl - name: slack-sdk - version: 3.40.1 - sha256: cd8902252979aa248092b0d77f3a9ea3cc605bc5d53663ad728e892e26e14a65 +- pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl + name: fastjsonschema + version: 2.21.2 + sha256: 1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463 requires_dist: - - aiodns>1.0 ; extra == 'optional' - - aiohttp>=3.7.3,<4 ; extra == 'optional' - - boto3<=2 ; extra == 'optional' - - sqlalchemy>=1.4,<3 ; extra == 'optional' - - websockets>=9.1,<16 ; extra == 'optional' - - websocket-client>=1,<2 ; extra == 'optional' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/ad/95/bc978be7ea0babf2fb48a414b6afaad414c6a9e8b1eafc5b8a53c030381a/smart_open-7.5.0-py3-none-any.whl - name: smart-open - version: 7.5.0 - sha256: 87e695c5148bbb988f15cec00971602765874163be85acb1c9fb8abc012e6599 + - colorama ; extra == 'devel' + - jsonschema ; extra == 'devel' + - json-spec ; extra == 'devel' + - pylint ; extra == 'devel' + - pytest ; extra == 'devel' + - pytest-benchmark ; extra == 'devel' + - pytest-cache ; extra == 'devel' + - validictory ; extra == 'devel' +- pypi: https://files.pythonhosted.org/packages/cd/f5/038741f5e747a5f6ea3e72487211579d8cbea5eb9827a9cbd61d0108c4bd/sqlalchemy-2.0.49-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: sqlalchemy + version: 2.0.49 + sha256: 47604cb2159f8bbd5a1ab48a714557156320f20871ee64d550d8bf2683d980d3 requires_dist: - - wrapt - - boto3>=1.9.17 ; extra == 's3' - - google-cloud-storage>=2.6.0 ; extra == 'gcs' - - google-api-core<2.28 ; python_full_version < '3.10' and extra == 'gcs' - - azure-storage-blob ; extra == 'azure' - - azure-common ; extra == 'azure' - - azure-core ; extra == 'azure' - - requests ; extra == 'http' - - requests ; extra == 'webhdfs' - - paramiko ; extra == 'ssh' - - backports-zstd>=1.0.0 ; python_full_version < '3.14' and extra == 'zst' - - smart-open[azure,gcs,http,s3,ssh,webhdfs,zst] ; extra == 'all' - - smart-open[all] ; extra == 'test' - - moto[server] ; extra == 'test' - - responses ; extra == 'test' - - pytest ; extra == 'test' - - pytest-rerunfailures ; extra == 'test' - - pytest-benchmark ; extra == 'test' - - pytest-timeout ; extra == 'test' - - pytest-xdist[psutil] ; extra == 'test' - - awscli ; extra == 'test' - - pyopenssl ; extra == 'test' - - numpy ; extra == 'test' - - flake8 ; extra == 'test' - requires_python: '>=3.9,<4.0' -- pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - name: smmap - version: 5.0.2 - sha256: b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e + - importlib-metadata ; python_full_version < '3.8' + - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' + - typing-extensions>=4.6.0 + - greenlet>=1 ; extra == 'asyncio' + - mypy>=0.910 ; extra == 'mypy' + - pyodbc ; extra == 'mssql' + - pymssql ; extra == 'mssql-pymssql' + - pyodbc ; extra == 'mssql-pyodbc' + - mysqlclient>=1.4.0 ; extra == 'mysql' + - mysql-connector-python ; extra == 'mysql-connector' + - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector' + - cx-oracle>=8 ; extra == 'oracle' + - oracledb>=1.0.1 ; extra == 'oracle-oracledb' + - psycopg2>=2.7 ; extra == 'postgresql' + - pg8000>=1.29.1 ; extra == 'postgresql-pg8000' + - greenlet>=1 ; extra == 'postgresql-asyncpg' + - asyncpg ; extra == 'postgresql-asyncpg' + - psycopg2-binary ; extra == 'postgresql-psycopg2binary' + - psycopg2cffi ; extra == 'postgresql-psycopg2cffi' + - psycopg>=3.0.7 ; extra == 'postgresql-psycopg' + - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary' + - pymysql ; extra == 'pymysql' + - greenlet>=1 ; extra == 'aiomysql' + - aiomysql>=0.2.0 ; extra == 'aiomysql' + - greenlet>=1 ; extra == 'aioodbc' + - aioodbc ; extra == 'aioodbc' + - greenlet>=1 ; extra == 'asyncmy' + - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy' + - greenlet>=1 ; extra == 'aiosqlite' + - aiosqlite ; extra == 'aiosqlite' + - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite' + - sqlcipher3-binary ; extra == 'sqlcipher' requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/2b/0c/adf4310b15ebcbbbe36d316808d48142424f904422fef1fecca3d6e76c8a/snakemake-9.16.3-py3-none-any.whl - name: snakemake - version: 9.16.3 - sha256: 42f9b74446794750a333fbaeb977fddf561ec7b3abd00839c44ab97c630781e3 - requires_dist: - - appdirs - - immutables - - configargparse - - connection-pool>=0.0.3 - - docutils - - gitpython - - humanfriendly - - jinja2>=3.0,<4.0 - - jsonschema - - nbformat - - packaging>=24.0,<26 - - psutil - - pulp>=2.3.1,<3.4 - - pyyaml - - referencing - - requests>=2.8.1,<3.0 - - reretry - - smart-open>=4.0,<8.0 - - snakemake-interface-executor-plugins>=9.3.2,<10.0 - - snakemake-interface-common>=1.20.1,<2.0 - - snakemake-interface-storage-plugins>=4.3.2,<5.0 - - snakemake-interface-report-plugins>=1.2.0,<2.0.0 - - snakemake-interface-logger-plugins>=1.1.0,<3.0.0 - - snakemake-interface-scheduler-plugins>=2.0.0,<3.0.0 - - tabulate - - throttler - - wrapt - - yte>=1.5.5,<2.0 - - dpath>=2.1.6,<3.0.0 - - conda-inject>=1.3.1,<2.0 - - eido ; extra == 'pep' - - peppy ; extra == 'pep' - - pygments ; extra == 'reports' - - eido ; extra == 'all' - - peppy ; extra == 'all' - - pygments ; extra == 'all' +- pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: 8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/d1/2c/fd59b47677a1df3efa64172dcd9b99fa7db437de8c663f08120ebd4db835/pysam-0.24.0-cp313-cp313-macosx_11_0_arm64.whl + name: pysam + version: 0.24.0 + sha256: b9445a4c3be5ed4b60202690af3890a444452276372e3abb58564308cc6d5a45 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: numpy + version: 2.4.4 + sha256: c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83 requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/0f/c4/2da11760cebae7cfc66304ce5dccbabf9f1323e3e0ab8091960b84ad2bd6/snakemake_interface_common-1.22.0-py3-none-any.whl - name: snakemake-interface-common - version: 1.22.0 - sha256: a68c57cba8569536195fc9b7db07bc2a91b56ad811636585dae0313b2ca2e1ce +- pypi: https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl + name: idna + version: '3.15' + sha256: 048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8 requires_dist: - - argparse-dataclass>=2.0.0 - - configargparse>=1.7 - - packaging>=24.0,<26.0 + - ruff>=0.6.2 ; extra == 'all' + - mypy>=1.11.2 ; extra == 'all' + - pytest>=8.3.2 ; extra == 'all' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/7a/8b/fec4419acedfa5924549f40664cb2134f2ea5fae3d8a39df5e24035df06a/snakemake_interface_executor_plugins-9.3.9-py3-none-any.whl - name: snakemake-interface-executor-plugins - version: 9.3.9 - sha256: bae310d5e258d5504731cca69d73051cd5ae1702d46fa66c03ef947be27fe09a - requires_dist: - - argparse-dataclass>=2.0.0 - - snakemake-interface-common>=1.19.0 - - throttler>=1.2.2 - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/c3/1f/f0848d750e7ca675e2cc0ea5e14135f432db498e8ad8cf746a19108e9d55/snakemake_interface_logger_plugins-2.0.0-py3-none-any.whl - name: snakemake-interface-logger-plugins - version: 2.0.0 - sha256: c06a6779528a60f0362049c3adfb558e64d071769691718c810ef3057fdb9ff3 +- pypi: https://files.pythonhosted.org/packages/d2/d0/a5fb7c164ddb298ec37537e618b70dfa30c7cae9fac01de374c36489cbc9/immutables-0.21-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + name: immutables + version: '0.21' + sha256: 583d2a63e444ce1538cc2bda56ae1f4a1a11473dbc0377c82b516bc7eec3b81e requires_dist: - - snakemake-interface-common>=1.17.4 - requires_python: '>=3.11,<4.0' -- pypi: https://files.pythonhosted.org/packages/f0/f0/df73f6abc9b5910e43612ae28c7b6f666af80c4edd46a216ef47599ab6cb/snakemake_interface_report_plugins-1.3.0-py3-none-any.whl - name: snakemake-interface-report-plugins - version: 1.3.0 - sha256: 78da3931f70e79eef51e5645a40b172929e555fe4d86ff45d6b856e521a379db + - flake8~=5.0 ; extra == 'test' + - pycodestyle~=2.9 ; extra == 'test' + - mypy~=1.4 ; extra == 'test' + - pytest~=7.4 ; extra == 'test' + requires_python: '>=3.8.0' +- pypi: https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl + name: tenacity + version: 9.1.4 + sha256: 6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55 requires_dist: - - snakemake-interface-common>=1.16.0,<2.0.0 - requires_python: '>=3.11,<4.0' -- pypi: https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl - name: snakemake-interface-scheduler-plugins - version: 2.0.2 - sha256: b9ddfa508bd480711de1770dfb24f3b813cfa3cd0f862f0127ef721ae5346915 + - reno ; extra == 'doc' + - sphinx ; extra == 'doc' + - pytest ; extra == 'test' + - tornado>=4.5 ; extra == 'test' + - typeguard ; extra == 'test' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl + name: traitlets + version: 5.15.0 + sha256: fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40 requires_dist: - - snakemake-interface-common>=1.20.1,<2.0 - requires_python: '>=3.11,<4.0' -- pypi: https://files.pythonhosted.org/packages/74/20/08a4f00c32329544ff147bafa68d0bab53645dca64dae218ff861bb4187d/snakemake_interface_storage_plugins-4.3.3-py3-none-any.whl - name: snakemake-interface-storage-plugins - version: 4.3.3 - sha256: 6ebaad6f6f7024cbd85c2ab3cc764db69456216212b6afb10954f1e0ed8d3bfe + - myst-parser ; extra == 'docs' + - pydata-sphinx-theme ; extra == 'docs' + - sphinx ; extra == 'docs' + - argcomplete>=3.0.3 ; extra == 'test' + - mypy>=1.7.0,<1.19 ; platform_python_implementation == 'PyPy' and extra == 'test' + - mypy>=1.7.0 ; extra == 'test' + - pre-commit ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-mypy-testing ; extra == 'test' + - pytest>=7.0,<8.2 ; extra == 'test' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + name: typing-inspection + version: 0.4.2 + sha256: 4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 requires_dist: - - humanfriendly>=10.0,<11 - - reretry>=0.11.8 - - snakemake-interface-common>=1.12.0 - - throttler>=1.2.2 - - wrapt>=1.15.0 - requires_python: '>=3.11' -- conda: https://conda.anaconda.org/bioconda/linux-64/spades-4.2.0-h8d6e82b_2.conda - sha256: 77fecca55d456af662bdfe9981906576aed5e270e463d48150ff57b412d01ffe - md5: a3ecf0ab04ac28f12813e065a8e60909 - depends: - - _openmp_mutex >=4.5 - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=13 - - libgomp - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openmpi >=4.1.6,<5.0a0 - - python >=3.8 - license: GPL-2.0-only - license_family: GPL - size: 19327462 - timestamp: 1758931918693 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/spades-4.2.0-h3e01217_2.conda - sha256: dacc35267b9c31350739e521fdaf6f2805436569b04214b910e9386476020849 - md5: bee299b02e8be21d0dcd74e49753fd72 - depends: - - _openmp_mutex >=4.5 - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=13 - - libgomp - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openmpi >=4.1.6,<5.0a0 - - python >=3.8 - license: GPL-2.0-only - license_family: GPL - purls: [] - size: 35259065 - timestamp: 1758931426837 -- conda: https://conda.anaconda.org/bioconda/osx-64/spades-4.2.0-hf6bce26_2.conda - sha256: c612be396c8649eadbe4d1088e07d8ff5bc9afb2abc3941edfc7f2f2e5ca38e5 - md5: b5e75c46829f141a317c4a2c26096660 - depends: - - bzip2 >=1.0.8,<2.0a0 - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 - - llvm-openmp >=18.1.8 - - openmpi >=4.1.6,<5.0a0 - - python >=3.8 - license: GPL-2.0-only - license_family: GPL - purls: [] - size: 22850116 - timestamp: 1758933785330 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/spades-4.2.0-h4d841d5_2.conda - sha256: 5c18b6564ff3b47d02a40b16f9eb73fca64b2d0dab77a917b7ddb9615d614af0 - md5: 813a993f2486f38f9027ecd821a18ca8 - depends: - - bzip2 >=1.0.8,<2.0a0 - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 - - llvm-openmp >=18.1.8 - - openmpi >=4.1.6,<5.0a0 - - python >=3.8 - license: GPL-2.0-only - license_family: GPL - purls: [] - size: 21925186 - timestamp: 1758931207633 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda - sha256: ccce47d8fe3a817eac5b95f34ca0fcb12423b0c7c5eee249ffb32ac8013e9692 - md5: bb88d9335d09e54c7e6b5529d1856917 - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 - - libgcc >=14 - - libsqlite 3.51.2 hf4e2dac_0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - readline >=8.3,<9.0a0 - license: blessing - purls: [] - size: 183298 - timestamp: 1768147986603 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.51.2-hf1c7be2_0.conda - sha256: e5fdff1edc8a04690b03c8a42233e6b1eedfb2700fd5cec77ea81b143c59d21d - md5: ee42a18aa659cf9e9c3169d614cfeb32 - depends: - - icu >=78.2,<79.0a0 - - libgcc >=14 - - libsqlite 3.51.2 h10b116e_0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - readline >=8.3,<9.0a0 - license: blessing - purls: [] - size: 189123 - timestamp: 1768148001230 -- conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.2-h5af3ad2_0.conda - sha256: 89fde12f2a5e58edb9bd1497558a77df9c090878971559bcf0c8513e0966795e - md5: 9eef7504045dd9eb1be950b2f934d542 - depends: - - __osx >=10.13 - - libsqlite 3.51.2 hb99441e_0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - readline >=8.3,<9.0a0 - license: blessing - purls: [] - size: 174119 - timestamp: 1768148271396 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.51.2-h77b7338_0.conda - sha256: a13c798ad921da0c84c441c390ace3b53e5c40fe6b11d00e07641d985021c4d1 - md5: 93796186d49d0b09243fb5a8f83e53b6 - depends: - - __osx >=11.0 - - icu >=78.2,<79.0a0 - - libsqlite 3.51.2 h1ae2325_0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - readline >=8.3,<9.0a0 - license: blessing - purls: [] - size: 165840 - timestamp: 1768148351309 -- conda: https://conda.anaconda.org/conda-forge/linux-64/squashfs-tools-4.7.4-hb4e62d2_0.conda - sha256: 0bea6da3e2309b25d49f1fce3557dc6d961ada83b55fba791054370cbc169590 - md5: 92b446e7c169dbcc57945dd4b2d76c49 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - lzo >=2.10,<3.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: GPL-2.0-or-later - license_family: GPL - purls: [] - size: 255602 - timestamp: 1764337666455 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/squashfs-tools-4.7.4-hc071bb0_0.conda - sha256: b2422cd4452a6d2492243ebbb3b6a9d3e4c20c9feebe7c0d7bed13322eab58ac - md5: b4b1f9c63e414ca29914962235907a33 - depends: - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - lzo >=2.10,<3.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: GPL-2.0-or-later - license_family: GPL - purls: [] - size: 264542 - timestamp: 1764337680697 -- conda: https://conda.anaconda.org/conda-forge/linux-64/squashfuse-0.6.1-hb8971b7_1.conda - sha256: 44e9cba06e0fdce1520891f0bda7691e1f41ab221e5773016e45cb0dda21a47d - md5: b900adfc16e5367aa80929e66809aff2 - depends: - - __glibc >=2.17,<3.0.a0 - - libfuse3 >=3.18.0,<4.0a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - lzo >=2.10,<3.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 64133 - timestamp: 1766138155082 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/squashfuse-0.6.1-h46c73cc_1.conda - sha256: 0795996d9c47b8d06563d343671166b5e2ef3404c0f14f465c807cdeaf89d821 - md5: 6da50895dbc892fb7ef91995282f2c06 - depends: - - libfuse3 >=3.18.0,<4.0a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - lzo >=2.10,<3.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 73821 - timestamp: 1766141061115 -- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - sha256: c47299fe37aebb0fcf674b3be588e67e4afb86225be4b0d452c7eb75c086b851 - md5: 13dc3adbc692664cd3beabd216434749 - depends: - - __glibc >=2.28 - - kernel-headers_linux-64 4.18.0 he073ed8_9 - - tzdata - license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later - license_family: GPL - purls: [] - size: 24008591 - timestamp: 1765578833462 -- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - sha256: 1bd2db6b2e451247bab103e4a0128cf6c7595dd72cb26d70f7fadd9edd1d1bc3 - md5: fdf07ab944a222ff28c754914fdb0740 - depends: - - __glibc >=2.28 - - kernel-headers_linux-aarch64 4.18.0 h05a177a_9 - - tzdata - license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later - license_family: GPL - purls: [] - size: 23644746 - timestamp: 1765578629426 -- pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - name: tabulate - version: 0.9.0 - sha256: 024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f + - typing-extensions>=4.12.0 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/df/3e/3c6aa8b2a7e6b791a34407736db32f59657001f0446ada31db73a3e0b7d5/biopython-1.87.tar.gz + name: biopython + version: '1.87' + sha256: 8456c803459b679a9712422e5a7fd9809f2f089bf69bb085f3b077946ac9bdbf requires_dist: - - wcwidth ; extra == 'widechars' + - numpy + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl + name: shellingham + version: 1.5.4 + sha256: 7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_0.conda - sha256: 2602632f7923fd59042a897bfb22f050d78f2b5960d53565eae5fa6a79308caa - md5: aae272355bc3f038e403130a5f6f5495 - depends: - - libcxx >=19.0.0.a0 - - __osx >=10.13 - - ncurses >=6.5,<7.0a0 - license: NCSA - purls: [] - size: 213480 - timestamp: 1762535196805 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda - sha256: dcb678fa77f448fa981bf3783902afe09b8838436f3092e9ecaf6a718c87f642 - md5: 347261d575a245cb6111fb2cb5a79fc7 - depends: - - libcxx >=19.0.0.a0 - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: NCSA - purls: [] - size: 199699 - timestamp: 1762535277608 -- pypi: https://files.pythonhosted.org/packages/84/98/06ba4db905613fa24d227bc81219b7b2e6d48f803eac407d86f2ca54991d/taxopy-0.14.0-py3-none-any.whl - name: taxopy - version: 0.14.0 - sha256: 1dabbd091d0be081462d03d57ad0143c73273897ec2e2dfba53758bd24e65ee5 +- pypi: https://files.pythonhosted.org/packages/e1/66/ef5dda05aa8d4e975f9186b806e18e4ca50ef1d2e2a043313c2d287ea7ca/labkey-4.2.0-py3-none-any.whl + name: labkey + version: 4.2.0 + sha256: 5e01c2fe668066037fbca7ce21a8f7bc76fc10726994b57b666a87e65a707b55 requires_dist: - - rapidfuzz ; extra == 'fuzzy-matching' - requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/66/70/42d8796acc57c8bcd9ae395b1a6a0bbc833f738492a8ed192a44ccd58035/throttler-1.2.3-py3-none-any.whl - name: throttler - version: 1.2.3 - sha256: 241ea3e97438dec4dc2f31ddc56dbd96262787a9b1d0598adfcc0bada1134b66 + - requests>=2.32.5 + - black>=26.1.0 ; extra == 'dev' + - hatch>=1.16.4 ; extra == 'dev' + - mock>=5.2.0 ; extra == 'dev' + - pytest-cov>=7.0.0 ; extra == 'dev' + - pytest>=9.0.2 ; extra == 'dev' + - mock>=5.2.0 ; extra == 'test' + - pytest-cov>=7.0.0 ; extra == 'test' + - pytest>=9.0.2 ; extra == 'test' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/e5/30/8519fdde58a7bdf155b714359791ad1dc018b47d60269d5d160d311fdc36/sqlalchemy-2.0.49-py3-none-any.whl + name: sqlalchemy + version: 2.0.49 + sha256: ec44cfa7ef1a728e88ad41674de50f6db8cfdb3e2af84af86e0041aaf02d43d0 requires_dist: - - aiohttp ; extra == 'dev' - - build ; extra == 'dev' - - codecov ; extra == 'dev' + - importlib-metadata ; python_full_version < '3.8' + - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' + - typing-extensions>=4.6.0 + - greenlet>=1 ; extra == 'asyncio' + - mypy>=0.910 ; extra == 'mypy' + - pyodbc ; extra == 'mssql' + - pymssql ; extra == 'mssql-pymssql' + - pyodbc ; extra == 'mssql-pyodbc' + - mysqlclient>=1.4.0 ; extra == 'mysql' + - mysql-connector-python ; extra == 'mysql-connector' + - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector' + - cx-oracle>=8 ; extra == 'oracle' + - oracledb>=1.0.1 ; extra == 'oracle-oracledb' + - psycopg2>=2.7 ; extra == 'postgresql' + - pg8000>=1.29.1 ; extra == 'postgresql-pg8000' + - greenlet>=1 ; extra == 'postgresql-asyncpg' + - asyncpg ; extra == 'postgresql-asyncpg' + - psycopg2-binary ; extra == 'postgresql-psycopg2binary' + - psycopg2cffi ; extra == 'postgresql-psycopg2cffi' + - psycopg>=3.0.7 ; extra == 'postgresql-psycopg' + - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary' + - pymysql ; extra == 'pymysql' + - greenlet>=1 ; extra == 'aiomysql' + - aiomysql>=0.2.0 ; extra == 'aiomysql' + - greenlet>=1 ; extra == 'aioodbc' + - aioodbc ; extra == 'aioodbc' + - greenlet>=1 ; extra == 'asyncmy' + - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy' + - greenlet>=1 ; extra == 'aiosqlite' + - aiosqlite ; extra == 'aiosqlite' + - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite' + - sqlcipher3-binary ; extra == 'sqlcipher' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + name: psutil + version: 7.2.2 + sha256: ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486 + requires_dist: + - psleak ; extra == 'dev' - pytest ; extra == 'dev' - - pytest-asyncio ; extra == 'dev' + - pytest-instafail ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - setuptools ; extra == 'dev' + - abi3audit ; extra == 'dev' + - black ; extra == 'dev' + - check-manifest ; extra == 'dev' + - coverage ; extra == 'dev' + - packaging ; extra == 'dev' + - pylint ; extra == 'dev' + - pyperf ; extra == 'dev' + - pypinfo ; extra == 'dev' - pytest-cov ; extra == 'dev' + - requests ; extra == 'dev' + - rstcheck ; extra == 'dev' - ruff ; extra == 'dev' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac - md5: cffd3bdd58090148f4cfcd831f4b26ab - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - constrains: - - xorg-libx11 >=1.8.12,<2.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3301196 - timestamp: 1769460227866 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 - md5: 7fc6affb9b01e567d2ef1d05b84aa6ed - depends: - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - constrains: - - xorg-libx11 >=1.8.12,<2.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3368666 - timestamp: 1769464148928 -- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - sha256: 7f0d9c320288532873e2d8486c331ec6d87919c9028208d3f6ac91dc8f99a67b - md5: 6e6efb7463f8cef69dbcb4c2205bf60e - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3282953 - timestamp: 1769460532442 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 - md5: a9d86bc62f39b94c4661716624eb21b0 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3127137 - timestamp: 1769460817696 -- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda - sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 - md5: e5ce43272193b38c2e9037446c1d9206 - depends: - - python >=3.10 - - __unix - - python - license: MPL-2.0 and MIT - purls: - - pkg:pypi/tqdm?source=compressed-mapping - size: 94132 - timestamp: 1770153424136 -- pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - name: traitlets - version: 5.14.3 - sha256: b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f + - sphinx ; extra == 'dev' + - sphinx-rtd-theme ; extra == 'dev' + - toml-sort ; extra == 'dev' + - twine ; extra == 'dev' + - validate-pyproject[all] ; extra == 'dev' + - virtualenv ; extra == 'dev' + - vulture ; extra == 'dev' + - wheel ; extra == 'dev' + - colorama ; os_name == 'nt' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - psleak ; extra == 'test' + - pytest ; extra == 'test' + - pytest-instafail ; extra == 'test' + - pytest-xdist ; extra == 'test' + - setuptools ; extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl + name: jupyter-core + version: 5.9.1 + sha256: ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407 requires_dist: + - platformdirs>=2.5 + - traitlets>=5.3 + - intersphinx-registry ; extra == 'docs' - myst-parser ; extra == 'docs' - pydata-sphinx-theme ; extra == 'docs' - - sphinx ; extra == 'docs' - - argcomplete>=3.0.3 ; extra == 'test' - - mypy>=1.7.0 ; extra == 'test' + - sphinx-autodoc-typehints ; extra == 'docs' + - sphinxcontrib-spelling ; extra == 'docs' + - traitlets ; extra == 'docs' + - ipykernel ; extra == 'test' - pre-commit ; extra == 'test' - - pytest-mock ; extra == 'test' - - pytest-mypy-testing ; extra == 'test' - - pytest>=7.0,<8.2 ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl - name: typer - version: 0.24.1 - sha256: 112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e - requires_dist: - - click>=8.2.1 - - shellingham>=1.3.0 - - rich>=12.3.0 - - annotated-doc>=0.0.2 + - pytest-cov ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest<9 ; extra == 'test' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl - name: typing-extensions - version: 4.15.0 - sha256: f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - name: typing-inspection - version: 0.4.2 - sha256: 4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 +- pypi: https://files.pythonhosted.org/packages/ea/91/74fc60d94488685a92ac9d49d7ec55f3e91fe9b77942a6235a5fa7f249c3/polars-1.40.1-py3-none-any.whl + name: polars + version: 1.40.1 + sha256: c0f861219d1319cdea45c4ce4d30355a47176b8f98dcedf95ea8269f131b8abd requires_dist: - - typing-extensions>=4.12.0 - requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c - md5: ad659d0a2b3e47e38d829aa8cad2d610 - license: LicenseRef-Public-Domain - purls: [] - size: 119135 - timestamp: 1767016325805 -- conda: https://conda.anaconda.org/conda-forge/linux-64/unzip-6.0-hb03c661_4.conda - sha256: 489ee14dcc1080e45d07531e89b1c690a8df68ca6a817ade536e6ef4cdc77b9e - md5: 7f58240fa4cd5b42607606333cf8b550 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: LicenseRef-BSD-like - purls: [] - size: 146901 - timestamp: 1754913060109 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unzip-6.0-he30d5cf_4.conda - sha256: 49f58bfa1b1ec914a827a238c84cc1929af30b83e3ee0875bdc6402295a324e2 - md5: 8b8239bcb89e6710d7c3ef9d9398216f - depends: - - libgcc >=14 - license: LicenseRef-BSD-like - purls: [] - size: 162036 - timestamp: 1754913052303 -- conda: https://conda.anaconda.org/conda-forge/osx-64/unzip-6.0-h1c43f85_4.conda - sha256: 427e586d62bf1ba9663c39fd6d4fad3e235d0cda80b6a33ce7eb15158da5ee7f - md5: ad412e69da4be5b80bbfe9a238323340 - depends: - - __osx >=10.13 - license: LicenseRef-BSD-like - purls: [] - size: 148716 - timestamp: 1754913371098 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unzip-6.0-h6caf38d_4.conda - sha256: 47cdb8893a679d2122e8eec28a4cf26010bdb177e694d1ab1fcd66b9ea0c3de6 - md5: d9521ca78166888a860e7e4c9ea30d2a - depends: - - __osx >=11.0 - license: LicenseRef-BSD-like - purls: [] - size: 144569 - timestamp: 1754913257831 -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - sha256: af641ca7ab0c64525a96fd9ad3081b0f5bcf5d1cbb091afb3f6ed5a9eee6111a - md5: 9272daa869e03efe68833e3dc7a02130 - depends: - - backports.zstd >=1.0.0 - - brotli-python >=1.2.0 - - h2 >=4,<5 - - pysocks >=1.5.6,<2.0,!=1.5.7 - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/urllib3?source=hash-mapping - size: 103172 - timestamp: 1767817860341 -- conda: https://conda.anaconda.org/bioconda/linux-64/vsearch-2.30.4-hd6d6fdc_0.conda - sha256: 63e3b5a23bb37b54f2c0f49b0031a2845a25fdfc0f5424e03a635302cd9a128d - md5: cd119b75f746b5b4fd22c51075195583 - depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - license: GPL-3.0-or-later OR BSD-2-Clause - license_family: GPL3 - purls: [] - size: 310902 - timestamp: 1768825958972 -- conda: https://conda.anaconda.org/bioconda/linux-aarch64/vsearch-2.30.4-h7645e38_0.conda - sha256: 4fc89f1f44c39eaed64802d1f4b497780d3186babd84e836f7a6bb1179c69f61 - md5: c6e6f927afe8f0a155972aea4534cd3c - depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - license: GPL-3.0-or-later OR BSD-2-Clause - license_family: GPL3 - purls: [] - size: 304739 - timestamp: 1768825723790 -- conda: https://conda.anaconda.org/bioconda/osx-64/vsearch-2.30.4-heca6186_0.conda - sha256: 34177bba27889d7529dc20fb65e84201b6946aacd5c3f8ba0edbd8929c9ff150 - md5: f0cf8e185698c7f456d8f0ab0ba3d467 - depends: - - bzip2 >=1.0.8,<2.0a0 - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 - license: GPL-3.0-or-later OR BSD-2-Clause - license_family: GPL3 - purls: [] - size: 293249 - timestamp: 1768826756854 -- conda: https://conda.anaconda.org/bioconda/osx-arm64/vsearch-2.30.4-hf8bb5b5_0.conda - sha256: 77760b8bd9ee95923893555479b28f417dcec8670f37c418566c76aee3d7da4a - md5: fb49a887c9ead6115fff06a087e00251 - depends: - - bzip2 >=1.0.8,<2.0a0 - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 - license: GPL-3.0-or-later OR BSD-2-Clause - license_family: GPL3 - purls: [] - size: 276121 - timestamp: 1768825547566 -- conda: https://conda.anaconda.org/conda-forge/linux-64/wget-1.21.4-hda4d442_0.conda - sha256: 70df4ac8cca488618458af4705706551cef7e402bac9c2c41dd17148f60cbd1f - md5: 361e96b664eac64a33c20dfd11affbff - depends: - - libgcc-ng >=12 - - libidn2 >=2,<3.0a0 - - libunistring >=0,<1.0a0 - - libzlib >=1.2.13,<2.0.0a0 - - openssl >=3.2.1,<4.0a0 - - zlib - license: GPL-3.0-or-later - license_family: GPL - purls: [] - size: 770380 - timestamp: 1710770110704 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wget-1.21.4-h3861a24_0.conda - sha256: 3515b13665266664d2fd7da6767e83382670dc2bb3a2e91c11ca4ac337b3dac4 - md5: a82f95000b9c2e518f25115f45587d45 - depends: - - libgcc-ng >=12 - - libidn2 >=2,<3.0a0 - - libunistring >=0,<1.0a0 - - libzlib >=1.2.13,<2.0.0a0 - - openssl >=3.2.1,<4.0a0 - - zlib - license: GPL-3.0-or-later - license_family: GPL - purls: [] - size: 792543 - timestamp: 1710770044900 -- conda: https://conda.anaconda.org/conda-forge/osx-64/wget-1.25.0-hfb6e5ea_0.conda - sha256: b5ce13d7f3ba2515ec5d372fd27d1af7be7453d53c3d3e584c482f7fa4e87782 - md5: b628163d87c31fb25d5be6521067cb9d - depends: - - __osx >=10.13 - - libidn2 >=2,<3.0a0 - - libunistring >=0,<1.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 - - pcre2 >=10.45,<10.46.0a0 - - zlib - license: GPL-3.0-or-later - license_family: GPL - purls: [] - size: 337953 - timestamp: 1761206943577 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wget-1.21.4-he2df1f1_0.conda - sha256: df0ef5aed0791ebcb27692bfdee0785ebcf02eb770479c53a3e4cdd775d18f1a - md5: c56417aa2d4f73708bf453cfc295a25d - depends: - - libidn2 >=2,<3.0a0 - - libunistring >=0,<1.0a0 - - libzlib >=1.2.13,<2.0.0a0 - - openssl >=3.2.1,<4.0a0 - - zlib - license: GPL-3.0-or-later - license_family: GPL - purls: [] - size: 777150 - timestamp: 1710770624608 -- pypi: https://files.pythonhosted.org/packages/1e/2f/60c51304fbdf47ce992d9eefa61fbd2c0e64feee60aaa439baf42ea6f40b/wrapt-2.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - name: wrapt - version: 2.1.1 - sha256: 5797f65e4d58065a49088c3b32af5410751cd485e83ba89e5a45e2aa8905af98 + - polars-runtime-32==1.40.1 + - polars-runtime-64==1.40.1 ; extra == 'rt64' + - polars-runtime-compat==1.40.1 ; extra == 'rtcompat' + - polars-cloud>=0.4.0 ; extra == 'polars-cloud' + - numpy>=1.16.0 ; extra == 'numpy' + - pandas ; extra == 'pandas' + - polars[pyarrow] ; extra == 'pandas' + - pyarrow>=7.0.0 ; extra == 'pyarrow' + - pydantic ; extra == 'pydantic' + - fastexcel>=0.9 ; extra == 'calamine' + - openpyxl>=3.0.0 ; extra == 'openpyxl' + - xlsx2csv>=0.8.0 ; extra == 'xlsx2csv' + - xlsxwriter ; extra == 'xlsxwriter' + - polars[calamine,openpyxl,xlsx2csv,xlsxwriter] ; extra == 'excel' + - adbc-driver-manager[dbapi] ; extra == 'adbc' + - adbc-driver-sqlite[dbapi] ; extra == 'adbc' + - connectorx>=0.3.2 ; extra == 'connectorx' + - sqlalchemy ; extra == 'sqlalchemy' + - polars[pandas] ; extra == 'sqlalchemy' + - polars[adbc,connectorx,sqlalchemy] ; extra == 'database' + - fsspec ; extra == 'fsspec' + - deltalake>=1.0.0 ; extra == 'deltalake' + - pyiceberg>=0.7.1 ; extra == 'iceberg' + - gevent ; extra == 'async' + - cloudpickle ; extra == 'cloudpickle' + - matplotlib ; extra == 'graph' + - altair>=5.4.0 ; extra == 'plot' + - great-tables>=0.8.0 ; extra == 'style' + - tzdata ; sys_platform == 'win32' and extra == 'timezone' + - cudf-polars-cu12 ; extra == 'gpu' + - polars[async,cloudpickle,database,deltalake,excel,fsspec,graph,iceberg,numpy,pandas,plot,pyarrow,pydantic,style,timezone] ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + name: python-dateutil + version: 2.9.0.post0 + sha256: a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 requires_dist: - - pytest ; extra == 'dev' - - setuptools ; extra == 'dev' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/9d/33/5b8f89a82a9859ce82da4870c799ad11ce15648b6e1c820fec3e23f4a19f/wrapt-2.1.1-cp313-cp313-macosx_11_0_arm64.whl - name: wrapt - version: 2.1.1 - sha256: 428cfc801925454395aa468ba7ddb3ed63dc0d881df7b81626cdd433b4e2b11b + - six>=1.5 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl + name: rpds-py + version: 0.30.0 + sha256: f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ee/b8/ead7c10efff731738c72e59ed6eb5791854879fbed7ae98781a12006263a/lxml-6.1.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + name: lxml + version: 6.1.0 + sha256: e69aa6805905807186eb00e66c6d97a935c928275182eb02ee40ba00da9623b2 requires_dist: - - pytest ; extra == 'dev' - - setuptools ; extra == 'dev' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/ad/03/ce5256e66dd94e521ad5e753c78185c01b6eddbed3147be541f4d38c0cb7/wrapt-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - name: wrapt - version: 2.1.1 - sha256: 5a2db44a71202c5ae4bb5f27c6d3afbc5b23053f2e7e78aa29704541b5dad789 + - cssselect>=0.7 ; extra == 'cssselect' + - html5lib ; extra == 'html5' + - beautifulsoup4 ; extra == 'htmlsoup' + - lxml-html-clean ; extra == 'html-clean' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl + name: humanfriendly + version: '10.0' + sha256: 1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477 requires_dist: - - pytest ; extra == 'dev' - - setuptools ; extra == 'dev' + - monotonic ; python_full_version == '2.7.*' + - pyreadline ; python_full_version < '3.8' and sys_platform == 'win32' + - pyreadline3 ; python_full_version >= '3.8' and sys_platform == 'win32' + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*' +- pypi: https://files.pythonhosted.org/packages/f0/f0/df73f6abc9b5910e43612ae28c7b6f666af80c4edd46a216ef47599ab6cb/snakemake_interface_report_plugins-1.3.0-py3-none-any.whl + name: snakemake-interface-report-plugins + version: 1.3.0 + sha256: 78da3931f70e79eef51e5645a40b172929e555fe4d86ff45d6b856e521a379db + requires_dist: + - snakemake-interface-common>=1.16.0,<2.0.0 + requires_python: '>=3.11,<4.0' +- pypi: https://files.pythonhosted.org/packages/f3/a5/5fda0ee4a261a85124011ac0750fec678f00e1b2d4a5502b149a3b4d86d9/immutables-0.21-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: immutables + version: '0.21' + sha256: b274a52da9b106db55eceb93fc1aea858c4e6f4740189e3548e38613eafc2021 + requires_dist: + - flake8~=5.0 ; extra == 'test' + - pycodestyle~=2.9 ; extra == 'test' + - mypy~=1.4 ; extra == 'test' + - pytest~=7.4 ; extra == 'test' + requires_python: '>=3.8.0' +- pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + name: pygments + version: 2.20.0 + sha256: 81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176 + requires_dist: + - colorama>=0.4.6 ; extra == 'windows-terminal' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/f7/ca/3cf290212855b19af9fcc41b725b5620b32f470d6aad970c2593500817eb/wrapt-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl - name: wrapt - version: 2.1.1 - sha256: ce9646e17fa7c3e2e7a87e696c7de66512c2b4f789a8db95c613588985a2e139 +- pypi: https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: charset-normalizer + version: 3.4.7 + sha256: e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl + name: rpds-py + version: 0.30.0 + sha256: e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + name: pydantic + version: 2.13.4 + sha256: 45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba requires_dist: - - pytest ; extra == 'dev' - - setuptools ; extra == 'dev' + - annotated-types>=0.6.0 + - pydantic-core==2.46.4 + - typing-extensions>=4.14.1 + - typing-inspection>=0.4.2 + - email-validator>=2.0.0 ; extra == 'email' + - tzdata ; python_full_version >= '3.9' and sys_platform == 'win32' and extra == 'timezone' requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda - sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b - md5: fb901ff28063514abb6046c9ec2c4a45 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 58628 - timestamp: 1734227592886 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda - sha256: a2ba1864403c7eb4194dacbfe2777acf3d596feae43aada8d1b478617ce45031 - md5: c8d8ec3e00cd0fd8a231789b91a7c5b7 - depends: - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 60433 - timestamp: 1734229908988 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda - sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 - md5: 1c74ff8c35dcadf952a16f752ca5aa49 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libuuid >=2.38.1,<3.0a0 - - xorg-libice >=1.1.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 27590 - timestamp: 1741896361728 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda - sha256: b86a819cd16f90c01d9d81892155126d01555a20dabd5f3091da59d6309afd0a - md5: 2d1409c50882819cb1af2de82e2b7208 - depends: - - libgcc >=13 - - libuuid >=2.38.1,<3.0a0 - - xorg-libice >=1.1.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 28701 - timestamp: 1741897678254 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda - sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 - md5: 861fb6ccbc677bb9a9fb2468430b9c6a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libxcb >=1.17.0,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 839652 - timestamp: 1770819209719 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda - sha256: cf886160e2ff580d77f7eb8ec1a77c41c2c5b05343e329bc35f0ddf40b8d92ab - md5: 22dd10425ef181e80e130db50675d615 - depends: - - libgcc >=14 - - libxcb >=1.17.0,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 869058 - timestamp: 1770819244991 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda - sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b - md5: b2895afaf55bf96a8c8282a2e47a5de0 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - size: 15321 - timestamp: 1762976464266 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda - sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 - md5: 1c246e1105000c3660558459e2fd6d43 - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - size: 16317 - timestamp: 1762977521691 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda - sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 - md5: 1dafce8548e38671bea82e3f5c6ce22f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - size: 20591 - timestamp: 1762976546182 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda - sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 - md5: bff06dcde4a707339d66d45d96ceb2e2 - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - size: 21039 - timestamp: 1762979038025 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda - sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f - md5: 34e54f03dfea3e7a2dcf1453a85f1085 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 50326 - timestamp: 1769445253162 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda - sha256: db2188bc0d844d4e9747bac7f6c1d067e390bd769c5ad897c93f1df759dc5dba - md5: fb42b683034619915863d68dd9df03a3 - depends: - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 52409 - timestamp: 1769446753771 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda - sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 - md5: ba231da7fccf9ea1e768caf5c7099b84 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 20071 - timestamp: 1759282564045 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda - sha256: 8cb9c88e25c57e47419e98f04f9ef3154ad96b9f858c88c570c7b91216a64d0e - md5: e8b4056544341daf1d415eaeae7a040c - depends: - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 20704 - timestamp: 1759284028146 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda - sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a - md5: 17dcc85db3c7886650b8908b183d6876 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - license: MIT - license_family: MIT - purls: [] - size: 47179 - timestamp: 1727799254088 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda - sha256: 7b587407ecb9ccd2bbaf0fb94c5dbdde4d015346df063e9502dc0ce2b682fb5e - md5: eeee3bdb31c6acde2b81ad1b8c287087 - depends: - - libgcc >=13 - - xorg-libx11 >=1.8.9,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - license: MIT - license_family: MIT - purls: [] - size: 48197 - timestamp: 1727801059062 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda - sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 - md5: e192019153591938acf7322b6459d36e - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - license: MIT - license_family: MIT - purls: [] - size: 30456 - timestamp: 1769445263457 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda - sha256: 9f5196665a8d72f4f119c40dcc4bafeb0b540b102cc7b8b299c2abf599e7919f - md5: 1f64c613f0b8d67e9fb0e165d898fb6b - depends: - - libgcc >=14 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - license: MIT - license_family: MIT - purls: [] - size: 31122 - timestamp: 1769445286951 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda - sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 - md5: 96d57aba173e878a2089d5638016dc5e - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 33005 - timestamp: 1734229037766 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda - sha256: ffd77ee860c9635a28cfda46163dcfe9224dc6248c62404c544ae6b564a0be1f - md5: ae2c2dd0e2d38d249887727db2af960e - depends: - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 33649 - timestamp: 1734229123157 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda - sha256: a8afba4a55b7b530eb5c8ad89737d60d60bc151a03fbef7a2182461256953f0e - md5: 279b0de5f6ba95457190a1c459a64e31 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libice >=1.1.1,<2.0a0 - - xorg-libsm >=1.2.4,<2.0a0 - - xorg-libx11 >=1.8.10,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 379686 - timestamp: 1731860547604 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda - sha256: 7c109792b60720809a580612aba7f8eb2a0bd425b9fc078748a9d6ffc97cbfa8 - md5: a9e4852c8e0b68ee783e7240030b696f - depends: - - libgcc >=13 - - xorg-libice >=1.1.1,<2.0a0 - - xorg-libsm >=1.2.4,<2.0a0 - - xorg-libx11 >=1.8.9,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 384752 - timestamp: 1731860572314 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda - sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a - md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxi >=1.7.10,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 32808 - timestamp: 1727964811275 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda - sha256: 6eaffce5a34fc0a16a21ddeaefb597e792a263b1b0c387c1ce46b0a967d558e1 - md5: c05698071b5c8e0da82a282085845860 - depends: - - libgcc >=13 - - xorg-libx11 >=1.8.9,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxi >=1.7.10,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 33786 - timestamp: 1727964907993 -- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad - md5: a77f85f77be52ff59391544bfe73390a - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: MIT - license_family: MIT - purls: [] - size: 85189 - timestamp: 1753484064210 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda - sha256: 66265e943f32ce02396ad214e27cb35f5b0490b3bd4f064446390f9d67fa5d88 - md5: 032d8030e4a24fe1f72c74423a46fb88 - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - size: 88088 - timestamp: 1753484092643 -- conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - sha256: a335161bfa57b64e6794c3c354e7d49449b28b8d8a7c4ed02bf04c3f009953f9 - md5: a645bb90997d3fc2aea0adf6517059bd - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - purls: [] - size: 79419 - timestamp: 1753484072608 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac - md5: 78a0fe9e9c50d2c381e8ee47e3ea437d - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 83386 - timestamp: 1753484079473 -- pypi: https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl - name: yte - version: 1.9.4 - sha256: 5dac63303d3e6bc2ebadc36ece3c3fb09343772fe6e25e9356d9baf8f9dfaf6d +- pypi: https://files.pythonhosted.org/packages/fe/19/3ba5e1b0bcc7b91aeab6c258afd70e4907d220fed3972febe38feb40db30/configargparse-1.7.5-py3-none-any.whl + name: configargparse + version: 1.7.5 + sha256: 1e63fdffedf94da9cd435fc13a1cd24777e76879dd2343912c1f871d4ac8c592 requires_dist: - - argparse-dataclass>=2.0.0,<3 - - dpath>=2.1,<3.0 - - pyyaml>=6.0,<7.0 - requires_python: '>=3.8,<4.0' -- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab - md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib 1.3.1 hb9d3cd8_2 - license: Zlib - license_family: Other - purls: [] - size: 92286 - timestamp: 1727963153079 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 - md5: bc230abb5d21b63ff4799b0e75204783 - depends: - - libgcc >=13 - - libzlib 1.3.1 h86ecc28_2 - license: Zlib - license_family: Other - purls: [] - size: 95582 - timestamp: 1727963203597 -- conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - sha256: 219edbdfe7f073564375819732cbf7cc0d7c7c18d3f546a09c2dfaf26e4d69f3 - md5: c989e0295dcbdc08106fe5d9e935f0b9 - depends: - - __osx >=10.13 - - libzlib 1.3.1 hd23fc13_2 - license: Zlib - license_family: Other - purls: [] - size: 88544 - timestamp: 1727963189976 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 - md5: e3170d898ca6cb48f1bb567afb92f775 - depends: - - __osx >=11.0 - - libzlib 1.3.1 h8359307_2 - license: Zlib - license_family: Other - purls: [] - size: 77606 - timestamp: 1727963209370 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 - md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 - depends: - - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 601375 - timestamp: 1764777111296 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 - md5: c3655f82dcea2aa179b291e7099c1fcc - depends: - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 614429 - timestamp: 1764777145593 -- conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - sha256: 47101a4055a70a4876ffc87b750ab2287b67eca793f21c8224be5e1ee6394d3f - md5: 727109b184d680772e3122f40136d5ca - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 528148 - timestamp: 1764777156963 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 - md5: ab136e4c34e97f34fb621d2592a393d8 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 433413 - timestamp: 1764777166076 + - pyyaml ; extra == 'yaml' + - black ; extra == 'test' + - mock ; extra == 'test' + - toml ; extra == 'test' + - pyyaml ; extra == 'test' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-subtests ; extra == 'test' + requires_python: '>=3.6' diff --git a/pyproject.toml b/pyproject.toml index a6cba7c..2a8b2b8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ authors = [ { name = "William Gardner", email = "wkgardner@wisc.edu" }, ] requires-python = ">= 3.11, < 3.14" -version = "2.5.0" +version = "3.0.0" dependencies = [ "biopython>=1.85", "blake3>=1.0.8", @@ -27,6 +27,7 @@ dependencies = [ "snakemake>=9.3.1", "taxopy>=0.14.0", "typer>=0.15.2", + ] [tool.pixi.workspace] @@ -40,12 +41,12 @@ bbmap = ">=39.19,<40" blast = ">=2.16.0,<3" deacon = ">=0.13.0,<0.14" fastp = ">=1.0.1,<2" -gottcha2 = ">=2.1.8.11,<2.1.10" minimap2 = ">=2.22,<3" samtools = ">=1.5,<2" seqkit = ">=2.10.0,<3" spades = ">=4.1.0,<5" vsearch = ">=2.30.0,<3" +rust = ">=1.94.0,<1.95" # System Dependencies # ----------------------------------------------------------------------------------- # @@ -62,17 +63,20 @@ nextflow = ">=25.10.2,<26" [tool.pixi.target.linux-64.dependencies] apptainer = ">=1.3.6,<2" +rust-script = ">=0.36.0" [tool.pixi.target.linux-aarch64.dependencies] apptainer = ">=1.3.6,<2" +[tool.pixi.target.osx-64.dependencies] +rust-script = ">=0.36.0" + +[tool.pixi.target.osx-arm64.dependencies] +rust-script = ">=0.36.0" + [tool.pixi.pypi-dependencies] nvd = { path = ".", editable = true } -[tool.pixi.tasks] -# Regenerate pipeline fingerprint (run after editing main.nf or nextflow.config) -fingerprint = "nvd-fingerprint" - [dependency-groups] dev = [ "basedpyright>=1.28.4", @@ -97,7 +101,6 @@ module-name = ["py_nvd"] [project.scripts] "nvd" = "py_nvd.cli:main" -"nvd-fingerprint" = "py_nvd.fingerprint:main" [tool.ruff.lint] select = ["ALL"] diff --git a/schemas/README.md b/schemas/README.md index e786a3f..40a2827 100644 --- a/schemas/README.md +++ b/schemas/README.md @@ -6,9 +6,7 @@ This directory contains JSON Schema definitions for the NVD pipeline. | Schema | Description | |--------|-------------| -| `nvd-params.v2.3.0.schema.json` | Pipeline parameters schema (version 2.3.0) | -| `nvd-params.v2.4.0.schema.json` | Pipeline parameters schema (version 2.4.0) | -| `nvd-params.v2.5.0.schema.json` | Pipeline parameters schema (version 2.5.0) | +| `nvd-params.v3.0.0.schema.json` | Pipeline parameters schema (version 3.0.0) | | `nvd-params.latest.schema.json` | Symlink to the current version | ## Usage @@ -22,7 +20,7 @@ Add a schema reference comment at the top of your params file: samplesheet: samples.csv experiment_id: 1001 -tools: all +dedup: true cutoff_percent: 0.001 ``` @@ -35,7 +33,7 @@ Include the `$schema` property in your JSON params file: "$schema": "https://raw.githubusercontent.com/dhoconno/nvd/main/schemas/nvd-params.latest.schema.json", "samplesheet": "samples.csv", "experiment_id": 1001, - "tools": "all", + "dedup": true, "cutoff_percent": 0.001 } ``` @@ -47,7 +45,7 @@ With the schema reference, your IDE provides: - **Autocomplete** for parameter names - **Type validation** (red squiggles for wrong types) - **Hover documentation** (descriptions from schema) -- **Enum suggestions** (e.g., valid `tools` values) +- **Completion suggestions** for documented pipeline parameters ### Using with Nextflow @@ -71,7 +69,7 @@ points to the current version for users who want to track updates automatically. For reproducibility, you can reference a specific version: ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/dhoconno/nvd/main/schemas/nvd-params.v2.5.0.schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/dhoconno/nvd/main/schemas/nvd-params.v3.0.0.schema.json ``` ## Validation diff --git a/schemas/nvd-params.latest.schema.json b/schemas/nvd-params.latest.schema.json index f862abd..5d33157 120000 --- a/schemas/nvd-params.latest.schema.json +++ b/schemas/nvd-params.latest.schema.json @@ -1 +1 @@ -nvd-params.v2.5.0.schema.json \ No newline at end of file +nvd-params.v3.0.0.schema.json \ No newline at end of file diff --git a/schemas/nvd-params.v2.4.0.schema.json b/schemas/nvd-params.v2.4.0.schema.json deleted file mode 100644 index d38bf8c..0000000 --- a/schemas/nvd-params.v2.4.0.schema.json +++ /dev/null @@ -1,326 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://raw.githubusercontent.com/dhoconno/nvd/main/schemas/nvd-params.v2.4.0.schema.json", - "title": "NVD Pipeline Parameters", - "description": "Parameters for the Novel Virus Detection (NVD) metagenomics pipeline. Use with Nextflow's -params-file option or register as a preset with nvd preset register.", - "type": "object", - "properties": { - "labkey": { - "type": "boolean", - "default": false, - "description": "Enable LabKey integration for result uploads. When enabled, all labkey_* params must be set." - }, - "labkey_server": { - "type": "string", - "description": "LabKey server URL" - }, - "labkey_project_name": { - "type": "string", - "description": "LabKey project name" - }, - "labkey_webdav": { - "type": "string", - "description": "LabKey WebDAV endpoint URL" - }, - "labkey_schema": { - "type": "string", - "description": "LabKey schema name" - }, - "labkey_gottcha_fasta_list": { - "type": "string", - "description": "LabKey list name for GOTTCHA2 FASTA uploads" - }, - "labkey_gottcha_full_list": { - "type": "string", - "description": "LabKey list name for GOTTCHA2 full results" - }, - "labkey_gottcha_blast_verified_full_list": { - "type": "string", - "description": "LabKey list name for BLAST-verified GOTTCHA2 results" - }, - "labkey_blast_meta_hits_list": { - "type": "string", - "description": "LabKey list name for BLAST meta hits" - }, - "labkey_blast_fasta_list": { - "type": "string", - "description": "LabKey list name for BLAST FASTA uploads" - }, - "labkey_exp_id_guard_list": { - "type": "string", - "description": "LabKey list name for experiment ID guard (prevents duplicate uploads)" - }, - "samplesheet": { - "type": "string", - "format": "path", - "description": "Path to samplesheet CSV with columns: sample_id, srr, platform, fastq1, fastq2" - }, - "results": { - "type": "string", - "format": "path", - "description": "Directory for pipeline output files" - }, - "tools": { - "type": "string", - "pattern": "^(stat_blast|nvd|stat|blast|stast|gottcha|all|clumpify)(,(stat_blast|nvd|stat|blast|stast|gottcha|all|clumpify))*$", - "description": "Which analysis tool(s) to run. Valid tools: stat_blast, nvd, stat, blast, gottcha, all, clumpify. For multiple tools, use comma-separated values with no spaces (e.g., 'stat,blast,gottcha'). Use 'all' to run the complete pipeline." - }, - "experiment_id": { - "type": "string", - "description": "Experiment identifier for tracking and LabKey integration" - }, - "max_concurrent_downloads": { - "type": "integer", - "default": 3, - "minimum": 1, - "description": "Maximum number of concurrent SRA downloads" - }, - "cleanup": { - "type": "boolean", - "description": "Whether to empty the work directory after successful completion" - }, - "work_dir": { - "type": ["string", "null"], - "format": "path", - "description": "Nextflow work directory for intermediate files" - }, - "gottcha2_db_version": { - "type": "string", - "description": "GOTTCHA2 database version identifier" - }, - "blast_db_version": { - "type": "string", - "description": "BLAST database version identifier" - }, - "stat_db_version": { - "type": "string", - "description": "STAT database version identifier" - }, - "gottcha2_db": { - "type": "string", - "format": "path", - "description": "Path to GOTTCHA2 database directory" - }, - "nvd_files": { - "type": "string", - "format": "path", - "description": "Path to NVD resource files directory" - }, - "blast_db": { - "type": "string", - "format": "path", - "description": "Path to BLAST database directory" - }, - "blast_db_prefix": { - "type": "string", - "description": "BLAST database name prefix" - }, - "stat_index": { - "type": "string", - "format": "path", - "description": "Path to STAT index file" - }, - "stat_dbss": { - "type": "string", - "format": "path", - "description": "Path to STAT DBSS file" - }, - "stat_annotation": { - "type": "string", - "format": "path", - "description": "Path to STAT annotation file" - }, - "human_virus_taxlist": { - "type": "string", - "format": "path", - "description": "Path to human virus taxonomy list file" - }, - "preprocess": { - "type": "boolean", - "default": false, - "description": "Run all preprocessing steps on reads before classification (enables dedup, trim_adapters, scrub_host_reads, filter_reads)" - }, - "merge_pairs": { - "type": "boolean", - "description": "Merge paired read mates based on overlaps between them" - }, - "dedup": { - "type": "boolean", - "description": "Deduplicate sequencing reads" - }, - "trim_adapters": { - "type": "boolean", - "description": "Trim Illumina adapters from reads" - }, - "scrub_host_reads": { - "type": "boolean", - "description": "Remove host (human) reads using STAT. Requires sra_human_db to be set." - }, - "sra_human_db": { - "type": "string", - "format": "path", - "description": "Path to human reads STAT database for host scrubbing and SRA submission prep" - }, - "human_read_scrub": { - "type": "string", - "format": "path", - "deprecated": true, - "description": "DEPRECATED: Use sra_human_db instead. Path to human reads database for SRA submission scrubbing" - }, - "filter_reads": { - "type": "boolean", - "description": "Apply quality and length filtering to reads" - }, - "min_read_quality_illumina": { - "type": "integer", - "default": 20, - "minimum": 0, - "description": "Minimum average quality score for Illumina reads" - }, - "min_read_quality_nanopore": { - "type": "integer", - "default": 12, - "minimum": 0, - "description": "Minimum average quality score for Nanopore reads" - }, - "min_read_length": { - "type": "integer", - "default": 50, - "minimum": 1, - "description": "Minimum read length to retain" - }, - "max_read_length": { - "type": "integer", - "minimum": 1, - "description": "Maximum read length to retain (no limit if not specified)" - }, - "cutoff_percent": { - "type": "number", - "default": 0.001, - "minimum": 0, - "maximum": 1, - "description": "Minimum abundance threshold for reporting taxa (0-1)" - }, - "entropy": { - "type": "number", - "default": 0.9, - "minimum": 0, - "maximum": 1, - "description": "Entropy threshold for sequence complexity filtering (0-1)" - }, - "min_consecutive_bases": { - "type": "integer", - "default": 200, - "minimum": 1, - "description": "Minimum number of consecutive bases required" - }, - "qtrim": { - "type": "string", - "default": "t", - "description": "Quality trimming mode" - }, - "tax_stringency": { - "type": "number", - "default": 0.7, - "minimum": 0, - "maximum": 1, - "description": "Stringency for taxonomic classification (0-1)" - }, - "include_children": { - "type": "boolean", - "default": true, - "description": "Include child taxa in taxonomic analysis" - }, - "human_virus_families": { - "type": "array", - "items": { - "type": "string" - }, - "default": [ - "Adenoviridae", - "Anelloviridae", - "Arenaviridae", - "Arteriviridae", - "Astroviridae", - "Bornaviridae", - "Peribunyaviridae", - "Caliciviridae", - "Coronaviridae", - "Filoviridae", - "Flaviviridae", - "Hepadnaviridae", - "Hepeviridae", - "Orthoherpesviridae", - "Orthomyxoviridae", - "Papillomaviridae", - "Paramyxoviridae", - "Parvoviridae", - "Picobirnaviridae", - "Picornaviridae", - "Pneumoviridae", - "Polyomaviridae", - "Poxviridae", - "Sedoreoviridae", - "Retroviridae", - "Rhabdoviridae", - "Togaviridae", - "Kolmioviridae" - ], - "description": "List of virus family names to include in human virus analysis" - }, - "min_gottcha_reads": { - "type": "integer", - "default": 250, - "minimum": 1, - "description": "Minimum number of reads required for GOTTCHA2 analysis" - }, - "max_blast_targets": { - "type": "integer", - "default": 100, - "minimum": 1, - "description": "Maximum number of BLAST hits to consider before calling hits" - }, - "blast_retention_count": { - "type": "integer", - "default": 5, - "minimum": 1, - "description": "Number of top BLAST hits to retain" - }, - "state_dir": { - "type": "string", - "format": "path", - "description": "State directory for run tracking, upload deduplication, and taxonomy cache. Defaults to NVD_STATE_DIR env var or ~/.cache/nvd" - }, - "refman_registry": { - "type": "string", - "format": "path", - "description": "Path to refman registry file for reference management" - }, - "monoimage": { - "type": "string", - "default": "nrminor/nvd:v2.4.0", - "description": "Container image to use for pipeline execution" - }, - "slack_enabled": { - "type": "boolean", - "default": false, - "description": "Enable Slack notifications for run completion (stat_blast workflow only)" - }, - "slack_channel": { - "type": "string", - "pattern": "^C[A-Z0-9]+$", - "description": "Slack channel ID for notifications (e.g., 'C0123456789')" - }, - "stateless": { - "type": "boolean", - "default": false, - "description": "Run without state management (disables run tracking, sample locking, LabKey, and Slack). When enabled, state_dir is ignored and taxonomy_dir must be set." - }, - "taxonomy_dir": { - "type": ["string", "null"], - "format": "path", - "description": "Path to taxonomy database directory containing NCBI taxdump files. Defaults to {state_dir}/taxdump when state_dir is set. Required when stateless=true." - } - }, - "additionalProperties": false -} diff --git a/schemas/nvd-params.v2.5.0.schema.json b/schemas/nvd-params.v3.0.0.schema.json similarity index 71% rename from schemas/nvd-params.v2.5.0.schema.json rename to schemas/nvd-params.v3.0.0.schema.json index e6a5b92..9228225 100644 --- a/schemas/nvd-params.v2.5.0.schema.json +++ b/schemas/nvd-params.v3.0.0.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://raw.githubusercontent.com/dhoconno/nvd/main/schemas/nvd-params.v2.5.0.schema.json", + "$id": "https://raw.githubusercontent.com/dhoconno/nvd/main/schemas/nvd-params.v3.0.0.schema.json", "title": "NVD Pipeline Parameters", "description": "Parameters for the Novel Virus Detection (NVD) metagenomics pipeline. Use with Nextflow's -params-file option or register as a preset with nvd preset register.", "type": "object", @@ -26,18 +26,6 @@ "type": "string", "description": "LabKey schema name" }, - "labkey_gottcha_fasta_list": { - "type": "string", - "description": "LabKey list name for GOTTCHA2 FASTA uploads" - }, - "labkey_gottcha_full_list": { - "type": "string", - "description": "LabKey list name for GOTTCHA2 full results" - }, - "labkey_gottcha_blast_verified_full_list": { - "type": "string", - "description": "LabKey list name for BLAST-verified GOTTCHA2 results" - }, "labkey_blast_meta_hits_list": { "type": "string", "description": "LabKey list name for BLAST meta hits" @@ -60,11 +48,6 @@ "format": "path", "description": "Directory for pipeline output files" }, - "tools": { - "type": "string", - "pattern": "^(stat_blast|nvd|stat|blast|stast|gottcha|all|clumpify)(,(stat_blast|nvd|stat|blast|stast|gottcha|all|clumpify))*$", - "description": "Which analysis tool(s) to run. Valid tools: stat_blast, nvd, stat, blast, gottcha, all, clumpify. For multiple tools, use comma-separated values with no spaces (e.g., 'stat,blast,gottcha'). Use 'all' to run the complete pipeline." - }, "experiment_id": { "type": "string", "description": "Experiment identifier for tracking and LabKey integration" @@ -84,23 +67,10 @@ "format": "path", "description": "Nextflow work directory for intermediate files" }, - "gottcha2_db_version": { - "type": "string", - "description": "GOTTCHA2 database version identifier" - }, "blast_db_version": { "type": "string", "description": "BLAST database version identifier" }, - "stat_db_version": { - "type": "string", - "description": "STAT database version identifier" - }, - "gottcha2_db": { - "type": "string", - "format": "path", - "description": "Path to GOTTCHA2 database directory" - }, "nvd_files": { "type": "string", "format": "path", @@ -115,66 +85,70 @@ "type": "string", "description": "BLAST database name prefix" }, - "stat_index": { - "type": "string", - "format": "path", - "description": "Path to STAT index file" + "virus_index": { + "type": ["string", "null"], + "default": null, + "description": "Path to a prebuilt vertebrate-infecting virus deacon index (.idx file). Providing this enables virus read enrichment." }, - "stat_dbss": { - "type": "string", - "format": "path", - "description": "Path to STAT DBSS file" + "virus_index_url": { + "type": ["string", "null"], + "default": null, + "description": "URL to download a prebuilt vertebrate-infecting virus deacon index. Providing this enables virus read enrichment when virus_index is not set." }, - "stat_annotation": { - "type": "string", - "format": "path", - "description": "Path to STAT annotation file" + "virus_reference_fasta": { + "type": ["string", "null"], + "default": null, + "description": "Custom vertebrate-infecting virus FASTA to build and union with other virus indexes. Providing this enables virus read enrichment." }, - "human_virus_taxlist": { - "type": "string", - "format": "path", - "description": "Path to human virus taxonomy list file" + "virus_kmer_size": { + "type": "integer", + "default": 31, + "minimum": 1, + "description": "K-mer size for building a custom virus enrichment index" + }, + "virus_window_size": { + "type": "integer", + "default": 1, + "minimum": 1, + "description": "Minimizer window size for building a custom virus enrichment index" + }, + "virus_abs_threshold": { + "type": "integer", + "default": 1, + "minimum": 1, + "description": "Minimum absolute minimizer hits for virus read enrichment" + }, + "virus_rel_threshold": { + "type": "number", + "default": 0.0, + "minimum": 0, + "maximum": 1, + "description": "Minimum relative proportion of minimizers for virus read enrichment (0.0-1.0)" }, "preprocess": { "type": "boolean", "default": false, - "description": "Run all preprocessing steps on reads before classification (enables dedup, trim_adapters, scrub_host_reads, filter_reads)" - }, - "merge_pairs": { - "type": "boolean", - "description": "Merge paired read mates based on overlaps between them" + "description": "Enable default preprocessing steps before classification" }, "dedup": { "type": "boolean", + "default": false, "description": "Deduplicate sequencing reads (umbrella: enables both dedup_seq and dedup_pos)" }, "dedup_seq": { "type": "boolean", + "default": false, "description": "Sequence-based deduplication with clumpify (preprocessing)" }, "dedup_pos": { "type": "boolean", + "default": false, "description": "Positional deduplication with samtools markdup (after alignment)" }, "trim_adapters": { "type": "boolean", "description": "Trim Illumina adapters from reads" }, - "scrub_host_reads": { - "type": "boolean", - "description": "Remove host (human) reads using STAT. Requires sra_human_db to be set." - }, - "sra_human_db": { - "type": "string", - "format": "path", - "description": "Path to human reads STAT database for host scrubbing and SRA submission prep" - }, - "human_read_scrub": { - "type": "string", - "format": "path", - "deprecated": true, - "description": "DEPRECATED: Use sra_human_db instead. Path to human reads database for SRA submission scrubbing" - }, "filter_reads": { "type": "boolean", "description": "Apply quality and length filtering to reads" @@ -202,39 +176,44 @@ "minimum": 1, "description": "Maximum read length to retain (no limit if not specified)" }, - "deacon_index": { + "host_index": { "type": ["string", "null"], "default": null, - "description": "Path to prebuilt deacon index (.idx file)" + "description": "Path to a prebuilt host/contaminant index (.idx file). Providing this enables host depletion." }, - "deacon_index_url": { - "type": "string", - "default": "https://zenodo.org/records/17288185/files/panhuman-1.k31w15.idx", - "description": "URL to download prebuilt deacon index (default: panhuman-1)" + "host_index_url": { + "type": ["string", "null"], + "default": null, + "description": "URL to download a prebuilt host/contaminant index. Providing this enables host depletion when host_index is not set." }, - "deacon_contaminants_fasta": { + "host_contaminants_fasta": { "type": ["string", "null"], "default": null, - "description": "Custom contaminant FASTA to union with base index" + "description": "Custom contaminant FASTA to build and union with other host indexes. Providing this enables host depletion." }, - "deacon_kmer_size": { + "host_kmer_size": { "type": "integer", "default": 31, - "description": "K-mer size for deacon index (must match index if prebuilt)" + "minimum": 1, + "description": "K-mer size for building a custom host/contaminant index" }, - "deacon_window_size": { + "host_window_size": { "type": "integer", "default": 15, - "description": "Minimizer window size for deacon index" + "minimum": 1, + "description": "Minimizer window size for building a custom host/contaminant index" }, - "deacon_abs_threshold": { + "host_abs_threshold": { "type": "integer", "default": 2, + "minimum": 1, "description": "Minimum absolute minimizer hits to classify as contaminant" }, - "deacon_rel_threshold": { + "host_rel_threshold": { "type": "number", "default": 0.01, + "minimum": 0, + "maximum": 1, "description": "Minimum relative proportion of minimizers (0.0-1.0)" }, "cutoff_percent": { @@ -311,12 +290,6 @@ ], "description": "List of virus family names to include in human virus analysis" }, - "min_gottcha_reads": { - "type": "integer", - "default": 250, - "minimum": 1, - "description": "Minimum number of reads required for GOTTCHA2 analysis" - }, "max_blast_targets": { "type": "integer", "default": 100, @@ -341,7 +314,7 @@ }, "monoimage": { "type": "string", - "default": "nrminor/nvd:v2.5.0", + "default": "nrminor/nvd:v3.0.0", "description": "Container image to use for pipeline execution" }, "slack_enabled": { diff --git a/subworkflows/bundle_blast_for_labkey.nf b/subworkflows/bundle_blast_for_labkey.nf index 9d7425b..6f4ff8d 100644 --- a/subworkflows/bundle_blast_for_labkey.nf +++ b/subworkflows/bundle_blast_for_labkey.nf @@ -167,8 +167,7 @@ process PREPARE_BLAST_LABKEY { --experiment-id ${experiment_id} \\ --run-id '${run_id}' \\ --total-reads ${total_reads} \\ - --blast-db-version '${params.blast_db_version}' \\ - --stat-db-version '${params.stat_db_version}' + --blast-db-version '${params.blast_db_version}' """ } diff --git a/subworkflows/bundle_gottcha2_for_labkey.nf b/subworkflows/bundle_gottcha2_for_labkey.nf deleted file mode 100644 index a41b020..0000000 --- a/subworkflows/bundle_gottcha2_for_labkey.nf +++ /dev/null @@ -1,147 +0,0 @@ -workflow BUNDLE_GOTTCHA2_FOR_LABKEY { - take: - gottcha2_results // queue channel: [sample_id, full_tsv, ref_mmi, stats, tax_tsv] - gottcha2_extracted_fastas // queue channel: [sample_id, fasta, full_tsv] - experiment_id // value channel: experiment ID - run_id // value channel: workflow.runName - validation_complete // value channel: gate ensuring validation passed - run_context // value channel: [sample_set_id, state_dir] from CHECK_RUN_STATE - - main: - - LABKEY_UPLOAD_GOTTCHA2_FULL( - gottcha2_results, - experiment_id, - run_id, - run_context, - validation_complete - ) - - LABKEY_UPLOAD_GOTTCHA2_FASTA( - gottcha2_extracted_fastas, - experiment_id, - run_id, - run_context, - validation_complete - ) - - LABKEY_WEBDAV_UPLOAD_FILES( - gottcha2_extracted_fastas, - experiment_id, - validation_complete - ) - - emit: - upload_log = LABKEY_UPLOAD_GOTTCHA2_FULL.out.log - .mix(LABKEY_UPLOAD_GOTTCHA2_FASTA.out.log) -} - -process LABKEY_UPLOAD_GOTTCHA2_FULL { - label 'low' - - tag "${sample_id}" - - secret 'LABKEY_API_KEY' - - input: - tuple val(sample_id), path(full_tsv), path(ref_mmi), path(stats), path(tax_tsv) - val experiment_id - val run_id - tuple val(sample_set_id), val(state_dir) // run_context from CHECK_RUN_STATE - val _validation_complete // Gate: ensures validation passed - - output: - path "fasta_labkey_upload.log", emit: log - - script: - def sample_set_arg = sample_set_id ? "--sample-set-id '${sample_set_id}'" : "" - def state_dir_arg = state_dir ? "--state-dir '${state_dir}'" : "" - def run_id_arg = run_id ? "--run-id '${run_id}'" : "" - """ - labkey_upload_gottcha2_full.py \ - --input-tsv ${full_tsv} \ - --sample ${sample_id} \ - --experiment '${experiment_id}' \ - ${sample_set_arg} \ - ${state_dir_arg} \ - ${run_id_arg} \ - --labkey-server '${params.labkey_server}' \ - --labkey-project-name '${params.labkey_project_name}' \ - --labkey-api-key \$LABKEY_API_KEY \ - --db-version ${params.gottcha2_db_version} \ - --labkey-schema '${params.labkey_schema}' \ - --table-name '${params.labkey_gottcha_full_list}' \ - """ -} - -process LABKEY_UPLOAD_GOTTCHA2_FASTA { - - label 'low' - tag "${sample_id}" - - secret 'LABKEY_API_KEY' - - input: - tuple val(sample_id), path(fasta), path(full_tsv) - val experiment_id - val run_id - tuple val(sample_set_id), val(state_dir) // run_context from CHECK_RUN_STATE - val _validation_complete // Gate: ensures validation passed - - output: - path("${sample_id}_df.tsv"), emit: log - - script: - def sample_set_arg = sample_set_id ? "--sample_set_id '${sample_set_id}'" : "" - def state_dir_arg = state_dir ? "--state_dir '${state_dir}'" : "" - """ - labkey_upload_gottcha2_fasta.py \ - --fasta ${fasta} \ - --sample_id ${sample_id} \ - --output_tsv ${sample_id}_df.tsv \ - --server ${params.labkey_server} \ - --experiment_id ${experiment_id} \ - --container ${params.labkey_project_name} \ - --list ${params.labkey_gottcha_fasta_list} \ - --api_key \$LABKEY_API_KEY \ - --batch_size 10000 \ - --notes "NVD2 upload" \ - --run_id '${run_id}' \ - ${sample_set_arg} \ - ${state_dir_arg} \ - """ -} - -// Process to upload Gottcha2 report and extracted fastas -process LABKEY_WEBDAV_UPLOAD_FILES { - - tag "${sample_id}" - - secret 'LABKEY_API_KEY' - - input: - tuple val(sample_id), path(fasta), path(full_tsv) - val experiment_id - val _validation_complete // Gate: ensures validation passed - - output: - tuple val(sample_id), path("${fasta}.gz"), path("${full_tsv}.gz") - - script: - """ - gzip -c ${fasta} > ${fasta}.gz - gzip -c ${full_tsv} > ${full_tsv}.gz - - # Upload tabular Gottcha2 report - webdav_CLIent.py \ - --password \$LABKEY_API_KEY \ - --server ${params.labkey_webdav} \ - upload ${full_tsv}.gz ${experiment_id}/${sample_id}/gottcha2/${full_tsv}.gz - - # Upload fasta file - webdav_CLIent.py \ - --password \$LABKEY_API_KEY \ - --server ${params.labkey_webdav} \ - upload ${fasta}.gz ${experiment_id}/${sample_id}/gottcha2/${fasta}.gz - """ -} diff --git a/subworkflows/extract_human_virus_contigs.nf b/subworkflows/extract_human_virus_contigs.nf index c32f67d..7296861 100644 --- a/subworkflows/extract_human_virus_contigs.nf +++ b/subworkflows/extract_human_virus_contigs.nf @@ -1,79 +1,27 @@ -include { - CLASSIFY_CONTIGS_FIRST_PASS ; - GENERATE_CONTIGS_TAXA_LIST ; - CLASSIFY_CONTIGS_SECOND_PASS ; - GENERATE_STAT_CONTIG_REPORT ; - IDENTIFY_HUMAN_VIRUS_FAMILY_CONTIGS -} from "../modules/stat" -include { EXTRACT_HUMAN_VIRUS_CONTIGS } from "../modules/seqkit" -include { MAP_READS_TO_CONTIGS } from "../modules/minimap2" -include { COUNT_MAPPED_READS } from "../modules/samtools" +include { DEACON_FILTER_CONTIGS } from "../modules/deacon" +include { MAP_READS_TO_CONTIGS } from "../modules/minimap2" +include { COUNT_MAPPED_READS } from "../modules/samtools" workflow EXTRACT_HUMAN_VIRUSES { take: - ch_filtered_contigs // tuple(sample_id, platform, read_structure, fasta) from PREPROCESS_CONTIGS - ch_viral_reads // tuple(sample_id, platform, read_structure, fastq) from EXTRACT_HUMAN_VIRUS_READS - ch_stat_dbs - ch_stat_dbss - ch_stat_annotation - ch_state_dir // value channel: state directory path (may be null in stateless mode) - ch_taxonomy_dir // value channel: taxonomy directory path for taxonomy lookups + ch_filtered_contigs // tuple(sample_id, platform, read_structure, fasta) from PREPROCESS_CONTIGS + ch_viral_reads // tuple(sample_id, platform, read_structure, fastq) from DEACON_FILTER_HUMAN_VIRUS_READS + ch_virus_index // path: pre-built or freshly-built virus deacon index main: - CLASSIFY_CONTIGS_FIRST_PASS( - ch_filtered_contigs.combine(ch_stat_dbs) + // Filter assembled contigs to those sharing k-mers with the virus index. + // Collapses the former 5-process STAT classification chain into one step. + DEACON_FILTER_CONTIGS( + ch_filtered_contigs.combine(ch_virus_index) ) - GENERATE_CONTIGS_TAXA_LIST( - CLASSIFY_CONTIGS_FIRST_PASS.out - .filter { _id, _contigs, hits_file -> - hits_file.size() > 0 && hits_file.readLines().size() > 0 - } - ) - - CLASSIFY_CONTIGS_SECOND_PASS( - GENERATE_CONTIGS_TAXA_LIST.out - .combine(ch_stat_dbss) - .combine(ch_stat_annotation) - ) - - GENERATE_STAT_CONTIG_REPORT( - CLASSIFY_CONTIGS_SECOND_PASS.out - .filter { _id, hits_file -> - hits_file.size() > 0 && hits_file.readLines().size() > 0 - }, - ch_state_dir, - ch_taxonomy_dir - ) - - IDENTIFY_HUMAN_VIRUS_FAMILY_CONTIGS( - CLASSIFY_CONTIGS_SECOND_PASS.out - .filter { _id, hits_file -> - hits_file.size() > 0 && hits_file.readLines().size() > 0 - }, - ch_state_dir, - ch_taxonomy_dir - ) - - EXTRACT_HUMAN_VIRUS_CONTIGS( - IDENTIFY_HUMAN_VIRUS_FAMILY_CONTIGS.out - .filter { _id, hits_file -> - hits_file.size() > 0 && hits_file.readLines().size() > 0 - } - .join( - ch_filtered_contigs - .map { id, _platform, _read_structure, contigs -> tuple(id, file(contigs)) }, - by: 0 - ) - ) - - // Pass through the extracted virus reads from STAT and align them to the assembled and QC-checked - // SPAdes contigs that have been identified as human-infecting virus family members. - // Join viral reads with extracted contigs by sample_id + // Align virus reads back to the deacon-filtered virus contigs to get + // per-contig read depth. Join by sample_id so each sample's reads + // are mapped to its own contigs. ch_reads_with_contigs = ch_viral_reads .map { sample_id, platform, _read_structure, reads -> tuple(sample_id, platform, reads) } .join( - EXTRACT_HUMAN_VIRUS_CONTIGS.out.map { sample_id, contigs -> tuple(sample_id, contigs) }, + DEACON_FILTER_CONTIGS.out.map { sample_id, contigs -> tuple(sample_id, contigs) }, by: 0 ) // Result: [sample_id, platform, reads, contigs] @@ -83,7 +31,6 @@ workflow EXTRACT_HUMAN_VIRUSES { COUNT_MAPPED_READS(MAP_READS_TO_CONTIGS.out) emit: - contigs = EXTRACT_HUMAN_VIRUS_CONTIGS.out + contigs = DEACON_FILTER_CONTIGS.out contig_read_counts = COUNT_MAPPED_READS.out.mapped_counts - } diff --git a/subworkflows/host_depletion.nf b/subworkflows/host_depletion.nf deleted file mode 100644 index 0cbf870..0000000 --- a/subworkflows/host_depletion.nf +++ /dev/null @@ -1,67 +0,0 @@ -include { DEACON_BUILD_INDEX ; DEACON_FETCH_INDEX ; DEACON_UNION_INDEXES ; DEACON_DEPLETE } from "../modules/deacon" - -workflow HOST_DEPLETION { - /* - * Orchestrates deacon-based host/contaminant depletion. - * - * Index resolution priority: - * 1. params.deacon_index (explicit local path) - * 2. params.deacon_index_url (download prebuilt, e.g., panhuman-1) - * 3. params.deacon_contaminants_fasta (build from FASTA at runtime) - * - * If both a base index (local or URL) and deacon_contaminants_fasta are provided, - * the indexes are unioned to combine panhuman with custom contaminants. - * - * Uses declarative channel ternaries so the DAG is consistent across runs, - * matching the pattern in preprocess_reads.nf. - */ - - take: - ch_reads // tuple(sample_id, platform, read_structure, reads) - - main: - // --- Resolve base index --- - // Explicit local path takes priority over URL download. - // Both produce a channel of one .idx file; unused path emits nothing. - ch_local_index = params.deacon_index - ? Channel.fromPath(params.deacon_index) - : Channel.empty() - - ch_fetch_url = (!params.deacon_index && params.deacon_index_url) - ? Channel.of(params.deacon_index_url) - : Channel.empty() - - DEACON_FETCH_INDEX(ch_fetch_url) - - ch_base_index = ch_local_index.mix(DEACON_FETCH_INDEX.out.index) - - // --- Build custom index from FASTA if provided --- - ch_custom_fasta = params.deacon_contaminants_fasta - ? Channel.fromPath(params.deacon_contaminants_fasta) - : Channel.empty() - - DEACON_BUILD_INDEX(ch_custom_fasta) - ch_custom_index = DEACON_BUILD_INDEX.out.index - - // --- Combine indexes if both base and custom are present --- - def needs_union = params.deacon_contaminants_fasta && (params.deacon_index || params.deacon_index_url) - - ch_union_input = needs_union - ? ch_base_index.mix(ch_custom_index).collect() - : Channel.empty() - - DEACON_UNION_INDEXES(ch_union_input) - - ch_index = needs_union - ? DEACON_UNION_INDEXES.out.index - : params.deacon_contaminants_fasta - ? ch_custom_index - : ch_base_index - - // --- Run depletion --- - DEACON_DEPLETE(ch_reads.combine(ch_index)) - - emit: - reads = DEACON_DEPLETE.out.reads - stats = DEACON_DEPLETE.out.stats -} diff --git a/subworkflows/preprocess_contigs.nf b/subworkflows/preprocess_contigs.nf index 78bdc43..f3781b3 100644 --- a/subworkflows/preprocess_contigs.nf +++ b/subworkflows/preprocess_contigs.nf @@ -1,23 +1,16 @@ -include { EXTRACT_HUMAN_VIRUS_READS } from "../modules/stat" include { MASK_LOW_COMPLEXITY ; FILTER_SHORT_CONTIGS } from "../modules/bbmap" include { RUN_SPADES } from "../modules/spades" workflow PREPROCESS_CONTIGS { take: - ch_sample_fastqs // tuple(sample_id, platform, read_structure, fastq) - ch_stat_dbss - ch_stat_annotation - ch_human_virus_taxlist + ch_sample_fastqs // tuple(sample_id, platform, read_structure, fastq) — already virus-filtered and preprocessed main: - - // Uses STAT to get fastq records that map to specific human-infecting viruses - EXTRACT_HUMAN_VIRUS_READS( - ch_sample_fastqs.combine(ch_stat_dbss).combine(ch_stat_annotation).combine(ch_human_virus_taxlist) - ) + // Assemble virus reads into contigs with SPAdes. + // Filter out samples with fewer than 100 reads (insufficient for assembly). RUN_SPADES( - EXTRACT_HUMAN_VIRUS_READS.out + ch_sample_fastqs .map { id, platform, read_structure, fq -> tuple(id, platform, read_structure, fq, file(fq).countFastq()) } .filter { _id, _platform, _read_structure, _fq, count -> count >= 100 } .map { id, platform, read_structure, fq, _count -> tuple(id, platform, read_structure, file(fq)) } @@ -39,5 +32,5 @@ workflow PREPROCESS_CONTIGS { emit: contigs = ch_filtered_contigs // tuple(sample_id, platform, read_structure, fasta) - viral_reads = EXTRACT_HUMAN_VIRUS_READS.out // tuple(sample_id, platform, read_structure, fastq) + viral_reads = ch_sample_fastqs // the incoming reads ARE the viral reads (extracted upstream) } diff --git a/subworkflows/validate_lk_gottcha2_lists.nf b/subworkflows/validate_lk_gottcha2_lists.nf deleted file mode 100644 index 7de45e1..0000000 --- a/subworkflows/validate_lk_gottcha2_lists.nf +++ /dev/null @@ -1,54 +0,0 @@ -workflow VALIDATE_LK_GOTTCHA2 { - - main: - VALIDATE_GOTTCHA2_FULL_LIST() - VALIDATE_GOTTCHA2_FASTA_LIST() - - emit: - validated = VALIDATE_GOTTCHA2_FULL_LIST.out - .mix(VALIDATE_GOTTCHA2_FASTA_LIST.out) - .collect() -} - -/* -This workflow is basically a duplicate of validate_lk_blast_lists.nf. -Refer to that workflow for more notes. -*/ - -process VALIDATE_GOTTCHA2_FULL_LIST { - label 'low' - secret 'LABKEY_API_KEY' - - output: - path 'gottcha2_full_validation_report.txt' - - script: - """ - validate_labkey.py \ - --server '${params.labkey_server}' \ - --container '${params.labkey_project_name}' \ - --list '${params.labkey_gottcha_full_list}' \ - --api_key \$LABKEY_API_KEY \ - --experiment_id ${params.experiment_id} \ - --type gottcha2_full > gottcha2_full_validation_report.txt 2>&1 - """ -} - -process VALIDATE_GOTTCHA2_FASTA_LIST { - label 'low' - secret 'LABKEY_API_KEY' - - output: - path 'gottcha2_fasta_validation_report.txt' - - script: - """ - validate_labkey.py \\ - --server '${params.labkey_server}' \\ - --container '${params.labkey_project_name}' \\ - --list '${params.labkey_gottcha_fasta_list}' \\ - --api_key \$LABKEY_API_KEY \\ - --experiment_id ${params.experiment_id} \\ - --type gottcha2_fasta > gottcha2_fasta_validation_report.txt 2>&1 - """ -} diff --git a/tests/data/hits_only_R1.fastq.gz b/tests/data/hits_only_R1.fastq.gz new file mode 100644 index 0000000..3b1c685 Binary files /dev/null and b/tests/data/hits_only_R1.fastq.gz differ diff --git a/tests/data/hits_only_R2.fastq.gz b/tests/data/hits_only_R2.fastq.gz new file mode 100644 index 0000000..bcbfbe9 Binary files /dev/null and b/tests/data/hits_only_R2.fastq.gz differ diff --git a/tests/data/water_R1.fastq.gz b/tests/data/water_R1.fastq.gz new file mode 100644 index 0000000..49564b7 Binary files /dev/null and b/tests/data/water_R1.fastq.gz differ diff --git a/tests/data/water_R2.fastq.gz b/tests/data/water_R2.fastq.gz new file mode 100644 index 0000000..dbccc05 Binary files /dev/null and b/tests/data/water_R2.fastq.gz differ diff --git a/tests/data/water_plus_hits_R1.fastq.gz b/tests/data/water_plus_hits_R1.fastq.gz new file mode 100644 index 0000000..d10f9cb Binary files /dev/null and b/tests/data/water_plus_hits_R1.fastq.gz differ diff --git a/tests/data/water_plus_hits_R2.fastq.gz b/tests/data/water_plus_hits_R2.fastq.gz new file mode 100644 index 0000000..f2b56f7 Binary files /dev/null and b/tests/data/water_plus_hits_R2.fastq.gz differ diff --git a/uv.lock b/uv.lock index 11d721f..c0494b8 100644 --- a/uv.lock +++ b/uv.lock @@ -1503,7 +1503,7 @@ wheels = [ [[package]] name = "nvd" -version = "2.5.0" +version = "3.0.0" source = { editable = "." } dependencies = [ { name = "biopython" }, diff --git a/workflows/clumpify.nf b/workflows/clumpify.nf deleted file mode 100644 index 1921d91..0000000 --- a/workflows/clumpify.nf +++ /dev/null @@ -1,37 +0,0 @@ -include { CLUMP_READS } from "../modules/bbmap" -include { DEACON_FETCH_INDEX } from "../modules/deacon" -include { DEACON_DEPLETE } from "../modules/deacon" - -workflow CLUMPIFY_WORKFLOW { - take: - ch_gathered_reads // tuple(sample_id, platform, read_structure, fastq) - ch_start_gate - - main: - def gated_reads = ch_gathered_reads - .combine(ch_start_gate) - .map { it[0..-2] } - - // Reorder reads by kmer similarity for better compression. - // Full 4-element tuple passes through so DEACON_DEPLETE can consume it directly. - CLUMP_READS(gated_reads) - - // --- Host read depletion with deacon --- - // Resolve deacon index: local path takes priority over URL download - ch_local_index = params.deacon_index - ? Channel.fromPath(params.deacon_index) - : Channel.empty() - - ch_fetch_url = (!params.deacon_index && params.deacon_index_url) - ? Channel.of(params.deacon_index_url) - : Channel.empty() - - DEACON_FETCH_INDEX(ch_fetch_url) - - ch_index = ch_local_index.mix(DEACON_FETCH_INDEX.out.index) - - // DEACON_DEPLETE expects tuple(sample_id, platform, read_structure, reads, index) - DEACON_DEPLETE( - CLUMP_READS.out.combine(ch_index) - ) -} diff --git a/workflows/gather_reads.nf b/workflows/gather_reads.nf index b2c028a..80acb87 100644 --- a/workflows/gather_reads.nf +++ b/workflows/gather_reads.nf @@ -1,5 +1,4 @@ include { FETCH_FASTQ } from "../modules/sratools" -include { INTERLEAVE_PAIRS ; MERGE_PAIRS } from "../modules/bbmap" workflow GATHER_READS { @@ -21,71 +20,52 @@ workflow GATHER_READS { .filter { _id, srr, _platform, fastq1, fastq2 -> (srr == null || srr == "") && fastq1 != null && fastq1 != "" && fastq2 != null && fastq2 != "" } - .map { id, _srr, platform, fastq1, fastq2 -> tuple( id, platform, fastq1, fastq2 )} + .map { id, _srr, platform, fastq1, fastq2 -> tuple(id, platform, fastq1, fastq2) } ch_known_single = ch_samplesheet_row .filter { _id, srr, _platform, fastq1, fastq2 -> (srr == null || srr == "") && fastq1 != null && fastq1 != "" && (fastq2 == null || fastq2 == "") } - .map { id, _srr, platform, fastq1, _fastq2 -> tuple(id, platform, "single", file(fastq1))} + .map { id, _srr, platform, fastq1, _fastq2 -> tuple(id, platform, file(fastq1)) } FETCH_FASTQ(ch_sra_accessions) - // split the output FASTQs from the SRA download into two channels, where one + // Split the output FASTQs from the SRA download into two channels, where one // contains paired-end libraries with >=2 FASTQs, and the other contains the rest ch_sorted_fastqs = FETCH_FASTQ.out .branch { sample_id, platform, fastq_files -> - // If there's just one FASTQ, "unpack" it from the array returned by the glob single: fastq_files.size() == 1 - return tuple(sample_id, platform, "single", file(fastq_files[0])) + return tuple(sample_id, platform, file(fastq_files[0])) - // If there are two FASTQs, expect that the alphanumeric first will end with ".1.fastq" and the second with ".2.fastq", - // which is a (mostly) reliable SRA convention paired: fastq_files.size() > 1 && file(fastq_files[0]).getName().endsWith("1.fastq") && file(fastq_files[1]).getName().endsWith("2.fastq") return tuple(sample_id, platform, file(fastq_files[0]), file(fastq_files[1])) - // There are a couple common cases of >2 FASTQs per accession that we can handle. The first is where the first two files - // end with "1.fastq" and ".2.fastq" and the third ends with "3.fastq". Assuming correct alphanumeric sorting, we handle - // that in this branch. triple1: fastq_files.size() > 2 && file(fastq_files[0]).getName().endsWith("1.fastq") && file(fastq_files[1]).getName().endsWith("2.fastq") return tuple(sample_id, platform, file(fastq_files[0]), file(fastq_files[1])) - // It's also possible that the third, non-R1/R2 reads are in a FASTQ that doesn't have a numbered suffix, e.g., - // SRR33146255.fastq. When that's the case, that third FASTQ will end up first when the files are sorted by name. - // We handle that case in this branch by indexing out the second and third FASTQ (groovy/nextflow are 0-indexed) triple2: fastq_files.size() > 2 && file(fastq_files[1]).getName().endsWith("1.fastq") && file(fastq_files[2]).getName().endsWith("2.fastq") return tuple(sample_id, platform, file(fastq_files[1]), file(fastq_files[2])) - // Other cases are as-yet unsupported other: true } - - // SEPARATE OUT SETS OF FASTQS THAT WILL NEED TO BE MERGED OR INTERLEAVED - // ***************************************************************************/ ch_to_be_paired = ch_known_pairs.mix( ch_sorted_fastqs.paired, ch_sorted_fastqs.triple1, ch_sorted_fastqs.triple2 ) - - // MERGE OR INTERLEAVE ANY PAIRED READS - // ***************************************************************************/ - ch_combined_fastqs = params.merge_pairs - ? MERGE_PAIRS(ch_to_be_paired) - : INTERLEAVE_PAIRS(ch_to_be_paired) - - - // MIX READS FROM DIFFERENT PLATFORMS AND EMIT - // ***************************************************************************/ - ch_gathered_reads = ch_known_single.mix( - ch_combined_fastqs, + // Emit raw reads — no interleaving. Deacon handles R1/R2 directly + // and outputs interleaved as a byproduct of virus filtering. + // Paired: tuple(id, platform, R1, R2) + // Single: tuple(id, platform, fastq) + ch_raw_reads = ch_to_be_paired.mix( + ch_known_single, ch_sorted_fastqs.single ) emit: - ch_gathered_reads + ch_raw_reads } diff --git a/workflows/gottcha2_workflow.nf b/workflows/gottcha2_workflow.nf deleted file mode 100644 index 6aa9b9d..0000000 --- a/workflows/gottcha2_workflow.nf +++ /dev/null @@ -1,222 +0,0 @@ -include { - GOTTCHA2_PROFILE_NANOPORE ; - GOTTCHA2_PROFILE_ILLUMINA ; - GENERATE_FASTA ; - REGISTER_GOTTCHA2_HITS -} from "../modules/gottcha2" -include { - VALIDATE_LK_GOTTCHA2 -} from '../subworkflows/validate_lk_gottcha2_lists' -include { - BUNDLE_GOTTCHA2_FOR_LABKEY -} from "../subworkflows/bundle_gottcha2_for_labkey" -include { SANITIZE_EXTRACTED_FASTA } from "../modules/bbmap" -include { CHECK_RUN_STATE; COMPLETE_RUN } from "../modules/utils" -include { CHECK_MIN_READS } from "../modules/count_reads" - - -workflow GOTTCHA2_WORKFLOW { - take: - ch_sample_fastqs // Queue channel: tuple val(sample_id), val(platform), val(read_structure), path(fastq) - - main: - // Determine whether GOTTCHA2 was selected by the user. - def gottcha_selected = NvdUtils.isToolSelected(params, 'gottcha') - - // Validate required params when GOTTCHA2 is selected - if (gottcha_selected) { - assert ( - params.gottcha2_db && - file("${params.gottcha2_db}.mmi").exists() && - file("${params.gottcha2_db}.stats").exists() && - file("${params.gottcha2_db}.tax.tsv").exists() - ) : - """ - One or more required GOTTCHA2 database files are missing or gottcha2_db is not set: - - gottcha2_db -> ${params.gottcha2_db} - gottcha2_db.mmi -> ${params.gottcha2_db ? params.gottcha2_db + '.mmi' : 'N/A'} - gottcha2_db.stats -> ${params.gottcha2_db ? params.gottcha2_db + '.stats' : 'N/A'} - gottcha2_db.tax.tsv -> ${params.gottcha2_db ? params.gottcha2_db + '.tax.tsv' : 'N/A'} - - Please supply --gottcha2_db in your config or command line, pointing to the - GOTTCHA2 database prefix (without extension). The .mmi, .stats, and .tax.tsv - companion files must exist at that prefix. - """ - - NvdUtils.validateLabkeyGottcha2(params) - } - - // Signal channel: emits true when gottcha is selected, empty otherwise. - // This single signal gates both state-management processes (CHECK_RUN_STATE, - // COMPLETE_RUN) and data-processing processes (profiling, FASTA generation). - // When empty, combine() produces nothing, so downstream processes remain in - // the DAG but never execute. - ch_gottcha_enabled = gottcha_selected - ? Channel.value(true) - : Channel.empty() - - // Resolve directories for stateful vs stateless mode. - // Returns absolute path strings (not Nextflow path objects) to avoid staging. - dirs = NvdDirs.resolve(params, log) - - // Gate CHECK_RUN_STATE: combine with the tool-selection signal so the input - // tuple only emits when gottcha is selected. When empty, CHECK_RUN_STATE - // remains in the DAG but never executes. - ch_run_state_input = ch_gottcha_enabled - .combine(Channel.fromPath(params.samplesheet)) - .combine(Channel.value(dirs.state_dir)) - .combine(Channel.value(dirs.taxonomy_dir)) - .map { _flag, samplesheet, state_dir, taxonomy_dir -> - tuple(samplesheet, state_dir, taxonomy_dir) - } - - // Check run state upfront (prevents duplicate processing of same sample set) - CHECK_RUN_STATE(ch_run_state_input, "gottcha2,gottcha2_fasta") - - // Convert run_context from queue channel to value channel so it can be - // consumed by multiple processes (hit registration, LabKey uploads, etc.). - ch_run_context = CHECK_RUN_STATE.out.run_context.first() - - // Extract state_dir from run_context for state-tracking processes - ch_state_dir = ch_run_context.map { _sample_set_id, state_dir -> state_dir } - - // Create value channel for hits_dir - ch_hits_dir = Channel.value(dirs.hits_dir) - - // Guard channel declaration with ternary fallback to Channel.empty(). - // When --tools doesn't include 'gottcha', this param is null. - // Empty channel maintains the DAG but results in no-op downstream processes. - ch_gottcha2_db = params.gottcha2_db - ? Channel - .fromPath("${params.gottcha2_db}{.tax.tsv,.stats,.mmi}") - .collect() - .map { files -> - def ref_mmi = files.find { it.name.endsWith(".mmi") } - def stats = files.find { it.name.endsWith(".stats") } - def tax_tsv = files.find { it.name.endsWith(".tax.tsv") } - tuple(ref_mmi, stats, tax_tsv) - } - : Channel.empty() - - // Gate sample channel: when gottcha is not selected, ch_gottcha_enabled is - // empty, so the combine produces nothing and no downstream operations execute. - ch_gated_samples = ch_gottcha_enabled - .combine(ch_sample_fastqs) - .map { _flag, sample_id, platform, read_structure, fastq -> - tuple(sample_id, platform, read_structure, fastq) - } - - // LabKey validation: no-input subworkflow, gated by tool selection - if (params.labkey && gottcha_selected) { - VALIDATE_LK_GOTTCHA2() - } - - // Check minimum read threshold on a compute node instead of using - // countFastq() on the head node. countFastq() decompresses entire gzipped - // FASTQs in the Nextflow process, blocking indefinitely for large files on - // networked storage. CHECK_MIN_READS only reads up to min_reads records - // before stopping — O(threshold) instead of O(file_size). - CHECK_MIN_READS(ch_gated_samples) - - // Join threshold check back to samples and filter out those below minimum - ch_passing_samples = ch_gated_samples - .map { sample_id, platform, _read_structure, fastq -> tuple(sample_id, platform, fastq) } - .join(CHECK_MIN_READS.out.counts) - .filter { _sample_id, _platform, _fastq, read_count -> (read_count as Integer) >= params.min_gottcha_reads } - - ch_nanopore_fastqs = ch_passing_samples - .filter { _sample_id, platform, _fastq, _read_count -> platform == "nanopore" || platform == "ont" } - .map { sample_id, _platform, fastq, _read_count -> tuple(sample_id, file(fastq)) } - - ch_illumina_fastqs = ch_passing_samples - .filter { _sample_id, platform, _fastq, _read_count -> platform == "illumina" } - .map { sample_id, _platform, fastq, _read_count -> tuple(sample_id, file(fastq)) } - - GOTTCHA2_PROFILE_NANOPORE( - ch_nanopore_fastqs.combine(ch_gottcha2_db) - ) - - GOTTCHA2_PROFILE_ILLUMINA( - ch_illumina_fastqs.combine(ch_gottcha2_db) - ) - - GENERATE_FASTA( - GOTTCHA2_PROFILE_NANOPORE.out.aligned.mix(GOTTCHA2_PROFILE_ILLUMINA.out.aligned) - ) - - ch_extracted_fasta = GENERATE_FASTA.out - .map { id, fasta, full_tsv, _log, _lineages -> tuple(id, fasta, full_tsv) } - - SANITIZE_EXTRACTED_FASTA(ch_extracted_fasta) - - // Register GOTTCHA2 hits with idempotent keys in the state database. - // Join sanitized FASTA with run context and hits_dir. - ch_register_gottcha2_input = SANITIZE_EXTRACTED_FASTA.out - .combine(ch_run_context) - .combine(ch_hits_dir) - .map { sample_id, fasta, full_tsv, sample_set_id, state_dir, hits_dir -> - tuple(sample_id, fasta, full_tsv, sample_set_id, state_dir, hits_dir) - } - - REGISTER_GOTTCHA2_HITS(ch_register_gottcha2_input) - - if (params.labkey && gottcha_selected) { - // Build validation gate: both state check and LabKey validation must pass - // before any uploads proceed. Matches stat_blast_workflow pattern. - ch_validation_gate = CHECK_RUN_STATE.out.ready - .combine(VALIDATE_LK_GOTTCHA2.out.validated) - .map { _ready, _validated -> true } - .first() - - // LabKey upload channels - ch_gottcha2_results_for_labkey = GOTTCHA2_PROFILE_NANOPORE.out.full_tsv - .mix(GOTTCHA2_PROFILE_ILLUMINA.out.full_tsv) - - ch_extracted_for_labkey = SANITIZE_EXTRACTED_FASTA.out - - BUNDLE_GOTTCHA2_FOR_LABKEY( - ch_gottcha2_results_for_labkey, - ch_extracted_for_labkey, - params.experiment_id, - workflow.runName, - ch_validation_gate, - ch_run_context - ) - - // Gate run completion on LabKey bundle completion - ch_run_complete_gate = BUNDLE_GOTTCHA2_FOR_LABKEY.out.upload_log.collect() - .map { _logs -> true } - - // Terminal channel for LabKey path - ch_terminal = BUNDLE_GOTTCHA2_FOR_LABKEY.out.upload_log - } else { - // Gate run completion on REGISTER_GOTTCHA2_HITS completion (all samples) - ch_run_complete_gate = REGISTER_GOTTCHA2_HITS.out.collect() - .map { _logs -> true } - - // Terminal channel for non-LabKey path - ch_terminal = REGISTER_GOTTCHA2_HITS.out - } - - // Mark the run as completed in the state database - COMPLETE_RUN( - ch_run_complete_gate, - ch_state_dir, - "completed" - ) - - // Completion signal: always emits exactly one value regardless of whether - // data flowed through the workflow. - // - // When gottcha is not selected: Channel.value() emits one token immediately. - // When gottcha is selected: count() waits for ch_terminal to close, then - // emits the number of items that flowed through (including 0 if all samples - // were filtered out). Either way, exactly one emission. - ch_completion = gottcha_selected - ? ch_terminal.count().map { n -> "GOTTCHA2 complete: ${n} samples processed" } - : Channel.value("GOTTCHA2 skipped: tool not selected") - - emit: - completion = ch_completion -} diff --git a/workflows/nvd_main.nf b/workflows/nvd_main.nf new file mode 100644 index 0000000..931fb11 --- /dev/null +++ b/workflows/nvd_main.nf @@ -0,0 +1,310 @@ +/* + * NVD main workflow + * + * Human virus detection pipeline: deacon-based virus read extraction, + * preprocessing, SPAdes assembly, and two-phase BLAST verification. + * + * Architecture: deacon virus extraction runs first on raw R1/R2 reads + * (outputting interleaved), then preprocessing (dedup, trim, optional host depletion, filter) + * operates on the tiny virus subset, then SPAdes and BLAST. + */ + +nextflow.enable.dsl=2 + +include { DEACON_FETCH_INDEX as DEACON_FETCH_VIRUS_INDEX } from "../modules/deacon" +include { DEACON_FETCH_INDEX as DEACON_FETCH_HOST_INDEX } from "../modules/deacon" +include { DEACON_BUILD_VIRUS_INDEX_FROM_FASTA } from "../modules/deacon" +include { DEACON_BUILD_INDEX_FROM_FASTA } from "../modules/deacon" +include { DEACON_UNION_INDEXES } from "../modules/deacon" +include { DEACON_FILTER_HUMAN_VIRUS_READS } from "../modules/deacon" +include { DEACON_DEPLETE } from "../modules/deacon" +include { DEDUP_WITH_CLUMPIFY ; TRIM_ADAPTERS ; FILTER_READS ; REPAIR_PAIRS } from "../modules/bbmap" +include { PREPROCESS_CONTIGS } from "../subworkflows/preprocess_contigs" +include { EXTRACT_HUMAN_VIRUSES } from "../subworkflows/extract_human_virus_contigs" +include { CLASSIFY_WITH_MEGABLAST } from "../subworkflows/classify_with_megablast" +include { CLASSIFY_WITH_BLASTN } from "../subworkflows/classify_with_blastn" +include { BUNDLE_BLAST_FOR_LABKEY } from "../subworkflows/bundle_blast_for_labkey" +include { CHECK_RUN_STATE; REGISTER_HITS; COMPLETE_RUN; NOTIFY_SLACK; ADD_READ_COUNTS_TO_BLAST; CONCATENATE_EXPERIMENT_BLAST } from "../modules/utils" +include { VALIDATE_LK_BLAST } from "../subworkflows/validate_lk_blast_lists.nf" +include { VALIDATE_LK_EXP_FRESH } from "../modules/validate_blast_labkey.nf" +include { REGISTER_LK_EXPERIMENT } from "../modules/validate_blast_labkey.nf" + + +workflow NVD_MAIN { + take: + ch_sample_fastqs // Queue channel: pre-interleave tuples from GATHER_READS + // Paired: tuple(sample_id, platform, R1, R2) + // Single: tuple(sample_id, platform, fastq) + + main: + + // Validate required params + assert ( + params.blast_db && file(params.blast_db).isDirectory() && + (params.virus_index || params.virus_index_url || params.virus_reference_fasta) + ) : + """ + One or more required parameters are missing or point to non-existent files: + + blast_db -> ${params.blast_db} + virus_index / virus_index_url / virus_reference_fasta: at least one must be set + + Please supply the above in your `-c nextflow.config` or via `-params-file`. + """ + + if (params.labkey) { + NvdUtils.validateLabkeyBlast(params) + } + + // Reference channels + ch_blast_db_files = Channel.fromPath(params.blast_db) + + // Resolve directories for stateful vs stateless mode. + dirs = NvdDirs.resolve(params, log) + + // Check run state upfront (prevents duplicate processing of same sample set) + ch_run_state_input = Channel.fromPath(params.samplesheet) + .combine(Channel.value(dirs.state_dir)) + .combine(Channel.value(dirs.taxonomy_dir)) + + CHECK_RUN_STATE(ch_run_state_input, "blast,blast_fasta") + + if (params.labkey) { + VALIDATE_LK_BLAST() + } + + // Normalize mixed-size tuples from GATHER_READS: + // Paired: (id, platform, R1, R2) -> (id, platform, R1, R2) + // Single: (id, platform, fastq) -> (id, platform, fastq, NO_R2) + // The sentinel file NO_R2 lets DEACON_FILTER_HUMAN_VIRUS_READS distinguish + // paired from single-end input with a fixed-size tuple. + ch_normalized_samples = ch_sample_fastqs + .map { items -> + if (items.size() == 4) + tuple(items[0], items[1], file(items[2]), file(items[3])) + else + tuple(items[0], items[1], file(items[2]), file("NO_R2")) + } + + // ------------------------------------------------------------------------- + // Step 1: Resolve virus index and frontloaded extraction + // ------------------------------------------------------------------------- + // Priority: explicit local path → URL download → build from reference FASTA. + // Each condition guards against the higher-priority source being set, so at + // most one channel is non-empty and the mix passes through exactly one index. + ch_local_virus_index = params.virus_index + ? Channel.fromPath(params.virus_index) + : Channel.empty() + ch_virus_fetch_url = (!params.virus_index && params.virus_index_url) + ? Channel.of(params.virus_index_url) + : Channel.empty() + ch_virus_ref_fasta = (!params.virus_index && !params.virus_index_url && params.virus_reference_fasta) + ? Channel.fromPath(params.virus_reference_fasta) + : Channel.empty() + + DEACON_FETCH_VIRUS_INDEX(ch_virus_fetch_url) + DEACON_BUILD_VIRUS_INDEX_FROM_FASTA(ch_virus_ref_fasta) + + ch_virus_index = ch_local_virus_index + .mix(DEACON_FETCH_VIRUS_INDEX.out.index) + .mix(DEACON_BUILD_VIRUS_INDEX_FROM_FASTA.out.index) + + // Extract virus reads — runs BEFORE any preprocessing. For paired reads, + // deacon takes R1/R2 and outputs interleaved FASTQ in one step. + DEACON_FILTER_HUMAN_VIRUS_READS( + ch_normalized_samples.combine(ch_virus_index) + ) + + // ------------------------------------------------------------------------- + // Step 2: Inlined preprocessing on virus-only reads + // ------------------------------------------------------------------------- + ch_virus_reads = DEACON_FILTER_HUMAN_VIRUS_READS.out.reads + + // Extract total read counts from deacon summary JSON (replaces COUNT_READS). + // The seqs_in field is the total input read count across R1+R2. + ch_read_counts = DEACON_FILTER_HUMAN_VIRUS_READS.out.stats + .map { sample_id, json_file -> + def summary = new groovy.json.JsonSlurper().parse(json_file.toFile()) + tuple(sample_id, summary.seqs_in.toString()) + } + + // 2a. Dedup + def should_dedup_seq = params.dedup || params.dedup_seq + ch_after_dedup = should_dedup_seq + ? DEDUP_WITH_CLUMPIFY(ch_virus_reads) + : ch_virus_reads + + // 2b. Adapter trim (Illumina only) + ch_branched_for_trim = ch_after_dedup.branch { _id, platform, _rs, _reads -> + illumina: platform == "illumina" + other: true + } + ch_after_trim = params.trim_adapters + ? TRIM_ADAPTERS(ch_branched_for_trim.illumina).mix(ch_branched_for_trim.other) + : ch_after_dedup + + // 2c. Host/contaminant depletion with deacon (optional) + def has_host_config = params.host_index || params.host_index_url || params.host_contaminants_fasta + if (has_host_config) { + ch_local_host_index = params.host_index + ? Channel.fromPath(params.host_index) + : Channel.empty() + ch_host_fetch_url = (!params.host_index && params.host_index_url) + ? Channel.of(params.host_index_url) + : Channel.empty() + ch_host_contaminants_fasta = params.host_contaminants_fasta + ? Channel.fromPath(params.host_contaminants_fasta) + : Channel.empty() + + DEACON_FETCH_HOST_INDEX(ch_host_fetch_url) + DEACON_BUILD_INDEX_FROM_FASTA(ch_host_contaminants_fasta) + + ch_host_index_sources = ch_local_host_index + .mix(DEACON_FETCH_HOST_INDEX.out.index) + .mix(DEACON_BUILD_INDEX_FROM_FASTA.out.index) + .collect() + + DEACON_UNION_INDEXES(ch_host_index_sources) + ch_host_index = DEACON_UNION_INDEXES.out.index + + ch_after_scrub = DEACON_DEPLETE(ch_after_trim.combine(ch_host_index)).reads + } else { + ch_after_scrub = ch_after_trim + } + + // 2d. Quality/length filter + ch_with_quality = ch_after_scrub.map { sample_id, platform, read_structure, reads -> + def min_qual = platform == "illumina" + ? params.min_read_quality_illumina + : params.min_read_quality_nanopore + tuple(sample_id, platform, read_structure, reads, min_qual) + } + ch_after_filter = params.filter_reads + ? FILTER_READS(ch_with_quality) + : ch_after_scrub + + // 2e. Repair pairs (interleaved only) + ch_branched_for_repair = ch_after_filter.branch { _id, _p, read_structure, _r -> + interleaved: read_structure == "interleaved" + other: true + } + ch_repaired = REPAIR_PAIRS(ch_branched_for_repair.interleaved) + ch_preprocessed = ch_repaired.mix(ch_branched_for_repair.other) + + // ------------------------------------------------------------------------- + // Step 3: Assembly and classification + // ------------------------------------------------------------------------- + PREPROCESS_CONTIGS(ch_preprocessed) + + ch_run_context = CHECK_RUN_STATE.out.run_context.first() + ch_state_dir = ch_run_context.map { _sample_set_id, state_dir -> state_dir } + ch_taxonomy_dir = Channel.value(dirs.taxonomy_dir) + ch_hits_dir = Channel.value(dirs.hits_dir) + + EXTRACT_HUMAN_VIRUSES( + PREPROCESS_CONTIGS.out.contigs, + PREPROCESS_CONTIGS.out.viral_reads, + ch_virus_index + ) + + CLASSIFY_WITH_MEGABLAST( + EXTRACT_HUMAN_VIRUSES.out.contigs, + ch_blast_db_files, + ch_state_dir, + ch_taxonomy_dir + ) + + CLASSIFY_WITH_BLASTN( + CLASSIFY_WITH_MEGABLAST.out.filtered_megablast, + CLASSIFY_WITH_MEGABLAST.out.megablast_contigs, + ch_blast_db_files, + ch_state_dir, + ch_taxonomy_dir + ) + + // Add total read counts to the final merged BLAST results so they are + // always present in the published TSV, regardless of LabKey. + ch_blast_with_counts = CLASSIFY_WITH_BLASTN.out.merged_results + .join(ch_read_counts, by: 0) + + ADD_READ_COUNTS_TO_BLAST(ch_blast_with_counts) + + // Concatenate all per-sample final BLAST results into a single experiment-level TSV. + // Runs unconditionally so every run produces an experiment summary, not just LabKey runs. + CONCATENATE_EXPERIMENT_BLAST( + ADD_READ_COUNTS_TO_BLAST.out.map { _sample_id, tsv -> tsv }.collect() + ) + + // Register hits + ch_register_hits_input = EXTRACT_HUMAN_VIRUSES.out.contigs + .join(ADD_READ_COUNTS_TO_BLAST.out, by: 0) + .combine(ch_run_context) + .combine(ch_hits_dir) + .map { sample_id, contigs, blast_results, sample_set_id, state_dir, hits_dir -> + tuple(sample_id, contigs, blast_results, sample_set_id, state_dir, hits_dir) + } + + REGISTER_HITS(ch_register_hits_input) + + if (params.labkey) { + VALIDATE_LK_EXP_FRESH( + ADD_READ_COUNTS_TO_BLAST.out.first() + ) + + ch_validation_gate = CHECK_RUN_STATE.out.ready + .combine(VALIDATE_LK_EXP_FRESH.out.validated) + .map { _ready, _validated -> true } + .first() + + BUNDLE_BLAST_FOR_LABKEY( + ADD_READ_COUNTS_TO_BLAST.out, + EXTRACT_HUMAN_VIRUSES.out.contigs, + ch_read_counts, + params.experiment_id, + workflow.runName, + EXTRACT_HUMAN_VIRUSES.out.contig_read_counts, + ch_validation_gate, + ch_run_context + ) + + REGISTER_LK_EXPERIMENT( + BUNDLE_BLAST_FOR_LABKEY.out.upload_log.collect() + ) + + labkey_log_ch = BUNDLE_BLAST_FOR_LABKEY.out.upload_log + + ch_run_complete_gate = REGISTER_LK_EXPERIMENT.out.collect() + .map { _logs -> true } + + ch_terminal = REGISTER_LK_EXPERIMENT.out + } else { + labkey_log_ch = Channel.empty() + + ch_run_complete_gate = REGISTER_HITS.out.collect() + .map { _logs -> true } + + ch_terminal = REGISTER_HITS.out + } + + COMPLETE_RUN( + ch_run_complete_gate, + ch_state_dir, + "completed" + ) + + if (params.slack_enabled && params.slack_channel && params.labkey) { + ch_labkey_url = Channel.value( + "https://${params.labkey_server}/${params.labkey_project_name}/list-grid.view?name=${params.labkey_blast_meta_hits_list}" + ) + + NOTIFY_SLACK( + COMPLETE_RUN.out.done, + ch_run_context, + ch_labkey_url + ) + } + + emit: + completion = ch_terminal.count().map { n -> "NVD main workflow complete: ${n} samples processed" } + labkey_log = labkey_log_ch +} diff --git a/workflows/preprocess_reads.nf b/workflows/preprocess_reads.nf deleted file mode 100644 index 4c70a18..0000000 --- a/workflows/preprocess_reads.nf +++ /dev/null @@ -1,67 +0,0 @@ -include { DEDUP_WITH_CLUMPIFY ; TRIM_ADAPTERS ; FILTER_READS ; REPAIR_PAIRS } from "../modules/bbmap" -include { HOST_DEPLETION } from "../subworkflows/host_depletion" - -workflow PREPROCESS_READS { - take: - ch_fastq_tuple // tuple(sample_id, platform, read_structure, reads) - - main: - // Resolve optional step flags: explicit param wins, then umbrella, then master switch - def should_dedup = params.dedup_seq ?: params.dedup ?: params.preprocess - def should_trim = params.trim_adapters ?: params.preprocess - def should_scrub = params.scrub_host_reads ?: params.preprocess - def should_filter = params.filter_reads ?: params.preprocess - def should_repair = params.preprocess - - // 1. Dedup - ch_after_dedup = should_dedup - ? DEDUP_WITH_CLUMPIFY(ch_fastq_tuple) - : ch_fastq_tuple - - // 2. Adapter trim (Illumina only) - ch_branched_for_trim = ch_after_dedup.branch { _id, platform, _read_structure, _reads -> - illumina: platform == "illumina" - other: true - } - - ch_trimmed_illumina = should_trim - ? TRIM_ADAPTERS(ch_branched_for_trim.illumina) - : ch_branched_for_trim.illumina - - ch_after_trim = ch_trimmed_illumina.mix(ch_branched_for_trim.other) - - // 3. Host scrub with deacon - // Requires at least one of: deacon_index, deacon_index_url, deacon_contaminants_fasta - def has_deacon_config = params.deacon_index || params.deacon_index_url || params.deacon_contaminants_fasta - - ch_after_scrub = (should_scrub && has_deacon_config) - ? HOST_DEPLETION(ch_after_trim).reads - : ch_after_trim - - // 4. Quality/length filter (with platform-specific quality threshold) - ch_with_quality_threshold = ch_after_scrub.map { sample_id, platform, read_structure, reads -> - def min_qual = platform == "illumina" - ? params.min_read_quality_illumina - : params.min_read_quality_nanopore - tuple(sample_id, platform, read_structure, reads, min_qual) - } - - ch_after_filter = should_filter - ? FILTER_READS(ch_with_quality_threshold) - : ch_after_scrub - - // 5. Repair pairs (interleaved reads only) - fixes orphans from upstream steps - // Note: This works because deacon preserves CASAVA FASTQ headers - ch_branched_for_repair = ch_after_filter.branch { _id, _platform, read_structure, _reads -> - interleaved: read_structure == "interleaved" - other: true - } - - ch_repaired = should_repair - ? REPAIR_PAIRS(ch_branched_for_repair.interleaved) - : ch_branched_for_repair.interleaved - ch_preprocessed = ch_repaired.mix(ch_branched_for_repair.other) - - emit: - ch_preprocessed -} diff --git a/workflows/stat_blast_workflow.nf b/workflows/stat_blast_workflow.nf deleted file mode 100644 index 5542944..0000000 --- a/workflows/stat_blast_workflow.nf +++ /dev/null @@ -1,276 +0,0 @@ -/* - * STAT+BLAST Workflow - * - * Human virus detection using NCBI STAT for initial classification - * followed by two-phase BLAST verification (megablast + blastn). - * - * Historical note: Previously called "NVD" (Novel Virus Detection) workflow. - * Tool aliases: nvd, stat, blast, stat_blast, stast - */ - -nextflow.enable.dsl=2 - -include { PREPROCESS_CONTIGS } from "../subworkflows/preprocess_contigs" -include { EXTRACT_HUMAN_VIRUSES } from "../subworkflows/extract_human_virus_contigs" -include { CLASSIFY_WITH_MEGABLAST } from "../subworkflows/classify_with_megablast" -include { CLASSIFY_WITH_BLASTN } from "../subworkflows/classify_with_blastn" -include { BUNDLE_BLAST_FOR_LABKEY } from "../subworkflows/bundle_blast_for_labkey" -include { COUNT_READS } from "../modules/count_reads" -include { CHECK_RUN_STATE; REGISTER_HITS; COMPLETE_RUN; NOTIFY_SLACK } from "../modules/utils" -include { VALIDATE_LK_BLAST } from "../subworkflows/validate_lk_blast_lists.nf" -include { VALIDATE_LK_EXP_FRESH } from "../modules/validate_blast_labkey.nf" -include { REGISTER_LK_EXPERIMENT } from "../modules/validate_blast_labkey.nf" - - -workflow STAT_BLAST_WORKFLOW { - take: - ch_sample_fastqs // Queue channel: tuple val(sample_id), val(platform), val(read_structure), path(fastq) - - main: - // Determine whether STAT+BLAST was selected by the user. - def blast_selected = NvdUtils.isToolSelected(params, 'blast') - - // Validate required params when STAT+BLAST is selected - if (blast_selected) { - assert ( - params.blast_db && file(params.blast_db).isDirectory() && - params.stat_index && file(params.stat_index).exists() && - params.stat_dbss && file(params.stat_dbss).exists() && - params.stat_annotation && file(params.stat_annotation).exists() && - params.human_virus_taxlist && file(params.human_virus_taxlist).exists() - ) : - """ - One or more required parameters are missing or point to non-existent files: - - blast_db -> ${params.blast_db} - stat_index -> ${params.stat_index} - stat_dbss -> ${params.stat_dbss} - stat_annotation -> ${params.stat_annotation} - human_virus_taxlist -> ${params.human_virus_taxlist} - - Please supply all of the above in your `-c nextflow.config` or via `-params-file`, and ensure each path exists. - """ - - // Validate LabKey params required for STAT+BLAST if LabKey is enabled - NvdUtils.validateLabkeyBlast(params) - } - - // Signal channel: emits true when STAT+BLAST is selected, empty otherwise. - // This single signal gates both state-management processes (CHECK_RUN_STATE, - // COMPLETE_RUN) and data-processing processes (COUNT_READS, PREPROCESS_CONTIGS). - // When empty, combine() produces nothing, so downstream processes remain in - // the DAG but never execute. - ch_blast_enabled = blast_selected - ? Channel.value(true) - : Channel.empty() - - // Guard channel declarations with ternary fallback to Channel.empty(). - // When --tools doesn't include a BLAST alias, these params are null. - // Empty channels maintain the DAG but result in no-op downstream processes. - ch_blast_db_files = params.blast_db - ? Channel.fromPath(params.blast_db) - : Channel.empty() - ch_stat_index = params.stat_index - ? Channel.fromPath(params.stat_index) - : Channel.empty() - ch_stat_dbss = params.stat_dbss - ? Channel.fromPath(params.stat_dbss) - : Channel.empty() - ch_stat_annotation = params.stat_annotation - ? Channel.fromPath(params.stat_annotation) - : Channel.empty() - ch_human_virus_taxlist = params.human_virus_taxlist - ? Channel.fromPath(params.human_virus_taxlist) - : Channel.empty() - - // Resolve directories for stateful vs stateless mode. - // Returns absolute path strings (not Nextflow path objects) to avoid staging. - // See lib/NvdDirs.groovy for validation logic and error messages. - dirs = NvdDirs.resolve(params, log) - - // Gate CHECK_RUN_STATE: combine with the tool-selection signal so the input - // tuple only emits when STAT+BLAST is selected. When empty, CHECK_RUN_STATE - // remains in the DAG but never executes. - ch_run_state_input = ch_blast_enabled - .combine(Channel.fromPath(params.samplesheet)) - .combine(Channel.value(dirs.state_dir)) - .combine(Channel.value(dirs.taxonomy_dir)) - .map { _flag, samplesheet, state_dir, taxonomy_dir -> - tuple(samplesheet, state_dir, taxonomy_dir) - } - - // Check run state upfront (prevents duplicate processing of same sample set) - CHECK_RUN_STATE(ch_run_state_input, "blast,blast_fasta") - - if (params.labkey && blast_selected) { - VALIDATE_LK_BLAST() - } - - // Gate sample channel: when STAT+BLAST is not selected, ch_blast_enabled is - // empty, so the combine produces nothing and no downstream operations execute. - ch_gated_samples = ch_blast_enabled - .combine(ch_sample_fastqs) - .map { _flag, sample_id, platform, read_structure, fastq -> - tuple(sample_id, platform, read_structure, fastq) - } - - // Count reads for each sample - COUNT_READS(ch_gated_samples) - - PREPROCESS_CONTIGS( - ch_gated_samples, - ch_stat_dbss, - ch_stat_annotation, - ch_human_virus_taxlist - ) - - // Convert run_context from queue channel to value channel so it can be - // consumed by multiple processes (hit registration, LabKey uploads, etc.). - // This is safe because CHECK_RUN_STATE emits exactly once per pipeline run. - ch_run_context = CHECK_RUN_STATE.out.run_context.first() - - // Extract state_dir from run_context for state-tracking processes - // (run_context is a value channel: [sample_set_id, state_dir]) - ch_state_dir = ch_run_context.map { _sample_set_id, state_dir -> state_dir } - - // Create value channels for taxonomy_dir and hits_dir - // These are resolved at workflow start and broadcast to all consumers - ch_taxonomy_dir = Channel.value(dirs.taxonomy_dir) - ch_hits_dir = Channel.value(dirs.hits_dir) - - EXTRACT_HUMAN_VIRUSES( - PREPROCESS_CONTIGS.out.contigs, - PREPROCESS_CONTIGS.out.viral_reads, - ch_stat_index, - ch_stat_dbss, - ch_stat_annotation, - ch_state_dir, - ch_taxonomy_dir - ) - - CLASSIFY_WITH_MEGABLAST( - EXTRACT_HUMAN_VIRUSES.out.contigs, - ch_blast_db_files, - ch_state_dir, - ch_taxonomy_dir - ) - - CLASSIFY_WITH_BLASTN( - CLASSIFY_WITH_MEGABLAST.out.filtered_megablast, - CLASSIFY_WITH_MEGABLAST.out.megablast_contigs, - ch_blast_db_files, - ch_state_dir, - ch_taxonomy_dir - ) - - // Register hits with idempotent keys in the state database. - // Join contigs with merged BLAST results, then combine with run context and hits_dir. - // DSL2 automatically forks EXTRACT_HUMAN_VIRUSES.out.contigs and - // CLASSIFY_WITH_BLASTN.out.merged_results for multiple consumers. - ch_register_hits_input = EXTRACT_HUMAN_VIRUSES.out.contigs - .join(CLASSIFY_WITH_BLASTN.out.merged_results, by: 0) - .combine(ch_run_context) - .combine(ch_hits_dir) - .map { sample_id, contigs, blast_results, sample_set_id, state_dir, hits_dir -> - tuple(sample_id, contigs, blast_results, sample_set_id, state_dir, hits_dir) - } - - REGISTER_HITS(ch_register_hits_input) - // Hits are registered in the state database for querying via `nvd hits export`. - // Collect output to gate run completion when LabKey is disabled. - - if (params.labkey && blast_selected) { - // Check LabKey guard list - ensures experiment_id hasn't been uploaded before - // Uses .first() to get a value channel trigger - VALIDATE_LK_EXP_FRESH( - CLASSIFY_WITH_BLASTN.out.merged_results.first() - ) - - // Bundle and upload - gates ensure both checks passed: - // 1. CHECK_RUN_STATE.out.ready: local sample_set_id check passed - // 2. VALIDATE_LK_EXP_FRESH.out.validated: LabKey guard list check passed - // We combine both gates to ensure both validations complete before uploading. - // The .first() converts the result to a value channel so it broadcasts to all - // consumers instead of being consumed by the first process that reads it. - ch_validation_gate = CHECK_RUN_STATE.out.ready - .combine(VALIDATE_LK_EXP_FRESH.out.validated) - .map { _ready, _validated -> true } - .first() - - BUNDLE_BLAST_FOR_LABKEY( - CLASSIFY_WITH_BLASTN.out.merged_results, - EXTRACT_HUMAN_VIRUSES.out.contigs, - COUNT_READS.out.counts, - params.experiment_id, - workflow.runName, - EXTRACT_HUMAN_VIRUSES.out.contig_read_counts, - ch_validation_gate, - ch_run_context // value channel: [sample_set_id, state_dir] - ) - - // Register experiment ID in guard list after successful upload - REGISTER_LK_EXPERIMENT( - BUNDLE_BLAST_FOR_LABKEY.out.upload_log.collect() - ) - - labkey_log_ch = BUNDLE_BLAST_FOR_LABKEY.out.upload_log - - // Gate run completion on LabKey experiment registration - // This ensures all uploads are complete before marking the run done - ch_run_complete_gate = REGISTER_LK_EXPERIMENT.out.collect() - .map { _logs -> true } - - // Terminal channel for LabKey path - ch_terminal = REGISTER_LK_EXPERIMENT.out - } else { - // If no labkey upload then just pass an empty channel - labkey_log_ch = Channel.empty() - - // Gate run completion on REGISTER_HITS completion (all samples) - ch_run_complete_gate = REGISTER_HITS.out.collect() - .map { _logs -> true } - - // Terminal channel for non-LabKey path - ch_terminal = REGISTER_HITS.out - } - - // Mark the run as completed in the state database - COMPLETE_RUN( - ch_run_complete_gate, - ch_state_dir, - "completed" - ) - - // Send Slack notification (if enabled) - // Only runs when slack_enabled=true, slack_channel is set, and LabKey is enabled - // (we need LabKey for the results URL in the notification) - // Stats are queried from state database by the Python script using sample_set_id - if (params.slack_enabled && params.slack_channel && params.labkey && blast_selected) { - // Build LabKey URL to the hits list view - // Format: https://{server}/{project}/list-grid.view?name={list_name} - ch_labkey_url = Channel.value( - "https://${params.labkey_server}/${params.labkey_project_name}/list-grid.view?name=${params.labkey_blast_meta_hits_list}" - ) - - NOTIFY_SLACK( - COMPLETE_RUN.out.done, - ch_run_context, // tuple: (sample_set_id, state_dir) - ch_labkey_url - ) - } - - // Completion signal: always emits exactly one value regardless of whether - // data flowed through the workflow. - // - // When STAT+BLAST is not selected: Channel.value() emits one token immediately. - // When STAT+BLAST is selected: count() waits for ch_terminal to close, then - // emits the number of items that flowed through (including 0 if all samples - // were filtered out). Either way, exactly one emission. - ch_completion = blast_selected - ? ch_terminal.count().map { n -> "STAT+BLAST complete: ${n} samples processed" } - : Channel.value("STAT+BLAST skipped: tool not selected") - - emit: - completion = ch_completion - labkey_log = labkey_log_ch -}