From b90946240c4a400b558eb7b9921837fbb025dec2 Mon Sep 17 00:00:00 2001 From: Nanda Scott Date: Tue, 23 Oct 2018 20:54:28 -0400 Subject: [PATCH] Updated docstrings and some functionality. Still working on cards_object --- scrython/cards/arena_id.py | 9 +- scrython/cards/autocomplete.py | 6 +- scrython/cards/cardid.py | 29 ++- scrython/cards/cards_object.py | 96 +++++++-- scrython/cards/collector.py | 22 +-- scrython/cards/mtgo.py | 27 ++- scrython/cards/multiverse.py | 27 ++- scrython/cards/named.py | 37 +++- scrython/cards/randomcard.py | 25 ++- scrython/cards/search.py | 351 ++++++++++++++------------------- 10 files changed, 356 insertions(+), 273 deletions(-) diff --git a/scrython/cards/arena_id.py b/scrython/cards/arena_id.py index 89c3e11..3a5919a 100644 --- a/scrython/cards/arena_id.py +++ b/scrython/cards/arena_id.py @@ -7,7 +7,7 @@ class ArenaId(CardsObject): Args: id (string): - The Scryfall Id of the card. + The Arena Id of the card. format (string, optional): Defaults to 'json'. Returns data in the specified method. @@ -23,8 +23,9 @@ class ArenaId(CardsObject): Returns a prettier version of the json object. Note that this may break functionality with Scrython. - Attributes: - All attributes are inherited from CardsObject. + Raises: + Exception: If the 'id' parameter is not provided. + Exception: If the object returned is an error. Example usage: >>> card = scrython.cards.ArenaId(id="66975") @@ -32,7 +33,7 @@ class ArenaId(CardsObject): """ def __init__(self, **kwargs): if kwargs.get('id') is None: - raise TypeError('No id provided to search by') + raise Exception('No id provided to search by') self.url = 'cards/arena/{}?'.format(str(kwargs.get('id'))) super(ArenaId, self).__init__(self.url) diff --git a/scrython/cards/autocomplete.py b/scrython/cards/autocomplete.py index 51dd5b8..a053859 100644 --- a/scrython/cards/autocomplete.py +++ b/scrython/cards/autocomplete.py @@ -25,13 +25,17 @@ class Autocomplete(CardsObject): Returns a prettier version of the json object. Note that this may break functionality with Scrython. + Raises: + Exception: If the 'q' parameter is not provided. + Exception: If the object returned is an error. + Example usage: >>> auto = scrython.cards.Autocomplete(q="Thal") >>> auto.total_items() """ def __init__(self, **kwargs): if kwargs.get('q') is None: - raise TypeError('No query provided to search by') + raise Exception('No query provided to search by') self.dict = { 'q': kwargs.get('q') } diff --git a/scrython/cards/cardid.py b/scrython/cards/cardid.py index 1209aa4..bd7ada9 100644 --- a/scrython/cards/cardid.py +++ b/scrython/cards/cardid.py @@ -5,14 +5,27 @@ class Id(CardsObject): cards/id Get a card by the Scryfall id. - Positional arguments: - id : str ....................... The Scryfall Id of the card. + Args: + id (string): + The Scryfall Id of the card. + format (string, optional): + Defaults to 'json'. + Returns data in the specified method. + face (string, optional): + Defaults to empty string. + If you're using the `image` format, this will specify if you want the front or back face. + version (string, optional): + Defaults to empty string. + If you're using the `image` format, this will specify if you want the small, normal, + large, etc version of the image. + pretty (string, optional): + Defaults to empty string. + Returns a prettier version of the json object. + Note that this may break functionality with Scrython. - Optional arguments: - Inherits all arguments from CardsObject. - - Attributes: - All attributes are inherited from CardsObject. + Raises: + Exception: If the 'id' parameter is not provided. + Exception: If the object returned is an error. Example usage: >>> card = scrython.cards.Id(id="5386a61c-4928-4bd1-babe-5b089ab8b2d9") @@ -20,7 +33,7 @@ class Id(CardsObject): """ def __init__(self, **kwargs): if kwargs.get('id') is None: - raise TypeError('No id provided to search by') + raise Exception('No id provided to search by') self.url = 'cards/{}?'.format(str(kwargs.get('id'))) super(Id, self).__init__(self.url) diff --git a/scrython/cards/cards_object.py b/scrython/cards/cards_object.py index 2068edb..ebfdd17 100644 --- a/scrython/cards/cards_object.py +++ b/scrython/cards/cards_object.py @@ -19,18 +19,6 @@ class CardsObject(object): pretty : str ... Returns a prettier version of the json object. Note that this may break functionality with Scrython. Attributes: - object : str ..... Returns the type of object it is. (card, error, etc) - id : str ................................. The scryfall id of the card. - multiverse_ids : list ...... The associated multiverse ids of the card. - mtgo_id : int ........................ The Magic Online id of the card. - mtgo_foil_id : int .............. The Magic Online foil id of the card. - name : str ................................. The full name of the card. - uri : str .......................... The Scryfall API uri for the card. - scryfall_uri : str ................ The full Scryfall page of the card. - layout : str ... The image layout of the card. (normal, transform, etc) - highres_image : bool ... Returns True if the card has a high res image. - image_uris : dict .... All image uris of the card in various qualities. - cmc : float ........... A float of the converted mana cost of the card. type_line : str ....................... The full type line of the card. oracle_text : str ................. The official oracle text of a card. mana_cost : str .... The full mana cost using shorthanded mana symbols. @@ -112,69 +100,153 @@ class CardsObject(object): raise Exception(self.scryfallJson['details']) def _checkForKey(self, key): + """Checks for a key in the scryfallJson object. + This function should be considered private, and + should not be accessed in production. + + Args: + key (string): The key to check + + Raises: + KeyError: If key is not found. + """ if not key in self.scryfallJson: raise KeyError('This card has no key \'{}\''.format(key)) def _checkForTupleKey(self, parent, num, key): + """Checks for a key of an object in an array. + This function should be considered private, and + should not be accessed in production. + + Args: + parent (string): The key for the array to be accessed + num (int): The index of the array + key (string): The key to check + + Raises: + KeyError: If key is not found. + """ if not key in self.scryfallJson[parent][num]: raise KeyError('This tuple has no key \'{}\''.format(key)) def object(self): + """Returns the type of object it is + (card, error, etc) + + Returns: + string: The type of object + """ self._checkForKey('object') return self.scryfallJson['object'] def id(self): + """A unique ID for the returned card object + + Returns: + string: The scryfall id of the card + """ self._checkForKey('id') return self.scryfallJson['id'] def multiverse_ids(self): + """The official Gatherer multiverse ids of the card + + Returns: + list: The associated multiverse ids of the card + """ self._checkForKey('multiverse_ids') return self.scryfallJson['multiverse_ids'] def mtgo_id(self): + """The official MTGO id of the of the card + + Returns: + integer: The Magic Online id of the card + """ self._checkForKey('mtgo_id') return self.scryfallJson['mtgo_id'] def mtgo_foil_id(self): + """The corresponding MTGO foil ID of the card + + Returns: + integer: The Magic Online foil id of the card + """ self._checkForKey('mtgo_foil_id') return self.scryfallJson['mtgo_foil_id'] def name(self): + """The oracle name of the card + + Returns: + string: The card name + """ self._checkForKey('name') return self.scryfallJson['name'] def uri(self): + """The Scryfall API uri for the card + + Returns: + string: An API uri for the card + """ self._checkForKey('uri') return self.scryfallJson['uri'] def scryfall_uri(self): + """The full Scryfall page of the card + As if it was a URL from the site. + + Returns: + string: The Scryfall URL for the card + """ self._checkForKey('scryfall_uri') return self.scryfallJson['scryfall_uri'] def layout(self): + """The image layout of the card. (normal, transform, etc) + + Returns: + string: The card layout + """ self._checkForKey('layout') return self.scryfallJson['layout'] def highres_image(self): + """Determine if a card has a highres scan available + + Returns: + boolean: True if card has a highres image available + """ self._checkForKey('highres_image') return self.scryfallJson['highres_image'] def image_uris(self): + """All image uris of the card in various qualities + + Returns: + dict: The dictionary of image uris + """ self._checkForKey('image_uris') return self.scryfallJson['image_uris'] def cmc(self): + """A float of the converted mana cost of the card + + Returns: + float: The cmc of the card + """ self._checkForKey('cmc') return self.scryfallJson['cmc'] diff --git a/scrython/cards/collector.py b/scrython/cards/collector.py index 30ba77c..6d8a935 100644 --- a/scrython/cards/collector.py +++ b/scrython/cards/collector.py @@ -5,17 +5,15 @@ class Collector(CardsObject): cards/collector Get a card by collector number. - Positional arguments: - code : str ....................... This is the 3 letter code for the set - collector_number : str ........ This is the collector number of the card + Args: + code (string): This is the 3 letter code for the set + collector_number (string): This is the collector number of the card + lang (string, optional): Defaults to 'en'. A 2-3 character language code. - Optional arguments: - Inherits all arguments from CardsObject - - lang : str ............................... A 2-3 character language code - - Attributes: - Inherits all attributes from CardsObject + Raises: + Exception: If the 'code' parameter is not provided. + Exception: If the 'collector_number' parameter is not provided. + Exception: If the object returned is an error. Example usage: >>> card = scrython.cards.Collector(code='exo', collector_number='96') @@ -23,7 +21,9 @@ class Collector(CardsObject): """ def __init__(self, **kwargs): if kwargs.get('code') is None: - raise TypeError('No code provided to search by') + raise Exception('No code provided to search by') + elif kwargs.get('collector_number') is None: + raise Exception('No collector number provided to search by') self.url = 'cards/{}/{}/{}?'.format( kwargs.get('code'), diff --git a/scrython/cards/mtgo.py b/scrython/cards/mtgo.py index a1078b4..8e5c5b9 100644 --- a/scrython/cards/mtgo.py +++ b/scrython/cards/mtgo.py @@ -6,14 +6,27 @@ class Mtgo(CardsObject): cards/mtgo Get a card by MTGO id. - Positional arguments: - id : str ............................. The required mtgo id of the card. + Args: + id (string): + The MTGO Id of the card. + format (string, optional): + Defaults to 'json'. + Returns data in the specified method. + face (string, optional): + Defaults to empty string. + If you're using the `image` format, this will specify if you want the front or back face. + version (string, optional): + Defaults to empty string. + If you're using the `image` format, this will specify if you want the small, normal, + large, etc version of the image. + pretty (string, optional): + Defaults to empty string. + Returns a prettier version of the json object. + Note that this may break functionality with Scrython. - Optional arguments: - All arguments are inherited from CardsObject - - Attributes: - All attributes are inherited from CardsObject + Raises: + Exception: If the 'id' parameter is not provided. + Exception: If the object returned is an error. Example usage: >>> card = scrython.cards.Mtgo(id="48296") diff --git a/scrython/cards/multiverse.py b/scrython/cards/multiverse.py index 795033e..27416ad 100644 --- a/scrython/cards/multiverse.py +++ b/scrython/cards/multiverse.py @@ -5,14 +5,27 @@ class Multiverse(CardsObject): cards/multiverse Get a card by Multiverse id - Positional arguments: - id : str ....... This is the associated multiverse id of the given card. + Args: + id (string): + The Multiverse Id of the card. + format (string, optional): + Defaults to 'json'. + Returns data in the specified method. + face (string, optional): + Defaults to empty string. + If you're using the `image` format, this will specify if you want the front or back face. + version (string, optional): + Defaults to empty string. + If you're using the `image` format, this will specify if you want the small, normal, + large, etc version of the image. + pretty (string, optional): + Defaults to empty string. + Returns a prettier version of the json object. + Note that this may break functionality with Scrython. - Optional arguments: - Inherits all arguments from CardsObject - - Attributes: - Inherits all attributes from CardsObject + Raises: + Exception: If the 'id' parameter is not provided. + Exception: If the object returned is an error. Example usage: >>> card = scrython.cards.Multiverse(id='96865') diff --git a/scrython/cards/named.py b/scrython/cards/named.py index 0dd9e28..14f81b3 100644 --- a/scrython/cards/named.py +++ b/scrython/cards/named.py @@ -6,23 +6,40 @@ class Named(CardsObject): cards/named Gets a card by the name. - Positional arguments: - fuzzy : str ................ Uses the fuzzy parameter for the card name. - or - exact : str ................ Uses the exact parameter for the card name. + Args: + fuzzy (string): Uses the fuzzy parameter for the card name. + exact (string): Uses the exact parameter for the card name. + set (string, optional): + Defaults to empty string. + Returns the set of the card if specified. + Requires the 3 letter set code. + format (string, optional): + Defaults to 'json'. + Returns data in the specified method. + face (string, optional): + Defaults to empty string. + If you're using the `image` format, this will specify if you want the front or back face. + version (string, optional): + Defaults to empty string. + If you're using the `image` format, this will specify if you want the small, normal, + large, etc version of the image. + pretty (string, optional): + Defaults to empty string. + Returns a prettier version of the json object. + Note that this may break functionality with Scrython. - Optional arguments: - set : str . Returns the set of the card if specified. Requires the 3 letter set code. - All arguments are inherited from CardsObject - - Attributes: - All attributes are inherited from CardsObject + Raises: + Exception: If the 'fuzzy' or 'exact' parameter is not provided. + Exception: If the object returned is an error. Example usage: >>> card = scrython.cards.Named(exact="Black Lotus") >>> card.colors() """ def __init__(self, **kwargs): + if kwargs.get('exact') is None or kwargs.get('fuzzy') is None: + raise Exception('You must provide a `fuzzy` or `exact` parameter.') + self.dict = { 'set':kwargs.get('set', '') } diff --git a/scrython/cards/randomcard.py b/scrython/cards/randomcard.py index 5b0e272..763acad 100644 --- a/scrython/cards/randomcard.py +++ b/scrython/cards/randomcard.py @@ -6,14 +6,25 @@ class Random(CardsObject): cards/random Get a random card. - Positional arguments: - No arguments are required. + Args: + format (string, optional): + Defaults to 'json'. + Returns data in the specified method. + face (string, optional): + Defaults to empty string. + If you're using the `image` format, + this will specify if you want the front or back face. + version (string, optional): + Defaults to empty string. + If you're using the `image` format, this will specify + if you want the small, normal, large, etc version of the image. + pretty (string, optional): + Defaults to empty string. + Returns a prettier version of the json object. + Note that this may break functionality with Scrython. - Optional arguments: - All arguments are inherited from CardsObject - - Attributes: - All attributes are inherited from CardsObject + Raises: + Exception: If the object returned is an error. Example usage: >>> card = scrython.cards.Random() diff --git a/scrython/cards/search.py b/scrython/cards/search.py index 22c82c6..b8d133d 100644 --- a/scrython/cards/search.py +++ b/scrython/cards/search.py @@ -6,28 +6,46 @@ class Search(CardsObject): cards/search Uses a search query to gather relevant data. - Positional arguments: - q : str ...... The query to search. This will be updated in the future. - - Optional arguments: - order : str ................... The order you'd like the data returned. - unique : str ........................... A way to filter similar cards. - dir : str ......... The direction you'd like to sort. (asc, desc, auto) - include_extras : bool ... Includes cards that are normally omitted from - search results, like Un-sets. - page : int .............. The page number you'd like to search, if any. - Inherits all arguments from CardsObject. - - Attributes: - object : str ....................... Returns what kind of object it is. - total_cards : int ......... How many cards are returned from the query. - data : list ...................... The list of potential autocompletes. - has_more : bool ......... True if there is more than 1 page of results. - next_page : str ............ The API URI to the next page of the query. - warnings : list .................. Provides an array of errors, if any. - data_length : int .................... The length of the data returned. - data_tuple : dict .......... Accesses an object at the specified index. + Args: + q (string): + The query to search. This will be updated in the future. + order (string, optional): + Defaults to 'none' + The order you'd like the data returned. + unique (string, optional): + Defaults to 'none' + A way to filter similar cards. + dir (string, optional) + Defaults to 'none' + The direction you'd like to sort. (asc, desc, auto) + include_extras (boolean, optional): + Defaults to 'false' + Includes cards that are normally omitted from search results, like Un-sets. + include_multilingual (boolean, optional): + Defaults to 'false' + Includes cards that are in the language specified. (en, ja, etc). + page (integer, optional): + Defaults to '1' + The page number you'd like to search, if any. + format (string, optional): + Defaults to 'json'. + Returns data in the specified method. + face (string, optional): + Defaults to empty string. + If you're using the `image` format, + this will specify if you want the front or back face. + version (string, optional): + Defaults to empty string. + If you're using the `image` format, this will specify + if you want the small, normal, large, etc version of the image. + pretty (string, optional): + Defaults to empty string. + Returns a prettier version of the json object. + Note that this may break functionality with Scrython. + Raises: + Exception: If the 'q' parameter is not provided. + Exception: If the object returned is an error. Example usage: >>> search = scrython.cards.Search(q="++e:A25", order="spoiled") @@ -35,7 +53,7 @@ class Search(CardsObject): """ def __init__(self, **kwargs): if kwargs.get('q') is None: - raise TypeError('No query is specified.') + raise Exception('No query is specified.') self.dict = { 'q':kwargs.get('q'), @@ -52,220 +70,141 @@ class Search(CardsObject): super(Search, self).__init__(self.url) + # The following block of methods are not compatible with object returned from + # the cards/autocomplete endpoint. Doing it this way as to not repeat defining another + # getRequest function in the __init__. Will be refactored in the future. + del CardsObject.id + del CardsObject.multiverse_ids + del CardsObject.mtgo_id + del CardsObject.mtgo_foil_id + del CardsObject.name + del CardsObject.uri + del CardsObject.scryfall_uri + del CardsObject.layout + del CardsObject.highres_image + del CardsObject.image_uris + del CardsObject.cmc + del CardsObject.type_line + del CardsObject.oracle_text + del CardsObject.mana_cost + del CardsObject.colors + del CardsObject.color_identity + del CardsObject.legalities + del CardsObject.reserved + del CardsObject.reprint + del CardsObject.set_code + del CardsObject.set_name + del CardsObject.set_uri + del CardsObject.set_search_uri + del CardsObject.scryfall_set_uri + del CardsObject.rulings_uri + del CardsObject.prints_search_uri + del CardsObject.collector_number + del CardsObject.digital + del CardsObject.rarity + del CardsObject.illustration_id + del CardsObject.artist + del CardsObject.frame + del CardsObject.full_art + del CardsObject.border_color + del CardsObject.timeshifted + del CardsObject.colorshifted + del CardsObject.futureshifted + del CardsObject.edhrec_rank + del CardsObject.currency + del CardsObject.related_uris + del CardsObject.purchase_uris + del CardsObject.life_modifier + del CardsObject.hand_modifier + del CardsObject.color_indicator + del CardsObject.all_parts + del CardsObject.card_faces + del CardsObject.watermark + del CardsObject.story_spotlight + del CardsObject.power + del CardsObject.toughness + del CardsObject.loyalty + del CardsObject.flavor_text + del CardsObject.arena_id + del CardsObject.lang + del CardsObject.printed_name + del CardsObject.printed_type_line + del CardsObject.printed_text + del CardsObject.oracle_id + del CardsObject.foil + del CardsObject.nonfoil + del CardsObject.oversized + def object(self): + """Returns the type of object it is. + (card, error, etc) + + Returns: + string: The type of object + """ super(Search, self)._checkForKey('object') return self.scryfallJson['object'] def total_cards(self): + """How many cards are returned from the query + + Returns: + integer: The number of cards returned + """ super(Search, self)._checkForKey('total_cards') return self.scryfallJson['total_cards'] def data(self): + """The data returned from the query + + Returns: + list: A list of card objects + """ super(Search, self)._checkForKey('data') return self.scryfallJson['data'] def next_page(self): + """The API URI to the next page of the query + + Returns: + string: A URI to the next page of the query + """ super(Search, self)._checkForKey('next_page') return self.scryfallJson['next_page'] def data_length(self): + """ + + Returns: + integer: The length of data returned + """ super(Search, self)._checkForKey('data') return len(self.scryfallJson['data']) def data_tuple(self, num): + """Accesses an object at the specified index + + Args: + num (int): The index of the object in the `data` key + + Returns: + dict: The card object at the specified index + """ super(Search, self)._checkForKey('data') return self.scryfallJson['data'][num] def has_more(self): + """Determines if there are more pages of results. + + Returns: + boolean: True if there is more than 1 page of results + """ super(Search, self)._checkForKey('has_more') - return self.scryfallJson['has_more'] - - #The following attributes are only to override the inherited class attributes. - #This class has no matching attributes but we still need the getRequest function from CardsObject - - def id(self): - raise AttributeError('Search object has no attribute \'id\'') - - def multiverse_ids(self): - raise AttributeError('Search object has no attribute \'multiverse_ids\'') - - def mtgo_id(self): - raise AttributeError('Search object has no attribute \'mtgo_id\'') - - def mtgo_foil_id(self): - raise AttributeError('Search object has no attribute \'mtgo_foil_id\'') - - def name(self): - raise AttributeError('Search object has no attribute \'name\'') - - def uri(self): - raise AttributeError('Search object has no attribute \'uri\'') - - def scryfall_uri(self): - raise AttributeError('Search object has no attribute \'scryfall_uri\'') - - def layout(self): - raise AttributeError('Search object has no attribute \'layout\'') - - def highres_image(self): - raise AttributeError('Search object has no attribute \'highres_image\'') - - def image_uris(self): - raise AttributeError('Search object has no attribute \'image_uris\'') - - def cmc(self): - raise AttributeError('Search object has no attribute \'cmc\'') - - def type_line(self): - raise AttributeError('Search object has no attribute \'type_line\'') - - def oracle_text(self): - raise AttributeError('Search object has no attribute \'oracle_text\'') - - def mana_cost(self): - raise AttributeError('Search object has no attribute \'mana_cost\'') - - def colors(self): - raise AttributeError('Search object has no attribute \'colors\'') - - def color_identity(self): - raise AttributeError('Search object has no attribute \'color_identity\'') - - def legalities(self): - raise AttributeError('Search object has no attribute \'legalities\'') - - def reserved(self): - raise AttributeError('Search object has no attribute \'reserved\'') - - def reprint(self): - raise AttributeError('Search object has no attribute \'reprint\'') - - def set_code(self): - raise AttributeError('Search object has no attribute \'set_code\'') - - def set_name(self): - raise AttributeError('Search object has no attribute \'set_name\'') - - def set_uri(self): - raise AttributeError('Search object has no attribute \'set_uri\'') - - def set_search_uri(self): - raise AttributeError('Search object has no attribute \'set_search_uri\'') - - def scryfall_set_uri(self): - raise AttributeError('Search object has no attribute \'scryfall_set_uri\'') - - def rulings_uri(self): - raise AttributeError('Search object has no attribute \'rulings_uri\'') - - def prints_search_uri(self): - raise AttributeError('Search object has no attribute \'prints_search_uri\'') - - def collector_number(self): - raise AttributeError('Search object has no attribute \'collector_number\'') - - def digital(self): - raise AttributeError('Search object has no attribute \'digital\'') - - def rarity(self): - raise AttributeError('Search object has no attribute \'rarity\'') - - def illustration_id(self): - raise AttributeError('Search object has no attribute \'illustration_id\'') - - def artist(self): - raise AttributeError('Search object has no attribute \'artist\'') - - def frame(self): - raise AttributeError('Search object has no attribute \'frame\'') - - def full_art(self): - raise AttributeError('Search object has no attribute \'full_art\'') - - def border_color(self): - raise AttributeError('Search object has no attribute \'border_color\'') - - def timeshifted(self): - raise AttributeError('Search object has no attribute \'timeshifted\'') - - def colorshifted(self): - raise AttributeError('Search object has no attribute \'colorshifted\'') - - def futureshifted(self): - raise AttributeError('Search object has no attribute \'futureshifted\'') - - def edhrec_rank(self): - raise AttributeError('Search object has no attribute \'edhrec_rank\'') - - def currency(self, mode): - raise AttributeError('Search object has no attribute \'currency\'') - - def related_uris(self): - raise AttributeError('Search object has no attribute \'related_uris\'') - - def purchase_uris(self): - raise AttributeError('Search object has no attribute \'purchase_uris\'') - - def life_modifier(self): - raise AttributeError('Search object has no attribute \'life_modifier\'') - - def hand_modifier(self): - raise AttributeError('Search object has no attribute \'hand_modifier\'') - - def color_indicator(self): - raise AttributeError('Search object has no attribute \'color_indicator\'') - - def all_parts(self): - raise AttributeError('Search object has no attribute \'all_parts\'') - - def card_faces(self): - raise AttributeError('Search object has no attribute \'card_faces\'') - - def watermark(self): - raise AttributeError('Search object has no attribute \'watermark\'') - - def story_spotlight(self): - raise AttributeError('Search object has no attribute \'story_spotlight\'') - - def power(self): - raise AttributeError('Search object has no attribute \'power\'') - - def toughness(self): - raise AttributeError('Search object has no attribute \'toughness\'') - - def loyalty(self): - raise AttributeError('Search object has no attribute \'loyalty\'') - - def flavor_text(self): - raise AttributeError('Search object has no attribute \'flavor_text\'') - - def arena_id(self): - raise AttributeError('Search object has no attribute \'arena_id\'') - - def lang(self): - raise AttributeError('Search object has no attribute \'lang\'') - - def printed_name(self): - raise AttributeError('Search object has no attribute \'printed_name\'') - - def printed_type_line(self): - raise AttributeError('Search object has no attribute \'printed_type_line\'') - - def printed_text(self): - raise AttributeError('Search object has no attribute \'printed_text\'') - - def oracle_id(self): - raise AttributeError('Search object has no attribute \'oracle_id\'') - - def nonfoil(self): - raise AttributeError('Search object has no attribute \'nonfoil\'') - - def oversized(self): - raise AttributeError('Search object has no attribute \'oversized\'') + return self.scryfallJson['has_more'] \ No newline at end of file