Scrython/scrython/cards/search.py

210 lines
6.8 KiB
Python
Raw Normal View History

2018-02-13 20:58:28 +00:00
from .cards_object import CardsObject
import urllib.parse
2018-02-13 20:58:28 +00:00
class Search(CardsObject):
2018-10-22 14:19:38 +00:00
"""
cards/search
Uses a search query to gather relevant data.
2018-02-21 19:42:58 +00:00
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.
2018-02-21 19:42:58 +00:00
2018-10-22 14:19:38 +00:00
Example usage:
>>> search = scrython.cards.Search(q="++e:A25", order="spoiled")
>>> search.data()
"""
def __init__(self, **kwargs):
if kwargs.get('q') is None:
raise Exception('No query is specified.')
2018-02-13 21:51:03 +00:00
2018-10-22 14:19:38 +00:00
self.dict = {
'q':kwargs.get('q'),
'order':kwargs.get('order', 'none'),
'unique':kwargs.get('unique', 'none'),
'dir':kwargs.get('dir', 'none'),
'include_extras':kwargs.get('include_extras', 'false'),
'include_multilingual':kwargs.get('include_multilingual', 'false'),
2018-10-22 14:19:38 +00:00
'page':kwargs.get('page', '1')
}
2018-10-22 14:19:38 +00:00
self.args = urllib.parse.urlencode(self.dict)
self.url = 'cards/search?' + self.args
2018-10-22 14:19:38 +00:00
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
2018-10-22 14:19:38 +00:00
def object(self):
"""Returns the type of object it is.
(card, error, etc)
Returns:
string: The type of object
"""
2018-10-22 14:19:38 +00:00
super(Search, self)._checkForKey('object')
2018-10-22 14:19:38 +00:00
return self.scryfallJson['object']
2018-10-22 14:19:38 +00:00
def total_cards(self):
"""How many cards are returned from the query
Returns:
integer: The number of cards returned
"""
2018-10-22 14:19:38 +00:00
super(Search, self)._checkForKey('total_cards')
2018-10-22 14:19:38 +00:00
return self.scryfallJson['total_cards']
2018-10-22 14:19:38 +00:00
def data(self):
"""The data returned from the query
Returns:
list: A list of card objects
"""
2018-10-22 14:19:38 +00:00
super(Search, self)._checkForKey('data')
2018-10-22 14:19:38 +00:00
return self.scryfallJson['data']
2018-10-22 14:19:38 +00:00
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
"""
2018-10-22 14:19:38 +00:00
super(Search, self)._checkForKey('next_page')
2018-10-22 14:19:38 +00:00
return self.scryfallJson['next_page']
2018-10-22 14:19:38 +00:00
def data_length(self):
"""
Returns:
integer: The length of data returned
"""
2018-10-22 14:19:38 +00:00
super(Search, self)._checkForKey('data')
2018-10-22 14:19:38 +00:00
return len(self.scryfallJson['data'])
2018-10-22 14:19:38 +00:00
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
"""
2018-10-22 14:19:38 +00:00
super(Search, self)._checkForKey('data')
2018-10-22 14:19:38 +00:00
return self.scryfallJson['data'][num]
2018-10-22 14:19:38 +00:00
def has_more(self):
"""Determines if there are more pages of results.
Returns:
boolean: True if there is more than 1 page of results
"""
2018-10-22 14:19:38 +00:00
super(Search, self)._checkForKey('has_more')
2018-04-14 18:21:31 +00:00
return self.scryfallJson['has_more']