Merge pull request #1388 from jkowalleck/feat/validate_rfc3987_non-gpl/rfc3987-syntax

Add support for the `iri` and `iri-reference` formats to the `format-nongpl` extra
diff --git a/docs/validate.rst b/docs/validate.rst
index 91f0577..bc740e3 100644
--- a/docs/validate.rst
+++ b/docs/validate.rst
@@ -206,8 +206,6 @@
 
     $ pip install jsonschema[format-nongpl]
 
-At the moment, it supports all the available checkers except for ``iri`` and ``iri-reference``.
-
 .. warning::
 
     It is your own responsibility ultimately to ensure you are license-compliant, so you should be double checking your own dependencies if you rely on this extra.
@@ -230,8 +228,8 @@
 ``idn-hostname``           requires idna_
 ``ipv4``
 ``ipv6``                   OS must have `socket.inet_pton` function
-``iri``                    requires rfc3987_
-``iri-reference``          requires rfc3987_
+``iri``                    requires rfc3987_ or rfc3987-syntax_
+``iri-reference``          requires rfc3987_ or rfc3987-syntax_
 ``json-pointer``           requires jsonpointer_
 ``regex``
 ``relative-json-pointer``  requires jsonpointer_
@@ -249,6 +247,7 @@
 .. _rfc3339-validator: https://pypi.org/project/rfc3339-validator/
 .. _rfc3986-validator: https://pypi.org/project/rfc3986-validator/
 .. _rfc3987: https://pypi.org/pypi/rfc3987/
+.. _rfc3987-syntax: https://pypi.org/pypi/rfc3987-syntax/
 .. _uri-template: https://pypi.org/pypi/uri-template/
 .. _webcolors: https://pypi.org/pypi/webcolors/
 
diff --git a/jsonschema/_format.py b/jsonschema/_format.py
index 9b4e67b..6fc7a01 100644
--- a/jsonschema/_format.py
+++ b/jsonschema/_format.py
@@ -324,6 +324,31 @@
                 return True
             return validate_rfc3986(instance, rule="URI_reference")
 
+    with suppress(ImportError):
+        from rfc3987_syntax import is_valid_syntax as _rfc3987_is_valid_syntax
+
+        @_checks_drafts(
+            draft7="iri",
+            draft201909="iri",
+            draft202012="iri",
+            raises=ValueError,
+        )
+        def is_iri(instance: object) -> bool:
+            if not isinstance(instance, str):
+                return True
+            return _rfc3987_is_valid_syntax("iri", instance)
+
+        @_checks_drafts(
+            draft7="iri-reference",
+            draft201909="iri-reference",
+            draft202012="iri-reference",
+            raises=ValueError,
+        )
+        def is_iri_reference(instance: object) -> bool:
+            if not isinstance(instance, str):
+                return True
+            return _rfc3987_is_valid_syntax("iri_reference", instance)
+
 else:
 
     @_checks_drafts(
diff --git a/pyproject.toml b/pyproject.toml
index e2c128c..ad98e9f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -62,6 +62,7 @@
   "jsonpointer>1.13",
   "rfc3339-validator",
   "rfc3986-validator>0.1.0",
+  "rfc3987-syntax>=1.1.0",
   "uri_template",
   "webcolors>=24.6.0",
 ]