diff --git a/doclang/schematron_validation.py b/doclang/schematron_validation.py index 4a241f5..bacc741 100644 --- a/doclang/schematron_validation.py +++ b/doclang/schematron_validation.py @@ -10,7 +10,6 @@ from typing import Union from lxml import etree -from saxonche import PySaxonProcessor from doclang._schemas import _bundled_sch_path from doclang.utils import _ensure_namespace @@ -117,6 +116,13 @@ def _transpile_schematron_to_xslt(sch_file, verbose=False): if verbose: print(f"Transpiling Schematron: {sch_file}") + try: + from saxonche import PySaxonProcessor + except ImportError: + raise ImportError( + "saxonche is required for Schematron validation. Install it with: pip install doclang[schematron]" + ) from None + with PySaxonProcessor(license=False) as proc: xslt_proc = proc.new_xslt30_processor() @@ -162,6 +168,13 @@ def _validate_with_schematron( tmp_xml_path = tmp.name # File is still open but flushed, Saxon can read it + try: + from saxonche import PySaxonProcessor + except ImportError: + raise ImportError( + "saxonche is required for Schematron validation. Install it with: pip install doclang[schematron]" + ) from None + with PySaxonProcessor(license=False) as proc: if verbose: print(f"Using XSLT processor version: {proc.version}") diff --git a/pyproject.toml b/pyproject.toml index 6c0c942..14aaebe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,10 +25,12 @@ classifiers = [ ] dependencies = [ "lxml>=6.0.2", - "saxonche>=12.9.0", "typer>=0.15.1", ] +[project.optional-dependencies] +schematron = ["saxonche>=12.9.0"] + [project.urls] Homepage = "https://www.doclang.ai/" Documentation = "https://github.com/doclang-project/doclang/blob/main/README.md" diff --git a/uv.lock b/uv.lock index 55578d9..b8cf057 100644 --- a/uv.lock +++ b/uv.lock @@ -355,10 +355,14 @@ version = "0.7.0" source = { editable = "." } dependencies = [ { name = "lxml" }, - { name = "saxonche" }, { name = "typer" }, ] +[package.optional-dependencies] +schematron = [ + { name = "saxonche" }, +] + [package.dev-dependencies] ci = [ { name = "mypy" }, @@ -382,9 +386,10 @@ dev = [ [package.metadata] requires-dist = [ { name = "lxml", specifier = ">=6.0.2" }, - { name = "saxonche", specifier = ">=12.9.0" }, + { name = "saxonche", marker = "extra == 'schematron'", specifier = ">=12.9.0" }, { name = "typer", specifier = ">=0.15.1" }, ] +provides-extras = ["schematron"] [package.metadata.requires-dev] ci = [