Пример #1
0
class MetadataForm(forms.Form):

    # Metadata version
    metadata_version = wtforms.StringField(
        description="Metadata-Version",
        validators=[
            wtforms.validators.DataRequired(),
            wtforms.validators.AnyOf(
                # Note: This isn't really Metadata 2.0, however bdist_wheel
                #       claims it is producing a Metadata 2.0 metadata when in
                #       reality it's more like 1.2 with some extensions.
                ["1.0", "1.1", "1.2", "2.0", "2.1"],
                message="Use a known metadata version.",
            ),
        ],
    )

    # Identity Project and Release
    name = wtforms.StringField(
        description="Name",
        validators=[
            wtforms.validators.DataRequired(),
            wtforms.validators.Regexp(
                _project_name_re,
                re.IGNORECASE,
                message=("Start and end with a letter or numeral containing "
                         "only ASCII numeric and '.', '_' and '-'."),
            ),
        ],
    )
    version = wtforms.StringField(
        description="Version",
        validators=[
            wtforms.validators.DataRequired(),
            wtforms.validators.Regexp(
                r"^(?!\s).*(?<!\s)$",
                message="Can't have leading or trailing whitespace.",
            ),
            _validate_pep440_version,
        ],
    )

    # Additional Release metadata
    summary = wtforms.StringField(
        description="Summary",
        validators=[
            wtforms.validators.Optional(),
            wtforms.validators.Length(max=512),
            wtforms.validators.Regexp(
                r"^.+$",  # Rely on the fact that . doesn't match a newline.
                message="Use a single line only.",
            ),
        ],
    )
    description = wtforms.StringField(
        description="Description", validators=[wtforms.validators.Optional()])
    author = wtforms.StringField(description="Author",
                                 validators=[wtforms.validators.Optional()])
    description_content_type = wtforms.StringField(
        description="Description-Content-Type",
        validators=[
            wtforms.validators.Optional(), _validate_description_content_type
        ],
    )
    author_email = wtforms.StringField(
        description="Author-email",
        validators=[
            wtforms.validators.Optional(), _validate_rfc822_email_field
        ],
    )
    maintainer = wtforms.StringField(
        description="Maintainer", validators=[wtforms.validators.Optional()])
    maintainer_email = wtforms.StringField(
        description="Maintainer-email",
        validators=[
            wtforms.validators.Optional(), _validate_rfc822_email_field
        ],
    )
    license = wtforms.StringField(description="License",
                                  validators=[wtforms.validators.Optional()])
    keywords = wtforms.StringField(description="Keywords",
                                   validators=[wtforms.validators.Optional()])
    classifiers = wtforms.fields.SelectMultipleField(description="Classifier")
    platform = wtforms.StringField(description="Platform",
                                   validators=[wtforms.validators.Optional()])

    # URLs
    home_page = wtforms.StringField(
        description="Home-Page",
        validators=[wtforms.validators.Optional(),
                    forms.URIValidator()],
    )
    download_url = wtforms.StringField(
        description="Download-URL",
        validators=[wtforms.validators.Optional(),
                    forms.URIValidator()],
    )

    # Dependency Information
    requires_python = wtforms.StringField(
        description="Requires-Python",
        validators=[
            wtforms.validators.Optional(), _validate_pep440_specifier_field
        ],
    )

    # File information
    pyversion = wtforms.StringField(validators=[wtforms.validators.Optional()])
    filetype = wtforms.StringField(validators=[
        wtforms.validators.DataRequired(),
        wtforms.validators.AnyOf(
            [
                "bdist_dmg",
                "bdist_dumb",
                "bdist_egg",
                "bdist_msi",
                "bdist_rpm",
                "bdist_wheel",
                "bdist_wininst",
                "sdist",
            ],
            message="Use a known file type.",
        ),
    ])
    comment = wtforms.StringField(validators=[wtforms.validators.Optional()])
    md5_digest = wtforms.StringField(
        validators=[wtforms.validators.Optional()])
    sha256_digest = wtforms.StringField(validators=[
        wtforms.validators.Optional(),
        wtforms.validators.Regexp(
            r"^[A-F0-9]{64}$",
            re.IGNORECASE,
            message="Use a valid, hex-encoded, SHA256 message digest.",
        ),
    ])
    blake2_256_digest = wtforms.StringField(validators=[
        wtforms.validators.Optional(),
        wtforms.validators.Regexp(
            r"^[A-F0-9]{64}$",
            re.IGNORECASE,
            message="Use a valid, hex-encoded, BLAKE2 message digest.",
        ),
    ])

    # Legacy dependency information
    requires = ListField(validators=[
        wtforms.validators.Optional(), _validate_legacy_non_dist_req_list
    ])
    provides = ListField(validators=[
        wtforms.validators.Optional(), _validate_legacy_non_dist_req_list
    ])
    obsoletes = ListField(validators=[
        wtforms.validators.Optional(), _validate_legacy_non_dist_req_list
    ])

    # Newer dependency information
    requires_dist = ListField(
        description="Requires-Dist",
        validators=[
            wtforms.validators.Optional(), _validate_legacy_dist_req_list
        ],
    )
    provides_dist = ListField(
        description="Provides-Dist",
        validators=[
            wtforms.validators.Optional(), _validate_legacy_dist_req_list
        ],
    )
    obsoletes_dist = ListField(
        description="Obsoletes-Dist",
        validators=[
            wtforms.validators.Optional(), _validate_legacy_dist_req_list
        ],
    )
    requires_external = ListField(
        description="Requires-External",
        validators=[
            wtforms.validators.Optional(), _validate_requires_external_list
        ],
    )

    # Newer metadata information
    project_urls = ListField(
        description="Project-URL",
        validators=[wtforms.validators.Optional(), _validate_project_url_list],
    )

    def full_validate(self):
        # All non source releases *must* have a pyversion
        if (self.filetype.data and self.filetype.data != "sdist"
                and not self.pyversion.data):
            raise wtforms.validators.ValidationError(
                "Python version is required for binary distribution uploads.")

        # All source releases *must* have a pyversion of "source"
        if self.filetype.data == "sdist":
            if not self.pyversion.data:
                self.pyversion.data = "source"
            elif self.pyversion.data != "source":
                raise wtforms.validators.ValidationError(
                    "Use 'source' as Python version for an sdist.")

        # We *must* have at least one digest to verify against.
        if not self.md5_digest.data and not self.sha256_digest.data:
            raise wtforms.validators.ValidationError(
                "Include at least one message digest.")
