Skip to content

Commit 6f95625

Browse files
committed
chore: Rework registry
Signed-off-by: Dmitry Dygalo <[email protected]>
1 parent 4b932ca commit 6f95625

File tree

28 files changed

+1586
-951
lines changed

28 files changed

+1586
-951
lines changed

crates/jsonschema-py/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -597,16 +597,16 @@ thread_local! {
597597
static LAST_FORMAT_ERROR: RefCell<Option<PyErr>> = const { RefCell::new(None) };
598598
}
599599

600-
fn make_options(
600+
fn make_options<'a>(
601601
draft: Option<u8>,
602602
formats: Option<&Bound<'_, PyDict>>,
603603
validate_formats: Option<bool>,
604604
ignore_unknown_formats: Option<bool>,
605605
retriever: Option<&Bound<'_, PyAny>>,
606-
registry: Option<&registry::Registry>,
606+
registry: Option<&'a registry::Registry>,
607607
base_uri: Option<String>,
608608
pattern_options: Option<&Bound<'_, PyAny>>,
609-
) -> PyResult<jsonschema::ValidationOptions> {
609+
) -> PyResult<jsonschema::ValidationOptions<'a>> {
610610
let mut options = jsonschema::options();
611611
if let Some(raw_draft_version) = draft {
612612
options = options.with_draft(get_draft(raw_draft_version)?);
@@ -652,7 +652,7 @@ fn make_options(
652652
options = options.with_retriever(Retriever { func });
653653
}
654654
if let Some(registry) = registry {
655-
options = options.with_registry(registry.inner.clone());
655+
options = options.with_registry(&registry.inner);
656656
}
657657
if let Some(base_uri) = base_uri {
658658
options = options.with_base_uri(base_uri);
@@ -1539,7 +1539,7 @@ mod meta {
15391539
let schema = crate::ser::to_value(schema)?;
15401540
let result = if let Some(registry) = registry {
15411541
jsonschema::meta::options()
1542-
.with_registry(registry.inner.clone())
1542+
.with_registry(&registry.inner)
15431543
.validate(&schema)
15441544
} else {
15451545
jsonschema::meta::validate(&schema)
@@ -1588,7 +1588,7 @@ mod meta {
15881588
let schema = crate::ser::to_value(schema)?;
15891589
let result = if let Some(registry) = registry {
15901590
jsonschema::meta::options()
1591-
.with_registry(registry.inner.clone())
1591+
.with_registry(&registry.inner)
15921592
.validate(&schema)
15931593
} else {
15941594
jsonschema::meta::validate(&schema)

crates/jsonschema-py/src/registry.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{get_draft, retriever::into_retriever, to_value, Retriever};
66
/// A registry of JSON Schema resources, each identified by their canonical URIs.
77
#[pyclass]
88
pub(crate) struct Registry {
9-
pub(crate) inner: jsonschema::Registry,
9+
pub(crate) inner: jsonschema::Registry<'static>,
1010
}
1111

1212
#[pymethods]

crates/jsonschema-referencing/benches/anchor.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@ fn bench_anchor_lookup(c: &mut Criterion) {
2424
BenchmarkId::new("resolve", "small"),
2525
&registry,
2626
|b, registry| {
27-
let resolver = registry
28-
.try_resolver("http://example.com/")
29-
.expect("Invalid base URI");
30-
b.iter_with_large_drop(|| resolver.lookup(black_box("#foo")));
27+
let context = registry.context();
28+
b.iter_with_large_drop(|| {
29+
let resolver = context
30+
.try_resolver("http://example.com/")
31+
.expect("Invalid base URI");
32+
resolver.lookup(black_box("#foo"))
33+
});
3134
},
3235
);
3336

crates/jsonschema-referencing/benches/pointer.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,13 @@ fn bench_pointers(c: &mut Criterion) {
4545
BenchmarkId::new("pointer", name),
4646
&registry,
4747
|b, registry| {
48-
let resolver = registry
49-
.try_resolver("http://example.com/schema.json")
50-
.expect("Invalid base URI");
51-
b.iter_with_large_drop(|| resolver.lookup(black_box(pointer)));
48+
let context = registry.context();
49+
b.iter_with_large_drop(|| {
50+
let resolver = context
51+
.try_resolver("http://example.com/schema.json")
52+
.expect("Invalid base URI");
53+
resolver.lookup(black_box(pointer))
54+
});
5255
},
5356
);
5457
}

crates/jsonschema-referencing/benches/registry.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,10 @@ fn bench_subresources(c: &mut Criterion) {
2424
let schema = benchmark::read_json(data);
2525

2626
group.bench_with_input(BenchmarkId::new("try_new", name), &schema, |b, schema| {
27-
b.iter_batched(
28-
|| draft.create_resource(schema.clone()),
29-
|resource| {
30-
Registry::try_new("http://example.com/schema.json", resource)
31-
.expect("Invalid registry input")
32-
},
33-
BatchSize::SmallInput,
34-
);
27+
b.iter(|| {
28+
Registry::try_new("http://example.com/schema.json", (schema, *draft))
29+
.expect("Invalid registry input")
30+
});
3531
});
3632
}
3733
let drafts = [
@@ -50,14 +46,10 @@ fn bench_subresources(c: &mut Criterion) {
5046
&schema,
5147
|b, schema| {
5248
b.iter_batched(
53-
|| {
54-
(
55-
draft.create_resource(schema.clone()),
56-
SPECIFICATIONS.clone(),
57-
)
58-
},
59-
|(resource, registry)| {
60-
registry.try_with_resource("http://example.com/schema.json", resource)
49+
|| SPECIFICATIONS.clone(),
50+
|registry| {
51+
registry
52+
.try_with_resource("http://example.com/schema.json", (schema, *draft))
6153
},
6254
BatchSize::SmallInput,
6355
);

crates/jsonschema-referencing/src/anchors/mod.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ impl Anchor {
9090
Anchor::Dynamic { name, resource } => {
9191
let mut last = resource;
9292
for uri in &resolver.dynamic_scope() {
93-
match resolver.registry.anchor(uri, name.as_str()) {
93+
match resolver.context.anchor(uri, name.as_str()) {
9494
Ok(anchor) => {
9595
if let Anchor::Dynamic { resource, .. } = anchor {
9696
last = resource;
@@ -216,7 +216,8 @@ mod tests {
216216
let one = Draft::Draft202012.create_resource(json!({"$dynamicAnchor": "foo"}));
217217
let registry =
218218
Registry::try_new("http://example.com", one.clone()).expect("Invalid resources");
219-
let resolver = registry
219+
let context = registry.context();
220+
let resolver = context
220221
.try_resolver("http://example.com")
221222
.expect("Invalid base URI");
222223
let resolved = resolver.lookup("#foo").expect("Lookup failed");
@@ -249,7 +250,8 @@ mod tests {
249250
("http://example.com/foo/bar".to_string(), root.clone()),
250251
])
251252
.expect("Invalid resources");
252-
let resolver = registry
253+
let context = registry.context();
254+
let resolver = context
253255
.try_resolver("http://example.com")
254256
.expect("Invalid base URI");
255257

@@ -290,7 +292,8 @@ mod tests {
290292
("http://example.com/foo/bar".to_string(), two.clone()),
291293
])
292294
.expect("Invalid resources");
293-
let resolver = registry
295+
let context = registry.context();
296+
let resolver = context
294297
.try_resolver("http://example.com")
295298
.expect("Invalid base URI");
296299

@@ -312,7 +315,8 @@ mod tests {
312315
}
313316
}));
314317
let registry = Registry::try_new("http://example.com", schema).expect("Invalid resources");
315-
let resolver = registry
318+
let context = registry.context();
319+
let resolver = context
316320
.try_resolver("http://example.com")
317321
.expect("Invalid base URI");
318322

@@ -331,7 +335,8 @@ mod tests {
331335
}
332336
}));
333337
let registry = Registry::try_new("http://example.com", schema).expect("Invalid resources");
334-
let resolver = registry
338+
let context = registry.context();
339+
let resolver = context
335340
.try_resolver("http://example.com")
336341
.expect("Invalid base URI");
337342

@@ -347,7 +352,8 @@ mod tests {
347352
let one = Draft::Draft201909.create_resource(json!({"$recursiveAnchor": true}));
348353
let registry =
349354
Registry::try_new("http://example.com", one.clone()).expect("Invalid resources");
350-
let resolver = registry
355+
let context = registry.context();
356+
let resolver = context
351357
.try_resolver("http://example.com")
352358
.expect("Invalid base URI");
353359
let first = resolver.lookup("").expect("Lookup failed");
@@ -363,7 +369,8 @@ mod tests {
363369
let true_resource = Draft::Draft201909.create_resource(json!(true));
364370
let registry = Registry::try_new("http://example.com", true_resource.clone())
365371
.expect("Invalid resources");
366-
let resolver = registry
372+
let context = registry.context();
373+
let resolver = context
367374
.try_resolver("http://example.com")
368375
.expect("Invalid base URI");
369376
let resolved = resolver.lookup_recursive_ref().expect("Lookup failed");
@@ -398,7 +405,8 @@ mod tests {
398405
])
399406
.expect("Invalid resources");
400407

401-
let resolver = registry
408+
let context = registry.context();
409+
let resolver = context
402410
.try_resolver("http://example.com")
403411
.expect("Invalid base URI");
404412
let first = resolver.lookup("").expect("Lookup failed");
@@ -440,7 +448,8 @@ mod tests {
440448
])
441449
.expect("Invalid resources");
442450

443-
let resolver = registry
451+
let context = registry.context();
452+
let resolver = context
444453
.try_resolver("http://example.com")
445454
.expect("Invalid base URI");
446455
let first = resolver.lookup("").expect("Lookup failed");

0 commit comments

Comments
 (0)