def validate_conan_name(name, version=False): """Check for name compliance with pattern rules""" try: if name == '*': return name if ConanFileReference.validation_pattern.match(name) is None: if version and name.startswith("[") and name.endswith("]"): return name if len(name) > ConanFileReference.max_chars: message = "'%s' is too long. Valid names must " \ "contain at most %s characters." % (name, ConanFileReference.max_chars) elif len(name) < ConanFileReference.min_chars: message = "'%s' is too short. Valid names must contain"\ " at least %s characters." % (name, ConanFileReference.min_chars) else: message = "'%s' is an invalid name. Valid names MUST begin with a "\ "letter or number, have between %s-%s chars, including "\ "letters, numbers, underscore,"\ " dot and dash" % (name, ConanFileReference.min_chars, ConanFileReference.max_chars) raise InvalidNameException(message) return name except AttributeError: raise InvalidNameException('Empty name provided', None)
def __new__(cls, name, version, user, channel, revision=None, validate=True): """Simple name creation. @param name: string containing the desired name @param version: string containing the desired version @param user: string containing the user name @param channel: string containing the user channel @param revision: string containing the revision (optional) """ if (user and not channel) or (channel and not user): raise InvalidNameException( "Specify the 'user' and the 'channel' or neither of them") version = Version(version) if version is not None else None user = _noneize(user) channel = _noneize(channel) obj = super(cls, ConanFileReference).__new__(cls, name, version, user, channel, revision) if validate: obj._validate() return obj
def _validate(self): if self.name is not None: ConanName.validate_name(self.name, reference_token="package name") if self.version is not None: ConanName.validate_name(self.version, True, reference_token="package version") if self.user is not None: ConanName.validate_name(self.user, reference_token="user name") if self.channel is not None: ConanName.validate_name(self.channel, reference_token="channel") if self.revision is not None: ConanName.validate_revision(self.revision) if not self.name or not self.version: raise InvalidNameException("Specify the 'name' and the 'version'") if (self.user and not self.channel) or (self.channel and not self.user): raise InvalidNameException("Specify the 'user' and the 'channel' or neither of them")
def raise_invalid_version_error(name, version): message = ( "Package {} has an invalid version number: '{}'. Valid names " "MUST begin with a letter, number or underscore, have " "between {}-{} chars, including letters, numbers, " "underscore, dot and dash").format(name, version, ConanName._min_chars, ConanName._max_chars) raise InvalidNameException(message)
def validate_string(value, reference_token=None): """Check for string""" if not isinstance(value, string_types): message = "Value provided{ref_token}, '{value}' (type {type}), {reason}".format( ref_token=" for {}".format(reference_token) if reference_token else "", value=value, type=type(value).__name__, reason="is not a string" ) raise InvalidNameException(message)
def invalid_name_message(name): if len(name) > ConanName._max_chars: message = ("'%s' is too long. Valid names must contain at most %s characters." % (name, ConanName._max_chars)) elif len(name) < ConanName._min_chars: message = ("'%s' is too short. Valid names must contain at least %s characters." % (name, ConanName._min_chars)) else: message = ("'%s' is an invalid name. Valid names MUST begin with a " "letter or number, have between %s-%s chars, including " "letters, numbers, underscore, dot and dash" % (name, ConanName._min_chars, ConanName._max_chars)) raise InvalidNameException(message)
def invalid_name_message(value, reference_token=None): if len(value) > ConanName._max_chars: reason = "is too long. Valid names must contain at most %s characters."\ % ConanName._max_chars elif len(value) < ConanName._min_chars: reason = "is too short. Valid names must contain at least %s characters."\ % ConanName._min_chars else: reason = ("is an invalid name. Valid names MUST begin with a " "letter, number or underscore, have between %s-%s chars, including " "letters, numbers, underscore, dot and dash" % (ConanName._min_chars, ConanName._max_chars)) message = "Value provided{ref_token}, '{value}' (type {type}), {reason}".format( ref_token=" for {}".format(reference_token) if reference_token else "", value=value, type=type(value).__name__, reason=reason ) raise InvalidNameException(message)
def validate(name, pattern=False): """Check for name compliance with pattern rules. User names can be with upper/lower case """ if Username.pattern.match(name) is None: if pattern and name == "*": return if len(name) > Username.max_len: message = "'%s' is too long. Valid names must contain at most %s characters." \ "" % (name, Username.max_len) elif len(name) < Username.min_len: message = "'%s' is too short. Valid names must contain at least %s characters." \ "" % (name, Username.min_len) else: message = "'%s' is an invalid name. "\ "Valid names should begin with alphanumerical characters, '_' and '-'." % name raise InvalidNameException(message)
def validate_revision(revision): if ConanName._validation_revision_pattern.match(revision) is None: raise InvalidNameException( "The revision field, must contain only letters " "and numbers with a length between 1 and " "%s" % ConanName._max_chars)