[build-system]
requires = ["setuptools==80.9.0", "wheel==0.45.1"]
build-backend = "setuptools.build_meta"

[project]
name = "obliteratus"
version = "0.1.2"
description = "Master Ablation Suite for HuggingFace transformers"
readme = "README.md"
requires-python = ">=3.10"
license = "AGPL-3.0-or-later"
license-files = ["LICENSE"]
keywords = ["abliteration", "mechanistic-interpretability", "refusal-removal", "llm", "transformers", "alignment"]
classifiers = [
    "Development Status :: 4 - Beta",
    "Intended Audience :: Science/Research",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Topic :: Scientific/Engineering :: Artificial Intelligence",
]

dependencies = [
    "torch>=2.0",
    "transformers>=4.40",
    "datasets>=2.14",
    "accelerate>=0.24",
    "safetensors>=0.4",
    "pyyaml>=6.0",
    "rich>=13.0",
    "matplotlib>=3.7",
    "seaborn>=0.12",
    "pandas>=2.0",
    "numpy>=1.24",
    "scikit-learn>=1.3",
    "tqdm>=4.64",
    "bitsandbytes>=0.46.1",
]

[project.urls]
"Homepage" = "https://github.com/elder-plinius/OBLITERATUS"
"Repository" = "https://github.com/elder-plinius/OBLITERATUS"
"Bug Tracker" = "https://github.com/elder-plinius/OBLITERATUS/issues"

[project.optional-dependencies]
dev = [
    "build==1.2.2.post1",
    "mypy==1.13.0",
    "pytest==9.1.1",
    "pytest-cov==7.1.0",
    "ruff==0.16.2",
]
spaces = ["gradio>=6.7,<7.0"]

[dependency-groups]
ci = [
    "build==1.2.2.post1",
    "pip-licenses==5.5.5",
    "twine==7.0.0",
]

[project.scripts]
obliteratus = "obliteratus.cli:main"

[tool.setuptools]
# The local UI launcher imports the Hugging Face Spaces application module.
# Include that top-level module in wheels as well as editable/source installs.
py-modules = ["app"]

[tool.setuptools.packages.find]
include = ["obliteratus*"]

[tool.setuptools.package-data]
obliteratus = ["py.typed"]

[tool.ruff]
line-length = 100
target-version = "py310"

[tool.ruff.lint]
select = ["F"]

[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = [
    "--strict-config",
    "--strict-markers",
    "--cov=obliteratus",
    "--cov-report=term-missing",
    "--cov-fail-under=49",
]
filterwarnings = [
    "error",
]
markers = [
    "cpu: deterministic tests supported by the mandatory CPU-only gate",
    "integration: offline integration tests spanning multiple components",
    "slow: tests excluded from the fast pull-request gate because of runtime",
    "gpu: tests that require a CUDA-capable runner",
    "mps: tests that require Apple Metal Performance Shaders",
    "mlx: tests that require Apple MLX",
    "network: tests that access external network resources",
    "download: tests that download model or dataset artifacts",
    "remote: tests that require a remote execution provider or credentials",
]

[tool.uv]
constraint-dependencies = ["pillow>=12.2.0"]
exclude-newer = "3 days"

[tool.uv.sources]
torch = [
    { index = "pytorch-cpu", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
]

[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true
