[build-system]
requires = ["hatchling", "hatch-vcs"]
build-backend = "hatchling.build"

[project]
name = "gitlint"
dynamic = ["version", "dependencies", "urls"]
description = "Git commit message linter written in python, checks your commit messages for style."
readme = "README.md"

license = "MIT"
requires-python = ">=3.7"
authors = [{ name = "Joris Roovers" }]
keywords = [
    "git",
    "gitlint",
    "lint",    #
]
classifiers = [
    "Development Status :: 5 - Production/Stable",
    "Environment :: Console",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3.7",
    "Programming Language :: Python :: 3.8",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: Implementation :: CPython",
    "Programming Language :: Python :: Implementation :: PyPy",
    "Topic :: Software Development :: Quality Assurance",
    "Topic :: Software Development :: Testing",
]

[tool.hatch.version]
source = "vcs"

[tool.hatch.build]
exclude = ["*"]

[tool.hatch.metadata.hooks.vcs.urls]
Homepage = "https://jorisroovers.github.io/gitlint"
Documentation = "https://jorisroovers.github.io/gitlint"
Source = "https://github.com/jorisroovers/gitlint"
Changelog = "https://github.com/jorisroovers/gitlint/blob/main/CHANGELOG.md"
# TODO(jorisroovers): Temporary disable until fixed in hatch-vcs (see #460)
# 'Source Archive' = "https://github.com/jorisroovers/gitlint/archive/{commit_hash}.zip"
# 'Source Commit' = "https://github.com/jorisroovers/gitlint/tree/{commit_hash}"

# Use metadata hooks specified in 'hatch_build.py'
# (this line is critical when building wheels, when building sdist it seems optional)
[tool.hatch.metadata.hooks.custom]

# Environments #########################################################################################################
# NOTE: By default all environments inherit from the 'default' environment

# DEV
# Workaround for editable install:
# https://github.com/pypa/hatch/issues/588
[tool.hatch.envs.dev]
description = """
Dev environment (running gitlint itself from source)
"""
pre-install-commands = [
    "pip install -e ./gitlint-core", #
]

[tool.hatch.envs.dev.scripts]
fullclean = [
    "rm .coverage .coverage.lcov",
    "rm -rf site dist .pytest_cache",
    "rm -rf gitlint-core/dist gitlint-core/build gitlint-core/.pytest_cache",
    "rm -rf qa/__pycache__ qa/.pytest_cache",
]

# TEST
[tool.hatch.envs.test]
description = """
Test environment (unit tests, formatting, lint)
"""
skip-install = true
dependencies = [
    "gitlint-core[trusted-deps] @ {root:uri}/gitlint-core",
    "black==23.1.0",
    "pytest==7.2.1",
    "pytest-cov==4.0.0",
    "python-coveralls==2.9.3",
    "ruff==0.0.252",
    "radon==5.1.0",
    "pdbr==0.8.2; sys_platform != \"win32\"",
]

[tool.hatch.envs.test.scripts]
unit-tests = [
    "pytest --cov=gitlint-core --cov-report=term --cov-report=lcov:.coverage.lcov -rw -s {args:gitlint-core}",
]
u = "unit-tests"
unit-tests-no-cov = "pytest -rw -s {args:gitlint-core}"
format = "black --check --diff {args:.}"
lint = "ruff {args:gitlint-core/gitlint qa}"
autoformat = "black {args:.}"
autofix = [
    "ruff --fix {args:gitlint-core/gitlint qa}",
    "autoformat",                                #
]

all = [
    "unit-tests",
    "format",
    "lint",       #
]
stats = ["./tools/stats.sh"]

# QA
[tool.hatch.envs.qa]
description = """
Integration test environment.
Run a set of integration tests against any gitlint binary (not just the one from local source).
"""
detached = true
dependencies = [
    "pytest==7.2.1",
    "arrow==1.2.3",
    "sh==1.14.3; sys_platform != \"win32\"",
    "pdbr==0.8.2; sys_platform != \"win32\"",
]

[tool.hatch.envs.qa.scripts]
# The integration tests can be ran against any gitlint binary, e.g. one installed from pypi (for post-release testing)
# This is why by default we don't install the local dev version of gitlint in the qa environment
# To run integration tests against the dev version of gitlint, use install-local first
install-local = "pip install -e ./gitlint-core[trusted-deps]"
integration-tests = "pytest -rw -s {args:qa}"
i = "integration-tests"


# DOCS
[tool.hatch.envs.docs]
description = """
Documentation environment. Run docs build and serve commands.
"""
detached = true
dependencies = [
    "mkdocs==1.4.2", #
]

[tool.hatch.envs.docs.scripts]
build = "mkdocs build --clean --strict"
serve = "mkdocs serve"

# Tool config ##########################################################################################################

[tool.black]
target_version = ['py37', 'py38', 'py39', 'py310']
line-length = 120
# extend-exclude: keep excluding files from .gitignore in addition to the ones specified
extend-exclude = "gitlint-core/gitlint/tests/samples/user_rules/import_exception/invalid_python.py"

[tool.ruff]
target-version = "py37"
extend-exclude = [
    "gitlint-core/gitlint/tests/samples/user_rules/import_exception/invalid_python.py",
]

ignore = [
    "E501",    # Never enforce `E501` (line length violations) - taken care of by black
    "SIM108",  # Use ternary operator instead of if-else-block
    "PLR0913", # Too many arguments to function call
]

select = [
    "F",   # PyFlakes
    "E",   # Pycodestyle
    "W",   # Pycodestyle
    "I",   # isort (import order)
    "YTT", # flake8-2020 (misuse of sys.version)
    "S",   # flake8-bandit (security)
    "B",   # flake8-bugbear
    "C4",  # flake8-comprehensions (correct use of comprehensions)
    "T10", # flake8-debugger (no debug statements)
    "T20", # flake8-print (no print statements)
    "SIM", # flake8-simplify (use simple code)
    "TID", # flake8-tidy-imports (correct import syntax)
    "ARG", # flake8-unused-arguments (no unused function arguments)
    "DTZ", # flake8-datetimez (correct datetime usage)
    "ERA", # eradicate (no commented out code)
    "UP",  # pyupgrade (modern python syntax)
    "PLC", # pylint 
    "PLE", # pylint
    "PLR", # pylint
    "PLW", # pylint
    "PIE", # flake8-pie
    "RUF", # ruff specific
]

[tool.coverage.run]
branch = true # measure branch coverage in addition to statement coverage

[tool.coverage.report]
fail_under = 97
show_missing = true