Skip to content

v3.2-dev: update from dev #4723

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Jun 15, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
3a0fb3d
Use full schema (schema-base.yaml) for coverage
handrews Jun 13, 2025
0fadf2e
Do not expect coverage of unreachable schema
handrews Jun 13, 2025
f66d94c
Fix spelling
handrews Jun 13, 2025
d986f88
Fix coverage calculation
handrews Jun 13, 2025
20eec3a
Remove stray commented-out line.
handrews Jun 13, 2025
8136caa
Use full schema-base to run schema tests
handrews Jun 13, 2025
3a0a025
Use matching jsonSchemaDialect
handrews Jun 12, 2025
0c75419
Update scripts/schema-test-coverage.mjs
handrews Jun 13, 2025
835059f
Merge pull request #4702 from handrews/redundant
ralfhandl Jun 13, 2025
b862c2e
Merge pull request #4701 from handrews/cov-main
ralfhandl Jun 13, 2025
fec632d
Merge pull request #4707 from OAI/main
ralfhandl Jun 13, 2025
3b6551c
Fix typos
handrews Jun 13, 2025
1873c23
Merge pull request #4708 from handrews/fixit
ralfhandl Jun 13, 2025
eee4d20
Merge pull request #4709 from OAI/main
handrews Jun 13, 2025
ea3dd41
Set exit code only if base branch is not dev
ralfhandl Jun 14, 2025
4765634
Merge pull request #4712 from ralfhandl/main-base-branch-for-schema-t…
handrews Jun 14, 2025
5d06d24
Merge pull request #4715 from OAI/main
handrews Jun 14, 2025
60f359f
Determine OAS Base Vocab name
ralfhandl Jun 14, 2025
dee2baa
Determine OAS Base Vocab name from meta.yaml
ralfhandl Jun 14, 2025
ce4ecec
Merge pull request #4720 from ralfhandl/main-determine-dialect
handrews Jun 14, 2025
b173b48
Merge pull request #4721 from OAI/main
ralfhandl Jun 14, 2025
0703eb2
Merge pull request #4719 from ralfhandl/dev-determine-dialect
handrews Jun 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/workflows/schema-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ name: schema-test
#

# run this on push to any branch and creation of pull-requests
on:
push: {}
on:
pull_request: {}
workflow_dispatch: {}

Expand All @@ -33,3 +32,5 @@ jobs:

- name: Run tests
run: npm run test
env:
BASE: ${{ github.event.pull_request.base.ref }}
42 changes: 33 additions & 9 deletions scripts/schema-test-coverage.mjs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { readFileSync } from "node:fs";
import { readdir, readFile } from "node:fs/promises";
import YAML from "yaml";
import { join } from "node:path";
import { argv } from "node:process";
import { validate } from "@hyperjump/json-schema/draft-2020-12";
import { registerSchema, validate } from "@hyperjump/json-schema/openapi-3-1";
import "@hyperjump/json-schema/draft-04";
import { BASIC } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";

