diff --git a/mia_core/utils.py b/mia_core/utils.py new file mode 100644 index 0000000..a367249 --- /dev/null +++ b/mia_core/utils.py @@ -0,0 +1,106 @@ +import urllib.parse + + +class UrlBuilder: + """The URL builder. + + Attributes: + base_path (str): the base path + params (list[Param]): The query parameters + """ + base_path = None + params = [] + + def __init__(self, start_url): + """Constructs a new URL builder. + + Args: + start_url (str): The URL to start with + """ + pos = start_url.find("?") + if pos == -1: + self.base_path = start_url + return + self.base_path = start_url[:pos] + self.params = [] + for piece in start_url[pos+1:].split("&"): + pos = piece.find("=") + name = urllib.parse.unquote(piece[:pos]) + value = urllib.parse.unquote(piece[pos+1:]) + self.params.append(self.Param(name, value)) + + def add_param(self, name, value): + """Adds a query parameter. + + Args: + name (str): The parameter name + value (str): The parameter value + + Returns: + (UrlBuilder): The URL builder itself, with the parameter + modified. + """ + self.params.append(self.Param(name, value)) + return self + + def del_param(self, name): + """Removes a query parameter. + + Args: + name (str): The parameter name + + Returns: + (UrlBuilder): The URL builder itself, with the parameter + modified. + """ + self.params = [x for x in self.params if x.name != name] + return self + + def set_param(self, name, value): + """Sets a query parameter. The current parameters with the + same name will be replaced. + + Args: + name (str): The parameter name + value (str): The parameter value + + Returns: + (UrlBuilder): The URL builder itself, with the parameter + modified. + """ + return self.del_param(name).add_param(name, value) + + def __str__(self): + return self.base_path + "&".join([str(x) for x in self.params]) + + class Param: + """A query parameter. + + Attributes: + name (str): The parameter name + value (str): The parameter value + """ + name = None + value = None + + def __init__(self, name, value): + """Constructs a new query parameter + + Args: + name (str): The parameter name + value (str): The parameter value + """ + self.name = name + self.value = value + + def __str__(self): + """Returns the string representation of this query + parameter. + + Returns: + (str) The string representation of this query + parameter + """ + return "%s=%s" % ( + urllib.parse.quote(self.name), + urllib.parse.quote(self.value))