[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "mixinforge"
version = "0.301.0"
description = "A collection of Python mixins, metaclasses, context managers, utility functions, and CLI tools for building robust, configurable classes."
readme = "README.md"
requires-python = ">=3.11"

license = {text = "MIT"}

authors = [
    {name = "Vlad (Volodymyr) Pavlov", email = "vlpavlov@ieee.org"}
]
keywords = ["parameters", "mixins", "utilities", "singleton", "metaclass", "json",
    "serialization", "caching", "thread-safety", "cached-property"]

classifiers = [
    "Development Status :: 4 - Beta",
    "Intended Audience :: Developers",
    "Intended Audience :: Science/Research",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3.13",
    "Programming Language :: Python :: 3.14",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
    "Topic :: Software Development :: Libraries",
    "Topic :: Software Development :: Libraries :: Python Modules",
    "Typing :: Typed"
]

dependencies = [
    "tabulate",
    "uv"
]

[project.optional-dependencies]

docs = [
    "sphinx",
    "pydata-sphinx-theme",
    "sphinx-autodoc-typehints",
    "sphinx-copybutton",
    "myst-parser"
]

dev = [
    "pytest",
    "coverage",
    "sphinx",
    "pydata-sphinx-theme",
    "sphinx-autodoc-typehints",
    "sphinx-copybutton",
    "myst-parser",
    "uv-publish",
    "ruff"
]


[project.scripts]
mf-get-stats = "mixinforge.command_line_tools._cli_entry_points:mf_get_stats"
mf-clear-cache = "mixinforge.command_line_tools._cli_entry_points:mf_clear_cache"
mf-clear-dist = "mixinforge.command_line_tools._cli_entry_points:mf_clear_dist"

[project.urls]
Home = "https://github.com/pythagoras-dev/mixinforge"
Docs = "https://mixinforge.readthedocs.io/"

[tool.pytest.ini_options]
addopts = [
    "-ra",                    # Show summary of all test outcomes
    "--strict-markers",       # Raise error on unknown markers
    "--strict-config",        # Raise error on config issues
    "--showlocals",           # Show local variables in tracebacks
    "--verbose",              # Verbose output
    "--cache-clear",          # Clear cache before each run
]

testpaths = ["tests"]
python_files = ["test_*.py", "*_live_action.py"]
markers = [
    """live_actions: marks tests as live actions that operate on the actual project (deselect with '-m \"not live_actions\"')""",
]

[tool.coverage.run]
source = ["src/mixinforge"]
branch = true

[tool.ruff]
lint.ignore = ["F403", "F405"]
