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