diff --git a/.github/workflows/dotnet-core.yml b/.github/workflows/dotnet-core.yml index a261c2a28d..fe05aac2bb 100644 --- a/.github/workflows/dotnet-core.yml +++ b/.github/workflows/dotnet-core.yml @@ -124,7 +124,7 @@ jobs: if: github.event_name == 'pull_request' # multiline comment support details: https://github.community/t/set-output-truncates-multiline-strings/16852/3 run: | - dotnet analyze-semver -a artifacts/DLLs/Json.More/bin/Release/netstandard2.0/Json.More.dll -o semver-report-more.md -c .github/semver_config.json -p Json.More.Net + dotnet analyze-semver -a artifacts/DLLs/Json.More/bin/Release/netstandard2.0/Json.More.dll -o semver-report-more.md -c .github/semver_config.json -p Json.More.Net --include-header true --omit-disclaimer true --assume-changes true unset HAS_REPORT unset REPORT if [ -s semver-report-more.md ] @@ -176,7 +176,7 @@ jobs: if: github.event_name == 'pull_request' # multiline comment support details: https://github.community/t/set-output-truncates-multiline-strings/16852/3 run: | - dotnet analyze-semver -a artifacts/DLLs/JsonPatch/bin/Release/netstandard2.0/JsonPatch.dll -o semver-report-patch.md -c .github/semver_config.json -p JsonPatch.Net + dotnet analyze-semver -a artifacts/DLLs/JsonPatch/bin/Release/netstandard2.0/JsonPatch.dll -o semver-report-patch.md -c .github/semver_config.json -p JsonPatch.Net --include-header true --omit-disclaimer true --assume-changes true unset HAS_REPORT unset REPORT if [ -s semver-report-patch.md ] @@ -228,7 +228,7 @@ jobs: if: github.event_name == 'pull_request' # multiline comment support details: https://github.community/t/set-output-truncates-multiline-strings/16852/3 run: | - dotnet analyze-semver -a artifacts/DLLs/JsonPath/bin/Release/netstandard2.1/JsonPath.Net.dll -o semver-report-path.md -c .github/semver_config.json + dotnet analyze-semver -a artifacts/DLLs/JsonPath/bin/Release/netstandard2.1/JsonPath.Net.dll -o semver-report-path.md -c .github/semver_config.json --include-Header --include-header true --omit-disclaimer true --assume-changes true unset HAS_REPORT unset REPORT if [ -s semver-report-path.md ] @@ -280,7 +280,7 @@ jobs: if: github.event_name == 'pull_request' # multiline comment support details: https://github.community/t/set-output-truncates-multiline-strings/16852/3 run: | - dotnet analyze-semver -a artifacts/DLLs/JsonPointer/bin/Release/netstandard2.0/JsonPointer.Net.dll -o semver-report-pointer.md -c .github/semver_config.json + dotnet analyze-semver -a artifacts/DLLs/JsonPointer/bin/Release/netstandard2.0/JsonPointer.Net.dll -o semver-report-pointer.md -c .github/semver_config.json --include-header true --omit-disclaimer true --assume-changes true unset HAS_REPORT unset REPORT if [ -s semver-report-pointer.md ] @@ -332,7 +332,7 @@ jobs: if: github.event_name == 'pull_request' # multiline comment support details: https://github.community/t/set-output-truncates-multiline-strings/16852/3 run: | - dotnet analyze-semver -a artifacts/DLLs/JsonSchema/bin/Release/netstandard2.0/JsonSchema.Net.dll -o semver-report-schema.md -c .github/semver_config.json + dotnet analyze-semver -a artifacts/DLLs/JsonSchema/bin/Release/netstandard2.0/JsonSchema.Net.dll -o semver-report-schema.md -c .github/semver_config.json --include-header true --omit-disclaimer true --assume-changes true unset HAS_REPORT unset REPORT if [ -s semver-report-schema.md ] @@ -388,7 +388,7 @@ jobs: if: github.event_name == 'pull_request' # multiline comment support details: https://github.community/t/set-output-truncates-multiline-strings/16852/3 run: | - dotnet analyze-semver -a artifacts/DLLs/JsonSchema.Generation/bin/Release/netstandard2.0/JsonSchema.Net.Generation.dll -o semver-report-schema-gen.md -c .github/semver_config.json + dotnet analyze-semver -a artifacts/DLLs/JsonSchema.Generation/bin/Release/netstandard2.0/JsonSchema.Net.Generation.dll -o semver-report-schema-gen.md -c .github/semver_config.json --include-header true --omit-disclaimer true --assume-changes true unset HAS_REPORT unset REPORT if [ -s semver-report-schema-gen.md ] @@ -440,7 +440,7 @@ jobs: if: github.event_name == 'pull_request' # multiline comment support details: https://github.community/t/set-output-truncates-multiline-strings/16852/3 run: | - dotnet analyze-semver -a artifacts/DLLs/JsonSchema.Data/bin/Release/netstandard2.0/JsonSchema.Net.Data.dll -o semver-report-schema-data.md -c .github/semver_config.json + dotnet analyze-semver -a artifacts/DLLs/JsonSchema.Data/bin/Release/netstandard2.0/JsonSchema.Net.Data.dll -o semver-report-schema-data.md -c .github/semver_config.json --include-header true --omit-disclaimer true --assume-changes true unset HAS_REPORT unset REPORT if [ -s semver-report-schema-data.md ] @@ -492,7 +492,7 @@ jobs: if: github.event_name == 'pull_request' # multiline comment support details: https://github.community/t/set-output-truncates-multiline-strings/16852/3 run: | - dotnet analyze-semver -a artifacts/DLLs/JsonLogic/bin/Release/netstandard2.1/JsonLogic.dll -o semver-report-logic.md -c .github/semver_config.json + dotnet analyze-semver -a artifacts/DLLs/JsonLogic/bin/Release/netstandard2.1/JsonLogic.dll -o semver-report-logic.md -c .github/semver_config.json --include-header true --omit-disclaimer true --assume-changes true unset HAS_REPORT unset REPORT if [ -s semver-report-logic.md ] diff --git a/JsonSchema.Tests/GithubTests.cs b/JsonSchema.Tests/GithubTests.cs index 58efd55dd9..d45a71d1bb 100644 --- a/JsonSchema.Tests/GithubTests.cs +++ b/JsonSchema.Tests/GithubTests.cs @@ -418,14 +418,14 @@ public void Issue79_RefsTryingToResolveParent() { Fetch = uri => { - Console.WriteLine("Fetching {0}", uri); - return map.TryGetValue(uri, out var ret) ? ret : null; - //return map[uri]; + Assert.True(map.TryGetValue(uri, out var ret), "Unexpected uri: {0}", uri); + return ret; } } }; - var validation = schema2.Validate(json, options); - Console.WriteLine("Validation: {0}", JsonSerializer.Serialize(validation, new JsonSerializerOptions {WriteIndented = true})); + var result = schema2.Validate(json, options); + result.AssertValid(); + Assert.AreEqual(result.NestedResults[0].NestedResults[0].AbsoluteSchemaLocation, "http://first.com/schema1.json#"); } [Test] @@ -473,4 +473,4 @@ public void Issue79_RefsTryingToResolveParent_Explanation() schema.Validate(failing, new ValidationOptions{OutputFormat = OutputFormat.Detailed}).AssertInvalid(); } } -} \ No newline at end of file +} diff --git a/JsonSchema/DynamicRefKeyword.cs b/JsonSchema/DynamicRefKeyword.cs index e37c2c0fd6..c9706ffc7a 100644 --- a/JsonSchema/DynamicRefKeyword.cs +++ b/JsonSchema/DynamicRefKeyword.cs @@ -36,7 +36,7 @@ public DynamicRefKeyword(Uri value) /// Contextual details for the validation process. public void Validate(ValidationContext context) { - var parts = Reference.OriginalString.Split(new []{'#'}, StringSplitOptions.None); + var parts = Reference.OriginalString.Split(new[] {'#'}, StringSplitOptions.None); var baseUri = parts[0]; var fragment = parts.Length > 1 ? parts[1] : null; @@ -51,11 +51,8 @@ public void Validate(ValidationContext context) var uriFolder = context.CurrentUri.OriginalString.EndsWith("/") ? context.CurrentUri : context.CurrentUri.GetParentUri(); - newUri = uriFolder; - var newBaseUri = new Uri(uriFolder, baseUri); - if (!string.IsNullOrEmpty(fragment)) - newUri = newBaseUri; - baseSchema = context.Options.SchemaRegistry.Get(newBaseUri); + newUri = new Uri(uriFolder, baseUri); + baseSchema = context.Options.SchemaRegistry.Get(newUri); } } else @@ -63,7 +60,7 @@ public void Validate(ValidationContext context) newUri = context.CurrentUri; if (fragment != null && context.DynamicAnchors.TryGetValue(fragment, out var dynamicSchema)) baseSchema = dynamicSchema; - baseSchema ??= context.Options.SchemaRegistry.Get(newUri, fragment) ?? context.SchemaRoot; + baseSchema ??= context.Options.SchemaRegistry.Get(newUri) ?? context.SchemaRoot; } JsonSchema? schema; @@ -87,6 +84,7 @@ public void Validate(ValidationContext context) context.Message = $"Could not parse pointer `{fragment}`"; return; } + (schema, newUri) = baseSchema.FindSubschema(pointer, newUri); } else @@ -101,7 +99,7 @@ public void Validate(ValidationContext context) } var subContext = ValidationContext.From(context, newUri: newUri); - if (!ReferenceEquals(baseSchema, context.SchemaRoot)) + if (!ReferenceEquals(baseSchema, context.SchemaRoot)) subContext.SchemaRoot = baseSchema!; schema.ValidateSubschema(subContext); context.NestedContexts.Add(subContext); @@ -150,4 +148,4 @@ public override void Write(Utf8JsonWriter writer, DynamicRefKeyword value, JsonS JsonSerializer.Serialize(writer, value.Reference, options); } } -} \ No newline at end of file +} diff --git a/JsonSchema/IdKeyword.cs b/JsonSchema/IdKeyword.cs index 294fbdd58f..f48153ca59 100644 --- a/JsonSchema/IdKeyword.cs +++ b/JsonSchema/IdKeyword.cs @@ -53,7 +53,13 @@ public void Validate(ValidationContext context) internal Uri UpdateUri(Uri? currentUri) { - return currentUri == null || Id.IsAbsoluteUri ? Id : new Uri(currentUri, Id); + if (currentUri == null || Id.IsAbsoluteUri) return Id; + + var baseUri = currentUri; + if (currentUri.Segments.Length > 1 && currentUri.OriginalString.EndsWith("/")) + baseUri = baseUri.GetParentUri(); + + return new Uri(baseUri, Id); } /// Indicates whether the current object is equal to another object of the same type. @@ -101,4 +107,4 @@ public override void Write(Utf8JsonWriter writer, IdKeyword value, JsonSerialize writer.WriteString(IdKeyword.Name, value.Id.OriginalString); } } -} \ No newline at end of file +} diff --git a/JsonSchema/JsonSchema.csproj b/JsonSchema/JsonSchema.csproj index 5ec6692ea1..8f1ad4a107 100644 --- a/JsonSchema/JsonSchema.csproj +++ b/JsonSchema/JsonSchema.csproj @@ -13,8 +13,8 @@ https://github.com/gregsdennis/json-everything https://github.com/gregsdennis/json-everything json-schema validation schema json - 1.9.2 - 1.9.2.0 + 1.9.3 + 1.9.3.0 1.0.0.0 LICENSE JsonSchema.Net diff --git a/JsonSchema/RecursiveRefKeyword.cs b/JsonSchema/RecursiveRefKeyword.cs index a3a9776747..28f5f9c796 100644 --- a/JsonSchema/RecursiveRefKeyword.cs +++ b/JsonSchema/RecursiveRefKeyword.cs @@ -36,7 +36,7 @@ public RecursiveRefKeyword(Uri value) /// Contextual details for the validation process. public void Validate(ValidationContext context) { - var parts = Reference.OriginalString.Split(new []{'#'}, StringSplitOptions.None); + var parts = Reference.OriginalString.Split(new[] {'#'}, StringSplitOptions.None); var baseUri = parts[0]; var fragment = parts.Length > 1 ? parts[1] : null; @@ -85,6 +85,7 @@ public void Validate(ValidationContext context) context.Message = $"Could not parse pointer `{fragment}`"; return; } + (schema, newUri) = baseSchema.FindSubschema(pointer, newUri); } else @@ -99,7 +100,7 @@ public void Validate(ValidationContext context) } var subContext = ValidationContext.From(context, newUri: newUri); - if (!ReferenceEquals(baseSchema, context.SchemaRoot)) + if (!ReferenceEquals(baseSchema, context.SchemaRoot)) subContext.SchemaRoot = baseSchema!; schema.ValidateSubschema(subContext); context.NestedContexts.Add(subContext); @@ -148,4 +149,4 @@ public override void Write(Utf8JsonWriter writer, RecursiveRefKeyword value, Jso JsonSerializer.Serialize(writer, value.Reference, options); } } -} \ No newline at end of file +} diff --git a/JsonSchema/RefKeyword.cs b/JsonSchema/RefKeyword.cs index 7cc1d5241a..6f4d8b77ba 100644 --- a/JsonSchema/RefKeyword.cs +++ b/JsonSchema/RefKeyword.cs @@ -40,7 +40,7 @@ public RefKeyword(Uri value) /// Contextual details for the validation process. public void Validate(ValidationContext context) { - var parts = Reference.OriginalString.Split(new []{'#'}, StringSplitOptions.None); + var parts = Reference.OriginalString.Split(new[] {'#'}, StringSplitOptions.None); var baseUri = parts[0]; var fragment = parts.Length > 1 ? parts[1] : null; @@ -55,17 +55,14 @@ public void Validate(ValidationContext context) var uriFolder = context.CurrentUri.OriginalString.EndsWith("/") ? context.CurrentUri : context.CurrentUri.GetParentUri(); - newUri = uriFolder; - var newBaseUri = new Uri(uriFolder, baseUri); - if (!string.IsNullOrEmpty(fragment)) - newUri = newBaseUri; - baseSchema = context.Options.SchemaRegistry.Get(newBaseUri); + newUri = new Uri(uriFolder, baseUri); + baseSchema = context.Options.SchemaRegistry.Get(newUri); } } else { newUri = context.CurrentUri; - baseSchema = context.SchemaRoot; + baseSchema = context.Options.SchemaRegistry.Get(newUri) ?? context.SchemaRoot; } JsonSchema? schema; @@ -89,6 +86,7 @@ public void Validate(ValidationContext context) context.Message = $"Could not parse pointer `{fragment}`"; return; } + (schema, newUri) = baseSchema.FindSubschema(pointer, newUri); } else @@ -103,9 +101,9 @@ public void Validate(ValidationContext context) } var subContext = ValidationContext.From(context, newUri: newUri); - if (!string.IsNullOrEmpty(fragment) && JsonPointer.TryParse(fragment!, out var reference)) + if (!string.IsNullOrEmpty(fragment) && JsonPointer.TryParse(fragment!, out var reference)) subContext.Reference = reference; - if (!ReferenceEquals(baseSchema, context.SchemaRoot)) + if (!ReferenceEquals(baseSchema, context.SchemaRoot)) subContext.SchemaRoot = baseSchema!; schema.ValidateSubschema(subContext); context.NestedContexts.Add(subContext); @@ -156,4 +154,4 @@ public override void Write(Utf8JsonWriter writer, RefKeyword value, JsonSerializ } // Source: https://github.com/WebDAVSharp/WebDAVSharp.Server/blob/1d2086a502937936ebc6bfe19cfa15d855be1c31/WebDAVExtensions.cs -} \ No newline at end of file +} diff --git a/docs_source/release-notes/json-schema.md b/docs_source/release-notes/json-schema.md index 9fe31f88a4..a47898c728 100644 --- a/docs_source/release-notes/json-schema.md +++ b/docs_source/release-notes/json-schema.md @@ -1,3 +1,7 @@ +# [1.9.2](https://github.com/gregsdennis/json-everything/pull/83) + +[#82](https://github.com/gregsdennis/json-everything/pulll/82) - Fixing issues managing `ValidationContext.CurrentUri`. Credit to [@amosonn](https://github.com/amosonn). + # [1.9.2](https://github.com/gregsdennis/json-everything/pull/80) [#79](https://github.com/gregsdennis/json-everything/issues/79) - `$ref` was calling out to resolve a parent URI.