Skip to content

[data]: Sync and finalise tooling data #899

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 7 commits into from
Sep 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
61 changes: 61 additions & 0 deletions .github/workflows/validate-tooling-data.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: Validate Tooling Data

on:
push:
paths:
- data/tooling-data.yaml
branches:
- main
pull_request:
paths:
- data/tooling-data.yaml
workflow_dispatch:

jobs:
validate-tooling-data:
runs-on: ubuntu-latest

steps:
- name: Checkout Repository
uses: actions/checkout@v4

- name: Corepack enable
run: corepack enable

- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install dependencies
run: yarn add ajv ajv-formats js-yaml

- name: Validate tooling-data.yaml
run: |
node -e "
const Ajv = require('ajv/dist/2020');
const addFormats = require('ajv-formats');
const path = require('path');
const fs = require('fs');
const yaml = require('js-yaml');
const dataDir = path.join(process.env.GITHUB_WORKSPACE, 'data');
const schemaPath = path.join(dataDir, 'tooling-data.schema.json');
const dataPath = path.join(dataDir, 'tooling-data.yaml');

try {
const schema = JSON.parse(fs.readFileSync(schemaPath, 'utf-8'));
const data = yaml.load(fs.readFileSync(dataPath, 'utf-8'));
const ajv = new Ajv({ allErrors: true });
addFormats(ajv);
const validate = ajv.compile(schema);
const valid = validate(data);
if (!valid) {
console.error('Validation failed:', validate.errors);
process.exit(1);
} else {
console.log('tooling-data.yaml is valid.');
}
} catch (error) {
console.error('Error validating tooling-data.yaml:', error);
process.exit(1);
}"
286 changes: 286 additions & 0 deletions data/tooling-data.schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,286 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "JSON Schema Tooling Data Document",
"description": "This is a schema which represents the JSON Schema Tooling Data Document",
"$defs": {
"persons": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "object",
"properties": {
"name": {
"description": "The persons name, should they wish to provide it",
"type": "string"
},
"email": {
"description": ""
},
"username": {
"description": "The persons username on the platform where the user exists",
"type": "string"
},
"platform": {
"type": "string",
"anyOf": [
{
"enum": ["github", "gitlab", "bitbucket"]
},
{
"description": "A string value not yet included in the list of platforms"
}
]
},
"additionalProperties": false
},
"additionalProperties": false
}
}
},
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"description": "The name of the project",
"type": "string"
},
"description": {
"description": "A brief description of the project",
"$comment": "If this is omitted and description is already defined on GitHub or GitLab for the repository, we will use that information.",
"type": "string"
},
"toolingTypes": {
"description": "The categories of tooling for the project",
"type": "array",
"uniqueItems": true,
"items": {
"description": "One of the categories of tooling of the project",
"type": "string",
"enum": [
"validator",
"hyper-schema",
"benchmarks",
"documentation",
"LDO-utility",
"code-to-schema",
"data-to-schema",
"model-to-schema",
"schema-to-types",
"schema-to-code",
"schema-to-web-UI",
"schema-to-data",
"util-general-processing",
"util-schema-to-schema",
"util-draft-migration",
"util-format-conversion",
"util-testing",
"editor",
"editor-plugins",
"schema-repository",
"linter",
"linter-plugins"
]
}
},
"languages": {
"description": "The language or languages a tool is built in. In the case of a validator, this will likely be the language it is written in. In the case of a conversion or transformation tool, these are the languages that are supported in some capacity.",
"type": "array",
"items": {
"description": "Individual language name, from the list unless not included.",
"type": "string",
"anyOf": [
{
"enum": [
[
"Common Lisp",
"Rust",
"Elm",
".NET",
"PHP",
"Clojure",
"Helm",
"Python",
"XSD",
"Scala",
"Orderly",
"Kotlin",
"Elixir",
"RAML",
"Erlang",
"Java",
"Lua/LuaJIT",
"OpenAPI",
"Perl",
"TypeScript",
"Ruby",
"Objective-C",
"Swift",
"C#",
"Go",
"C++",
"JavaScript"
]
]
},
{
"description": "A string value not yet included in the list of languages"
}
]
}
},
"environments": {
"description": "The platforms or environments in which the tool or library is designed to operate. This field is optional and should be included when the tool or library is specific to a certain platform or environment.",
"type": "array",
"items": {
"type": "string",
"anyOf": [
{
"enum": [
"Web (Online)",
"GitHub Actions",
"Command Line",
"COM/ActiveX"
]
},
{
"description": "A string value not yet included in the list of environments"
}
]
}
},
"dependsOnValidators": {
"description": "Documents if the tool is the primary validator provider or depends on another tool",
"type": "array",
"items": {
"description": "One of the tools that this tool depends upon",
"$comment": "This should be the source URL. The source URL should already be known to the ecosystem repository in some way.",
"type": "string",
"format": "uri"
}
},
"creators": {
"description": "The creators or authors of the project",
"$ref": "#/$defs/persons"
},
"maintainers": {
"description": "The maintainers of the project",
"$ref": "#/$defs/persons"
},
"license": {
"description": "The license under which the project is distributed. SPDX expressions or a URL.",
"$comment": "Schemastore package.json schema uses enum to assist in auto complete. Could be worth doing the same.",
"type": "string"
},
"source": {
"description": "The URL of the project's repository",
"type": "string",
"format": "uri"
},
"homepage": {
"description": "The URL of the project's homepage",
"type": "string",
"format": "uri"
},
"documentation": {
"$comment": "This is reserved for future use",
"type": "object"
},
"supportedDialects": {
"description": "The declared supported dialects of JSON Schema. This includes draft version identifiers.",
"type": "object",
"properties": {
"draft": {
"description": "An array of dialects of JSON Schema.",
"type": "array",
"items": {
"enum": [1, 2, 3, 4, 5, 6, 7, "2019-09", "2020-12"]
}
},
"additional": {
"description": "Additional Dialects that are supported beyond the ones defined by the JSON Schema project, such as the OpenAPI Dialect.",
"type": "array",
"items": {
"description": "Individual JSON Schema Dialect items",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"homepage": {
"type": "string",
"format": "uri"
},
"source": {
"type": "string",
"format": "uri"
}
},
"required": ["name", "source"],
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"bowtie": {
"description": "Information related to compliance testing by Bowtie - https://bowtie.report - Presence of this property implies the tool is being tested in Bowtie",
"type": "object",
"properties": {
"identifier": {
"description": "The identifier used for the tool in Bowtie, including the language.",
"examples": ["dotnet-jsonschema-net", "js-ajv"]
}
},
"required": ["identifier"],
"additionalProperties": false
},
"toolingListingNotes": {
"description": "Notes about the tooling which will appear in the tooling listing on the website.",
"type": "string"
},
"compliance": {
"description": "Details on what must be done to make the implementation the most compliant that it can be. This is displayed on the website with the tooling details",
"type": "object",
"properties": {
"config": {
"type": "object",
"properties": {
"docs": {
"description": "A URL which links to the documentation which explains how to follow the given instructions.",
"type": "string"
},
"instructions": {
"description": "Instructions on how to make the implementation the most compliant.",
"type": "string"
}
}
}
}
},
"landscape": {
"description": "Additional information that should be used when generating the JSON Schema landscape diagram - https://github.com/json-schema-org/landscape",
"type": "object",
"properties": {
"logo": {
"description": "The filename of the logo to use for the JSON Schema landscape diagram - Must be included in the landscape repo under the logos directory, and in SVG format.",
"type": "string"
},
"optOut": {
"description": "Set this value to a boolean `true` value if you do not wish to be included in the JSON Schema Landscape. If you do, we would like to hear why.",
"type": "boolean",
"default": false
}
},
"additionalProperties": false
},
"lastUpdated": {
"description": "The date when the tool was most recently updated. The date should be in the format YYYY-MM-DD, representing the year, month, and day of the update.",
"type": "string",
"format": "date"
}
},
"required": ["name", "toolingTypes"],
"additionalProperties": false
}
}
Loading
Loading