{
  "id": "http://www.python.org/dev/peps/pep-0426/",
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "Metadata for Python Software Packages 2.0",
  "type": "object",
  "properties": {
    "metadata_version": {
      "description": "Version of the file format",
      "type": "string",
      "pattern": "^(\\d+(\\.\\d+)*)$"
    },
    "generator": {
      "description": "Name and version of the program that produced this file.",
      "type": "string",
      "pattern": "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])( \\(.*\\))?$"
    },
    "name": {
      "description": "The name of the distribution.",
      "type": "string",
      "$ref": "#/definitions/distribution_name"
    },
    "version": {
      "description": "The distribution's public version identifier",
      "type": "string",
      "pattern": "^(\\d+(\\.\\d+)*)((a|b|c|rc)(\\d+))?(\\.(post)(\\d+))?(\\.(dev)(\\d+))?$"
    },
    "source_label": {
      "description": "A constrained identifying text string",
      "type": "string",
      "pattern": "^[0-9a-z_.-+]+$"
    },
    "source_url": {
      "description": "A string containing a full URL where the source for this specific version of the distribution can be downloaded.",
      "type": "string",
      "format": "uri"
    },
    "summary": {
      "description": "A one-line summary of what the distribution does.",
      "type": "string"
    },
    "extras": {
      "description": "A list of optional sets of dependencies that may be used to define conditional dependencies in \"may_require\" and similar fields.",
      "type": "array",
      "items": {
        "type": "string",
        "$ref": "#/definitions/extra_name"
      }
    },
    "meta_requires": {
      "description": "A list of subdistributions made available through this metadistribution.",
      "type": "array",
      "$ref": "#/definitions/dependencies"
    },
    "run_requires": {
      "description": "A list of other distributions needed to run this distribution.",
      "type": "array",
      "$ref": "#/definitions/dependencies"
    },
    "test_requires": {
      "description": "A list of other distributions needed when this distribution is tested.",
      "type": "array",
      "$ref": "#/definitions/dependencies"
    },
    "build_requires": {
      "description": "A list of other distributions needed when this distribution is built.",
      "type": "array",
      "$ref": "#/definitions/dependencies"
    },
    "dev_requires": {
      "description": "A list of other distributions needed when this distribution is developed.",
      "type": "array",
      "$ref": "#/definitions/dependencies"
    },
    "provides": {
      "description": "A list of strings naming additional dependency requirements that are satisfied by installing this distribution. These strings must be of the form Name or Name (Version)",
      "type": "array",
      "items": {
        "type": "string",
        "$ref": "#/definitions/provides_declaration"
      }
    },
    "modules": {
      "description": "A list of modules and/or packages available for import after installing this distribution.",
      "type": "array",
      "items": {
        "type": "string",
        "$ref": "#/definitions/qualified_name"
      }
    },
    "namespaces": {
      "description": "A list of namespace packages this distribution contributes to",
      "type": "array",
      "items": {
        "type": "string",
        "$ref": "#/definitions/qualified_name"
      }
    },
    "obsoleted_by": {
      "description": "A string that indicates that this project is no longer being developed. The named project provides a substitute or replacement.",
      "type": "string",
      "$ref": "#/definitions/requirement"
    },
    "supports_environments": {
      "description": "A list of strings specifying the environments that the distribution explicitly supports.",
      "type": "array",
      "items": {
        "type": "string",
        "$ref": "#/definitions/environment_marker"
      }
    },
    "install_hooks": {
      "description": "The install_hooks field is used to define various operations that may be invoked on a distribution in a platform independent manner.",
      "type": "object",
      "properties": {
        "postinstall": {
          "type": "string",
          "$ref": "#/definitions/export_specifier"
        },
        "preuninstall": {
          "type": "string",
          "$ref": "#/definitions/export_specifier"
        }
      }
    },
    "extensions": {
      "description": "Extensions to the metadata may be present in a mapping under the 'extensions' key.",
      "type": "object",
      "$ref": "#/definitions/extensions"
    }
  },

  "required": ["metadata_version", "name", "version", "summary"],
  "additionalProperties": false,

  "definitions": {
    "contact": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "role": {
          "type": "string"
        }
      },
      "required": ["name"],
      "additionalProperties": false
    },
    "dependencies": {
      "type": "array",
      "items": {
        "type": "object",
        "$ref": "#/definitions/dependency"
      }
    },
    "dependency": {
      "type": "object",
      "properties": {
        "extra": {
          "type": "string",
          "$ref": "#/definitions/extra_name"
        },
        "environment": {
          "type": "string",
          "$ref": "#/definitions/environment_marker"
        },
        "requires": {
          "type": "array",
          "items": {
            "type": "string",
            "$ref": "#/definitions/requirement"
          }
        }
      },
      "required": ["requires"],
      "additionalProperties": false
    },
    "extensions": {
      "type": "object",
      "patternProperties": {
        "^[A-Za-z][0-9A-Za-z_]*([.][0-9A-Za-z_]*)*$": {}
      },
      "properties": {
        "python.details" : {
          "description": "More information regarding the distribution.",
          "type": "object",
          "properties": {
            "document_names": {
              "description": "Names of supporting metadata documents",
              "type": "object",
              "properties": {
                "description": {
                  "type": "string",
                  "$ref": "#/definitions/document_name"
                },
                "changelog": {
                  "type": "string",
                  "$ref": "#/definitions/document_name"
                },
                "license": {
                  "type": "string",
                  "$ref": "#/definitions/document_name"
                }
              },
              "additionalProperties": false
            },
            "keywords": {
              "description": "A list of additional keywords to be used to assist searching for the distribution in a larger catalog.",
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "license": {
              "description": "A string indicating the license covering the distribution.",
              "type": "string"
            },
            "classifiers": {
              "description": "A list of strings, with each giving a single classification value for the distribution.",
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        },
        "python.project" : {
          "description": "More information regarding the creation and maintenance of the distribution.",
          "$ref": "#/definitions/project_or_integrator"
        },
        "python.integrator" : {
          "description": "More information regarding the downstream redistributor of the distribution.",
          "$ref": "#/definitions/project_or_integrator"
        },
        "python.commands" : {
          "description": "Command line interfaces provided by this distribution",
          "type": "object",
          "$ref": "#/definitions/commands"
        },
        "python.exports" : {
          "description": "Other exported interfaces provided by this distribution",
          "type": "object",
          "$ref": "#/definitions/exports"
        }
      },
      "additionalProperties": false
    },
    "commands": {
      "type": "object",
      "properties": {
        "wrap_console": {
          "type": "object",
          "$ref": "#/definitions/command_map"
        },
        "wrap_gui": {
          "type": "object",
          "$ref": "#/definitions/command_map"
        },
        "prebuilt": {
          "type": "array",
          "items": {
            "type": "string",
            "$ref": "#/definitions/relative_path"
          }
        }
      },
      "additionalProperties": false
    },
    "exports": {
      "type": "object",
      "patternProperties": {
        "^[A-Za-z][0-9A-Za-z_]*([.][0-9A-Za-z_]*)*$": {
          "type": "object",
          "patternProperties": {
            ".": {
              "type": "string",
              "$ref": "#/definitions/export_specifier"
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    },
    "command_map": {
      "type": "object",
      "patternProperties": {
        "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?$": {
          "type": "string",
          "$ref": "#/definitions/export_specifier"
        }
      },
      "additionalProperties": false
    },
    "project_or_integrator" : {
      "type": "object",
      "properties" : {
        "contacts": {
          "description": "A list of contributor entries giving the recommended contact points for getting more information about the project.",
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/contact"
          }
        },
        "contributors": {
          "description": "A list of contributor entries for other contributors not already listed as current project points of contact.",
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/contact"
          }
        },
        "project_urls": {
          "description": "A mapping of arbitrary text labels to additional URLs relevant to the project.",
          "type": "object"
        }
      }
    },
    "distribution_name": {
      "type": "string",
      "pattern": "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?$"
    },
    "requirement": {
      "type": "string"
    },
    "provides_declaration": {
      "type": "string"
    },
    "environment_marker": {
      "type": "string"
    },
    "document_name": {
      "type": "string"
    },
    "extra_name" : {
      "type": "string",
      "pattern": "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?$"
    },
    "relative_path" : {
      "type": "string"
    },
    "export_specifier": {
      "type": "string",
      "pattern": "^([A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_][A-Za-z_0-9]*)*)(:[A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_][A-Za-z_0-9]*)*)?(\\[[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?\\])?$"
    },
    "qualified_name" : {
      "type": "string",
      "pattern": "^[A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_][A-Za-z_0-9]*)*$"
    },
    "prefixed_name" : {
      "type": "string",
      "pattern": "^[A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_0-9]*)*$"
    }
  }
}
