Esempio n. 1
0
class UrlBuilder:
    def __init__(self, url: typing.Optional[str] = None) -> None:
        if url is None:
            self.splitted = SplitResult("", "", "", "", "")
        else:
            self.splitted = urlsplit(url)
        self.query = parse_qsl(self.splitted.query)

    def set(self,
            scheme: str = None,
            netloc: str = None,
            path: str = None,
            query: typing.List[typing.Tuple[str, str]] = None,
            fragment: str = None) -> "UrlBuilder":
        kwargs = dict()
        if scheme is not None:
            kwargs['scheme'] = scheme
        if netloc is not None:
            kwargs['netloc'] = netloc
        if path is not None:
            kwargs['path'] = path
        if query is not None:
            self.query = query
        if fragment is not None:
            kwargs['fragment'] = fragment
        self.splitted = self.splitted._replace(**kwargs)

        return self

    def has_query(self, needle_query_name: str) -> bool:
        """Returns True iff the URL being constructed has a query field with name `needle_query_name`."""
        for query_name, _ in self.query:
            if query_name == needle_query_name:
                return True
        return False

    def add_query(self, query_name: str, query_value: str) -> "UrlBuilder":
        self.query.append((query_name, query_value))

        return self

    def replace_query(self, query_name: str, query_value: str) -> "UrlBuilder":
        """
        Given a query name, remove all instances of that query name in this UrlBuilder.  Then append an instance with
        the name set to `query_name` and the value set to `query_value`.
        """
        self.query = [(q_name, q_value) for q_name, q_value in self.query
                      if q_name != query_name]
        self.query.append((query_name, query_value))

        return self

    def __str__(self) -> str:
        result = self.splitted._replace(
            query=urlencode(self.query, doseq=True))

        return urlunsplit(result)
Esempio n. 2
0
class UrlBuilder:
    def __init__(self):
        self.splitted = SplitResult("", "", "", "", "")
        self.query = list()

    def set(
            self,
            scheme: str=None,
            netloc: str=None,
            path: str=None,

            query: typing.Sequence[typing.Tuple[str, str]]=None,
            fragment: str=None) -> "UrlBuilder":
        kwargs = dict()
        if scheme is not None:
            kwargs['scheme'] = scheme
        if netloc is not None:
            kwargs['netloc'] = netloc
        if path is not None:
            kwargs['path'] = path
        if query is not None:
            self.query = query
        if fragment is not None:
            kwargs['fragment'] = fragment
        self.splitted = self.splitted._replace(**kwargs)

        return self

    def has_query(self, needle_query_name: str) -> bool:
        """Returns True iff the URL being constructed has a query field with name `needle_query_name`."""
        for query_name, _ in self.query:
            if query_name == needle_query_name:
                return True
        return False

    def add_query(self, query_name: str, query_value: str) -> "UrlBuilder":
        self.query.append((query_name, query_value))

        return self

    def __str__(self) -> str:
        result = self.splitted._replace(query=urlencode(self.query, doseq=True))

        return urlunsplit(result)