diff --git a/mtg-collector/mtgsdk/__init__.py b/mtg-collector/mtgsdk/__init__.py new file mode 100644 index 0000000..dd18ad6 --- /dev/null +++ b/mtg-collector/mtgsdk/__init__.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of mtgsdk. +# https://github.com/MagicTheGathering/mtg-sdk-python + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/MIT-license +# Copyright (c) 2016, Andrew Backes + +from mtgsdk.config import __version__, __pypi_packagename__, __github_username__, __github_reponame__, __endpoint__ +from mtgsdk.card import Card +from mtgsdk.set import Set +from mtgsdk.supertype import Supertype +from mtgsdk.subtype import Subtype +from mtgsdk.type import Type +from mtgsdk.changelog import Changelog +from mtgsdk.restclient import RestClient +from mtgsdk.restclient import MtgException +from mtgsdk.querybuilder import QueryBuilder \ No newline at end of file diff --git a/mtg-collector/mtgsdk/card.py b/mtg-collector/mtgsdk/card.py new file mode 100644 index 0000000..b45f311 --- /dev/null +++ b/mtg-collector/mtgsdk/card.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of mtgsdk. +# https://github.com/MagicTheGathering/mtg-sdk-python + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/MIT-license +# Copyright (c) 2016, Andrew Backes + +from mtgsdk.querybuilder import QueryBuilder + + +class Card(object): + RESOURCE = 'cards' + + def __init__(self, response_dict={}): + self.name = response_dict.get('name') + self.layout = response_dict.get('layout') + self.mana_cost = response_dict.get('manaCost') + self.cmc = response_dict.get('cmc') + self.colors = response_dict.get('colors') + self.names = response_dict.get('names') + self.type = response_dict.get('type') + self.supertypes = response_dict.get('supertypes') + self.subtypes = response_dict.get('subtypes') + self.types = response_dict.get('types') + self.rarity = response_dict.get('rarity') + self.text = response_dict.get('text') + self.flavor = response_dict.get('flavor') + self.artist = response_dict.get('artist') + self.number = response_dict.get('number') + self.power = response_dict.get('power') + self.toughness = response_dict.get('toughness') + self.loyalty = response_dict.get('loyalty') + self.multiverse_id = response_dict.get('multiverseid') + self.variations = response_dict.get('variations') + self.watermark = response_dict.get('watermark') + self.border = response_dict.get('border') + self.timeshifted = response_dict.get('timeshifted') + self.hand = response_dict.get('hand') + self.life = response_dict.get('life') + self.release_date = response_dict.get('releaseDate') + self.starter = response_dict.get('starter') + self.printings = response_dict.get('printings') + self.original_text = response_dict.get('originalText') + self.original_type = response_dict.get('originalType') + self.source = response_dict.get('source') + self.image_url = response_dict.get('imageUrl') + self.set = response_dict.get('set') + self.set_name = response_dict.get('setName') + self.id = response_dict.get('id') + self.legalities = response_dict.get('legalities') + self.rulings = response_dict.get('rulings') + self.foreign_names = response_dict.get('foreignNames') + + @staticmethod + def find(id): + return QueryBuilder(Card).find(id) + + @staticmethod + def where(**kwargs): + return QueryBuilder(Card).where(**kwargs) + + @staticmethod + def all(): + return QueryBuilder(Card).all() diff --git a/mtg-collector/mtgsdk/changelog.py b/mtg-collector/mtgsdk/changelog.py new file mode 100644 index 0000000..ce419c8 --- /dev/null +++ b/mtg-collector/mtgsdk/changelog.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of mtgsdk. +# https://github.com/MagicTheGathering/mtg-sdk-python + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/MIT-license +# Copyright (c) 2016, Andrew Backes + +from mtgsdk.querybuilder import QueryBuilder + + +class Changelog(object): + RESOURCE = 'changelogs' + + def __init__(self, response_dict={}): + self.id = response_dict.get('id') + self.version = response_dict.get('version') + self.details = response_dict.get('details') + self.release_date = response_dict.get('releaseDate') + + @staticmethod + def all(): + return QueryBuilder(Changelog).all() diff --git a/mtg-collector/mtgsdk/config.py b/mtg-collector/mtgsdk/config.py new file mode 100644 index 0000000..066a7d8 --- /dev/null +++ b/mtg-collector/mtgsdk/config.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of mtgsdk. +# https://github.com/MagicTheGathering/mtg-sdk-python + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/MIT-license +# Copyright (c) 2016, Andrew Backes + +__version__ = "1.2.0" +__pypi_packagename__ = "mtgsdk" +__github_username__ = "MagicTheGathering" +__github_reponame__ = "mtg-sdk-python" +__endpoint__ = "https://api.magicthegathering.io/v1" diff --git a/mtg-collector/mtgsdk/querybuilder.py b/mtg-collector/mtgsdk/querybuilder.py new file mode 100644 index 0000000..b602259 --- /dev/null +++ b/mtg-collector/mtgsdk/querybuilder.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of mtgsdk. +# https://github.com/MagicTheGathering/mtg-sdk-python + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/MIT-license +# Copyright (c) 2016, Andrew Backes +from mtgsdk.restclient import RestClient +from mtgsdk.config import __endpoint__ + + +class QueryBuilder(object): + def __init__(self, type): + self.params = {} + self.type = type + + def find(self, id): + """Get a resource by its id + + Args: + id (string): Resource id + Returns: + object: Instance of the resource type + """ + url = "{}/{}/{}".format(__endpoint__, self.type.RESOURCE, id) + response = RestClient.get(url)[self.type.RESOURCE[:-1]] + return self.type(response) + + def find_many(self, url, type, resource): + """Get a list of resources + + Args: + url (string): URL to invoke + type (class): Class type + resource (string): The REST Resource + Returns: + list of object: List of resource instances + """ + list = [] + response = RestClient.get(url)[resource] + if len(response) > 0: + for item in response: + list.append(type(item)) + + return list + + def where(self, **kwargs): + """Adds a parameter to the dictionary of query parameters + + Args: + **kwargs: Arbitrary keyword arguments. + Returns: + QueryBuilder: Instance of the QueryBuilder + """ + for key, value in kwargs.items(): + self.params[key] = value + + return self + + def all(self): + """Get all resources, automatically paging through data + + Returns: + list of object: List of resource objects + """ + list = [] + page = 1 + fetch_all = True + url = "{}/{}".format(__endpoint__, self.type.RESOURCE) + + if 'page' in self.params: + page = self.params['page'] + fetch_all = False + + while True: + response = RestClient.get(url, self.params)[self.type.RESOURCE] + if len(response) > 0: + for item in response: + list.append(self.type(item)) + + if not fetch_all: + break + else: + page += 1 + self.where(page=page) + else: + break + + return list + + def array(self): + """Get all resources and return the result as an array + + Returns: + array of str: Array of resources + """ + url = "{}/{}".format(__endpoint__, self.type.RESOURCE) + return RestClient.get(url, self.params)[self.type.RESOURCE] diff --git a/mtg-collector/mtgsdk/restclient.py b/mtg-collector/mtgsdk/restclient.py new file mode 100644 index 0000000..9a7da11 --- /dev/null +++ b/mtg-collector/mtgsdk/restclient.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of mtgsdk. +# https://github.com/MagicTheGathering/mtg-sdk-python + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/MIT-license +# Copyright (c) 2016, Andrew Backes + +import json +from urllib.request import Request, urlopen +from urllib.error import HTTPError +from urllib.parse import urlencode + + +class RestClient(object): + @staticmethod + def get(url, params={}): + """Invoke an HTTP GET request on a url + + Args: + url (string): URL endpoint to request + params (dict): Dictionary of url parameters + Returns: + dict: JSON response as a dictionary + """ + request_url = url + + if len(params) > 0: + request_url = "{}?{}".format(url, urlencode(params)) + + try: + req = Request(request_url, headers={'User-Agent': 'Mozilla/5.0'}) + response = json.loads(urlopen(req).read().decode("utf-8")) + + return response + except HTTPError as err: + raise MtgException(err.read()) + + +class MtgException(Exception): + def __init__(self, description): + self.description = description + + def __str__(self): + return self.description diff --git a/mtg-collector/mtgsdk/set.py b/mtg-collector/mtgsdk/set.py new file mode 100644 index 0000000..228ee33 --- /dev/null +++ b/mtg-collector/mtgsdk/set.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of mtgsdk. +# https://github.com/MagicTheGathering/mtg-sdk-python + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/MIT-license +# Copyright (c) 2016, Andrew Backes + +from mtgsdk.querybuilder import QueryBuilder +from mtgsdk.config import __endpoint__ +from mtgsdk.card import Card + + +class Set(object): + RESOURCE = 'sets' + + def __init__(self, response_dict={}): + self.code = response_dict.get('code') + self.name = response_dict.get('name') + self.type = response_dict.get('type') + self.border = response_dict.get('border') + self.mkm_id = response_dict.get('mkm_id') + self.mkm_name = response_dict.get('mkm_name') + self.release_date = response_dict.get('releaseDate') + self.gatherer_code = response_dict.get('gathererCode') + self.magic_cards_info_code = response_dict.get('magicCardsInfoCode') + self.booster = response_dict.get('booster') + self.old_code = response_dict.get('oldCode') + self.block = response_dict.get('block') + self.online_only = response_dict.get('onlineOnly') + + @staticmethod + def find(id): + return QueryBuilder(Set).find(id) + + @staticmethod + def where(**kwargs): + return QueryBuilder(Set).where(**kwargs) + + @staticmethod + def all(): + return QueryBuilder(Set).all() + + @staticmethod + def generate_booster(code): + url = "{}/{}/{}/booster".format(__endpoint__, Set.RESOURCE, code) + return QueryBuilder(Set).find_many(url, Card, Card.RESOURCE) diff --git a/mtg-collector/mtgsdk/subtype.py b/mtg-collector/mtgsdk/subtype.py new file mode 100644 index 0000000..757ed69 --- /dev/null +++ b/mtg-collector/mtgsdk/subtype.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of mtgsdk. +# https://github.com/MagicTheGathering/mtg-sdk-python + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/MIT-license +# Copyright (c) 2016, Andrew Backes + +from mtgsdk.querybuilder import QueryBuilder + + +class Subtype(object): + RESOURCE = 'subtypes' + + @staticmethod + def all(): + return QueryBuilder(Subtype).array() diff --git a/mtg-collector/mtgsdk/supertype.py b/mtg-collector/mtgsdk/supertype.py new file mode 100644 index 0000000..3301711 --- /dev/null +++ b/mtg-collector/mtgsdk/supertype.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of mtgsdk. +# https://github.com/MagicTheGathering/mtg-sdk-python + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/MIT-license +# Copyright (c) 2016, Andrew Backes + +from mtgsdk.querybuilder import QueryBuilder + + +class Supertype(object): + RESOURCE = 'supertypes' + + @staticmethod + def all(): + return QueryBuilder(Supertype).array() diff --git a/mtg-collector/mtgsdk/type.py b/mtg-collector/mtgsdk/type.py new file mode 100644 index 0000000..ef4c4cc --- /dev/null +++ b/mtg-collector/mtgsdk/type.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of mtgsdk. +# https://github.com/MagicTheGathering/mtg-sdk-python + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/MIT-license +# Copyright (c) 2016, Andrew Backes + +from mtgsdk.querybuilder import QueryBuilder + + +class Type(object): + RESOURCE = 'types' + + @staticmethod + def all(): + return QueryBuilder(Type).array()