[% from pathjoin("includes", "variable.jinja") import page_url with context -%]
[% from pathjoin("includes", "variable.jinja") import repo_url with context -%]
[% from pathjoin("includes", "version_compare.jinja") import version_between -%]
[build-system]
requires = ["scikit-build-core"]
build-backend = "scikit_build_core.build"

[project]
name = "{{ module_name }}"
description = "{{ project_description }}"
readme = "README.md"
[%- if copyright_license == "Apache Software License" %]
license = { text = "Apache-2.0" }
[%- elif copyright_license == "Boost Software License 1.0 (BSL-1.0)" %]
license = { text = "BSL-1.0" }
[%- elif copyright_license == "GNU Affero General Public License v3" %]
license = { text = "AGPLv3" }
[%- elif copyright_license == "GNU General Public License v3 (GPLv3)" %]
license = { text = "GPLv3" }
[%- elif copyright_license == "GNU Lesser General Public License v3 (LGPLv3)" %]
license = { text = "LGPLv3" }
[%- elif copyright_license == "MIT License" %]
license = { text = "MIT" }
[%- elif copyright_license == "Mozilla Public License 2.0 (MPL 2.0)" %]
license = { text = "MPL-2.0" }
[%- elif copyright_license == "The Unlicense (Unlicense)" %]
license = { text = "Unlicense" }
[%- endif %]
authors = [{ email = "{{ author_email }}", name = "{{ author_name }}" }]
requires-python = ">={{ min_py }}"
classifiers = [
[%- if development_status == "Planning" %]
  "Development Status :: 1 - Planning",
[%- elif development_status == "Alpha" %]
  "Development Status :: 3 - Alpha",
[%- elif development_status == "Beta" %]
  "Development Status :: 4 - Beta",
[%- elif development_status == "Stable" %]
  "Development Status :: 5 - Production/Stable",
[%- endif %]
  "Intended Audience :: Science/Research",
  "Intended Audience :: Developers",
  "License :: OSI Approved :: {{ copyright_license }}",
  "Operating System :: OS Independent",
  "Programming Language :: Python",
  "Programming Language :: Python :: 3",
  "Programming Language :: Python :: 3 :: Only",
[%- if version_between("3.8", min_py, max_py) %]
  "Programming Language :: Python :: 3.8",
[%- endif %]
[%- if version_between("3.9", min_py, max_py) %]
  "Programming Language :: Python :: 3.9",
[%- endif %]
[%- if version_between("3.10", min_py, max_py) %]
  "Programming Language :: Python :: 3.10",
[%- endif %]
[%- if version_between("3.11", min_py, max_py) %]
  "Programming Language :: Python :: 3.11",
[%- endif %]
[%- if version_between("3.12", min_py, max_py) %]
  "Programming Language :: Python :: 3.12",
[%- endif %]
[%- if version_between("3.13", min_py, max_py) %]
  "Programming Language :: Python :: 3.13",
[%- endif %]
  "Topic :: Scientific/Engineering",
  "Typing :: Typed",
]
dynamic = ["version"]
dependencies = [
  "typing-extensions>=3.10.0; python_version<'3.9'",
  "importlib_metadata>=1.4",
]

[project.optional-dependencies]
test = ["pytest >=6", "pytest-cov >=3"]
dev = ["pytest >=6", "pytest-cov >=3"]
docs = [
[%- if docs_type == 'sphinx' %]
  "sphinx>=7.0",
  "myst_parser>=0.13",
  "sphinx_copybutton",
  "sphinx_autodoc_typehints",
  "furo>=2023.08.17",
[%- endif %]
[%- if docs_type == 'mkdocs' %]
  "mkdocs>=1.6.0",
  "mkdocs-git-revision-date-localized-plugin>=1.2.6",
  "mkdocs-material>=9.5.29",
  "mkdocs-minify-plugin>=0.8.0",
  "mkdocs-same-dir>=0.1.3",
[%- endif %]
]

[project.urls]
Homepage = "https://{{ repo_url() }}"
[% if repo_platform == 'github' -%]
"Bug Tracker" = "https://{{ repo_url() }}/issues"
Discussions = "https://github.com/{{ repo_namespace }}/{{ repo_name }}/discussions"
[%- elif repo_platform == 'gitlab' or repo_platform == 'gitlab-self-managed' -%]
"Bug Tracker" = "https://{{ repo_url() }}/-/issues"
[%- endif %]
Changelog = "https://github.com/{{ repo_namespace }}/{{ repo_name }}/releases"

