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

Restructure JSON enum documentation #361

Closed
stevespringett opened this issue Dec 30, 2023 · 0 comments
Closed

Restructure JSON enum documentation #361

stevespringett opened this issue Dec 30, 2023 · 0 comments
Assignees
Milestone

Comments

@stevespringett
Copy link
Member

Since JSON Schema does not allow enum values to be documented, the JSON Schema project recommends using oneOf/anyOf combined with an object with a const and description. This approach, while it does work, breaks most documentation tools that assume a choice like that has limited options, verses a list of enums with a lot more options to choose from. IMO, this is a workaround that does not address the core issue that the enum support in JSON schema has serious design issues.

To work around this issue, Adobe devises a simple way using a meta:enum property to document the enums and their descriptions. Support for meta:enum can be found at https://github.com/adobe/jsonschema2md and is additionally supported by other open source and commercial tools. The approach is briefly discussed here: https://stackoverflow.com/questions/64233370/in-json-schema-how-to-define-an-enum-with-description-of-each-elements-in-the-e

Currently CycloneDX overloads the description field with a long list of enum descriptions. It's an ugly approach since JSON does not support line breaks, and in using this approach, it makes merging and identifying diffs very difficult, since everything is on a single line of text.

Proposal

Refactor enum support in JSON to use meta:enum. This will greatly improve readability of the schema, our ability to maintain accurate descriptions, and our ability to diff/merge changes over time.

I have made a simple change to json-schema-for-humans which adds support for meta:enum and plan to contribute those changes back to the community.

An actual implementation looks like this:

"executionEnvironment": {
    "type": "string",
    "title": "Execution Environment",
    "description": "The target and execution environment in which the algorithm is implemented in.",
    "enum": [
        "softwarePlainRAM",
        "softwareEncryptedRAM",
        "softwareTEE",
        "hardware",
        "other",
        "unknown"
    ],
    "meta:enum": {
        "softwarePlainRAM": "A software implementation running in plain unencrypted RAM.",
        "softwareEncryptedRAM": "A software implementation running in encrypted RAM.",
        "softwareTEE": "A software implementation running in a trusted execution environment.",
        "hardware": "A hardware implementation.",
        "other": "Another implementation environment.",
        "unknown": "The execution environment is not known."
    }
}

When implemented, and with the changes I've made to json-schema-for-humans, the resulting documentation looks like this:
Screenshot 2023-12-30 at 2 17 01 PM

This approach will also help with TC54 documentation which must be purely human readable. We would be able to create a simple table with enum choice and descriptions which would be applicable to markdown and PDF output.

@stevespringett stevespringett added this to the 1.6 milestone Dec 30, 2023
@stevespringett stevespringett self-assigned this Dec 30, 2023
@jkowalleck jkowalleck mentioned this issue Jan 11, 2024
stevespringett added a commit that referenced this issue Apr 9, 2024
## Added

* Core enhancement: Attestation
([#192](#192) via
[#348](#348))
* Core enhancement: Cryptography Bill of Materials — CBOM
([#171](#171),
[#291](#291) via
[#347](#347))
* Feature to express the URL to source distribution
([#98](#98) via
[#269](#269))
* Feature to express the URL to RFC 9116 compliant documents
([#380](#380) via
[#381](#381))
* Feature to express tags/keywords for services and components (via
[#383](#383))
* Feature to express details for component authors
([#335](#335) via
[#379](#379))
* Feature to express details for component and BOM manufacturer
([#346](#346) via
[#379](#379))
* Feature to express communicate concluded values from observed
evidences ([#411](#411)
via [#412](#412))
* Features to express license acknowledgement
([#407](#407) via
[#408](#408))
* Feature to express environmental consideration information for model
cards ([#396](#396) via
[#395](#395))
* Feature to express the address of organizational entities (via
[#395](#395))
* Feature to express additional component identifiers: Universal Bill Of
Receipts Identifier and Software Heritage persistent IDs
([#413](#413) via
[#414](#414))

## Fixed

* Allow multiple evidence identities by XML/JSON schema
([#272](#272) via
[#359](#359))
  This was already correct via ProtoBuff schema.
* Prevent empty `license` entities by XML schema
([#288](#288) via
[#292](#292))
  This was already correct in JSON/ProtoBuff schema.
* Prevent empty or malformed `property` entities by JSON schema
([#371](#371) via
[#375](#375))
  This was already correct in XML/ProtoBuff schema.
* Allow multiple `licenses` in `Metadata` by ProtoBuff schema
([#264](#264) via
[#401](#401))
  This was already correct in XML/JSON schema.

## Changed

* Allow arbitrary `$schema` values by JSON schema
([#402](#402) via
[#403](#403))
* Increased max length of `versionRange` (via
[`3e01ce6`](3e01ce6))
* Harmonized length of `version` (via
[#417](#417))

## Deprecated

* Data model "Component"'s field `author` was deprecated. (via
[#379](#379))
  Use field `authors` or field `manufacturer` instead.
* Data model "Metadata"'s field `manufacture` was deprecated.
([#346](#346) via
[#379](#379))
  Use "Metadata"'s field `component`'s field `manufacturer` instead. 
  - for XML: `/bom/metadata/component/manufacturer`
  - for JSON: `$.metadata.component.manufacturer`
  - for ProtoBuf: `Bom:metadata.component.manufacturer`

## Documentation

* Centralize version and version-range (via
[#322](#322))
* Streamlined SPDX expression related descriptions (via
[#327](#327))
* Enhanced descriptions of `bom-ref`/`refType`
([#336](#336) via
[#344](#344))
* Enhanced readability of enum documentation in JSON schema
([#361](#361) via
[#362](#362))
* Fixed typo "compliment" -> "complement" (via
[#369](#369))
* Added documentation for enum "ComponentScope"'s values in JSON schema
([#293](#293) via
[`d92e58e`](d92e58e))
  Texts were a taken from the existing ones in XML/ProtoBuff schema.
* Added documentation for enum "TaskType"'s values
([#245](#245) via
[#377](#377))
* Improve documentation for data model "Metadata"'s field `licenses`
([#273](#273) via
[#378](#378))
* Added documentation for enum "MachineLearningApproachType"'s values
([#351](#351) via
[#416](#416))
* Rephrased some texts here and there.

## Test data

* Added test data for newly added use cases
* Added quality assurance for our ProtoBuf schemas
([#384](#384) via
[#385](#385))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant