Source code for wasp_general.uri

# -*- coding: utf-8 -*-
# wasp_general/uri.py
#
# Copyright (C) 2017 the wasp-general authors and contributors
# <see AUTHORS file>
#
# This file is part of wasp-general.
#
# Wasp-general is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Wasp-general is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with wasp-general.  If not, see <http://www.gnu.org/licenses/>.

# TODO: document the code
# TODO: write tests for the code
# TODO: merge some from wasp_general.network.web.service and wasp_general.network.web.re_statements

# noinspection PyUnresolvedReferences
from wasp_general.version import __author__, __version__, __credits__, __license__, __copyright__, __email__
# noinspection PyUnresolvedReferences
from wasp_general.version import __status__

from enum import Enum
from urllib.parse import urlsplit, urlunsplit

from wasp_general.verify import verify_type


[docs]class WURI:
[docs] class Component(Enum): scheme = 'scheme' username = 'username' password = 'password' hostname = 'hostname' port = 'port' path = 'path' query = 'query' fragment = 'fragment'
def __init__(self, **components): self.__components = {x: None for x in WURI.Component} for component_name, component_value in components.items(): self.component(component_name, component_value) def __getattr__(self, item): try: components_fn = object.__getattribute__(self, WURI.component.__name__) item = WURI.Component(item) return lambda: components_fn(item) except ValueError: pass return object.__getattribute__(self, item) def __str__(self): netloc = '' username = self.username() if username is not None: netloc += username password = self.password() if password is not None: netloc += ':' + password if len(netloc) > 0: netloc += '@' hostname = self.hostname() if hostname is not None: netloc += hostname port = self.port() if port is not None: netloc += ':' + str(port) scheme = self.scheme() path = self.path() if len(netloc) == 0 and scheme is not None and path is not None: path = '/' + path return urlunsplit(( scheme if scheme is not None else '', netloc, path if path is not None else '', self.query(), self.fragment() ))
[docs] @verify_type(component=(str, Component)) def component(self, component, value=None): if isinstance(component, str) is True: component = WURI.Component(component) if value is not None: self.__components[component] = value return value return self.__components[component]
[docs] @classmethod def parse(cls, uri): uri_components = urlsplit(uri) adapter_fn = lambda x: x if x is not None and (isinstance(x, str) is False or len(x)) > 0 else None return cls( scheme=adapter_fn(uri_components.scheme), username=adapter_fn(uri_components.username), password=adapter_fn(uri_components.password), hostname=adapter_fn(uri_components.hostname), port=adapter_fn(uri_components.port), path=adapter_fn(uri_components.path), query=adapter_fn(uri_components.query), fragment=adapter_fn(uri_components.fragment), )