diff --git a/sources/marvel/marvel_05.py b/sources/marvel/marvel_05.py index 9503371..ada858a 100644 --- a/sources/marvel/marvel_05.py +++ b/sources/marvel/marvel_05.py @@ -1,3 +1,4 @@ +import abc import hashlib import requests import shutil @@ -30,26 +31,56 @@ class Authorization: return params -class InformationRetriever: +class Client: base_url = "http://gateway.marvel.com/v1/public" def __init__(self, auth): self.auth = auth - def make_request(self, path, query_params): + def make_request(self, query): params = self.auth.generate_params() - params.update(query_params) - url = InformationRetriever.base_url + path + 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() attribution = body["attributionText"] - return (body, attribution) + response = query.extract(body) + return (response, attribution) -class CharacterDescriptionGetter(InformationRetriever): +class Display: + def __init__(self, width=80): + self.width = width + + def display(self, text): + print("\n".join(textwrap.wrap(text, width=self.width))) + + +class Query(metaclass=abc.ABCMeta): + @abc.abstractmethod + def params(self): + pass + + @abc.abstractmethod + def path(self): + pass + + @abc.abstractmethod + def extract(self, body): + pass + + @abc.abstractmethod + def text(self, response): + pass + + +class CharacterDescription(Query): + + def __init__(self, name): + self.name = name def get_character_description(self, name): params = {"name": name} @@ -59,8 +90,26 @@ class CharacterDescriptionGetter(InformationRetriever): description = first_result["description"] return (description, attribution) + def params(self): + return {"name": self.name} + + def path(self): + return "/characters" + + def extract(self, body): + first_result = body["data"]["results"][0] + description = first_result["description"] + return description + + def text(self, response): + return response -class CreatorNumberOfSeriesGetter(InformationRetriever): + +class CreatorNumberOfSeries(Query): + + def __init__(self, first_name, last_name): + self.first_name = first_name + self.last_name = last_name def get_number_of_series(self, first_name, last_name): params = { @@ -72,30 +121,36 @@ class CreatorNumberOfSeriesGetter(InformationRetriever): first_result = body["data"]["results"][0] return (first_result["series"]["available"], attribution) + def params(self): + return { "firstName": self.first_name, "lastName": self.last_name } -class Display: - def __init__(self, width=80): - self.width = width + def path(self): + return "/creators" - def display(self, text): - print("\n".join(textwrap.wrap(text, width=self.width))) + def extract(self, body): + first_result = body["data"]["results"][0] + return first_result["series"]["available"] + + def text(self, response): + return f"{self.first_name} {self.last_name} worked on {response} series" def main(): auth = Authorization("api-keys.txt") - query = sys.argv[1] - if query == "character-description": + query_type = sys.argv[1] + if query_type == "character-description": name = sys.argv[2] - character_description_getter = CharacterDescriptionGetter(auth) - description, attribution = character_description_getter.get_character_description(name) - text = description - elif query == "creator-number-of-series": + query = CharacterDescription(name) + + elif query_type == "creator-number-of-series": first_name = sys.argv[2] last_name = sys.argv[3] - creator_number_of_series_getter = CreatorNumberOfSeriesGetter(auth) - result, attribution = creator_number_of_series_getter.get_number_of_series(first_name, last_name) - text = first_name + " " + last_name + " worked on " + str(result) + " series" + query = CreatorNumberOfSeries(first_name, last_name) + + client = Client(auth) + response,attribution = client.make_request(query) + text = query.text(response) terminal_size = shutil.get_terminal_size() columns = terminal_size.columns