Пример #2
0
class MetadataForm(forms.Form):

    # Metadata version
    metadata_version = wtforms.StringField(
        validators=[
            wtforms.validators.DataRequired(),
            wtforms.validators.AnyOf(
                # Note: This isn't really Metadata 2.0, however bdist_wheel
                #       claims it is producing a Metadata 2.0 metadata when in
                #       reality it's more like 1.2 with some extensions.
                ["1.0", "1.1", "1.2", "2.0"],
                message="Unknown Metadata Version",
            ),
        ],
    )

    # Identity Project and Release
    name = wtforms.StringField(
        validators=[
            wtforms.validators.DataRequired(),
            wtforms.validators.Regexp(
                _project_name_re,
                re.IGNORECASE,
                message=(
                    "Must start and end with a letter or numeral and contain "
                    "only ascii numeric and '.', '_' and '-'."
                ),
            ),
        ],
    )
    version = wtforms.StringField(
        validators=[
            wtforms.validators.DataRequired(),
            wtforms.validators.Regexp(
                r"^(?!\s).*(?<!\s)$",
                message="Cannot have leading or trailing whitespace.",
            ),
            _validate_pep440_version,
        ],
    )

    # Additional Release metadata
    summary = wtforms.StringField(
        validators=[
            wtforms.validators.Optional(),
            wtforms.validators.Length(max=512),
            wtforms.validators.Regexp(
                r"^.+$",  # Rely on the fact that . doesn't match a newline.
                message="Multiple lines are not allowed.",
            )
        ],
    )
    description = wtforms.StringField(
        validators=[wtforms.validators.Optional()],
    )
    author = wtforms.StringField(validators=[wtforms.validators.Optional()])
    author_email = wtforms.StringField(
        validators=[
            wtforms.validators.Optional(),
            wtforms.validators.Email(),
        ],
    )
    maintainer = wtforms.StringField(
        validators=[wtforms.validators.Optional()],
    )
    maintainer_email = wtforms.StringField(
        validators=[
            wtforms.validators.Optional(),
            wtforms.validators.Email(),
        ],
    )
    license = wtforms.StringField(validators=[wtforms.validators.Optional()])
    keywords = wtforms.StringField(validators=[wtforms.validators.Optional()])
    classifiers = wtforms.fields.SelectMultipleField()
    platform = wtforms.StringField(validators=[wtforms.validators.Optional()])

    # URLs
    home_page = wtforms.StringField(
        validators=[
            wtforms.validators.Optional(),
            forms.URIValidator(),
        ],
    )
    download_url = wtforms.StringField(
        validators=[
            wtforms.validators.Optional(),
            forms.URIValidator(),
        ],
    )

    # Dependency Information
    requires_python = wtforms.StringField(
        validators=[
            wtforms.validators.Optional(),
            _validate_pep440_specifier,
        ],
    )

    # File information
    pyversion = wtforms.StringField(
        validators=[wtforms.validators.Optional()],
    )
    filetype = wtforms.StringField(
        validators=[
            wtforms.validators.DataRequired(),
            wtforms.validators.AnyOf(
                [
                    "bdist_dmg", "bdist_dumb", "bdist_egg", "bdist_msi",
                    "bdist_rpm", "bdist_wheel", "bdist_wininst", "sdist",
                ],
                message="Unknown type of file.",
            ),
        ]
    )
    comment = wtforms.StringField(validators=[wtforms.validators.Optional()])
    md5_digest = wtforms.StringField(
        validators=[
            wtforms.validators.Optional(),
        ],
    )
    sha256_digest = wtforms.StringField(
        validators=[
            wtforms.validators.Optional(),
            wtforms.validators.Regexp(
                r"^[A-F0-9]{64}$",
                re.IGNORECASE,
                message="Must be a valid, hex encoded, SHA256 message digest.",
            ),
        ]
    )
    blake2_256_digest = wtforms.StringField(
        validators=[
            wtforms.validators.Optional(),
            wtforms.validators.Regexp(
                r"^[A-F0-9]{64}$",
                re.IGNORECASE,
                message="Must be a valid, hex encoded, blake2 message digest.",
            ),
        ]
    )

    # Legacy dependency information
    requires = ListField(
        validators=[
            wtforms.validators.Optional(),
            _validate_legacy_non_dist_req_list,
        ]
    )
    provides = ListField(
        validators=[
            wtforms.validators.Optional(),
            _validate_legacy_non_dist_req_list,
        ],
    )
    obsoletes = ListField(
        validators=[
            wtforms.validators.Optional(),
            _validate_legacy_non_dist_req_list,
        ],
    )

    # Newer dependency information
    requires_dist = ListField(
        validators=[
            wtforms.validators.Optional(),
            _validate_legacy_dist_req_list,
        ],
    )
    provides_dist = ListField(
        validators=[
            wtforms.validators.Optional(),
            _validate_legacy_dist_req_list,
        ],
    )
    obsoletes_dist = ListField(
        validators=[
            wtforms.validators.Optional(),
            _validate_legacy_dist_req_list,
        ],
    )
    requires_external = ListField(
        validators=[
            wtforms.validators.Optional(),
            _validate_requires_external_list,
        ],
    )

    # Newer metadata information
    project_urls = ListField(
        validators=[
            wtforms.validators.Optional(),
            _validate_project_url_list,
        ],
    )

    def full_validate(self):
        # All non source releases *must* have a pyversion
        if (self.filetype.data and
                self.filetype.data != "sdist" and not self.pyversion.data):
            raise wtforms.validators.ValidationError(
                "Python version is required for binary distribution uploads."
            )

        # All source releases *must* have a pyversion of "source"
        if self.filetype.data == "sdist":
            if not self.pyversion.data:
                self.pyversion.data = "source"
            elif self.pyversion.data != "source":
                raise wtforms.validators.ValidationError(
                    "The only valid Python version for a sdist is 'source'."
                )

        # We *must* have at least one digest to verify against.
        if not self.md5_digest.data and not self.sha256_digest.data:
            raise wtforms.validators.ValidationError(
                "Must include at least one message digest.",
            )