Merge remote-tracking branch 'origin/main' into docs/arxiv-paper-review

# Conflicts:
#	.claude/settings.json
#	docs/installation.md
#	docs/supported-signals.md
#	docs/synthid.md
#	docs/verification-plan.md
#	docs/watermarking-landscape.md
#	pyproject.toml
#	src/remove_ai_watermarks/identify.py
#	uv.lock
This commit is contained in:
Victor Kuznetsov
2026-08-26 12:39:05 -07:00
84 changed files with 6888 additions and 1666 deletions
+15 -2
View File
@@ -5,19 +5,27 @@ from __future__ import annotations
from importlib.metadata import metadata, requires
from packaging.requirements import Requirement
from packaging.specifiers import SpecifierSet
from packaging.utils import canonicalize_name
def _requirement_names(extra: str | None = None) -> set[str]:
def _requirement_names(extra: str | None = None, *, python_version: str | None = None) -> set[str]:
selected_extra = extra or ""
environment = {"extra": selected_extra}
if python_version is not None:
environment["python_version"] = python_version
parsed = (Requirement(value) for value in requires("remove-ai-watermarks") or [])
return {
canonicalize_name(requirement.name)
for requirement in parsed
if requirement.marker is None or requirement.marker.evaluate({"extra": selected_extra})
if requirement.marker is None or requirement.marker.evaluate(environment)
}
def test_supported_python_floor_is_published():
assert SpecifierSet(metadata("remove-ai-watermarks")["Requires-Python"]) == SpecifierSet(">=3.11,<3.15")
def test_default_install_is_metadata_focused():
default = _requirement_names()
@@ -56,6 +64,11 @@ def test_file_format_and_detector_dependencies_are_independent():
assert "openai" in _requirement_names("verify")
def test_trustmark_is_limited_to_its_numpy_compatible_python_range():
assert "trustmark" in _requirement_names("trustmark", python_version="3.12")
assert "trustmark" not in _requirement_names("trustmark", python_version="3.13")
def test_extras_use_capability_names_without_legacy_aliases():
extras = set(metadata("remove-ai-watermarks").get_all("Provides-Extra") or [])