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)
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)