Skip to content
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

Self reporting tooling schema and processes definition #12

Merged
merged 31 commits into from
Jun 17, 2024
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
a1f6e2f
Initial version of schema for tooling self identification document
Relequestual May 28, 2024
6c0fc78
Make tooling type field an array to avoid needing duplicate entries f…
Relequestual Jun 6, 2024
18f95d1
Fix use of hyphen rather than camelcase
Relequestual Jun 6, 2024
60bce43
Add required fields to the base object
Relequestual Jun 6, 2024
458de58
Tighten up schema requirements
Relequestual Jun 6, 2024
05e0f03
Add requirement to include $schema
Relequestual Jun 6, 2024
ea0601a
Add opt-out for appearing on the landscape, so tool could just appear…
Relequestual Jun 6, 2024
a6054b3
Add readme to explain the project and its purpose
Relequestual Jun 6, 2024
3815714
Add to languages enum and move some values to new envrionments field.
Relequestual Jun 7, 2024
0b77004
Harden schema definition by preventing additional properties which wa…
Relequestual Jun 7, 2024
81922bb
Update projects/tooling-self-identification/identification.schema.json
Relequestual Jun 11, 2024
e48621e
Update projects/tooling-self-identification/identification.schema.json
Relequestual Jun 11, 2024
c753ae5
Make description not required and note that if the source is hosted o…
Relequestual Jun 11, 2024
dc45af8
Specify that non-unique names should use the full URL of the source r…
Relequestual Jun 11, 2024
40924c4
Remove project type and repo status. Hard to justify and may increase…
Relequestual Jun 11, 2024
3c0fae8
Aligns naming convention with Bowtie, which makes sense.
Relequestual Jun 11, 2024
3b0f9d7
Remove lastUpdated field. We don't need this data here, and we can ge…
Relequestual Jun 11, 2024
9c09829
Add paragraph to recognize that we want to support other source hosts.
Relequestual Jun 11, 2024
2749e06
Add definitions for each tooling category.
Relequestual Jun 12, 2024
a0fa9cf
Detail some of the process and what files can be edited and how
Relequestual Jun 12, 2024
6299390
Tighten schema
Relequestual Jun 12, 2024
5d4f67f
Update projects/tooling-self-identification/identification.schema.json
Relequestual Jun 13, 2024
01262e9
Update projects/tooling-self-identification/readme.md
Relequestual Jun 13, 2024
2cc9670
Make pluralizzation consistent
Relequestual Jun 13, 2024
5e5ee3a
Clarify the languages field
Relequestual Jun 13, 2024
abdd404
Refine dependsOnValidators so that the array of source URLs are requi…
Relequestual Jun 13, 2024
04cba4b
Fix use of the keyword to use as opposed to .
Relequestual Jun 13, 2024
6588385
Add support for declaring additional dialect support, where the diale…
Relequestual Jun 13, 2024
d1bdb67
Define data ingestion as automated into one file, and curated data in…
Relequestual Jun 14, 2024
6e29bf1
Move additional supported dialects inside of existing supported diale…
Relequestual Jun 17, 2024
d521696
Fix required field name and amended object description to make sense
Relequestual Jun 17, 2024
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
293 changes: 293 additions & 0 deletions projects/tooling-self-identification/identification.schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,293 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://schemas.json-schema.org/ecosystem/identification-v-0.0.1",
"title": "Tooling Project Self Identification Document",
"$comment": "Decided not to use JSON-LD and Schema.org concepts, as this complicates things without a clear benefit for our use case.",
"description": "This is a schema which represents a self reporting document published by a JSON Schema tooling creator, maintainer, or vendor.",
"$defs": {
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
"persons": {
"type": "array",
"uniqueItems": "true",
"items": {
"type": "object",
"required": [
"name",
"github"
],
"properties": {
"name": {
"type": "string"
},
"github": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"type": "object",
"properties": {
"$schema": {
"description": "Identifies the exact version of the schema and self reporting data structure to which the file intends to conform",
"type": "string",
"pattern": "https://schemas.json-schema.org/ecosystem/identification-v-\\d\\.\\d\\.\\d"
},
"name": {
"description": "The name of the project",
"type": "string"
},
"description": {
"description": "A brief description of the project",
"type": "string"
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
},
"toolingType": {
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
"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",
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
"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-to-documentation",
"schema-repository",
"linter",
"linter-plugins"
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
]
}
},
"languages": {
"description": "The languages the tool supports or can be used in or with",
"type": "array",
"items": {
"description": "Individual language name, from the list unless not included.",
"type": "string",
"anyOf": [
{
"enum": [
[
"Common Lisp",
"Rust",
"Elm",
".NET",
"PHP",
"Clojure",
"Python",
"XSD",
"Scala",
"Orderly",
"Kotlin",
"Elixir",
"RAML",
"Erlang",
"Java",
"Lua/LuaJIT",
"OpenAPI",
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
"Perl",
"TypeScript",
"Ruby",
"Objective-C",
"Swift",
"C#",
gregsdennis marked this conversation as resolved.
Show resolved Hide resolved
"Go",
"C++",
"JavaScript"
]
]
},
{
"description": "A string value not yet included in the list of languages"
}
]
}
},
"environment": {
"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.",
gregsdennis marked this conversation as resolved.
Show resolved Hide resolved
"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 envrionments"
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
}
]
}
},
"dependsOnValidators": {
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
"description": "Documents if the tool is the primary validator provider or depends on another tool",
"type": "array",
"items": {
"description": "The names of the tooling that this tooling depends upon",
"type": "string"
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
}
},
"creators": {
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
"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"
},
"projectType": {
"description": "The type of project, classified by Nadia Eghbal in Working in Public - https://project-types.github.io",
"type": "string",
"enum": [
Copy link
Member

Choose a reason for hiding this comment

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

I'm not saying I'm fully against including this, but in spirit of the above (friction) -- as an implementer I have no idea what this is, and clicking on the link doesn't tell me what I should use in literally less than 3 seconds, which seems like a papercut that again could push someone towards not doing this.

At first glance, it seems cute, but I don't know why it's better than simply a scale of 1 to N on how production ready the software is considered.

Copy link
Member

Choose a reason for hiding this comment

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

I agree.

Copy link
Member Author

Choose a reason for hiding this comment

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

It is true that PyPi classifiers are far more used, but I don't see any other package manager file format looking to specify project status. And, I'm not sure it's really talking about project maturity either. If a project is classified as a "toy", you might never use it in production, because the author is signalling they don't intend to really maintain it. It may very well be stable, but it might not be getting security patches.

I'm not expecting maintainers to go look at this schema.
Considering that, what probably makes senes is to provide a template for maintainers to use which is just the minimal, and invite those who have time or are curious to look at the optional fields, such as this one.

I think maturity is actually pretty interesting and something we could consider adding!

Do you know where I can find the definitions of the Development Status classifier levels used by PyPi?

Copy link
Member

Choose a reason for hiding this comment

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

Actually I wasn't even specifically referring to PyPI classifiers when commenting previously. I was assuming that this scale is about project maturity. Though now spending 30 seconds instead of 3 I see it's not about that at all. But given I haven't spent much more than that, I don't really know why it's useful to say something is a toy vs saying it is alpha maturity. To someone encountering the project they presumably should take the same "practical" information out of seeing that. Which again kind of leaves me saying "cute, someone has some simple model of how to classify projects" but not as an implementer "oh god I need to take the time to see what this is so I can fill this out".

But! I did not notice it's optional, so if it is, then all the above is irrelevant probably, and indeed people will ignore it if they don't know what it is.

"toy",
"club",
"stadium",
"federation"
]
},
"repositoryURL": {
"type": "string",
"description": "The URL of the project's repository"
},
"repositoryStatus": {
"description": "The status of the project's repository, defined at https://www.repostatus.org",
"type": "string",
"enum": [
"concpet",
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
"WIP",
"suspended",
"abandoned",
"active",
"inactive",
"unsupported",
"moved"
]
},
"homepageURL": {
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
"description": "The URL of the project's homepage",
"type": "string"
},
"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"
]
}
}
},
"additionalProperties": false
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
},
"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 informatin that should be used when generating the JSON Schema landscape diagram - https://github.com/json-schema-org/landscape",
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
"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
}
}
},
"lastUpdated": {
"description": "A date in the format of YYYY-MM-DD which repersents when the document was last updated.",
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
"type": "string",
"regex": "^\\d{4}\\-(0[1-9]|1[012])\\-(0[1-9]|[12][0-9]|3[01])$"
}
},
"required": [
"name",
"description",
"repositoryURL",
"toolingType",
"lastUpdated"
],
"additionalProperties": false
}
28 changes: 28 additions & 0 deletions projects/tooling-self-identification/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Self Identification of Open Source JSON Schema Tooling

