[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[project]
name = "multiqc"
version = "1.25.2"
dependencies = [
    "click",
    "humanize",
    "importlib_metadata",
    "jinja2>=3.0.0",
    "kaleido==0.2.1",     # for flat plot export
    "markdown",
    "numpy",
    "packaging",
    "requests",
    "Pillow>=10",         # to add a logo into flat plots
    "plotly>=5.18",
    "pyyaml>=4",
    "rich>=10",
    "rich-click",
    "coloredlogs",        # logging in notebooks
    "spectra>=0.0.10",
    "pydantic>=2.7.0",
    "typeguard",
    "tqdm",               # progress bar in notebooks
    "natsort",
]
requires-python = ">=3.8"
authors = [
    { name = "Phil Ewels", email = "phil.ewels@seqera.io" },
    { name = "Vlad Savelyev", email = "vladislav.savelyev@seqera.io" },
]
description = "Create aggregate bioinformatics analysis reports across many samples and tools"
readme = "README.md"
license = { file = "LICENSE" }
keywords = [
    "bioinformatics",
    "biology",
    "sequencing",
    "NGS",
    "next generation sequencing",
    "quality control",
]
classifiers = [
    "Development Status :: 5 - Production/Stable",
    "Environment :: Console",
    "Environment :: Web Environment",
    "Intended Audience :: Science/Research",
    "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
    "Natural Language :: English",
    "Operating System :: MacOS :: MacOS X",
    "Operating System :: POSIX",
    "Operating System :: Unix",
    "Programming Language :: Python",
    "Programming Language :: JavaScript",
    "Topic :: Scientific/Engineering",
    "Topic :: Scientific/Engineering :: Bio-Informatics",
    "Topic :: Scientific/Engineering :: Visualization",
]

[project.optional-dependencies]
dev = [
    "pre-commit",
    "ruff",
    "pdoc3",
    "pytest",
    "pytest-cov",
    "pytest-xdist", # for parallel testing with `pytest -n`
    "syrupy",       # to compare html snpashots, alternative to pytest-snapshot that
    # does work better with parametrized tests
    "pygithub",             # to generate changelog
    "mypy",
    "types-PyYAML",
    "types-tqdm",
    "types-requests",
    "types-Markdown",
    "types-beautifulsoup4",
    "types-Pillow",
]

[project.urls]
Homepage = "https://multiqc.info"
Repository = "https://github.com/MultiQC/MultiQC"
Issues = "https://github.com/MultiQC/MultiQC/issues"
Documentation = "https://docs.seqera.io/multiqc"
Changelog = "https://github.com/MultiQC/MultiQC/blob/main/CHANGELOG.md"

[project.entry-points.console_scripts]
multiqc = "multiqc.__main__:run_multiqc"

[project.entry-points."multiqc.modules.v1"]
adapterremoval = "multiqc.modules.adapterremoval:MultiqcModule"
afterqc = "multiqc.modules.afterqc:MultiqcModule"
anglerfish = "multiqc.modules.anglerfish:MultiqcModule"
bakta = "multiqc.modules.bakta:MultiqcModule"
bamdst = "multiqc.modules.bamdst:MultiqcModule"
bamtools = "multiqc.modules.bamtools:MultiqcModule"
bbduk = "multiqc.modules.bbduk:MultiqcModule"
bbmap = "multiqc.modules.bbmap:MultiqcModule"
bcftools = "multiqc.modules.bcftools:MultiqcModule"
bcl2fastq = "multiqc.modules.bcl2fastq:MultiqcModule"
bclconvert = "multiqc.modules.bclconvert:MultiqcModule"
biobambam2 = "multiqc.modules.biobambam2:MultiqcModule"
biobloomtools = "multiqc.modules.biobloomtools:MultiqcModule"
biscuit = "multiqc.modules.biscuit:MultiqcModule"
bismark = "multiqc.modules.bismark:MultiqcModule"
bowtie1 = "multiqc.modules.bowtie1:MultiqcModule"
bowtie2 = "multiqc.modules.bowtie2:MultiqcModule"
busco = "multiqc.modules.busco:MultiqcModule"
bustools = "multiqc.modules.bustools:MultiqcModule"
ccs = "multiqc.modules.ccs:MultiqcModule"
cellranger = "multiqc.modules.cellranger:MultiqcModule"
checkqc = "multiqc.modules.checkqc:MultiqcModule"
clipandmerge = "multiqc.modules.clipandmerge:MultiqcModule"
clusterflow = "multiqc.modules.clusterflow:MultiqcModule"
conpair = "multiqc.modules.conpair:MultiqcModule"
custom_content = "multiqc.modules.custom_content:custom_module_classes"           # special case
cutadapt = "multiqc.modules.cutadapt:MultiqcModule"
damageprofiler = "multiqc.modules.damageprofiler:MultiqcModule"
dedup = "multiqc.modules.dedup:MultiqcModule"
deeptools = "multiqc.modules.deeptools:MultiqcModule"
diamond = "multiqc.modules.diamond:MultiqcModule"
disambiguate = "multiqc.modules.disambiguate:MultiqcModule"
dragen = "multiqc.modules.dragen:MultiqcModule"
dragen_fastqc = "multiqc.modules.dragen_fastqc:MultiqcModule"
eigenstratdatabasetools = "multiqc.modules.eigenstratdatabasetools:MultiqcModule"
fastp = "multiqc.modules.fastp:MultiqcModule"
fastq_screen = "multiqc.modules.fastq_screen:MultiqcModule"
fastqc = "multiqc.modules.fastqc:MultiqcModule"
featurecounts = "multiqc.modules.featurecounts:MultiqcModule"
fgbio = "multiqc.modules.fgbio:MultiqcModule"
flash = "multiqc.modules.flash:MultiqcModule"
flexbar = "multiqc.modules.flexbar:MultiqcModule"
filtlong = "multiqc.modules.filtlong:MultiqcModule"
freyja = "multiqc.modules.freyja:MultiqcModule"
gffcompare = "multiqc.modules.gffcompare:MultiqcModule"
ganon = "multiqc.modules.ganon:MultiqcModule"
gatk = "multiqc.modules.gatk:MultiqcModule"
glimpse = "multiqc.modules.glimpse:MultiqcModule"
goleft_indexcov = "multiqc.modules.goleft_indexcov:MultiqcModule"
gopeaks = "multiqc.modules.gopeaks:MultiqcModule"
haplocheck = "multiqc.modules.haplocheck:MultiqcModule"
happy = "multiqc.modules.happy:MultiqcModule"
hicexplorer = "multiqc.modules.hicexplorer:MultiqcModule"
hicpro = "multiqc.modules.hicpro:MultiqcModule"
hicup = "multiqc.modules.hicup:MultiqcModule"
hifiasm = "multiqc.modules.hifiasm:MultiqcModule"
hisat2 = "multiqc.modules.hisat2:MultiqcModule"
homer = "multiqc.modules.homer:MultiqcModule"
hops = "multiqc.modules.hops:MultiqcModule"
hostile = "multiqc.modules.hostile:MultiqcModule"
htseq = "multiqc.modules.htseq:MultiqcModule"
humid = "multiqc.modules.humid:MultiqcModule"
interop = "multiqc.modules.interop:MultiqcModule"
isoseq = "multiqc.modules.isoseq:MultiqcModule"
ivar = "multiqc.modules.ivar:MultiqcModule"
jcvi = "multiqc.modules.jcvi:MultiqcModule"
jellyfish = "multiqc.modules.jellyfish:MultiqcModule"
kaiju = "multiqc.modules.kaiju:MultiqcModule"
kallisto = "multiqc.modules.kallisto:MultiqcModule"
kat = "multiqc.modules.kat:MultiqcModule"
kraken = "multiqc.modules.kraken:MultiqcModule"
leehom = "multiqc.modules.leehom:MultiqcModule"
librarian = "multiqc.modules.librarian:MultiqcModule"
lima = "multiqc.modules.lima:MultiqcModule"
longranger = "multiqc.modules.longranger:MultiqcModule"
macs2 = "multiqc.modules.macs2:MultiqcModule"
malt = "multiqc.modules.malt:MultiqcModule"
mapdamage = "multiqc.modules.mapdamage:MultiqcModule"
megahit = "multiqc.modules.megahit:MultiqcModule"
metaphlan = "multiqc.modules.metaphlan:MultiqcModule"
methylqa = "multiqc.modules.methylqa:MultiqcModule"
minionqc = "multiqc.modules.minionqc:MultiqcModule"
mirtop = "multiqc.modules.mirtop:MultiqcModule"
mirtrace = "multiqc.modules.mirtrace:MultiqcModule"
mosdepth = "multiqc.modules.mosdepth:MultiqcModule"
motus = "multiqc.modules.motus:MultiqcModule"
mtnucratio = "multiqc.modules.mtnucratio:MultiqcModule"
multivcfanalyzer = "multiqc.modules.multivcfanalyzer:MultiqcModule"
nanoq = "multiqc.modules.nanoq:MultiqcModule"
nanostat = "multiqc.modules.nanostat:MultiqcModule"
ngsbits = "multiqc.modules.ngsbits:MultiqcModule"
nextclade = "multiqc.modules.nextclade:MultiqcModule"
ngsderive = "multiqc.modules.ngsderive:MultiqcModule"
nonpareil = "multiqc.modules.nonpareil:MultiqcModule"
odgi = "multiqc.modules.odgi:MultiqcModule"
optitype = "multiqc.modules.optitype:MultiqcModule"
pangolin = "multiqc.modules.pangolin:MultiqcModule"
pairtools = "multiqc.modules.pairtools:MultiqcModule"
pbmarkdup = "multiqc.modules.pbmarkdup:MultiqcModule"
peddy = "multiqc.modules.peddy:MultiqcModule"
phantompeakqualtools = "multiqc.modules.phantompeakqualtools:MultiqcModule"
picard = "multiqc.modules.picard:MultiqcModule"
porechop = "multiqc.modules.porechop:MultiqcModule"
preseq = "multiqc.modules.preseq:MultiqcModule"
prinseqplusplus = "multiqc.modules.prinseqplusplus:MultiqcModule"
prokka = "multiqc.modules.prokka:MultiqcModule"
purple = "multiqc.modules.purple:MultiqcModule"
pychopper = "multiqc.modules.pychopper:MultiqcModule"
pycoqc = "multiqc.modules.pycoqc:MultiqcModule"
qc3C = "multiqc.modules.qc3C:MultiqcModule"
qorts = "multiqc.modules.qorts:MultiqcModule"
qualimap = "multiqc.modules.qualimap:MultiqcModule"
quast = "multiqc.modules.quast:MultiqcModule"
rna_seqc = "multiqc.modules.rna_seqc:MultiqcModule"
rockhopper = "multiqc.modules.rockhopper:MultiqcModule"
rsem = "multiqc.modules.rsem:MultiqcModule"
rseqc = "multiqc.modules.rseqc:MultiqcModule"
seqera_cli = "multiqc.modules.seqera_cli:MultiqcModule"
sequali = "multiqc.modules.sequali:MultiqcModule"
salmon = "multiqc.modules.salmon:MultiqcModule"
sambamba = "multiqc.modules.sambamba:MultiqcModule"
samblaster = "multiqc.modules.samblaster:MultiqcModule"
samtools = "multiqc.modules.samtools:MultiqcModule"
sargasso = "multiqc.modules.sargasso:MultiqcModule"
seqyclean = "multiqc.modules.seqyclean:MultiqcModule"
seqwho = "multiqc.modules.seqwho:MultiqcModule"
sexdeterrmine = "multiqc.modules.sexdeterrmine:MultiqcModule"
sickle = "multiqc.modules.sickle:MultiqcModule"
skewer = "multiqc.modules.skewer:MultiqcModule"
slamdunk = "multiqc.modules.slamdunk:MultiqcModule"
snippy = "multiqc.modules.snippy:MultiqcModule"
snpeff = "multiqc.modules.snpeff:MultiqcModule"
snpsplit = "multiqc.modules.snpsplit:MultiqcModule"
somalier = "multiqc.modules.somalier:MultiqcModule"
sortmerna = "multiqc.modules.sortmerna:MultiqcModule"
sourmash = "multiqc.modules.sourmash:MultiqcModule"
spaceranger = "multiqc.modules.spaceranger:MultiqcModule"
stacks = "multiqc.modules.stacks:MultiqcModule"
star = "multiqc.modules.star:MultiqcModule"
supernova = "multiqc.modules.supernova:MultiqcModule"
theta2 = "multiqc.modules.theta2:MultiqcModule"
tophat = "multiqc.modules.tophat:MultiqcModule"
trimmomatic = "multiqc.modules.trimmomatic:MultiqcModule"
truvari = "multiqc.modules.truvari:MultiqcModule"
umicollapse = "multiqc.modules.umicollapse:MultiqcModule"
umitools = "multiqc.modules.umitools:MultiqcModule"
varscan2 = "multiqc.modules.varscan2:MultiqcModule"
vcftools = "multiqc.modules.vcftools:MultiqcModule"
vep = "multiqc.modules.vep:MultiqcModule"
verifybamid = "multiqc.modules.verifybamid:MultiqcModule"
vg = "multiqc.modules.vg:MultiqcModule"
whatshap = "multiqc.modules.whatshap:MultiqcModule"
xenome = "multiqc.modules.xenome:MultiqcModule"
xengsort = "multiqc.modules.xengsort:MultiqcModule"

[project.entry-points."multiqc.templates.v1"]
default = "multiqc.templates.default"
sections = "multiqc.templates.sections"
simple = "multiqc.templates.simple"
gathered = "multiqc.templates.gathered"
geo = "multiqc.templates.geo"

### See https://docs.seqera.io/multiqc/development/plugins for documentation
#[project.entry-points."multiqc.cli_options.v1"]
#my-new-option = "myplugin.cli:new_option"
#
#[project.entry-points."multiqc.hooks.v1"]
#before_config = "myplugin.hooks:before_config"
#config_loaded = "myplugin.hooks:config_loaded"
#execution_start = "myplugin.hooks:execution_start"
#before_modules = "myplugin.hooks:before_modules"
#after_modules = "myplugin.hooks:after_modules"
#before_report_generation = "myplugin.hooks:before_report_generation"
#execution_finish = "myplugin.hooks:execution_finish"

[tool.setuptools]
packages = ["multiqc"]
package-data = { multiqc = ["py.typed"] }

[tool.ruff]
line-length = 120
target-version = "py312"
lint.ignore = ["F401"]   # unused-import

[tool.mypy]
check_untyped_defs = true
plugins = ["pydantic.mypy"]
# exclude all files in multiqc/modules
files = ["multiqc", "tests"]
exclude = "multiqc/modules/*"

[tool.pyright]
include = ["multiqc", "scripts", "tests"]
