gpkgstatus.utils.url_reader API documentation

# gpkgstatus.utils.url_reader

A URL Reader module that reads a JSON url and saves its response as a file in tempdir.

###### Raises:

- URLReader._StatusException: Manual exception raised if HTTP status code is not OK (200).

View Source

      1"""A URL Reader module that reads a JSON url and saves its response \
      2    as a file in tempdir.
      3
      4Raises:
      5    URLReader._StatusException: Manual exception raised if \
      6            HTTP status code is not OK (200).
      7
      8"""
      9import json
     10import logging
     11import sys
     12
     13from os.path import join
     14from tempfile import gettempdir
     15
     16import requests
     17
     18from termcolor import colored
     19
     20
     21# pylint:disable=too-few-public-methods
     22class URLReader:
     23    """A Custom URL Reader class created using requests package.
     24
     25    The class initializer uses a HEAD request to determine if given
     26    JSON url exists.
     27
     28    Raises:
     29        URLReader._StatusException: Manual exception raised if \
     30            HTTP status code is not OK (200).
     31    """
     32
     33    class _StatusException(Exception):
     34        pass
     35
     36    _url: str = ""
     37
     38    def __init__(self, _url: str):
     39        try:
     40            response = requests.head(_url, timeout=15)
     41
     42            if response.status_code != 200:
     43                print(
     44                    colored("Error: Website isn't returning HTTP Status Code (200 OK)")
     45                )
     46                raise URLReader._StatusException()
     47
     48            self._url = _url
     49            logging.info("URL %s returned OK", _url)
     50
     51        except requests.ConnectionError:
     52            print(colored(f"Error: Could not connect to {_url}", "red"))
     53            sys.exit(1)
     54
     55    def _load_json(self):
     56        """Loads the given JSON url.
     57
     58        If corresponding url is not a JSON url or if JSON decoding fails, then
     59        the program halts with exit status 1 and immediately states that
     60        there is an issue parsing JSON from corresponding url and might
     61        not be a valid JSON url.
     62
     63        Returns:
     64            Any: Returns JSON response of corresponding JSON url.
     65        """
     66        try:
     67            response = requests.get(self._url, timeout=15)
     68            logging.info("GET Request from %s succeeded", self._url)
     69
     70            return response.json()
     71        except requests.exceptions.JSONDecodeError:
     72            print(
     73                colored(
     74                    "Error: There is an issue parsing JSON from corresponding website. \
     75                        Check if given URL is valid JSON URL",
     76                    "red",
     77                )
     78            )
     79            sys.exit(1)
     80
     81    # pylint:disable=duplicate-code
     82    def save_as_file(self, filename: str, data: str = ""):
     83        """Saves JSON response in a file.
     84
     85        If PermissionError is raised, then the program halts with exit
     86        status 1 and immediately states that permission is denied.
     87
     88        Args:
     89            filename (str): Name of the file.
     90            data (str, optional): Corresponding JSON response/file.
     91            If no file is given, it takes JSON response as data from
     92            corresponding url.
     93        """
     94        if not data:
     95            data = self._load_json()
     96            logging.info("JSON loaded successfully from URL")
     97
     98        temp_file = join(gettempdir(), filename)
     99
    100        try:
    101            with open(temp_file, "w", encoding="utf-8") as file:
    102                json.dump(data, file, skipkeys=True, indent=4)
    103
    104            logging.info("JSON stored in %s", filename)
    105
    106        except PermissionError:
    107            print(
    108                colored(
    109                    "Error: Permission denied. Please check temp directory permissions.",
    110                    "red",
    111                )
    112            )
    113            sys.exit(1)

