Skip to content

Commit 9923f1c

Browse files
authored
Take a default identifier when compiling a schema (#468)
Signed-off-by: Juan Cruz Viotti <[email protected]>
1 parent ca84098 commit 9923f1c

File tree

9 files changed

+93
-46
lines changed

9 files changed

+93
-46
lines changed

DEPENDENCIES

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
vendorpull https://github.com/sourcemeta/vendorpull dea311b5bfb53b6926a4140267959ae334d3ecf4
2-
core https://github.com/sourcemeta/core fb91cc0f4bf496f6f56b1c9ae2bb4763e10adc59
2+
core https://github.com/sourcemeta/core 1fdd2a1b84477b026e9dd359924caf811ae77ae1
33
jsonschema-test-suite https://github.com/json-schema-org/JSON-Schema-Test-Suite 48461fc3568972801b40eaccc428a31bce338f6e

src/compiler/compile.cc

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,15 @@ auto compile(const sourcemeta::core::JSON &schema,
107107
const sourcemeta::core::SchemaResolver &resolver,
108108
const Compiler &compiler,
109109
const sourcemeta::core::SchemaFrame &frame, const Mode mode,
110-
const std::optional<std::string> &default_dialect) -> Template {
110+
const std::optional<std::string> &default_dialect,
111+
const std::optional<std::string> &default_id) -> Template {
111112
assert(is_schema(schema));
112113

113114
const std::string base{sourcemeta::core::URI::canonicalize(
114115
sourcemeta::core::identify(
115116
schema, resolver,
116117
sourcemeta::core::SchemaIdentificationStrategy::Strict,
117-
default_dialect)
118+
default_dialect, default_id)
118119
.value_or(""))};
119120

120121
assert(frame.locations().contains(
@@ -271,21 +272,22 @@ auto compile(const sourcemeta::core::JSON &schema,
271272
const sourcemeta::core::SchemaWalker &walker,
272273
const sourcemeta::core::SchemaResolver &resolver,
273274
const Compiler &compiler, const Mode mode,
274-
const std::optional<std::string> &default_dialect) -> Template {
275+
const std::optional<std::string> &default_dialect,
276+
const std::optional<std::string> &default_id) -> Template {
275277
assert(is_schema(schema));
276278

277279
// Make sure the input schema is bundled, otherwise we won't be able to
278280
// resolve remote references here
279-
const sourcemeta::core::JSON result{
280-
sourcemeta::core::bundle(schema, walker, resolver, default_dialect)};
281+
const sourcemeta::core::JSON result{sourcemeta::core::bundle(
282+
schema, walker, resolver, default_dialect, default_id)};
281283

282284
// Perform framing to resolve references later on
283285
sourcemeta::core::SchemaFrame frame{
284286
sourcemeta::core::SchemaFrame::Mode::References};
285-
frame.analyse(result, walker, resolver, default_dialect);
287+
frame.analyse(result, walker, resolver, default_dialect, default_id);
286288

287289
return compile(result, walker, resolver, compiler, frame, mode,
288-
default_dialect);
290+
default_dialect, default_id);
289291
}
290292

291293
auto compile(const Context &context, const SchemaContext &schema_context,

src/compiler/include/sourcemeta/blaze/compiler.h

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,13 @@ auto SOURCEMETA_BLAZE_COMPILER_EXPORT default_schema_compiler(
143143
///
144144
/// // Evaluate or encode
145145
/// ```
146-
auto SOURCEMETA_BLAZE_COMPILER_EXPORT
147-
compile(const sourcemeta::core::JSON &schema,
148-
const sourcemeta::core::SchemaWalker &walker,
149-
const sourcemeta::core::SchemaResolver &resolver,
150-
const Compiler &compiler, const Mode mode = Mode::FastValidation,
151-
const std::optional<std::string> &default_dialect = std::nullopt)
152-
-> Template;
146+
auto SOURCEMETA_BLAZE_COMPILER_EXPORT compile(
147+
const sourcemeta::core::JSON &schema,
148+
const sourcemeta::core::SchemaWalker &walker,
149+
const sourcemeta::core::SchemaResolver &resolver, const Compiler &compiler,
150+
const Mode mode = Mode::FastValidation,
151+
const std::optional<std::string> &default_dialect = std::nullopt,
152+
const std::optional<std::string> &default_id = std::nullopt) -> Template;
153153

154154
/// @ingroup compiler
155155
///
@@ -160,14 +160,14 @@ compile(const sourcemeta::core::JSON &schema,
160160
/// behavior.
161161
///
162162
/// Don't use this function unless you know what you are doing.
163-
auto SOURCEMETA_BLAZE_COMPILER_EXPORT
164-
compile(const sourcemeta::core::JSON &schema,
165-
const sourcemeta::core::SchemaWalker &walker,
166-
const sourcemeta::core::SchemaResolver &resolver,
167-
const Compiler &compiler, const sourcemeta::core::SchemaFrame &frame,
168-
const Mode mode = Mode::FastValidation,
169-
const std::optional<std::string> &default_dialect = std::nullopt)
170-
-> Template;
163+
auto SOURCEMETA_BLAZE_COMPILER_EXPORT compile(
164+
const sourcemeta::core::JSON &schema,
165+
const sourcemeta::core::SchemaWalker &walker,
166+
const sourcemeta::core::SchemaResolver &resolver, const Compiler &compiler,
167+
const sourcemeta::core::SchemaFrame &frame,
168+
const Mode mode = Mode::FastValidation,
169+
const std::optional<std::string> &default_dialect = std::nullopt,
170+
const std::optional<std::string> &default_id = std::nullopt) -> Template;
171171

172172
/// @ingroup compiler
173173
///

test/evaluator/evaluator_test.cc

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ static auto test_resolver(std::string_view identifier)
1919
"https://example.com/vocab/custom": true
2020
}
2121
})JSON");
22+
} else if (identifier == "https://example.com/schema") {
23+
return sourcemeta::core::parse_json(R"JSON({
24+
"$schema": "https://json-schema.org/draft/2020-12/schema",
25+
"$id": "https://example.com/schema",
26+
"type": "string"
27+
})JSON");
2228
} else {
2329
return sourcemeta::core::schema_official_resolver(identifier);
2430
}
@@ -42,6 +48,36 @@ TEST(Evaluator, unknown_vocabulary_required) {
4248
}
4349
}
4450

