Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 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
bdfbbcf
Merge remote-tracking branch 'upstream/dev' into 3.2-merge-dev
ralfhandl Jun 15, 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 numberDiff line numberDiff 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 }}
71 changes: 14 additions & 57 deletions scripts/schema-test-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,9 +3,9 @@ import { readdir, readFile } from "node:fs/promises";
import YAML from "yaml";
import { join } from "node:path";
import { argv } from "node:process";
import { registerSchema, 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, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";

/**
* @import { EvaluationPlugin } from "@hyperjump/json-schema/experimental"
Expand DownExpand Up@@ -118,65 +118,22 @@ const runTests = async (schemaUri, testDirectory) => {
};
};

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

const parseYamlFromFile = (filePath) => {
const schemaYaml = readFileSync(filePath, "utf8");
return YAML.parse(schemaYaml, { prettyErrors: true });
};
registerSchema(parseYamlFromFile("./src/schemas/validation/meta.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"));

Expand Down
4 changes: 1 addition & 3 deletions scripts/schema-test-coverage.sh
Original file line numberDiff line numberDiff 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-base.yaml tests/schema/pass
rc=$?

[[ "$branch" == "dev" ]] || exit $rc
[[ "$BASE" == "dev" ]] || exit $rc
65 changes: 11 additions & 54 deletions tests/schema/schema.test.mjs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { readdirSync, readFileSync } from "node:fs";
import YAML from "yaml";
import { registerSchema, validate, setMetaSchemaOutputFormat } from "@hyperjump/json-schema/openapi-3-1";
import { BASIC, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { describe, test, expect } from "vitest";

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

setMetaSchemaOutputFormat(BASIC);

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});
const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
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"
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

registerSchema(parseYamlFromFile("./src/schemas/validation/meta.yaml"));
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.2", () => {
describe("v3.1", () => {
describe("Pass", () => {
readdirSync(`${fixtures}/pass`, { withFileTypes: true })
.filter((entry) => entry.isFile() && /\.yaml$/.test(entry.name))
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
3.2 merge dev by ralfhandl · Pull Request #4727 · OAI/OpenAPI-Specification · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 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
bdfbbcf
Merge remote-tracking branch 'upstream/dev' into 3.2-merge-dev
ralfhandl Jun 15, 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 numberDiff line numberDiff 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 }}
71 changes: 14 additions & 57 deletions scripts/schema-test-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,9 +3,9 @@ import { readdir, readFile } from "node:fs/promises";
import YAML from "yaml";
import { join } from "node:path";
import { argv } from "node:process";
import { registerSchema, 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, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";

/**
* @import { EvaluationPlugin } from "@hyperjump/json-schema/experimental"
Expand DownExpand Up@@ -118,65 +118,22 @@ const runTests = async (schemaUri, testDirectory) => {
};
};

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

const parseYamlFromFile = (filePath) => {
const schemaYaml = readFileSync(filePath, "utf8");
return YAML.parse(schemaYaml, { prettyErrors: true });
};
registerSchema(parseYamlFromFile("./src/schemas/validation/meta.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"));

Expand Down
4 changes: 1 addition & 3 deletions scripts/schema-test-coverage.sh
Original file line numberDiff line numberDiff 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-base.yaml tests/schema/pass
rc=$?

[[ "$branch" == "dev" ]] || exit $rc
[[ "$BASE" == "dev" ]] || exit $rc
65 changes: 11 additions & 54 deletions tests/schema/schema.test.mjs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { readdirSync, readFileSync } from "node:fs";
import YAML from "yaml";
import { registerSchema, validate, setMetaSchemaOutputFormat } from "@hyperjump/json-schema/openapi-3-1";
import { BASIC, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { describe, test, expect } from "vitest";

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

setMetaSchemaOutputFormat(BASIC);

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});
const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
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"
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

registerSchema(parseYamlFromFile("./src/schemas/validation/meta.yaml"));
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.2", () => {
describe("v3.1", () => {
describe("Pass", () => {
readdirSync(`${fixtures}/pass`, { withFileTypes: true })
.filter((entry) => entry.isFile() && /\.yaml$/.test(entry.name))
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 3.2 merge dev by ralfhandl · Pull Request #4727 · OAI/OpenAPI-Specification · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 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
bdfbbcf
Merge remote-tracking branch 'upstream/dev' into 3.2-merge-dev
ralfhandl Jun 15, 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 numberDiff line numberDiff 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 }}
71 changes: 14 additions & 57 deletions scripts/schema-test-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,9 +3,9 @@ import { readdir, readFile } from "node:fs/promises";
import YAML from "yaml";
import { join } from "node:path";
import { argv } from "node:process";
import { registerSchema, 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, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";

/**
* @import { EvaluationPlugin } from "@hyperjump/json-schema/experimental"
Expand DownExpand Up@@ -118,65 +118,22 @@ const runTests = async (schemaUri, testDirectory) => {
};
};

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

const parseYamlFromFile = (filePath) => {
const schemaYaml = readFileSync(filePath, "utf8");
return YAML.parse(schemaYaml, { prettyErrors: true });
};
registerSchema(parseYamlFromFile("./src/schemas/validation/meta.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"));

Expand Down
4 changes: 1 addition & 3 deletions scripts/schema-test-coverage.sh
Original file line numberDiff line numberDiff 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-base.yaml tests/schema/pass
rc=$?

[[ "$branch" == "dev" ]] || exit $rc
[[ "$BASE" == "dev" ]] || exit $rc
65 changes: 11 additions & 54 deletions tests/schema/schema.test.mjs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { readdirSync, readFileSync } from "node:fs";
import YAML from "yaml";
import { registerSchema, validate, setMetaSchemaOutputFormat } from "@hyperjump/json-schema/openapi-3-1";
import { BASIC, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { describe, test, expect } from "vitest";

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

setMetaSchemaOutputFormat(BASIC);

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});
const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
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"
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

registerSchema(parseYamlFromFile("./src/schemas/validation/meta.yaml"));
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.2", () => {
describe("v3.1", () => {
describe("Pass", () => {
readdirSync(`${fixtures}/pass`, { withFileTypes: true })
.filter((entry) => entry.isFile() && /\.yaml$/.test(entry.name))
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 3.2 merge dev by ralfhandl · Pull Request #4727 · OAI/OpenAPI-Specification · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 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
bdfbbcf
Merge remote-tracking branch 'upstream/dev' into 3.2-merge-dev
ralfhandl Jun 15, 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 numberDiff line numberDiff 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 }}
71 changes: 14 additions & 57 deletions scripts/schema-test-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,9 +3,9 @@ import { readdir, readFile } from "node:fs/promises";
import YAML from "yaml";
import { join } from "node:path";
import { argv } from "node:process";
import { registerSchema, 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, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";

/**
* @import { EvaluationPlugin } from "@hyperjump/json-schema/experimental"
Expand DownExpand Up@@ -118,65 +118,22 @@ const runTests = async (schemaUri, testDirectory) => {
};
};

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

const parseYamlFromFile = (filePath) => {
const schemaYaml = readFileSync(filePath, "utf8");
return YAML.parse(schemaYaml, { prettyErrors: true });
};
registerSchema(parseYamlFromFile("./src/schemas/validation/meta.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"));

Expand Down
4 changes: 1 addition & 3 deletions scripts/schema-test-coverage.sh
Original file line numberDiff line numberDiff 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-base.yaml tests/schema/pass
rc=$?

[[ "$branch" == "dev" ]] || exit $rc
[[ "$BASE" == "dev" ]] || exit $rc
65 changes: 11 additions & 54 deletions tests/schema/schema.test.mjs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { readdirSync, readFileSync } from "node:fs";
import YAML from "yaml";
import { registerSchema, validate, setMetaSchemaOutputFormat } from "@hyperjump/json-schema/openapi-3-1";
import { BASIC, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { describe, test, expect } from "vitest";

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

setMetaSchemaOutputFormat(BASIC);

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});
const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
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"
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

registerSchema(parseYamlFromFile("./src/schemas/validation/meta.yaml"));
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.2", () => {
describe("v3.1", () => {
describe("Pass", () => {
readdirSync(`${fixtures}/pass`, { withFileTypes: true })
.filter((entry) => entry.isFile() && /\.yaml$/.test(entry.name))
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' 3.2 merge dev by ralfhandl · Pull Request #4727 · OAI/OpenAPI-Specification · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 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
bdfbbcf
Merge remote-tracking branch 'upstream/dev' into 3.2-merge-dev
ralfhandl Jun 15, 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 numberDiff line numberDiff 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 }}
71 changes: 14 additions & 57 deletions scripts/schema-test-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,9 +3,9 @@ import { readdir, readFile } from "node:fs/promises";
import YAML from "yaml";
import { join } from "node:path";
import { argv } from "node:process";
import { registerSchema, 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, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";

/**
* @import { EvaluationPlugin } from "@hyperjump/json-schema/experimental"
Expand DownExpand Up@@ -118,65 +118,22 @@ const runTests = async (schemaUri, testDirectory) => {
};
};

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

const parseYamlFromFile = (filePath) => {
const schemaYaml = readFileSync(filePath, "utf8");
return YAML.parse(schemaYaml, { prettyErrors: true });
};
registerSchema(parseYamlFromFile("./src/schemas/validation/meta.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"));

Expand Down
4 changes: 1 addition & 3 deletions scripts/schema-test-coverage.sh
Original file line numberDiff line numberDiff 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-base.yaml tests/schema/pass
rc=$?

[[ "$branch" == "dev" ]] || exit $rc
[[ "$BASE" == "dev" ]] || exit $rc
65 changes: 11 additions & 54 deletions tests/schema/schema.test.mjs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { readdirSync, readFileSync } from "node:fs";
import YAML from "yaml";
import { registerSchema, validate, setMetaSchemaOutputFormat } from "@hyperjump/json-schema/openapi-3-1";
import { BASIC, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { describe, test, expect } from "vitest";

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

setMetaSchemaOutputFormat(BASIC);

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});
const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
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"
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

registerSchema(parseYamlFromFile("./src/schemas/validation/meta.yaml"));
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.2", () => {
describe("v3.1", () => {
describe("Pass", () => {
readdirSync(`${fixtures}/pass`, { withFileTypes: true })
.filter((entry) => entry.isFile() && /\.yaml$/.test(entry.name))
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 3.2 merge dev by ralfhandl · Pull Request #4727 · OAI/OpenAPI-Specification · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 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
bdfbbcf
Merge remote-tracking branch 'upstream/dev' into 3.2-merge-dev
ralfhandl Jun 15, 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 numberDiff line numberDiff 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 }}
71 changes: 14 additions & 57 deletions scripts/schema-test-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,9 +3,9 @@ import { readdir, readFile } from "node:fs/promises";
import YAML from "yaml";
import { join } from "node:path";
import { argv } from "node:process";
import { registerSchema, 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, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";

/**
* @import { EvaluationPlugin } from "@hyperjump/json-schema/experimental"
Expand DownExpand Up@@ -118,65 +118,22 @@ const runTests = async (schemaUri, testDirectory) => {
};
};

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

const parseYamlFromFile = (filePath) => {
const schemaYaml = readFileSync(filePath, "utf8");
return YAML.parse(schemaYaml, { prettyErrors: true });
};
registerSchema(parseYamlFromFile("./src/schemas/validation/meta.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"));

Expand Down
4 changes: 1 addition & 3 deletions scripts/schema-test-coverage.sh
Original file line numberDiff line numberDiff 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-base.yaml tests/schema/pass
rc=$?

[[ "$branch" == "dev" ]] || exit $rc
[[ "$BASE" == "dev" ]] || exit $rc
65 changes: 11 additions & 54 deletions tests/schema/schema.test.mjs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { readdirSync, readFileSync } from "node:fs";
import YAML from "yaml";
import { registerSchema, validate, setMetaSchemaOutputFormat } from "@hyperjump/json-schema/openapi-3-1";
import { BASIC, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { describe, test, expect } from "vitest";

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

setMetaSchemaOutputFormat(BASIC);

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});
const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
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"
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

registerSchema(parseYamlFromFile("./src/schemas/validation/meta.yaml"));
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.2", () => {
describe("v3.1", () => {
describe("Pass", () => {
readdirSync(`${fixtures}/pass`, { withFileTypes: true })
.filter((entry) => entry.isFile() && /\.yaml$/.test(entry.name))
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); 3.2 merge dev by ralfhandl · Pull Request #4727 · OAI/OpenAPI-Specification · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 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
bdfbbcf
Merge remote-tracking branch 'upstream/dev' into 3.2-merge-dev
ralfhandl Jun 15, 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 numberDiff line numberDiff 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 }}
71 changes: 14 additions & 57 deletions scripts/schema-test-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,9 +3,9 @@ import { readdir, readFile } from "node:fs/promises";
import YAML from "yaml";
import { join } from "node:path";
import { argv } from "node:process";
import { registerSchema, 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, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";

/**
* @import { EvaluationPlugin } from "@hyperjump/json-schema/experimental"
Expand DownExpand Up@@ -118,65 +118,22 @@ const runTests = async (schemaUri, testDirectory) => {
};
};

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

const parseYamlFromFile = (filePath) => {
const schemaYaml = readFileSync(filePath, "utf8");
return YAML.parse(schemaYaml, { prettyErrors: true });
};
registerSchema(parseYamlFromFile("./src/schemas/validation/meta.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"));

Expand Down
4 changes: 1 addition & 3 deletions scripts/schema-test-coverage.sh
Original file line numberDiff line numberDiff 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-base.yaml tests/schema/pass
rc=$?

[[ "$branch" == "dev" ]] || exit $rc
[[ "$BASE" == "dev" ]] || exit $rc
65 changes: 11 additions & 54 deletions tests/schema/schema.test.mjs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { readdirSync, readFileSync } from "node:fs";
import YAML from "yaml";
import { registerSchema, validate, setMetaSchemaOutputFormat } from "@hyperjump/json-schema/openapi-3-1";
import { BASIC, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { describe, test, expect } from "vitest";

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

setMetaSchemaOutputFormat(BASIC);

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});
const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
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"
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

registerSchema(parseYamlFromFile("./src/schemas/validation/meta.yaml"));
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.2", () => {
describe("v3.1", () => {
describe("Pass", () => {
readdirSync(`${fixtures}/pass`, { withFileTypes: true })
.filter((entry) => entry.isFile() && /\.yaml$/.test(entry.name))
Expand Down