{
  "$schema": "https://json-schema.org/draft-07/schema",
  "$id": "https://cl-keeper.readthedocs.io/en/latest/schema.json",
  "$ref": "#/$defs/cl_keeper.config.Config",
  "title": "Config",
  "$defs": {
    "cl_keeper.config.Wrapping": {
      "oneOf": [
        {
          "const": "no",
          "description": "Disable wrapping, print all paragraphs in a single line."
        },
        {
          "const": "keep",
          "description": "Keep the original file wrapping."
        }
      ],
      "title": "Wrapping"
    },
    "cl_keeper.config.ReleaseLinkPreset": {
      "oneOf": [
        {
          "const": "github",
          "description": "Will link releases to tags on github."
        },
        {
          "const": "gitlab",
          "description": "Will link releases to tags on gitlab."
        },
        {
          "const": "none",
          "description": "Will not generate links automatically."
        }
      ],
      "title": "ReleaseLinkPreset"
    },
    "cl_keeper.config.VersionFormat": {
      "oneOf": [
        {
          "const": "semver",
          "description": "Semantic versioning, as per `semver 2.0 specification`__."
        },
        {
          "const": "semver-strict",
          "description": "Semantic versioning with stricter constraints."
        },
        {
          "const": "python",
          "description": "Python versioning specification, as per `PyPA specification`__."
        },
        {
          "const": "python-strict",
          "description": "Python versioning specification with stricter constraints."
        },
        {
          "const": "python-semver",
          "description": "Python versioning specification using :cli:field:`semver-strict` syntax."
        },
        {
          "const": "none",
          "description": "No versioning semantics are implied."
        }
      ],
      "title": "VersionFormat",
      "description": "Specification for versioning formats.\n\nDifferent settings affect parsing versions and sorting changelog entries.\n\n.. list-table:: Syntax overview\n    :header-rows: 1\n\n    * - Schema\n      - Release\n      - Pre-release\n      - Post-release\n      - Post-release of a pre-release\n\n    * - :cli:field:`~VersionFormat.semver`\n      - ``1.0.0``\n      - ``1.0.0-b``, ``1.0.0-b0``, ``1.0.0-beta0``, etc.\n      - not supported\n      - not supported\n    * - :cli:field:`~VersionFormat.semver-strict`\n      - ``1.0.0``\n      - ``1.0.0-beta0``\n      - not supported\n      - not supported\n    * - :cli:field:`~VersionFormat.python`\n      - ``1.0.0``\n      - ``1.0.0b0``, ``1.0.0-beta.0``, etc.\n      - ``1.0.0post0``, ``1.0.0-rev.0``, etc.\n      - ``1.0.0b1.post2``, ``1.0.0-beta.1post2``, etc.\n    * - :cli:field:`~VersionFormat.python-strict`\n      - ``1.0.0``\n      - ``1.0.0b0``\n      - ``1.0.0post0``\n      - ``1.0.0b0.post0``\n    * - :cli:field:`~VersionFormat.python-semver`\n      - ``1.0.0``\n      - ``1.0.0-beta0``\n      - ``1.0.0-post0``\n      - ``1.0.0-beta0.post0``\n"
    },
    "cl_keeper.config.IssueCode": {
      "oneOf": [
        {
          "const": "GeneralFormattingError",
          "description": "A formatting error related to the general structure of the changelog."
        },
        {
          "const": "InvalidVersion",
          "description": "Release version doesn't follow the requested specification."
        },
        {
          "const": "InvalidTag",
          "description": "Tag format doesn't follow the requested versioning specification."
        },
        {
          "const": "MissingReleaseForTag",
          "description": "Found a tag that has no associated release."
        },
        {
          "const": "MissingTagForRelease",
          "description": "Found a release that has no associated tag in the repository."
        },
        {
          "const": "ReleaseOrdering",
          "description": "Releases are not ordered according to their versions."
        },
        {
          "const": "UnreleasedHeadingFormat",
          "description": "Heading for unreleased changes doesn't meet formatting requirements."
        },
        {
          "const": "ReleaseHeadingFormat",
          "description": "Heading for a release doesn't meet formatting requirements."
        },
        {
          "const": "InvalidReleaseDate",
          "description": "Release date can't be parsed."
        },
        {
          "const": "MissingReleaseDate",
          "description": "Release date is missing."
        },
        {
          "const": "UnexpectedReleaseDate",
          "description": "Release date should not be present."
        },
        {
          "const": "MissingReleaseLink",
          "description": "Release link is missing."
        },
        {
          "const": "UnexpectedReleaseLink",
          "description": "Release link should not be present."
        },
        {
          "const": "IncorrectReleaseDate",
          "description": "Release date doesn't match date of the release commit."
        },
        {
          "const": "IncorrectReleaseLink",
          "description": "Release link is incorrect."
        },
        {
          "const": "DuplicateReleases",
          "description": "Found multiple releases for the same version."
        },
        {
          "const": "EmptyRelease",
          "description": "Section for a release is empty."
        },
        {
          "const": "ReleaseHasNoChangeCategories",
          "description": "There are no change categories in a release."
        },
        {
          "const": "ChangeCategoryOrdering",
          "description": "Order of sub-sections within a release doesn't match\nthe one given in :cli:field:`.change_categories`."
        },
        {
          "const": "ChangeCategoryHeadingFormat",
          "description": "Heading for a change category doesn't meet formatting requirements."
        },
        {
          "const": "ChangeCategoryHasNoChangeLists",
          "description": "Change category contains no change lists."
        },
        {
          "const": "UnknownChangeCategory",
          "description": "Heading for a change category doesn't appear in `change_categories_map`."
        },
        {
          "const": "DuplicateChangeCategories",
          "description": "Found multiple release sub-sections with the same title."
        },
        {
          "const": "EmptyChangeCategory",
          "description": "Found a release sub-section without content."
        },
        {
          "const": "MultipleChangeLists",
          "description": "Found multiple change lists in the same change category."
        },
        {
          "const": "ChangeListOrdering",
          "description": "Order of items within a change list doesn't match the one\ngiven in :cli:field:`.item_categories`."
        },
        {
          "const": "ChangeListItemFormat",
          "description": "A change list item doesn't start with a prefix\ndefined in :cli:field:`.item_categories`."
        },
        {
          "const": "UnknownItemCategory",
          "description": "Can't detect category for a change list item."
        }
      ],
      "title": "IssueCode"
    },
    "cl_keeper.config.IssueSeverity": {
      "oneOf": [
        {
          "const": "ERROR",
          "description": "Error."
        },
        {
          "const": "WARNING",
          "description": "Warning."
        },
        {
          "const": "WEAK_WARNING",
          "description": "Weak warning."
        },
        {
          "const": "INFO",
          "description": "Info."
        },
        {
          "const": "NONE",
          "description": "Not displayed."
        }
      ],
      "title": "IssueSeverity",
      "description": "Severity of the issue.\n"
    },
    "cl_keeper.config.Config": {
      "type": "object",
      "properties": {
        "$schema": {
          "type": "string"
        },
        "file": {
          "type": "string",
          "description": "Path to the changelog file, relative to this config location.\n"
        },
        "format_wrapping": {
          "oneOf": [
            {
              "allOf": [
                {
                  "type": "integer"
                },
                {
                  "exclusiveMinimum": 0
                }
              ]
            },
            {
              "$ref": "#/$defs/cl_keeper.config.Wrapping"
            }
          ],
          "description": "Max line width for wrapping markdown files.\n"
        },
        "change_categories": {
          "type": [
            "array",
            "object"
          ],
          "items": {
            "type": "array",
            "items": [
              {
                "type": "string"
              },
              {
                "type": "string"
              }
            ],
            "minItems": 2,
            "maxItems": 2,
            "additionalItems": false
          },
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "description": "Ordering and titles for change categories.\n"
        },
        "extra_change_categories": {
          "type": [
            "array",
            "object"
          ],
          "items": {
            "type": "array",
            "items": [
              {
                "type": "string"
              },
              {
                "type": "string"
              }
            ],
            "minItems": 2,
            "maxItems": 2,
            "additionalItems": false
          },
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "description": "Additional items that will be added to :cli:field:`.change_categories`\nwithout completely overriding it.\n"
        },
        "change_categories_map": {
          "type": [
            "array",
            "object"
          ],
          "items": {
            "type": "array",
            "items": [
              {
                "type": "string"
              },
              {
                "type": "string"
              }
            ],
            "minItems": 2,
            "maxItems": 2,
            "additionalItems": false
          },
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "description": "A mapping from regular expressions to change category names, used to parse\nand normalize categories.\n"
        },
        "extra_change_categories_map": {
          "type": [
            "array",
            "object"
          ],
          "items": {
            "type": "array",
            "items": [
              {
                "type": "string"
              },
              {
                "type": "string"
              }
            ],
            "minItems": 2,
            "maxItems": 2,
            "additionalItems": false
          },
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "description": "Additional items that will be added to :cli:field:`.change_categories_map`\nwithout completely overriding it.\n"
        },
        "use_default_item_categories": {
          "type": "boolean",
          "description": "Add default lists for :cli:field:`.item_categories`\nand :cli:field:`.item_categories_map`.\n"
        },
        "item_categories": {
          "type": [
            "array",
            "object"
          ],
          "items": {
            "type": "array",
            "items": [
              {
                "type": "string"
              },
              {
                "type": "string"
              }
            ],
            "minItems": 2,
            "maxItems": 2,
            "additionalItems": false
          },
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "description": "Ordering and titles for individual changelog items.\n"
        },
        "extra_item_categories": {
          "type": [
            "array",
            "object"
          ],
          "items": {
            "type": "array",
            "items": [
              {
                "type": "string"
              },
              {
                "type": "string"
              }
            ],
            "minItems": 2,
            "maxItems": 2,
            "additionalItems": false
          },
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "description": "Additional items that will be added to :cli:field:`.item_categories`\nwithout completely overriding it.\n"
        },
        "item_categories_map": {
          "type": [
            "array",
            "object"
          ],
          "items": {
            "type": "array",
            "items": [
              {
                "type": "string"
              },
              {
                "type": "string"
              }
            ],
            "minItems": 2,
            "maxItems": 2,
            "additionalItems": false
          },
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "description": "A mapping from regular expressions to item category names, used to parse\nand normalize item categories.\n"
        },
        "extra_item_categories_map": {
          "type": [
            "array",
            "object"
          ],
          "items": {
            "type": "array",
            "items": [
              {
                "type": "string"
              },
              {
                "type": "string"
              }
            ],
            "minItems": 2,
            "maxItems": 2,
            "additionalItems": false
          },
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "description": "Additional items that will be added to :cli:field:`.item_categories_map`\nwithout completely overriding it.\n"
        },
        "bump_patch_categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "uniqueItems": true,
          "description": "If these change categories appear in unreleased section, suggest bumping\nthe patch version component.\n"
        },
        "extra_bump_patch_categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "uniqueItems": true,
          "description": "Additional items that will be added to :cli:field:`.bump_patch_categories`\nwithout completely overriding it.\n"
        },
        "bump_minor_categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "uniqueItems": true,
          "description": "If these change categories appear in unreleased section, suggest bumping\nthe minor version component.\n"
        },
        "extra_bump_minor_categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "uniqueItems": true,
          "description": "Additional items that will be added to :cli:field:`.bump_minor_categories`\nwithout completely overriding it.\n"
        },
        "bump_major_categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "uniqueItems": true,
          "description": "If these change categories appear in unreleased section, suggest bumping\nthe major version component.\n"
        },
        "extra_bump_major_categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "uniqueItems": true,
          "description": "Additional items that will be added to :cli:field:`.bump_major_categories`\nwithout completely overriding it.\n"
        },
        "unreleased_name": {
          "type": "string",
          "description": "Title for the ``unreleased`` section of the changelog.\n"
        },
        "unreleased_decorations": {
          "type": "array",
          "items": [
            {
              "type": "string"
            },
            {
              "type": "string"
            }
          ],
          "minItems": 2,
          "maxItems": 2,
          "additionalItems": false,
          "description": "Symbols that will be added around :cli:field:`.unreleased_name`, but won't\nbe turned into a link.\n"
        },
        "unreleased_pattern": {
          "type": "string",
          "description": "Regular expression used to detect sections with unreleased changes.\n"
        },
        "release_decorations": {
          "type": "array",
          "items": [
            {
              "type": "string"
            },
            {
              "type": "string"
            }
          ],
          "minItems": 2,
          "maxItems": 2,
          "additionalItems": false,
          "description": "Symbols that will be added around each release heading.\n"
        },
        "release_date_decorations": {
          "type": "array",
          "items": [
            {
              "type": "string"
            },
            {
              "type": "string"
            }
          ],
          "minItems": 2,
          "maxItems": 2,
          "additionalItems": false,
          "description": "Symbols that will be added around release date.\n"
        },
        "version_decorations": {
          "type": "array",
          "items": [
            {
              "type": "string"
            },
            {
              "type": "string"
            }
          ],
          "minItems": 2,
          "maxItems": 2,
          "additionalItems": false,
          "description": "Symbols that will be added around release version.\n"
        },
        "release_comment_decorations": {
          "type": "array",
          "items": [
            {
              "type": "string"
            },
            {
              "type": "string"
            }
          ],
          "minItems": 2,
          "maxItems": 2,
          "additionalItems": false,
          "description": "Symbols that will be added around release comments.\n"
        },
        "add_release_date": {
          "type": "boolean",
          "description": "Whether changelog entries should have a release date in their headings.\n"
        },
        "add_release_link": {
          "type": "boolean",
          "description": "Whether changelog entries should have links to tags/diffs in their headings.\n"
        },
        "release_link_preset": {
          "oneOf": [
            {
              "$ref": "#/$defs/cl_keeper.config.ReleaseLinkPreset"
            },
            {
              "type": "null"
            }
          ],
          "description": "Preset for release link templates.\n"
        },
        "release_link_template": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Template for a release link, formatted using Python's :meth:`str.format` method.\nThis setting overrides link from :cli:field:`preset <.release_link_preset>`.\n"
        },
        "release_link_template_last": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Template for a link for an unreleased entry, formatted using\nPython's :meth:`str.format` method. This setting overrides link from\n:cli:field:`preset <.release_link_preset>`.\n"
        },
        "release_link_template_first": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Template for a link for the first release, formatted using\nPython's :meth:`str.format` method. This setting overrides link from\n:cli:field:`preset <.release_link_preset>`.\n"
        },
        "release_link_template_vars": {
          "oneOf": [
            {
              "type": [
                "array",
                "object"
              ],
              "items": {
                "type": "array",
                "items": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "string"
                  }
                ],
                "minItems": 2,
                "maxItems": 2,
                "additionalItems": false
              },
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {
                "type": "string"
              }
            },
            {
              "type": "null"
            }
          ],
          "description": "Additional variables that will be available in release link templates.\n"
        },
        "check_repo_tags": {
          "type": "boolean",
          "description": "Scan git repo and ensure that changelog doesn't miss any release.\n"
        },
        "tag_prefix": {
          "type": "string",
          "description": "Prefix for release tags.\n"
        },
        "version_format": {
          "$ref": "#/$defs/cl_keeper.config.VersionFormat",
          "description": "Versioning schema used to parse and sort tags and versions.\n"
        },
        "ignore_missing_releases_before": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Don't complain about missing releases for tags before this one.\n"
        },
        "ignore_missing_releases_regexp": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Don't complain about missing releases if version matches this regexp.\n"
        },
        "severity": {
          "type": [
            "array",
            "object"
          ],
          "items": {
            "type": "array",
            "items": [
              {
                "$ref": "#/$defs/cl_keeper.config.IssueCode"
              },
              {
                "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
              }
            ],
            "minItems": 2,
            "maxItems": 2,
            "additionalItems": false
          },
          "properties": {
            "GeneralFormattingError": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "InvalidVersion": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "InvalidTag": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "MissingReleaseForTag": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "MissingTagForRelease": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "ReleaseOrdering": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "UnreleasedHeadingFormat": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "ReleaseHeadingFormat": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "InvalidReleaseDate": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "MissingReleaseDate": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "UnexpectedReleaseDate": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "MissingReleaseLink": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "UnexpectedReleaseLink": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "IncorrectReleaseDate": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "IncorrectReleaseLink": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "DuplicateReleases": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "EmptyRelease": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "ReleaseHasNoChangeCategories": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "ChangeCategoryOrdering": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "ChangeCategoryHeadingFormat": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "ChangeCategoryHasNoChangeLists": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "UnknownChangeCategory": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "DuplicateChangeCategories": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "EmptyChangeCategory": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "MultipleChangeLists": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "ChangeListOrdering": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "ChangeListItemFormat": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            },
            "UnknownItemCategory": {
              "$ref": "#/$defs/cl_keeper.config.IssueSeverity"
            }
          },
          "additionalProperties": false,
          "description": "A mapping from issue code to issue severity. Allows customizing and disabling\ncertain checks.\n"
        },
        "auto_detect_maps": {
          "type": "boolean",
          "description": "Automatically fill out :cli:field:`.change_categories_map` and\n:cli:field:`.item_categories_map` based on :cli:field:`.change_categories`\nand :cli:field:`.item_categories`.\n"
        }
      },
      "additionalProperties": false,
      "title": "Config",
      "default": {
        "file": "CHANGELOG.md",
        "format_wrapping": 90,
        "change_categories": {
          "breaking": "Breaking",
          "security": "Security",
          "added": "Added",
          "changed": "Changed",
          "deprecated": "Deprecated",
          "removed": "Removed",
          "performance": "Performance",
          "fixed": "Fixed"
        },
        "extra_change_categories": {},
        "change_categories_map": {},
        "extra_change_categories_map": {},
        "use_default_item_categories": false,
        "item_categories": {},
        "extra_item_categories": {},
        "item_categories_map": {},
        "extra_item_categories_map": {},
        "bump_patch_categories": [
          "performance",
          "security",
          "fixed",
          "deprecated"
        ],
        "extra_bump_patch_categories": [],
        "bump_minor_categories": [
          "added",
          "changed",
          "removed"
        ],
        "extra_bump_minor_categories": [],
        "bump_major_categories": [
          "breaking"
        ],
        "extra_bump_major_categories": [],
        "unreleased_name": "Unreleased",
        "unreleased_decorations": [
          "",
          ""
        ],
        "unreleased_pattern": "(?i)unreleased",
        "release_decorations": [
          "",
          ""
        ],
        "release_date_decorations": [
          " - ",
          ""
        ],
        "version_decorations": [
          "",
          ""
        ],
        "release_comment_decorations": [
          " - ",
          ""
        ],
        "add_release_date": true,
        "add_release_link": true,
        "release_link_preset": null,
        "release_link_template": null,
        "release_link_template_last": null,
        "release_link_template_first": null,
        "release_link_template_vars": null,
        "check_repo_tags": true,
        "tag_prefix": "v",
        "version_format": "semver",
        "ignore_missing_releases_before": null,
        "ignore_missing_releases_regexp": "(?i)dev|b|beta|a|alpha|rc|post",
        "severity": {},
        "auto_detect_maps": true
      }
    }
  }
}