class URLReader: View Source

     23class URLReader:
     24    """A Custom URL Reader class created using requests package.
     25
     26    The class initializer uses a HEAD request to determine if given
     27    JSON url exists.
     28
     29    Raises:
     30        URLReader._StatusException: Manual exception raised if \
     31            HTTP status code is not OK (200).
     32    """
     33
     34    class _StatusException(Exception):
     35        pass
     36
     37    _url: str = ""
     38
     39    def __init__(self, _url: str):
     40        try:
     41            response = requests.head(_url, timeout=15)
     42
     43            if response.status_code != 200:
     44                print(
     45                    colored("Error: Website isn't returning HTTP Status Code (200 OK)")
     46                )
     47                raise URLReader._StatusException()
     48
     49            self._url = _url
     50            logging.info("URL %s returned OK", _url)
     51
     52        except requests.ConnectionError:
     53            print(colored(f"Error: Could not connect to {_url}", "red"))
     54            sys.exit(1)
     55
     56    def _load_json(self):
     57        """Loads the given JSON url.
     58
     59        If corresponding url is not a JSON url or if JSON decoding fails, then
     60        the program halts with exit status 1 and immediately states that
     61        there is an issue parsing JSON from corresponding url and might
     62        not be a valid JSON url.
     63
     64        Returns:
     65            Any: Returns JSON response of corresponding JSON url.
     66        """
     67        try:
     68            response = requests.get(self._url, timeout=15)
     69            logging.info("GET Request from %s succeeded", self._url)
     70
     71            return response.json()
     72        except requests.exceptions.JSONDecodeError:
     73            print(
     74                colored(
     75                    "Error: There is an issue parsing JSON from corresponding website. \
     76                        Check if given URL is valid JSON URL",
     77                    "red",
     78                )
     79            )
     80            sys.exit(1)
     81
     82    # pylint:disable=duplicate-code
     83    def save_as_file(self, filename: str, data: str = ""):
     84        """Saves JSON response in a file.
     85
     86        If PermissionError is raised, then the program halts with exit
     87        status 1 and immediately states that permission is denied.
     88
     89        Args:
     90            filename (str): Name of the file.
     91            data (str, optional): Corresponding JSON response/file.
     92            If no file is given, it takes JSON response as data from
     93            corresponding url.
     94        """
     95        if not data:
     96            data = self._load_json()
     97            logging.info("JSON loaded successfully from URL")
     98
     99        temp_file = join(gettempdir(), filename)
    100
    101        try:
    102            with open(temp_file, "w", encoding="utf-8") as file:
    103                json.dump(data, file, skipkeys=True, indent=4)
    104
    105            logging.info("JSON stored in %s", filename)
    106
    107        except PermissionError:
    108            print(
    109                colored(
    110                    "Error: Permission denied. Please check temp directory permissions.",
    111                    "red",
    112                )
    113            )
    114            sys.exit(1)

A Custom URL Reader class created using requests package.

The class initializer uses a HEAD request to determine if given JSON url exists.

###### Raises:

- URLReader._StatusException: Manual exception raised if HTTP status code is not OK (200).

URLReader(_url: str) View Source

    39    def __init__(self, _url: str):
    40        try:
    41            response = requests.head(_url, timeout=15)
    42
    43            if response.status_code != 200:
    44                print(
    45                    colored("Error: Website isn't returning HTTP Status Code (200 OK)")
    46                )
    47                raise URLReader._StatusException()
    48
    49            self._url = _url
    50            logging.info("URL %s returned OK", _url)
    51
    52        except requests.ConnectionError:
    53            print(colored(f"Error: Could not connect to {_url}", "red"))
    54            sys.exit(1)

def save_as_file(self, filename: str, data: str = ''): View Source

     83    def save_as_file(self, filename: str, data: str = ""):
     84        """Saves JSON response in a file.
     85
     86        If PermissionError is raised, then the program halts with exit
     87        status 1 and immediately states that permission is denied.
     88
     89        Args:
     90            filename (str): Name of the file.
     91            data (str, optional): Corresponding JSON response/file.
     92            If no file is given, it takes JSON response as data from
     93            corresponding url.
     94        """
     95        if not data:
     96            data = self._load_json()
     97            logging.info("JSON loaded successfully from URL")
     98
     99        temp_file = join(gettempdir(), filename)
    100
    101        try:
    102            with open(temp_file, "w", encoding="utf-8") as file:
    103                json.dump(data, file, skipkeys=True, indent=4)
    104
    105            logging.info("JSON stored in %s", filename)
    106
    107        except PermissionError:
    108            print(
    109                colored(
    110                    "Error: Permission denied. Please check temp directory permissions.",
    111                    "red",
    112                )
    113            )
    114            sys.exit(1)

Saves JSON response in a file.

If PermissionError is raised, then the program halts with exit status 1 and immediately states that permission is denied.

###### Arguments:

- filename (str): Name of the file.
- data (str, optional): Corresponding JSON response/file.
- If no file is given, it takes JSON response as data from
- corresponding url.