diff --git a/sources/marvel/marvel_06.py b/sources/marvel/marvel_06.py new file mode 100644 index 0000000..a4ea8c9 --- /dev/null +++ b/sources/marvel/marvel_06.py @@ -0,0 +1,133 @@ +import abc +import hashlib +import requests +import shutil +import time +import textwrap +import sys + + +class Authorization: + def __init__(self, filename): + with open(filename, "r") as file: + lines = file.readlines() + + if len(lines) != 2: + sys.exit("Incorrect api-keys file") + + self.public_key = lines[0].strip() + self.private_key = lines[1].strip() + + def generate_params(self): + params = dict() + params["apikey"] = self.public_key + ts = str(time.time()) + to_hash = ts + self.private_key + self.public_key + hasher = hashlib.md5() + hasher.update(to_hash.encode()) + digest = hasher.hexdigest() + params["ts"] = ts + params["hash"] = digest + return params + + +class Client(): + base_url = "http://gateway.marvel.com/v1/public" + + def __init__(self, auth): + self.auth = auth + + def make_request(self, query): + params = self.auth.generate_params() + params.update(query.params()) + url = Client.base_url + query.path + response = requests.get(url, params=params) + status_code = response.status_code + if status_code != 200: + sys.exit("got status: " + str(status_code)) + body = response.json() + result = query.extract(body) + return (query.to_text(result), body["attributionText"]) + + +class Query(metaclass=abc.ABCMeta): + @abc.abstractmethod + def params(self): + pass + + @abc.abstractmethod + def path(self): + pass + + @abc.abstractmethod + def extract(self, body): + pass + + def to_text(self, result): + return result + + +class CharacterDescription(Query): + path = "/characters" + + def __init__(self, name): + self.name = name + + def params(self): + return { "name": self.name } + + def extract(self, body): + return body["data"]["results"][0]["description"] + + +class CreatorNumberOfSeries(Query): + path = "/creators" + + def __init__(self, first_name, last_name): + self.first_name = first_name + self.last_name = last_name + + def params(self): + return { "firstName": self.first_name, "lastName": self.last_name } + + def extract(self, body): + return body["data"]["results"][0]["series"]["available"] + + def to_text(self, result): + return f"{self.first_name} {self.last_name} worked on {result} series" + + +class Display: + def __init__(self, width=80): + self.width = width + + def display(self, text): + print("\n".join(textwrap.wrap(text, width=self.width))) + + +def main(): + + query_type = sys.argv[1] + if query_type == "character-description": + name = sys.argv[2] + query = CharacterDescription(name) + elif query_type == "creator-number-of-series": + first_name = sys.argv[2] + last_name = sys.argv[3] + query = CreatorNumberOfSeries(first_name, last_name) + + auth = Authorization("api-keys.txt") + client = Client(auth) + text, attribution = client.make_request(query) + + terminal_size = shutil.get_terminal_size() + columns = terminal_size.columns + terminal = Display(width=columns) + + terminal.display(text) + terminal.display("---") + terminal.display(attribution) + + +if __name__ == "__main__": + main()