Source code for easydata.parsers.url

from typing import Any, Optional, Union

from easydata.parsers.text import Text
from easydata.utils import url

__all__ = ("Url",)


[docs]class Url(Text): def __init__( self, *args, from_text: bool = False, from_qs: Optional[str] = None, from_qs_unquote: Optional[str] = None, remove_qs: Optional[Union[str, list, bool]] = None, qs: Optional[dict] = None, domain: Optional[str] = None, protocol: Optional[str] = None, normalize: bool = True, **kwargs, ): self._from_text = from_text self._from_qs = from_qs self._from_qs_unquote = from_qs_unquote self._remove_qs = remove_qs self._qs = qs self._normalize_url = normalize self.__domain = domain self.__protocol = protocol super().__init__( *args, normalize=False, **kwargs, ) @property def _domain(self): return self.__domain or self.config.get("ED_URL_DOMAIN") @property def _protocol(self): return self.__protocol or self.config.get("ED_URL_PROTOCOL") def parse_value( self, value: Any, data: Any, ) -> str: value = super().parse_value(value, data) if value and self._from_text: value = url.from_text(value) if value and (self._domain or self._normalize_url): value = url.normalize( url=value, domain=self._domain, protocol=self._protocol, ) if self._from_qs: value = url.get_value_from_qs(value, self._from_qs) if value and self._remove_qs is not None: if isinstance(self._remove_qs, bool): if self._remove_qs is False: raise ValueError( "remove_qs only accepts True if bool type is provided!" ) value = url.remove_qs(value) else: value = url.remove_qs(value, self._remove_qs) if value and self._qs: value = url.set_qs_values(value, self._qs) return value