Skip to content

Commit 0e60546

Browse files
authored
Preserve certain errors when linting default/examples (#740)
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent 06b8d70 commit 0e60546

5 files changed

Lines changed: 109 additions & 0 deletions

File tree

src/alterschema/linter/valid_default.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ class ValidDefault final : public SchemaTransformRule {
4141
try {
4242
schema_template = compile(root, walker, resolver, this->compiler_,
4343
frame, base.value().get(), Mode::Exhaustive);
44+
} catch (const CompilerReferenceTargetNotSchemaError &) {
45+
throw;
46+
} catch (const sourcemeta::core::SchemaVocabularyError &) {
47+
throw;
4448
} catch (...) {
4549
return false;
4650
}
@@ -81,6 +85,10 @@ class ValidDefault final : public SchemaTransformRule {
8185
try {
8286
schema_template = compile(subschema, walker, resolver, this->compiler_,
8387
Mode::Exhaustive, location.dialect, default_id);
88+
} catch (const CompilerReferenceTargetNotSchemaError &) {
89+
throw;
90+
} catch (const sourcemeta::core::SchemaVocabularyError &) {
91+
throw;
8492
} catch (...) {
8593
return false;
8694
}

src/alterschema/linter/valid_examples.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ class ValidExamples final : public SchemaTransformRule {
4242
try {
4343
schema_template = compile(root, walker, resolver, this->compiler_,
4444
frame, base.value().get(), Mode::Exhaustive);
45+
} catch (const CompilerReferenceTargetNotSchemaError &) {
46+
throw;
47+
} catch (const sourcemeta::core::SchemaVocabularyError &) {
48+
throw;
4549
} catch (...) {
4650
return false;
4751
}
@@ -90,6 +94,10 @@ class ValidExamples final : public SchemaTransformRule {
9094
try {
9195
schema_template = compile(subschema, walker, resolver, this->compiler_,
9296
Mode::Exhaustive, location.dialect, default_id);
97+
} catch (const CompilerReferenceTargetNotSchemaError &) {
98+
throw;
99+
} catch (const sourcemeta::core::SchemaVocabularyError &) {
100+
throw;
93101
} catch (...) {
94102
return false;
95103
}

test/alterschema/alterschema_lint_2020_12_test.cc

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11729,3 +11729,38 @@ TEST(AlterSchema_lint_2020_12,
1172911729

1173011730
EXPECT_EQ(document, expected);
1173111731
}
11732+
11733+
TEST(AlterSchema_lint_2020_12, valid_default_throws_on_unsupported_vocabulary) {
11734+
sourcemeta::core::JSON document = sourcemeta::core::parse_json(R"JSON({
11735+
"$schema": "https://example.com/unsupported-vocabulary-metaschema",
11736+
"type": "string",
11737+
"default": "hello"
11738+
})JSON");
11739+
11740+
sourcemeta::blaze::SchemaTransformer bundle;
11741+
sourcemeta::blaze::add(bundle, sourcemeta::blaze::AlterSchemaMode::Linter);
11742+
EXPECT_THROW(static_cast<void>(
11743+
bundle.check(document, sourcemeta::core::schema_walker,
11744+
alterschema_test_resolver,
11745+
[](const auto &, const auto &, const auto &,
11746+
const auto &, const auto &) {})),
11747+
sourcemeta::core::SchemaVocabularyError);
11748+
}
11749+
11750+
TEST(AlterSchema_lint_2020_12,
11751+
valid_examples_throws_on_unsupported_vocabulary) {
11752+
sourcemeta::core::JSON document = sourcemeta::core::parse_json(R"JSON({
11753+
"$schema": "https://example.com/unsupported-vocabulary-metaschema",
11754+
"type": "string",
11755+
"examples": [ "hello" ]
11756+
})JSON");
11757+
11758+
sourcemeta::blaze::SchemaTransformer bundle;
11759+
sourcemeta::blaze::add(bundle, sourcemeta::blaze::AlterSchemaMode::Linter);
11760+
EXPECT_THROW(static_cast<void>(
11761+
bundle.check(document, sourcemeta::core::schema_walker,
11762+
alterschema_test_resolver,
11763+
[](const auto &, const auto &, const auto &,
11764+
const auto &, const auto &) {})),
11765+
sourcemeta::core::SchemaVocabularyError);
11766+
}

test/alterschema/alterschema_lint_draft7_test.cc

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <gtest/gtest.h>
22

3+
#include <sourcemeta/blaze/compiler_error.h>
34
#include <sourcemeta/core/json.h>
45

56
#include "alterschema_test_utils.h"
@@ -4456,3 +4457,47 @@ TEST(AlterSchema_lint_draft7, quintuple_negation_to_single) {
44564457

44574458
EXPECT_EQ(document, expected);
44584459
}
4460+
4461+
TEST(AlterSchema_lint_draft7, valid_default_throws_on_invalid_ref_target) {
4462+
sourcemeta::core::JSON document = sourcemeta::core::parse_json(R"JSON({
4463+
"$schema": "http://json-schema.org/draft-07/schema#",
4464+
"allOf": [
4465+
{ "$ref": "#/$defs/foo" }
4466+
],
4467+
"$defs": {
4468+
"foo": { "type": "string" }
4469+
},
4470+
"default": "test"
4471+
})JSON");
4472+
4473+
sourcemeta::blaze::SchemaTransformer bundle;
4474+
sourcemeta::blaze::add(bundle, sourcemeta::blaze::AlterSchemaMode::Linter);
4475+
EXPECT_THROW(static_cast<void>(
4476+
bundle.check(document, sourcemeta::core::schema_walker,
4477+
alterschema_test_resolver,
4478+
[](const auto &, const auto &, const auto &,
4479+
const auto &, const auto &) {})),
4480+
sourcemeta::blaze::CompilerReferenceTargetNotSchemaError);
4481+
}
4482+
4483+
TEST(AlterSchema_lint_draft7, valid_examples_throws_on_invalid_ref_target) {
4484+
sourcemeta::core::JSON document = sourcemeta::core::parse_json(R"JSON({
4485+
"$schema": "http://json-schema.org/draft-07/schema#",
4486+
"allOf": [
4487+
{ "$ref": "#/$defs/foo" }
4488+
],
4489+
"$defs": {
4490+
"foo": { "type": "string" }
4491+
},
4492+
"examples": [ "test" ]
4493+
})JSON");
4494+
4495+
sourcemeta::blaze::SchemaTransformer bundle;
4496+
sourcemeta::blaze::add(bundle, sourcemeta::blaze::AlterSchemaMode::Linter);
4497+
EXPECT_THROW(static_cast<void>(
4498+
bundle.check(document, sourcemeta::core::schema_walker,
4499+
alterschema_test_resolver,
4500+
[](const auto &, const auto &, const auto &,
4501+
const auto &, const auto &) {})),
4502+
sourcemeta::blaze::CompilerReferenceTargetNotSchemaError);
4503+
}

test/alterschema/alterschema_test_utils.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,19 @@ static auto alterschema_test_resolver(std::string_view identifier)
5050
"$schema": "https://json-schema.org/draft/2020-12/schema",
5151
"type": "integer"
5252
})JSON");
53+
} else if (identifier ==
54+
"https://example.com/unsupported-vocabulary-metaschema") {
55+
return sourcemeta::core::parse_json(R"JSON({
56+
"$id": "https://example.com/unsupported-vocabulary-metaschema",
57+
"$schema": "https://json-schema.org/draft/2020-12/schema",
58+
"$vocabulary": {
59+
"https://json-schema.org/draft/2020-12/vocab/core": true,
60+
"https://json-schema.org/draft/2020-12/vocab/applicator": true,
61+
"https://json-schema.org/draft/2020-12/vocab/validation": true,
62+
"https://json-schema.org/draft/2020-12/vocab/meta-data": true,
63+
"https://json-schema.org/draft/2020-12/vocab/format-assertion": true
64+
}
65+
})JSON");
5366
} else {
5467
return sourcemeta::core::schema_resolver(identifier);
5568
}

0 commit comments

Comments
 (0)