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.")
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.", )