Skip to content

Commit 56e7d26

Browse files
hbcarlosJulianpre-commit-ci[bot]blink1073
authoredJul 29, 2023
Migrate RefResolver to referencing.Registry (#80)
Co-authored-by: Julian Berman <Julian@GrayVines.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Steven Silvester <steven.silvester@ieee.org>
1 parent 0b5e0e8 commit 56e7d26

File tree

5 files changed

+49
-22
lines changed

5 files changed

+49
-22
lines changed
 

‎.github/workflows/python-tests.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818
fail-fast: false
1919
matrix:
2020
os: [ubuntu-latest, windows-latest, macos-latest]
21-
python-version: ["3.7", "3.11"]
21+
python-version: ["3.8", "3.12"]
2222
include:
2323
- os: windows-latest
2424
python-version: "3.9"
@@ -27,7 +27,7 @@ jobs:
2727
- os: ubuntu-latest
2828
python-version: "3.10"
2929
- os: macos-latest
30-
python-version: "3.8"
30+
python-version: "3.11"
3131
steps:
3232
- uses: actions/checkout@v3
3333
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1

‎jupyter_events/schema.py

+11-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
from pathlib import Path, PurePath
44
from typing import Optional, Type, Union
55

6-
from jsonschema import FormatChecker, RefResolver, validators
6+
from jsonschema import FormatChecker, validators
7+
from referencing import Registry
8+
from referencing.jsonschema import DRAFT7
79

810
try:
911
from jsonschema.protocols import Validator
@@ -55,23 +57,27 @@ class EventSchema:
5557
any schema registered here follows the expected form
5658
of Jupyter Events.
5759
58-
resolver:
59-
RefResolver for nested JSON schema references.
60+
registry:
61+
Registry for nested JSON schema references.
6062
"""
6163

6264
def __init__(
6365
self,
6466
schema: SchemaType,
6567
validator_class: Type[Validator] = validators.Draft7Validator, # type:ignore[assignment]
6668
format_checker: FormatChecker = draft7_format_checker,
67-
resolver: Optional[RefResolver] = None,
69+
registry: Optional[Registry] = None,
6870
):
6971
"""Initialize an event schema."""
7072
_schema = self._load_schema(schema)
7173
# Validate the schema against Jupyter Events metaschema.
7274
validate_schema(_schema)
75+
76+
if registry is None:
77+
registry = DRAFT7.create_resource(_schema) @ Registry()
78+
7379
# Create a validator for this schema
74-
self._validator = validator_class(_schema, resolver=resolver, format_checker=format_checker)
80+
self._validator = validator_class(_schema, registry=registry, format_checker=format_checker) # type: ignore
7581
self._schema = _schema
7682

7783
def __repr__(self):

‎jupyter_events/validators.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
import pathlib
33

44
import jsonschema
5-
from jsonschema import Draft7Validator, RefResolver, ValidationError
5+
from jsonschema import Draft7Validator, ValidationError
6+
from referencing import Registry
7+
from referencing.jsonschema import DRAFT7
68

79
from . import yaml
810

@@ -30,19 +32,21 @@
3032
EVENT_CORE_SCHEMA["$id"]: EVENT_CORE_SCHEMA,
3133
}
3234

33-
METASCHEMA_RESOLVER = RefResolver(
34-
base_uri=EVENT_METASCHEMA["$id"], referrer=EVENT_METASCHEMA, store=SCHEMA_STORE
35-
)
35+
resources = [
36+
DRAFT7.create_resource(each)
37+
for each in (EVENT_METASCHEMA, PROPERTY_METASCHEMA, EVENT_CORE_SCHEMA)
38+
]
39+
METASCHEMA_REGISTRY: Registry = resources @ Registry()
3640

37-
JUPYTER_EVENTS_SCHEMA_VALIDATOR = Draft7Validator(
41+
JUPYTER_EVENTS_SCHEMA_VALIDATOR = Draft7Validator( # type: ignore
3842
schema=EVENT_METASCHEMA,
39-
resolver=METASCHEMA_RESOLVER,
43+
registry=METASCHEMA_REGISTRY,
4044
format_checker=draft7_format_checker,
4145
)
4246

43-
JUPYTER_EVENTS_CORE_VALIDATOR = Draft7Validator(
47+
JUPYTER_EVENTS_CORE_VALIDATOR = Draft7Validator( # type: ignore
4448
schema=EVENT_CORE_SCHEMA,
45-
resolver=METASCHEMA_RESOLVER,
49+
registry=METASCHEMA_REGISTRY,
4650
format_checker=draft7_format_checker,
4751
)
4852

‎pyproject.toml

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
66
name = "jupyter-events"
77
description = "Jupyter Event System library"
88
readme = "README.md"
9-
requires-python = ">=3.7"
9+
requires-python = ">=3.8"
1010
authors = [
1111
{ name = "Jupyter Development Team", email = "jupyter@googlegroups.com" },
1212
]
@@ -23,7 +23,8 @@ classifiers = [
2323
"Programming Language :: Python :: 3",
2424
]
2525
dependencies = [
26-
"jsonschema[format-nongpl,format_nongpl]>=3.2.0",
26+
"referencing",
27+
"jsonschema[format-nongpl,format_nongpl]>=4.18.0",
2728
"python-json-logger>=2.0.4",
2829
"pyyaml>=5.3",
2930
"traitlets>=5.3",

‎tests/test_logger.py

+21-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import io
22
import json
33
import logging
4+
import sys
45
from datetime import datetime, timedelta, timezone
56
from unittest.mock import MagicMock
67

@@ -158,12 +159,15 @@ def test_emit():
158159
assert "__timestamp__" in event_capsule
159160
# Remove timestamp from capsule when checking equality, since it is gonna vary
160161
del event_capsule["__timestamp__"]
161-
assert event_capsule == {
162+
expected = {
162163
"__schema__": "http://test/test",
163164
"__schema_version__": 1,
164165
"__metadata_version__": 1,
165166
"something": "blah",
166167
}
168+
if sys.version_info >= (3, 12):
169+
expected["taskName"] = None
170+
assert event_capsule == expected
167171

168172

169173
def test_message_field():
@@ -202,13 +206,16 @@ def test_message_field():
202206
assert "__timestamp__" in event_capsule
203207
# Remove timestamp from capsule when checking equality, since it is gonna vary
204208
del event_capsule["__timestamp__"]
205-
assert event_capsule == {
209+
expected = {
206210
"__schema__": "http://test/test",
207211
"__schema_version__": 1,
208212
"__metadata_version__": 1,
209213
"something": "blah",
210214
"message": "a message was seen",
211215
}
216+
if sys.version_info >= (3, 12):
217+
expected["taskName"] = None
218+
assert event_capsule == expected
212219

213220

214221
def test_nested_message_field():
@@ -249,12 +256,15 @@ def test_nested_message_field():
249256
assert "__timestamp__" in event_capsule
250257
# Remove timestamp from capsule when checking equality, since it is gonna vary
251258
del event_capsule["__timestamp__"]
252-
assert event_capsule == {
259+
expected = {
253260
"__schema__": "http://test/test",
254261
"__schema_version__": 1,
255262
"__metadata_version__": 1,
256263
"thing": {"message": "a nested message was seen"},
257264
}
265+
if sys.version_info >= (3, 12):
266+
expected["taskName"] = None
267+
assert event_capsule == expected
258268

259269

260270
def test_register_event_schema(tmp_path):
@@ -411,24 +421,30 @@ def test_unique_logger_instances():
411421
assert "__timestamp__" in event_capsule0
412422
# Remove timestamp from capsule when checking equality, since it is gonna vary
413423
del event_capsule0["__timestamp__"]
414-
assert event_capsule0 == {
424+
expected = {
415425
"__schema__": "http://test/test0",
416426
"__schema_version__": 1,
417427
"__metadata_version__": 1,
418428
"something": "blah",
419429
}
430+
if sys.version_info >= (3, 12):
431+
expected["taskName"] = None
432+
assert event_capsule0 == expected
420433

421434
event_capsule1 = json.loads(output1.getvalue())
422435

423436
assert "__timestamp__" in event_capsule1
424437
# Remove timestamp from capsule when checking equality, since it is gonna vary
425438
del event_capsule1["__timestamp__"]
426-
assert event_capsule1 == {
439+
expected = {
427440
"__schema__": "http://test/test1",
428441
"__schema_version__": 1,
429442
"__metadata_version__": 1,
430443
"something": "blah",
431444
}
445+
if sys.version_info >= (3, 12):
446+
expected["taskName"] = None
447+
assert event_capsule1 == expected
432448

433449

434450
def test_register_duplicate_schemas():

0 commit comments

Comments
 (0)
Please sign in to comment.