| # -*- coding: utf-8 -*- |
| """Exceptions module for rfc3986.""" |
| |
| from . import compat |
| |
| |
| class RFC3986Exception(Exception): |
| """Base class for all rfc3986 exception classes.""" |
| |
| pass |
| |
| |
| class InvalidAuthority(RFC3986Exception): |
| """Exception when the authority string is invalid.""" |
| |
| def __init__(self, authority): |
| """Initialize the exception with the invalid authority.""" |
| super(InvalidAuthority, self).__init__( |
| u"The authority ({0}) is not valid.".format( |
| compat.to_str(authority))) |
| |
| |
| class InvalidPort(RFC3986Exception): |
| """Exception when the port is invalid.""" |
| |
| def __init__(self, port): |
| """Initialize the exception with the invalid port.""" |
| super(InvalidPort, self).__init__( |
| 'The port ("{0}") is not valid.'.format(port)) |
| |
| |
| class ResolutionError(RFC3986Exception): |
| """Exception to indicate a failure to resolve a URI.""" |
| |
| def __init__(self, uri): |
| """Initialize the error with the failed URI.""" |
| super(ResolutionError, self).__init__( |
| "{0} is not an absolute URI.".format(uri.unsplit())) |
| |
| |
| class ValidationError(RFC3986Exception): |
| """Exception raised during Validation of a URI.""" |
| |
| pass |
| |
| |
| class MissingComponentError(ValidationError): |
| """Exception raised when a required component is missing.""" |
| |
| def __init__(self, uri, *component_names): |
| """Initialize the error with the missing component name.""" |
| verb = 'was' |
| if len(component_names) > 1: |
| verb = 'were' |
| |
| self.uri = uri |
| self.components = sorted(component_names) |
| components = ', '.join(self.components) |
| super(MissingComponentError, self).__init__( |
| "{} {} required but missing".format(components, verb), |
| uri, |
| self.components, |
| ) |
| |
| |
| class UnpermittedComponentError(ValidationError): |
| """Exception raised when a component has an unpermitted value.""" |
| |
| def __init__(self, component_name, component_value, allowed_values): |
| """Initialize the error with the unpermitted component.""" |
| super(UnpermittedComponentError, self).__init__( |
| "{} was required to be one of {!r} but was {!r}".format( |
| component_name, list(sorted(allowed_values)), component_value, |
| ), |
| component_name, |
| component_value, |
| allowed_values, |
| ) |
| self.component_name = component_name |
| self.component_value = component_value |
| self.allowed_values = allowed_values |
| |
| |
| class PasswordForbidden(ValidationError): |
| """Exception raised when a URL has a password in the userinfo section.""" |
| |
| def __init__(self, uri): |
| """Initialize the error with the URI that failed validation.""" |
| unsplit = getattr(uri, 'unsplit', lambda: uri) |
| super(PasswordForbidden, self).__init__( |
| '"{}" contained a password when validation forbade it'.format( |
| unsplit() |
| ) |
| ) |
| self.uri = uri |
| |
| |
| class InvalidComponentsError(ValidationError): |
| """Exception raised when one or more components are invalid.""" |
| |
| def __init__(self, uri, *component_names): |
| """Initialize the error with the invalid component name(s).""" |
| verb = 'was' |
| if len(component_names) > 1: |
| verb = 'were' |
| |
| self.uri = uri |
| self.components = sorted(component_names) |
| components = ', '.join(self.components) |
| super(InvalidComponentsError, self).__init__( |
| "{} {} found to be invalid".format(components, verb), |
| uri, |
| self.components, |
| ) |
| |
| |
| class MissingDependencyError(RFC3986Exception): |
| """Exception raised when an IRI is encoded without the 'idna' module.""" |