[tool.scikit-build]
minimum-version = "0.9"
build-dir = "build/{wheel_tag}"
cmake.verbose = false
logging.level = "DEBUG"
metadata.version.provider = "scikit_build_core.metadata.setuptools_scm"
sdist.include = ["src/{{ module_name }}/_version.py"]

[tool.scikit-build.cmake.define]
BUILD_TESTING="OFF"
CMAKE_BUILD_TYPE="Release"
VCPKG_INSTALL_REPORT_FAILURE="ON"
VCPKG_INSTALL_OPTIONS="--allow-unsupported"
CMAKE_TOOLCHAIN_FILE="cmake/vcpkg/vcpkg.toolchain.cmake"
VCPKG_OVERLAY_TRIPLETS="cmake/vcpkg/triplets"
VCPKG_OVERLAY_PORTS="cmake/vcpkg/ports"

[tool.setuptools_scm]
write_to = "src/{{ module_name }}/_version.py"

[tool.cibuildwheel]
build-verbosity = 1
skip = "pp*"
test-command = "pytest {project}/tests"
test-extras = ["test"]
test-skip = ["*-win_arm64", "*-macosx_universal2:arm64"]

[tool.cibuildwheel.linux]
before-build = [
  'yum install zip perl-IPC-Cmd -y || apk add zip || true',
  'apt update && apt install zip pkg-config -y || true',
  'pip install cmake==3.31.6',
  'pip install ninja==1.11.1.4',
  'cmake --version',
  'ninja --version',
]

[[tool.cibuildwheel.overrides]]
select = "*linux_{aarch64,armv7l,ppc64le,s390x}"
environment = { VCPKG_FORCE_SYSTEM_BINARIES = "1" }

[tool.pytest.ini_options]
minversion = "6.0"
addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"]
xfail_strict = true
filterwarnings = ["error"]
log_cli_level = "INFO"
testpaths = ["tests"]

[tool.coverage]
run.source = ["{{ module_name }}"]
report.exclude_also = ['\.\.\.', 'if typing.TYPE_CHECKING:']

[tool.mypy]
files = ["src", "tests"]
python_version = "3.8"
warn_unused_configs = true
strict = true
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
warn_unreachable = true
disallow_untyped_defs = false
disallow_incomplete_defs = false

[[tool.mypy.overrides]]
module = "{{ module_name }}.*"
disallow_untyped_defs = true
disallow_incomplete_defs = true

[tool.ruff]
src = ["src"]

[tool.ruff.lint]
extend-select = [
  "B",   # flake8-bugbear
  "I",   # isort
  "ARG", # flake8-unused-arguments
  "C4",  # flake8-comprehensions
  "EM",  # flake8-errmsg
  "ICN", # flake8-import-conventions
  "G",   # flake8-logging-format
  "PGH", # pygrep-hooks
  "PIE", # flake8-pie
  "PL",  # pylint
  "PT",  # flake8-pytest-style
  "PTH", # flake8-use-pathlib
  "RET", # flake8-return
  "RUF", # Ruff-specific
  "SIM", # flake8-simplify
  "T20", # flake8-print
  "UP",  # pyupgrade
  "YTT", # flake8-2020
  "EXE", # flake8-executable
  "NPY", # NumPy specific rules
  "PD",  # pandas-vet
]
ignore = [
  "PLR09",   # Too many <...>
  "PLR2004", # Magic value used in comparison
  "ISC001",  # Conflicts with formatter
]
isort.required-imports = ["from __future__ import annotations"]
# Uncomment if using a _compat.typing backport
# typing-modules = ["{{ module_name }}._compat.typing"]

[tool.ruff.lint.per-file-ignores]
"tests/**" = ["T20"]
"noxfile.py" = ["T20"]

[tool.pylint]
py-version = "{{ min_py }}"
ignore-paths = [".*/_version.py", ".*/*.pyi"]
[%- if compiled == true %]
extension-pkg-allow-list = ["{{ module_name }}._core"]
[%- endif %]
reports.output-format = "colorized"
similarities.ignore-imports = "yes"
messages_control.disable = [
  "design",
  "fixme",
  "line-too-long",
  "missing-module-docstring",
  "wrong-import-position",
]