51+
TEST(Evaluator, without_default_id) {
52+
const sourcemeta::core::JSON schema{sourcemeta::core::parse_json(R"JSON({
53+
"$schema": "https://json-schema.org/draft/2020-12/schema",
54+
"$ref": "schema"
55+
})JSON")};
56+
57+
EXPECT_THROW(sourcemeta::blaze::compile(
58+
schema, sourcemeta::core::schema_official_walker,
59+
test_resolver, sourcemeta::blaze::default_schema_compiler,
60+
sourcemeta::blaze::Mode::FastValidation),
61+
sourcemeta::core::SchemaResolutionError);
62+
}
63+
64+
TEST(Evaluator, with_default_id) {
65+
const sourcemeta::core::JSON schema{sourcemeta::core::parse_json(R"JSON({
66+
"$schema": "https://json-schema.org/draft/2020-12/schema",
67+
"$ref": "schema"
68+
})JSON")};
69+
70+
const auto compiled_schema{sourcemeta::blaze::compile(
71+
schema, sourcemeta::core::schema_official_walker, test_resolver,
72+
sourcemeta::blaze::default_schema_compiler,
73+
sourcemeta::blaze::Mode::FastValidation, std::nullopt,
74+
"https://example.com/default")};
75+
76+
const sourcemeta::core::JSON instance{"foo"};
77+
EVALUATE_WITH_TRACE(compiled_schema, instance, 1)
78+
EXPECT_TRUE(result);
79+
}
80+
4581
TEST(Evaluator, boolean_true) {
4682
const sourcemeta::core::JSON schema{true};
4783

vendor/core/src/core/jsonschema/bundle.cc

Lines changed: 12 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/core/src/core/jsonschema/include/sourcemeta/core/jsonschema.h

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/core/src/core/jsonschema/include/sourcemeta/core/jsonschema_transform.h

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/core/src/core/jsonschema/transformer.cc

Lines changed: 6 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/core/src/core/uri/uri.cc

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)