/**
* @import { EvaluationPlugin } from "@hyperjump/json-schema/experimental"
Expand Down Expand Up @@ -45,7 +46,14 @@ class TestCoveragePlugin {
this.allLocations = [];

for (const schemaLocation in context.ast) {
if (schemaLocation === "metaData") {
if (
schemaLocation === "metaData" ||
// Do not require coverage of standard JSON Schema
schemaLocation.includes("json-schema.org") ||
// Do not require coverage of default $dynamicAnchor
// schemas, as they are not expected to be reached
schemaLocation.endsWith("/schema/WORK-IN-PROGRESS#/$defs/schema")
) {
continue;
}

Expand Down Expand Up @@ -110,6 +118,25 @@ const runTests = async (schemaUri, testDirectory) => {
};
};

const parseYamlFromFile = (filePath) => {
const schemaYaml = readFileSync(filePath, "utf8");
return YAML.parse(schemaYaml, { prettyErrors: true });
};

const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

defineVocabulary(oasBaseVocab, {
"discriminator": "https://spec.openapis.org/oas/3.0/keyword/discriminator",
"example": "https://spec.openapis.org/oas/3.0/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/3.0/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/3.0/keyword/xml"
});

registerSchema(meta);
registerSchema(parseYamlFromFile("./src/schemas/validation/dialect.yaml"));
registerSchema(parseYamlFromFile("./src/schemas/validation/schema.yaml"));

///////////////////////////////////////////////////////////////////////////////

const { allLocations, visitedLocations } = await runTests(argv[2], argv[3]);
Expand All @@ -122,16 +149,13 @@ if (notCovered.length > 0) {
const firstNotCovered = notCovered.slice(0, maxNotCovered);
if (notCovered.length > maxNotCovered) firstNotCovered.push("...");
console.log(firstNotCovered);
process.exitCode = 1;
}

console.log(
"Covered:",
visitedLocations.size,
(allLocations.length - notCovered.length),
"of",
allLocations.length,
"(" + Math.floor((visitedLocations.size / allLocations.length) * 100) + "%)",
"(" + Math.floor(((allLocations.length - notCovered.length) / allLocations.length) * 100) + "%)",
);

if (visitedLocations.size != allLocations.length) {
process.exitCode = 1;
}
6 changes: 2 additions & 4 deletions scripts/schema-test-coverage.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,11 @@

[[ ! -e src/schemas ]] && exit 0

branch=$(git branch --show-current)

echo
echo "Schema Test Coverage"
echo

node scripts/schema-test-coverage.mjs src/schemas/validation/schema.yaml tests/schema/pass
node scripts/schema-test-coverage.mjs src/schemas/validation/schema-base.yaml tests/schema/pass
rc=$?

[[ "$branch" == "dev" ]] || exit $rc
[[ "$BASE" == "dev" ]] || exit $rc
15 changes: 15 additions & 0 deletions tests/schema/pass/json_schema_dialect.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
openapi: 3.1.0
info:
summary: Testing jsonSchemaDialect
title: My API
version: 1.0.0
license:
name: Apache 2.0
identifier: Apache-2.0
jsonSchemaDialect: https://spec.openapis.org/oas/3.1/dialect/WORK-IN-PROGRESS
components:
schemas:
WithDollarSchema:
$id: "locked-metaschema"
$schema: https://spec.openapis.org/oas/3.1/dialect/WORK-IN-PROGRESS
paths: {}
Comment on lines +1 to +15
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ralfhandl I don't understand what is going on here as this file already exists on v3.2-dev?

1 change: 0 additions & 1 deletion tests/schema/pass/mega.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ info:
license:
name: Apache 2.0
identifier: Apache-2.0
jsonSchemaDialect: https://spec.openapis.org/oas/3.1/dialect/base
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ralfhandl likewise this change is already there?

paths:
/:
get:
Expand Down
20 changes: 17 additions & 3 deletions tests/schema/schema.test.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { readdirSync, readFileSync } from "node:fs";
import YAML from "yaml";
import { validate, setMetaSchemaOutputFormat } from "@hyperjump/json-schema/openapi-3-1";
import { BASIC } from "@hyperjump/json-schema/experimental";
import { registerSchema, validate, setMetaSchemaOutputFormat } from "@hyperjump/json-schema/openapi-3-1";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { describe, test, expect } from "vitest";

import contentTypeParser from "content-type";
Expand All @@ -26,7 +26,21 @@ const parseYamlFromFile = (filePath) => {

setMetaSchemaOutputFormat(BASIC);

const validateOpenApi = await validate("./src/schemas/validation/schema.yaml");
const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

defineVocabulary(oasBaseVocab, {
"discriminator": "https://spec.openapis.org/oas/3.0/keyword/discriminator",
"example": "https://spec.openapis.org/oas/3.0/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/3.0/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/3.0/keyword/xml"
});

registerSchema(meta);
registerSchema(parseYamlFromFile("./src/schemas/validation/dialect.yaml"));
registerSchema(parseYamlFromFile("./src/schemas/validation/schema.yaml"));

const validateOpenApi = await validate("./src/schemas/validation/schema-base.yaml");
const fixtures = './tests/schema';

describe("v3.1", () => {
Expand Down