JSON Schema has a vast ecosystem. We have documented a fraction of the existing tools out there for JSON Schema.

This project aims to enable tooling authors and maintainers to detail their tools existance and additional informaiton to be listed on the JSON Schema website and Landscape diagram.

The approach is to define a data structure for a file which is located in their own repo, which will then be located and extracted into a single file within this repository. Other repositories such as the website and landscape repositories, will then copy and transform the data as required. The data may be used to augment or totally replace the data they hold, if any.
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
The approach is to define a data structure for a file which is located in their own repo, which will then be located and extracted into a single file within this repository. Other repositories such as the website and landscape repositories, will then copy and transform the data as required. The data may be used to augment or totally replace the data they hold, if any.
The approach is to define a data structure for a file hosted located in their own repo, which will then be located and extracted into a single file within this repository. Other repositories such as the website and landscape repositories, will then copy and transform the data as required. The data may be used to augment or totally replace the data they hold, if any.

I think maybe just do a read through and see how many "which"'s there are...

Copy link
Member Author

Choose a reason for hiding this comment

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

Can you explain this please? It feels like you're assuming it should be obvious why this is bad? Does it make it harder to read or understand?

The primary purpose of the readme is to explain things. It often goes into more detail about things.
I'm open to more specific suggestions if you have them.


## Just Open Source for now

This project only aims to capture the open source tooling, and does not include detailing or tracking of tools which are not open source.

There may be further projects which aim to collate and combine data collected from other locations (such as this project), and primary data (such as information deposited into the website or later this repository in relation to close source tools).

## How do I self identify my tool?

We (will) have automation that looks for data daily. It will look for data in GitHub repositories which meet the following conditions:

- Repository has the Topic `json-schema` assigned
Relequestual marked this conversation as resolved.
Show resolved Hide resolved
- Has a file called `.json-schema-identification.json` in the project's root
- The JSON file validates successfully against the version of the self identification JSON Schema it declares

## Why should I include this file in my tooling repository?

If you define this file in your tooling repository, you will:
- Be able to update your listing on the JSON Schema website's tooling page
- Have your tool listing show it's project status and be filterable based on the project status
- Have your tool shown in the JSON Schema Landscape diagram (unless you opt out)