diff --git a/shopify/api_version.py b/shopify/api_version.py index 39ae8fb8..ce3d609a 100644 --- a/shopify/api_version.py +++ b/shopify/api_version.py @@ -1,5 +1,6 @@ import re - +import json +from six.moves.urllib import request class InvalidVersionError(Exception): pass @@ -24,11 +25,15 @@ def define_version(cls, version): @classmethod def define_known_versions(cls): - cls.define_version(Unstable()) - cls.define_version(Release('2020-01')) - cls.define_version(Release('2020-04')) - cls.define_version(Release('2020-07')) - cls.define_version(Release('2020-10')) + req = request.urlopen("https://app.shopify.com/services/apis.json") + data = json.loads(req.read().decode("utf-8")) + for api in data['apis']: + if api['handle'] == 'admin': + for release in api['versions']: + if release['handle'] == 'unstable': + cls.define_version(Unstable()) + else: + cls.define_version(Release(release['handle'])) @classmethod def clear_defined_versions(cls): diff --git a/test/fixtures/api_version.json b/test/fixtures/api_version.json new file mode 100644 index 00000000..43d1354d --- /dev/null +++ b/test/fixtures/api_version.json @@ -0,0 +1 @@ +{"apis":[{"handle":"admin","versions":[{"handle":"2019-04","latest_supported":false,"display_name":"2019-04 (Unsupported)","supported":true},{"handle":"2019-07","latest_supported":false,"display_name":"2019-07 (Unsupported)","supported":true},{"handle":"2019-10","latest_supported":false,"display_name":"2019-10 (Unsupported)","supported":true},{"handle":"2020-01","latest_supported":false,"display_name":"2020-01","supported":true},{"handle":"2020-04","latest_supported":false,"display_name":"2020-04","supported":true},{"handle":"2020-07","latest_supported":false,"display_name":"2020-07","supported":true},{"handle":"2020-10","latest_supported":true,"display_name":"2020-10 (Latest)","supported":true},{"handle":"2021-01","latest_supported":false,"display_name":"2021-01 (Release candidate)","supported":false},{"handle":"unstable","latest_supported":false,"display_name":"unstable","supported":false}]},{"handle":"storefront","versions":[{"handle":"2019-07","latest_supported":false,"display_name":"2019-07 (Unsupported)","supported":true},{"handle":"2019-10","latest_supported":false,"display_name":"2019-10 (Unsupported)","supported":true},{"handle":"2020-01","latest_supported":false,"display_name":"2020-01","supported":true},{"handle":"2020-04","latest_supported":false,"display_name":"2020-04","supported":true},{"handle":"2020-07","latest_supported":false,"display_name":"2020-07","supported":true},{"handle":"2020-10","latest_supported":true,"display_name":"2020-10 (Latest)","supported":true},{"handle":"2021-01","latest_supported":false,"display_name":"2021-01 (Release candidate)","supported":false},{"handle":"unstable","latest_supported":false,"display_name":"unstable","supported":false}]}]} \ No newline at end of file diff --git a/test/test_helper.py b/test/test_helper.py index dfb80968..7dc8644f 100644 --- a/test/test_helper.py +++ b/test/test_helper.py @@ -20,6 +20,14 @@ def setUp(self): self.http = http_fake.TestHandler self.http.set_response(Exception('Bad request')) self.http.site = 'https://this-is-my-test-show.myshopify.com' + self.fake('apis', + url='https://app.shopify.com/services/apis.json', + method='GET', + code=200, + response_headers={'Content-type': 'application/json'}, + body=self.load_fixture('api_version'), + has_user_agent=False + ) def load_fixture(self, name, format='json'): with open(os.path.dirname(__file__)+'/fixtures/%s.%s' % (name, format), 'rb') as f: @@ -35,13 +43,10 @@ def fake(self, endpoint, **kwargs): extension = "" else: extension = ".%s" % (kwargs.pop('extension', 'json')) - - url = "https://this-is-my-test-show.myshopify.com%s/%s%s" % (prefix, endpoint, extension) - try: - url = kwargs['url'] - except KeyError: - pass - + if kwargs.get('url'): + url = kwargs.get('url') + else: + url = "https://this-is-my-test-show.myshopify.com%s/%s%s" % (prefix, endpoint, extension) headers = {} if kwargs.pop('has_user_agent', True): userAgent = 'ShopifyPythonAPI/%s Python/%s' % (shopify.VERSION, sys.version.split(' ', 1)[0])