[build-system]
requires = ["setuptools"]


[project]
name = "jinjax"
version = "0.54"
description = "Replace your HTML templates with Python server-Side components"
authors = [
    {name = "Juan Pablo Scaletti", email = "juanpablo@jpscaletti.com"},
]
license = { "file" = "MIT-LICENSE" }
readme = "README.md"
classifiers = [
    "Development Status :: 4 - Beta",
    "Environment :: Web Environment",
    "Intended Audience :: Developers",
    "Programming Language :: Python :: 3 :: Only",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3.13",
    "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
    "Topic :: Software Development :: Libraries",
    "Topic :: Software Development :: Libraries :: Python Modules",
    "Topic :: Software Development :: User Interfaces",
    "Topic :: Text Processing :: Markup :: HTML",
    "Typing :: Typed",
]
requires-python = ">=3.11,<4"
dependencies = [
    "jinja2 >= 3.0",
    "markupsafe >= 2.0",
]

[project.optional-dependencies]
whitenoise = ["whitenoise"]

[project.urls]
homepage = "https://jinjax.scaletti.dev/"
repository = "https://github.com/jpsca/jinjax"
documentation = "https://jinjax.scaletti.dev/guides/"


[dependency-groups]
dev = [
    "ipdb >= 0.13",
    "pyright >= 1.1",
    "pre-commit",
    "ruff >= 0.2.0",
    "tox-uv",
]
test = [
    "pytest >= 7.2",
    "pytest-cov",
    "ruff > 0.3",
    "whitenoise >= 5.3",
]


[tool.setuptools.packages.find]
where = ["src"]


[tool.coverage.run]
branch = true

[tool.coverage.report]
exclude_lines = [
    "pragma: no cover",
    "TYPE_CHECKING",
    "def __repr__",
    "def __str__",
    "raise AssertionError",
    "raise NotImplementedError",
    "if __name__ == .__main__.:"
]


[tool.coverage.html]
directory = "covreport"
exclude_lines = [
    "pragma: no cover",
    "TYPE_CHECKING",
    "def __repr__",
    "def __str__",
    "raise AssertionError",
    "raise NotImplementedError",
    "if __name__ == .__main__.:"
]


[tool.pyright]
include = ["src"]
exclude = [
    "**/node_modules",
    "**/__pycache__",
    "**/tests",
]
reportPrivateImportUsage = false
reportWildcardImportFromLibrary = false


[tool.pytest.ini_options]
addopts = "--doctest-modules"


[tool.tox]
legacy_tox_ini = """
[tox]
env_list =
    3.11
    3.12
    3.13
    3.14

[testenv]
runner = uv-venv-lock-runner
dependency_groups =
    dev
    test
extras =
    whitenoise
commands =
    pytest -x src/jinjax tests
"""


[tool.ruff]
line-length = 90
indent-width = 4
target-version = "py311"
exclude = [
  ".*",
  "_build",
  "build",
  "covreport",
  "dist",
  "benchmark",
]
include = ["*.py"]

[tool.ruff.format]
# Like Black, use double quotes for strings.
quote-style = "double"

# Like Black, indent with spaces, rather than tabs.
indent-style = "space"

# Like Black, respect magic trailing commas.
skip-magic-trailing-comma = false

# Like Black, automatically detect the appropriate line ending.
line-ending = "auto"

# Enable auto-formatting of code examples in docstrings. Markdown,
# reStructuredText code/literal blocks and doctests are all supported.
#
# This is currently disabled by default, but it is planned for this
# to be opt-out in the future.
docstring-code-format = false

# Set the line length limit used when formatting code snippets in
# docstrings.
#
# This only has an effect when the `docstring-code-format` setting is
# enabled.
docstring-code-line-length = "dynamic"

[tool.ruff.lint]
fixable = ["ALL"]

ignore = [
	# x is too complex
	"C901",
	# whitespace before ':'
	"E203",
	"E501",
	# x defined from star imports
	"F405",
	# line break before binary operator
	"W505",
	"W605",
]
select = [
	# bugbear
	"B",
	# mccabe"", comprehensions, commas
	"C",
	# pycodestyle errors
	"E",
	# pyflakes
	"F",
	# logging format
	"G",
	# imports
	"I",
	# quotes
	"Q",
	# pycodestyle warnings
	"W",
]

[tool.ruff.lint.isort]
known-first-party = ["jinjax"]
known-local-folder = ["src/jinjax"]

# Use two line after imports.
lines-after-imports = 2