From 8138b89292ce099d68e6307e5e32a6a0c4b64880 Mon Sep 17 00:00:00 2001 From: Mike Steder Date: Tue, 26 Aug 2014 18:16:26 -0500 Subject: [PATCH 01/49] Add iPhone 6 codes and bump version --- setup.py | 2 +- spoke/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 4ada749..a3c34ad 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.0', + version = '1.0.1', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index b6bd12c..f02f56f 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -258,7 +258,7 @@ def __init__(self, **kwargs): CaseId = Required(), CaseType = Required(Enum('iph4bt', 'iph4tough', 'iph4vibe', 'iph3bt', 'iph3tough', 'ipt4gbt', 'bb9900bt', 'kindlefirebt', 'ssgs3vibe', - 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'ipad4bt', 'ipadminitough', + 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', 'iph6tough', 'ipad4bt', 'ipadminitough', 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe')), Quantity = Required(), PrintImage = Required(Image), From 662a373f151936cf3fdd9835841f8df2d1438b62 Mon Sep 17 00:00:00 2001 From: Mike Steder Date: Thu, 28 Aug 2014 08:44:56 -0500 Subject: [PATCH 02/49] An example script for ordering an iphone 6 --- examples/iphone6.py | 107 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 examples/iphone6.py diff --git a/examples/iphone6.py b/examples/iphone6.py new file mode 100644 index 0000000..c2941b4 --- /dev/null +++ b/examples/iphone6.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +""" +This example creates one order containing 4 items. In this case a couple +different iPhone 6 cases. + +To run this code just edit your CUSTOMER_CODE and API_KEY +for Spoke Custom below and type: + + python iphone6.py + +""" + + +import datetime +import pprint + +import spoke + + +CUSTOMER_CODE = ... +API_KEY = ... + + +api = spoke.Spoke( + production=True, + Customer=CUSTOMER_CODE, + Key=API_KEY, + Logo={ + 'ImageType' : 'svg', + 'Url' : "https://d1s82l1atzspzx.cloudfront.net/threadless-media/static/imgs/global/threadless-logo.svg", + }, +) + +order_id = 2 +shipment_id = 2 +shipping_address = { + 'FirstName' : 'Mister', + 'LastName' : 'Mittens', + 'Address1' : '1260 W Madison St', + 'City' : 'Chicago', + 'State' : 'IL', + 'PostalCode' : '60607', + 'CountryCode' : 'US', + 'OrderDate' : datetime.datetime.now().strftime("%m/%d/%Y"), + 'PhoneNumber' : '555-555-5555', + 'PurchaseOrderNumber' : shipment_id, + 'GiftMessage' : '', + 'Prices':dict( + DisplayOnPackingSlip="No", + CurrencySymbol="$", + TaxCents='0', + ShippingCents='0', + DiscountCents='0' + ), +} + + +def get_image(filename): + return "https://d1s82l1atzspzx.cloudfront.net/threadless-media/{}?rot=270&q=95".format(filename) + + +items = [ + dict(stock_id=1, + quantity=1, + print_image=get_image('artist_designs/1680000-1760000/1713600-1715200/1714912-1714944/1714928/1714928-3938-star_iphone2.jpg'), + case_type="iph6tough" + ), + dict(stock_id=2, + quantity=1, + print_image=get_image('artist_designs/1520000-1600000/1547200-1548800/1547424-1547456/1547453/1547453-5376-attack_iphone.JPG'), + case_type="iph6tough" + ), + dict(stock_id=3, + quantity=1, + print_image=get_image('artist_designs/1840000-1920000/1883200-1884800/1884544-1884576/1884551/1884551-4709-iphonemythunderstood.jpg'), + case_type="iph6bt" + ), + dict(stock_id=4, + quantity=1, + print_image=get_image('artist_designs/1680000-1760000/1729600-1731200/1730048-1730080/1730078/1730078-5430-iphone.jpg'), + case_type="iph6bt" + ), +] + + +data = dict( + OrderId=order_id, + ShippingMethod='Overnight', + OrderInfo=shipping_address, + Cases=[ + { + 'CaseId': item['stock_id'], + 'CaseType': item["case_type"], + 'Quantity': item['quantity'], + 'PrintImage': { + 'ImageType': 'jpg', + 'Url': item['print_image'], + }, + } for item in items + ], +) + + + +pprint.pprint(data) + +api.new(**data) From ccab1ba2d4a6e516a3dec6c2b7661d90786db09b Mon Sep 17 00:00:00 2001 From: Rob Hoelz Date: Mon, 15 Sep 2014 12:00:25 -0500 Subject: [PATCH 03/49] Add iPhone 6 Plus API codes and bump version --- setup.py | 2 +- spoke/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index a3c34ad..53bfab7 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.1', + version = '1.0.2', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index f02f56f..4c5d8de 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -258,7 +258,7 @@ def __init__(self, **kwargs): CaseId = Required(), CaseType = Required(Enum('iph4bt', 'iph4tough', 'iph4vibe', 'iph3bt', 'iph3tough', 'ipt4gbt', 'bb9900bt', 'kindlefirebt', 'ssgs3vibe', - 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', 'iph6tough', 'ipad4bt', 'ipadminitough', + 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', 'iph6tough', 'iph655bt', 'iph655tough', 'ipad4bt', 'ipadminitough', 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe')), Quantity = Required(), PrintImage = Required(Image), From 4587e6af67229549161a54dcd43ce2f11f874c5c Mon Sep 17 00:00:00 2001 From: Rob Hoelz Date: Tue, 3 Feb 2015 13:01:01 -0600 Subject: [PATCH 04/49] Add case types for Samsung Galaxy cases --- spoke/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index 4c5d8de..37e1f3e 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -259,7 +259,7 @@ def __init__(self, **kwargs): CaseType = Required(Enum('iph4bt', 'iph4tough', 'iph4vibe', 'iph3bt', 'iph3tough', 'ipt4gbt', 'bb9900bt', 'kindlefirebt', 'ssgs3vibe', 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', 'iph6tough', 'iph655bt', 'iph655tough', 'ipad4bt', 'ipadminitough', - 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe')), + 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe', 'ssgs5bt', 'ssgn4bt')), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From d45caa39b37792cf093b7f01d2fd4ac48c2b5c90 Mon Sep 17 00:00:00 2001 From: atkins Date: Fri, 3 Apr 2015 10:59:06 -0500 Subject: [PATCH 05/49] galaxy s6 cases --- setup.py | 2 +- spoke/__init__.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 53bfab7..72c139a 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.2', + version = '1.0.3', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index 37e1f3e..afe34d8 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -258,8 +258,10 @@ def __init__(self, **kwargs): CaseId = Required(), CaseType = Required(Enum('iph4bt', 'iph4tough', 'iph4vibe', 'iph3bt', 'iph3tough', 'ipt4gbt', 'bb9900bt', 'kindlefirebt', 'ssgs3vibe', - 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', 'iph6tough', 'iph655bt', 'iph655tough', 'ipad4bt', 'ipadminitough', - 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe', 'ssgs5bt', 'ssgn4bt')), + 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', + 'iph6tough', 'iph655bt', 'iph655tough', 'ipad4bt', 'ipadminitough', + 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe', + 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt')), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From 893cac90dbed2de1eb856abf55c3277399ecbbbb Mon Sep 17 00:00:00 2001 From: Atkins Meyer Date: Fri, 3 Apr 2015 11:27:36 -0500 Subject: [PATCH 06/49] removing the 3.4 tests to make myself feel better --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f00ebfe..aa406ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,9 @@ language: python python: - "2.7" - - "3.4" # command to install dependencies install: - python setup.py install - pip install nose # command to run tests -script: nosetests \ No newline at end of file +script: nosetests From 27a21d73a8831cd12bfdf4f4f6e0284761a79236 Mon Sep 17 00:00:00 2001 From: atkins Date: Fri, 3 Apr 2015 11:32:03 -0500 Subject: [PATCH 07/49] removing python 3 testing --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f00ebfe..aa406ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,9 @@ language: python python: - "2.7" - - "3.4" # command to install dependencies install: - python setup.py install - pip install nose # command to run tests -script: nosetests \ No newline at end of file +script: nosetests From ba04f3664b79d68da1e9b7f1d032ace273ac59cb Mon Sep 17 00:00:00 2001 From: Rob Hoelz Date: Mon, 6 Apr 2015 10:18:14 -0500 Subject: [PATCH 08/49] Bump version in module --- spoke/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index afe34d8..0a330b5 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.0' +__version__ = '1.0.3' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] From e5039ba33b53f95e5670b66d712ea81518e8cb19 Mon Sep 17 00:00:00 2001 From: Atkins Meyer Date: Fri, 11 Sep 2015 17:24:46 -0500 Subject: [PATCH 09/49] adding iphone6s --- spoke/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index 0a330b5..db23fbb 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.3' +__version__ = '1.0.4' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -261,7 +261,8 @@ def __init__(self, **kwargs): 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', 'iph6tough', 'iph655bt', 'iph655tough', 'ipad4bt', 'ipadminitough', 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe', - 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt')), + 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt', 'iph6sbtpresale', + 'iph6stoughpresale', 'iph6splusbtpresale', 'iph6splustoughpresale')), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From 2f9f032a39159d6d29632158a9ea0755bed26317 Mon Sep 17 00:00:00 2001 From: Atkins Meyer Date: Wed, 15 Jun 2016 11:35:49 -0500 Subject: [PATCH 10/49] switched iph4vibe for iph4tough2 --- spoke/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index db23fbb..8f32c1b 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.4' +__version__ = '1.0.5' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -256,7 +256,7 @@ def __init__(self, **kwargs): ''' _validate(kwargs, CaseId = Required(), - CaseType = Required(Enum('iph4bt', 'iph4tough', 'iph4vibe', 'iph3bt', + CaseType = Required(Enum('iph4bt', 'iph4tough', 'iph4tough2', 'iph3bt', 'iph3tough', 'ipt4gbt', 'bb9900bt', 'kindlefirebt', 'ssgs3vibe', 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', 'iph6tough', 'iph655bt', 'iph655tough', 'ipad4bt', 'ipadminitough', From 976a4be07fa5e4b3334f11b5316267012e09c5d8 Mon Sep 17 00:00:00 2001 From: Atkins Meyer Date: Wed, 7 Sep 2016 15:31:11 -0500 Subject: [PATCH 11/49] addingiphone7 sku types --- spoke/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index 8f32c1b..21a5c1f 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.5' +__version__ = '1.0.6' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -262,7 +262,8 @@ def __init__(self, **kwargs): 'iph6tough', 'iph655bt', 'iph655tough', 'ipad4bt', 'ipadminitough', 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe', 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt', 'iph6sbtpresale', - 'iph6stoughpresale', 'iph6splusbtpresale', 'iph6splustoughpresale')), + 'iph6stoughpresale', 'iph6splusbtpresale', 'iph6splustoughpresale', + 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough')), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From add7e1a3dcb4369c4ad2ff983f4073332b0cee3c Mon Sep 17 00:00:00 2001 From: Rob Hoelz Date: Thu, 8 Sep 2016 12:37:54 -0500 Subject: [PATCH 12/49] Add Mugs and Notebooks "case" types --- spoke/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index 21a5c1f..a4e595d 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -258,12 +258,14 @@ def __init__(self, **kwargs): CaseId = Required(), CaseType = Required(Enum('iph4bt', 'iph4tough', 'iph4tough2', 'iph3bt', 'iph3tough', 'ipt4gbt', 'bb9900bt', 'kindlefirebt', 'ssgs3vibe', - 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', + 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', 'iph6tough', 'iph655bt', 'iph655tough', 'ipad4bt', 'ipadminitough', - 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe', + 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe', 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt', 'iph6sbtpresale', 'iph6stoughpresale', 'iph6splusbtpresale', 'iph6splustoughpresale', - 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough')), + 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough', + 'mug11oz', 'mug15oz', 'mug12ozlatte', 'mug15oztravel', 'journal5x7blank', + 'journal5x7ruled', 'spiral6x8ruled')), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From 0cc516a0e3c5406b3506b579376ff6819dc4f1df Mon Sep 17 00:00:00 2001 From: Rob Hoelz Date: Thu, 8 Sep 2016 12:39:09 -0500 Subject: [PATCH 13/49] Bump version --- setup.py | 2 +- spoke/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 72c139a..dddc00a 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.3', + version = '1.0.7', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index a4e595d..0c28eb6 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.6' +__version__ = '1.0.7' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] From b5c7d3beb93864f36e297bf4b382c1ae390fe94a Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Fri, 27 Jan 2017 15:18:45 -0600 Subject: [PATCH 14/49] Add new validator that can conditionally validate based on data passed in --- spoke/__init__.py | 59 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index 0c28eb6..140fd27 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -27,6 +27,7 @@ def passthrough(v): class Validator(object): is_required = True + is_conditional = False def __init__(self, inner=None): if inner is None: @@ -51,6 +52,35 @@ def __call__(self, value): class Required(Validator): pass +class RequiredOnlyIfNot(Required): + """ This validator will require the key ONLY IF other keys are NOT present in + the payload. + + This validator was added because threadless.com payloads use "ShippingMethod" whereas + Artist Shops payloads use "ShippingAccount" and "ShippingMethodId" + + An example would be that SomeKey is only required if SomeOtherKey is not present in the payload: + "SomeKey" = RequiredOnlyIfNot(['SomeOtherKey']) + + """ + is_required = True + is_conditional = True + other_keys = [] + + def __init__(self, other_keys=[], inner=None): + if not isinstance(other_keys, (tuple, list)): + other_keys = [other_keys] + self.other_keys = other_keys + + super(RequiredOnlyIfNot, self).__init__(inner) + + def __call__(self, value, d): + # if all of other_keys are present in the payload, + # then require don't require this field + if all([key in d.keys() for key in self.other_keys]): + self.is_required = False + + return super(RequiredOnlyIfNot, self).__call__(value) class Optional(Validator): is_required = False @@ -81,7 +111,17 @@ def _validate(d, **validation_spec): validator = validation_spec.pop(k, None) if validator is None: raise ValidationError('parameter "%s" not allowed' % k) - d[k] = validator(v) + if validator.is_conditional: # conditional validators need the whole dictionary to look at other keys + d[k] = validator(v, d) + else: + d[k] = validator(v) + + # it's possible that there's some conditional validators still in the validation_spec + # because their corresponding key isn't in the payload, so look over them and if all + # of their other_keys are present in the payload, then this conditional validator isn't required + for k, v in validation_spec.items(): + if v.is_conditional and all([key in d.keys() for key in v.other_keys]): + v.is_required = False validation_spec = dict((k, v) for k, v in validation_spec.items() if v.is_required) if validation_spec: @@ -442,14 +482,17 @@ def new(self, **kwargs): Overnight = 'ON', ) _validate(kwargs, - OrderId = Required(), # XXX number - ShippingMethod = Required(Enum('FirstClass', 'PriorityMail', 'TrackedDelivery', 'SecondDay', 'Overnight')), - PackSlip = Optional(Image), - Comments = Optional(Array(Comment)), - OrderInfo = Required(OrderInfo), - Cases = Required(Array(Case)), + OrderId = Required(), # XXX number + ShippingMethod = RequiredOnlyIfNot(['ShippingAccount', 'ShippingMethodId'], Enum('FirstClass', 'PriorityMail', 'TrackedDelivery', 'SecondDay', 'Overnight')), + ShippingMethodId = RequiredOnlyIfNot(['ShippingMethod']), + ShippingAccount = RequiredOnlyIfNot(['ShippingMethod']), + PackSlip = Optional(Image), + Comments = Optional(Array(Comment)), + OrderInfo = Required(OrderInfo), + Cases = Required(Array(Case)), ) - kwargs['ShippingMethod'] = shipping_method_map[ kwargs['ShippingMethod'] ] + if "ShippingMethod" in kwargs: + kwargs['ShippingMethod'] = shipping_method_map[ kwargs['ShippingMethod'] ] # XXX OrderDate (date or datetime?) request = self._generate_request( From 46b1fc6bdc1aeaf0f2dc4feb1b3b7e992e859de4 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Fri, 27 Jan 2017 15:19:07 -0600 Subject: [PATCH 15/49] Add some tests for the new validator --- tests/spoke-tests.py | 117 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/tests/spoke-tests.py b/tests/spoke-tests.py index 718db09..8f3d5fc 100644 --- a/tests/spoke-tests.py +++ b/tests/spoke-tests.py @@ -103,10 +103,54 @@ def test_new_required_fields(self): for k in params.keys(): copy = params.copy() del copy[k] + self.assertRaises(spoke.ValidationError, sp.new, **copy) - self.assertRaises(spoke.ValidationError, spoke.Spoke, **copy) + def test_conditionally_required_fields(self): + sp = spoke.Spoke( + Customer = CUSTOMER_NAME, + Key = CUSTOMER_KEY, + production = False, + transport = FauxTransport(), + ) + + params = dict( + Cases = [dict( + CaseId = 1234, + CaseType = 'iph4tough', + PrintImage = dict( + ImageType = 'jpg', + Url = 'http://threadless.com/nothing.jpg', + ), + Quantity = 1, + )], + OrderId = 2, + OrderInfo = dict( + Address1 = FAUX_ADDRESS, + City = FAUX_CITY, + CountryCode = 'US', + FirstName = FAUX_FIRST_NAME, + LastName = FAUX_LAST_NAME, + OrderDate = datetime.now(), + PhoneNumber = FAUXN_NUMBER, + PostalCode = FAUX_ZIP, + State = FAUX_STATE, + ), + ShippingAccount = '5110896', + ShippingMethodId = 66, + ) + + for k in params.keys(): + copy = params.copy() + del copy[k] + self.assertRaises(spoke.ValidationError, sp.new, **copy) + + del params['ShippingAccount'] + del params['ShippingMethodId'] + self.assertRaises(spoke.ValidationError, sp.new, **params) + + def test_new_optional_fields(self): sp = spoke.Spoke( Customer = CUSTOMER_NAME, @@ -480,3 +524,74 @@ def test_unicode_roundtrip(self): result = sp.cancel(order_id) self.assertTrue('immc_id' in result) + + + @unittest.skipUnless('AS_SPOKE_CUSTOMER' in os.environ and 'AS_SPOKE_KEY' in os.environ, 'Please set AS_SPOKE_CUSTOMER and AS_SPOKE_KEY for live testing') + def test_roundtrip_artist_shop(self): + customer = os.getenv('AS_SPOKE_CUSTOMER') + key = os.getenv('AS_SPOKE_KEY') + + sp = spoke.Spoke( + Customer = customer, + Key = key, + production = False, + ) + + order_id = random.randint(1000000, 2000000) + + result = sp.new( + Cases = [dict( + CaseId = 1234, + CaseType = 'iph4tough', + PrintImage = dict( + ImageType = 'jpg', + Url = 'http://threadless.com/nothing.jpg', + ), + Quantity = 1, + )], + OrderId = order_id, + OrderInfo = dict( + Address1 = FAUX_ADDRESS, + City = FAUX_CITY, + CountryCode = 'US', + FirstName = FAUX_FIRST_NAME, + LastName = FAUX_LAST_NAME, + OrderDate = datetime.now(), + PhoneNumber = FAUXN_NUMBER, + PostalCode = FAUX_ZIP, + State = FAUX_STATE, + ), + ShippingMethodId = 66, + ShippingAccount = '5110896', + PackSlip = spoke.Image( + ImageType = 'jpg', + Url = 'file:///tmp/nothing.jpg', + ), + Comments = [dict( + Type = 'Printer', + CommentText = 'testing', + )] + ) + + self.assertTrue('immc_id' in result) + + result = sp.update( + OrderId = order_id, + OrderInfo = dict( + Address1 = FAUX_ADDRESS, + City = FAUX_CITY, + CountryCode = 'US', + FirstName = FAUX_FIRST_NAME, + LastName = FAUX_LAST_NAME, + OrderDate = datetime.now(), + PhoneNumber = FAUXN_NUMBER, + PostalCode = FAUX_ZIP, + State = FAUX_STATE, + ), + ) + + self.assertTrue('immc_id' in result) + + result = sp.cancel(order_id) + + self.assertTrue('immc_id' in result) \ No newline at end of file From 2b858dd05f84d1cb0dfe48d39cb7a646b74ccedd Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Fri, 27 Jan 2017 15:19:40 -0600 Subject: [PATCH 16/49] Bump the version --- setup.py | 2 +- spoke/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index dddc00a..1d1272d 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.7', + version = '1.0.8', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index 140fd27..febd97d 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.7' +__version__ = '1.0.8' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] From 7daf769d1c3eb02eb15a552dd68dd0d4a558441c Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Tue, 31 Jan 2017 14:50:53 -0600 Subject: [PATCH 17/49] Add the Galaxy S7 phone case to enum --- spoke/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index febd97d..fe50dcc 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -301,7 +301,7 @@ def __init__(self, **kwargs): 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', 'iph6tough', 'iph655bt', 'iph655tough', 'ipad4bt', 'ipadminitough', 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe', - 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt', 'iph6sbtpresale', + 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt', 'ssgs7bt', 'iph6sbtpresale', 'iph6stoughpresale', 'iph6splusbtpresale', 'iph6splustoughpresale', 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough', 'mug11oz', 'mug15oz', 'mug12ozlatte', 'mug15oztravel', 'journal5x7blank', From 8fe91cc44eb58f7cb15ef04607d21363260f3859 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Tue, 31 Jan 2017 16:14:45 -0600 Subject: [PATCH 18/49] Bump version --- setup.py | 2 +- spoke/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 1d1272d..bcf7395 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.8', + version = '1.0.9', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index fe50dcc..82e7f06 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.8' +__version__ = '1.0.9' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] From c9efecf851fd97061f54b56cc01c5ae5bd49d158 Mon Sep 17 00:00:00 2001 From: Atkins Meyer Date: Mon, 15 May 2017 12:47:26 -0500 Subject: [PATCH 19/49] version bump --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index bcf7395..e842eb5 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.9', + version = '1.0.10', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), From ff63aa50776cc06f64a9971ba34168c91a3594e2 Mon Sep 17 00:00:00 2001 From: Atkins Meyer Date: Mon, 15 May 2017 12:47:49 -0500 Subject: [PATCH 20/49] galaxy s8 case addition --- spoke/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index 82e7f06..1d188ea 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.9' +__version__ = '1.0.10' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -305,7 +305,7 @@ def __init__(self, **kwargs): 'iph6stoughpresale', 'iph6splusbtpresale', 'iph6splustoughpresale', 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough', 'mug11oz', 'mug15oz', 'mug12ozlatte', 'mug15oztravel', 'journal5x7blank', - 'journal5x7ruled', 'spiral6x8ruled')), + 'journal5x7ruled', 'spiral6x8ruled', 'ssgs8bt')), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From 04c984b08f1cc6886c07b82d480b097d115b7f8f Mon Sep 17 00:00:00 2001 From: Atkins Meyer Date: Thu, 7 Sep 2017 11:24:05 -0500 Subject: [PATCH 21/49] added iphone8 case types --- spoke/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index 1d188ea..003d846 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.10' +__version__ = '1.0.11' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -305,7 +305,7 @@ def __init__(self, **kwargs): 'iph6stoughpresale', 'iph6splusbtpresale', 'iph6splustoughpresale', 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough', 'mug11oz', 'mug15oz', 'mug12ozlatte', 'mug15oztravel', 'journal5x7blank', - 'journal5x7ruled', 'spiral6x8ruled', 'ssgs8bt')), + 'journal5x7ruled', 'spiral6x8ruled', 'ssgs8bt', 'iph8bt', 'iph8tough',)), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From acc0020d422abb15347bdefaa173d26288272318 Mon Sep 17 00:00:00 2001 From: Atkins Meyer Date: Thu, 7 Sep 2017 11:25:46 -0500 Subject: [PATCH 22/49] formatting --- spoke/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index 003d846..d16d57a 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -305,7 +305,7 @@ def __init__(self, **kwargs): 'iph6stoughpresale', 'iph6splusbtpresale', 'iph6splustoughpresale', 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough', 'mug11oz', 'mug15oz', 'mug12ozlatte', 'mug15oztravel', 'journal5x7blank', - 'journal5x7ruled', 'spiral6x8ruled', 'ssgs8bt', 'iph8bt', 'iph8tough',)), + 'journal5x7ruled', 'spiral6x8ruled', 'ssgs8bt', 'iph8bt', 'iph8tough')), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From 7983e87e5624fd4f52556268ee6cfd1c30c97d2d Mon Sep 17 00:00:00 2001 From: Rob Hoelz Date: Fri, 8 Sep 2017 10:39:49 -0500 Subject: [PATCH 23/49] Bump package version number in setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e842eb5..18a2a69 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.10', + version = '1.0.11', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), From b027f093e7bb5e1cf0ce8afc56550cc5e5e1d8d5 Mon Sep 17 00:00:00 2001 From: Rob Hoelz Date: Fri, 8 Sep 2017 10:40:21 -0500 Subject: [PATCH 24/49] Bump version to 1.0.12 So that I can create a new tag pointing at setup.py and __init__.py being consistent --- setup.py | 2 +- spoke/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 18a2a69..4aaf6d2 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.11', + version = '1.0.12', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index d16d57a..ca6b79a 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.11' +__version__ = '1.0.12' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] From 84283d2f6f6f0847d23150a485db05de4a243db6 Mon Sep 17 00:00:00 2001 From: Atkins Meyer Date: Wed, 13 Sep 2017 10:14:26 -0500 Subject: [PATCH 25/49] adding iphone 10 case types and bumping the version --- setup.py | 2 +- spoke/__init__.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 4aaf6d2..0d02765 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.12', + version = '1.0.13', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index ca6b79a..02fc05f 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.12' +__version__ = '1.0.13' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -305,7 +305,8 @@ def __init__(self, **kwargs): 'iph6stoughpresale', 'iph6splusbtpresale', 'iph6splustoughpresale', 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough', 'mug11oz', 'mug15oz', 'mug12ozlatte', 'mug15oztravel', 'journal5x7blank', - 'journal5x7ruled', 'spiral6x8ruled', 'ssgs8bt', 'iph8bt', 'iph8tough')), + 'journal5x7ruled', 'spiral6x8ruled', 'ssgs8bt', 'iph8bt', 'iph8tough', + 'iph10bt', 'iph10tough')), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From 2193c0fdf415e838f4b8b4410748dc9ad9fb49b4 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Wed, 12 Sep 2018 15:17:13 -0500 Subject: [PATCH 26/49] Update for 2018 iPhone cases (XS Max and XR) --- setup.py | 2 +- spoke/__init__.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 0d02765..6bd2b26 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.13', + version = '1.0.14', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index 02fc05f..3967530 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.13' +__version__ = '1.0.14' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -306,7 +306,7 @@ def __init__(self, **kwargs): 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough', 'mug11oz', 'mug15oz', 'mug12ozlatte', 'mug15oztravel', 'journal5x7blank', 'journal5x7ruled', 'spiral6x8ruled', 'ssgs8bt', 'iph8bt', 'iph8tough', - 'iph10bt', 'iph10tough')), + 'iph10bt', 'iph10tough', 'iphxsmaxbt', 'iphxsmaxtough', 'iphxrbt', 'iphxrtough')), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From 14fb53d51f3127e565d7242101617caeaaf6cd15 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Mon, 17 Sep 2018 11:48:52 -0500 Subject: [PATCH 27/49] Add stickers / reorganize for legibility --- spoke/__init__.py | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/spoke/__init__.py b/spoke/__init__.py index 3967530..cda7a4f 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -296,17 +296,29 @@ def __init__(self, **kwargs): ''' _validate(kwargs, CaseId = Required(), - CaseType = Required(Enum('iph4bt', 'iph4tough', 'iph4tough2', 'iph3bt', - 'iph3tough', 'ipt4gbt', 'bb9900bt', 'kindlefirebt', 'ssgs3vibe', - 'iph5bt', 'iph5vibe', 'iph5cbt', 'iph5xtreme', 'iph6bt', - 'iph6tough', 'iph655bt', 'iph655tough', 'ipad4bt', 'ipadminitough', - 'ipt5gbt', 'ssgn2tough', 'bbz10tough', 'ssgs4bt', 'ssgs4vibe', - 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt', 'ssgs7bt', 'iph6sbtpresale', - 'iph6stoughpresale', 'iph6splusbtpresale', 'iph6splustoughpresale', - 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough', - 'mug11oz', 'mug15oz', 'mug12ozlatte', 'mug15oztravel', 'journal5x7blank', - 'journal5x7ruled', 'spiral6x8ruled', 'ssgs8bt', 'iph8bt', 'iph8tough', - 'iph10bt', 'iph10tough', 'iphxsmaxbt', 'iphxsmaxtough', 'iphxrbt', 'iphxrtough')), + CaseType = Required(Enum( + 'bb9900bt', 'bbz10tough', 'kindlefirebt', + # apple / iphone + 'iph3bt', 'iph3tough', 'iph4bt', 'iph4tough', 'iph4tough2', + 'ipt4gbt', 'iph5bt', 'iph5vibe', 'iph5cbt', 'ipt5gbt', + 'iph5xtreme', 'iph6bt', 'iph6tough', 'iph655bt', 'iph655tough', + 'ipad4bt', 'ipadminitough', 'iph6sbtpresale', + 'iph6stoughpresale', 'iph6splusbtpresale', + 'iph6splustoughpresale', 'iph7bt', 'iph7tough', 'iph7plusbt', + 'iph7plustough', 'iph8bt', 'iph8tough', 'iph10bt', + 'iph10tough', 'iphxsmaxbt', 'iphxsmaxtough', 'iphxrbt', + 'iphxrtough', + # samsung / galaxy + 'ssgn2tough', 'ssgs3vibe', 'ssgs4bt', 'ssgs4vibe', + 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt', 'ssgs7bt', 'ssgs8bt', + # mugs + 'mug11oz', 'mug15oz', 'mug12ozlatte', 'mug15oztravel', + # notebooks + 'journal5x7blank', 'journal5x7ruled', 'spiral6x8ruled', + # stickers + '2x2-white', '3x3-white', '4x4-white', '6x6-white', + '2x2-clear', '3x3-clear', '4x4-clear', '6x6-clear', + )), Quantity = Required(), PrintImage = Required(Image), QcImage = Optional(Image), From 54808c041bb157e51cc02fad58a919570a488829 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Mon, 17 Sep 2018 11:49:07 -0500 Subject: [PATCH 28/49] Bump version --- setup.py | 2 +- spoke/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 6bd2b26..4746b5c 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.14', + version = '1.0.15', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index cda7a4f..9816fdc 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.14' +__version__ = '1.0.15' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] From 31047c4b4e3606ff2b0ba589d872cd80d347c62d Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Wed, 17 Jul 2019 10:45:11 -0500 Subject: [PATCH 29/49] Add magnet partner skus --- spoke/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spoke/__init__.py b/spoke/__init__.py index 9816fdc..be0b3ef 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -311,6 +311,8 @@ def __init__(self, **kwargs): # samsung / galaxy 'ssgn2tough', 'ssgs3vibe', 'ssgs4bt', 'ssgs4vibe', 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt', 'ssgs7bt', 'ssgs8bt', + # magnets + '3x3-magnet', '4x4-magnet', '6x6-magnet', # mugs 'mug11oz', 'mug15oz', 'mug12ozlatte', 'mug15oztravel', # notebooks From 5d28345785a4646a19040437014968a708e24e1b Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Wed, 17 Jul 2019 10:45:32 -0500 Subject: [PATCH 30/49] Bump version --- setup.py | 2 +- spoke/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 4746b5c..624c327 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.15', + version = '1.0.16', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index be0b3ef..e4d0718 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.15' +__version__ = '1.0.16' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] From 0e0b4ea2e185b5e3d61201c2366409da048d70ad Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Mon, 22 Jul 2019 09:53:58 -0500 Subject: [PATCH 31/49] Add button partner skus --- spoke/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spoke/__init__.py b/spoke/__init__.py index e4d0718..beae175 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -308,6 +308,8 @@ def __init__(self, **kwargs): 'iph7plustough', 'iph8bt', 'iph8tough', 'iph10bt', 'iph10tough', 'iphxsmaxbt', 'iphxsmaxtough', 'iphxrbt', 'iphxrtough', + # buttons + 'button-round-125', 'button-round-225', # samsung / galaxy 'ssgn2tough', 'ssgs3vibe', 'ssgs4bt', 'ssgs4vibe', 'ssgs5bt', 'ssgn4bt', 'ssgs6vibe', 'ssgs6bt', 'ssgs7bt', 'ssgs8bt', From cd4a14d7f6685dc94d39598d0d5a1c37b550051c Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Mon, 22 Jul 2019 09:54:10 -0500 Subject: [PATCH 32/49] Bump version --- setup.py | 2 +- spoke/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 624c327..5d7cc3d 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.16', + version = '1.0.17', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index beae175..5157254 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.16' +__version__ = '1.0.17' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] From 08ea962cf0c6fd4a6e31e4472d1f155531c7fd70 Mon Sep 17 00:00:00 2001 From: Jon Huber Date: Thu, 19 Sep 2019 15:47:42 -0500 Subject: [PATCH 33/49] added 2019 iphones and bumped version --- setup.py | 2 +- spoke/__init__.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 5d7cc3d..f64a91e 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.17', + version = '1.0.18', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index 5157254..e8b4cd0 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.17' +__version__ = '1.0.18' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -307,7 +307,8 @@ def __init__(self, **kwargs): 'iph6splustoughpresale', 'iph7bt', 'iph7tough', 'iph7plusbt', 'iph7plustough', 'iph8bt', 'iph8tough', 'iph10bt', 'iph10tough', 'iphxsmaxbt', 'iphxsmaxtough', 'iphxrbt', - 'iphxrtough', + 'iphxrtough', 'iph11bt', 'iph11tough', 'iph11probt', + 'iph11protough', 'iph11promaxbt', 'iph11promaxtough', # buttons 'button-round-125', 'button-round-225', # samsung / galaxy From a677f352189027c065552741dca84dc1f75bcddf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2019 20:12:15 +0000 Subject: [PATCH 34/49] Bump requests from 2.2.1 to 2.20.0 Bumps [requests](https://github.com/requests/requests) from 2.2.1 to 2.20.0. - [Release notes](https://github.com/requests/requests/releases) - [Changelog](https://github.com/psf/requests/blob/master/HISTORY.md) - [Commits](https://github.com/requests/requests/compare/v2.2.1...v2.20.0) Signed-off-by: dependabot[bot] --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f64a91e..f4fdaf9 100644 --- a/setup.py +++ b/setup.py @@ -12,6 +12,6 @@ author_email = 'rob.hoelz@skinnycorp.com', url = 'https://github.com/Threadless/python-spoke', keywords = 'spoke', - install_requires = ['lxml==3.3.5', 'requests==2.2.1'], + install_requires = ['lxml==3.3.5', 'requests==2.20.0'], tests_require = ['nose==1.3.1', 'python-termstyle==0.1.10', 'rednose==0.4.1'], ) From de32d51b01cf141631caaa3bfc2aa1f7d06e9668 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Fri, 21 Feb 2020 14:46:58 -0600 Subject: [PATCH 35/49] Add socks and bump version --- setup.py | 2 +- spoke/__init__.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index f64a91e..965bd8c 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.18', + version = '1.0.19', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index e8b4cd0..93c49af 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.18' +__version__ = '1.0.19' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -323,6 +323,8 @@ def __init__(self, **kwargs): # stickers '2x2-white', '3x3-white', '4x4-white', '6x6-white', '2x2-clear', '3x3-clear', '4x4-clear', '6x6-clear', + # socks + 'socks-small', 'socks-medium', 'socks-large', )), Quantity = Required(), PrintImage = Required(Image), From ae1f113934b6214514e35ff28cfe8e4c47815a93 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Wed, 26 Feb 2020 15:44:12 -0600 Subject: [PATCH 36/49] Add socks and bump version - with singular 'sock' --- setup.py | 2 +- spoke/__init__.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 6fe7d4f..423c6c3 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.19', + version = '1.0.20', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index 93c49af..e227b18 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.19' +__version__ = '1.0.20' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -324,7 +324,7 @@ def __init__(self, **kwargs): '2x2-white', '3x3-white', '4x4-white', '6x6-white', '2x2-clear', '3x3-clear', '4x4-clear', '6x6-clear', # socks - 'socks-small', 'socks-medium', 'socks-large', + 'sock-small', 'sock-medium', 'sock-large', )), Quantity = Required(), PrintImage = Required(Image), From cdb7e8196e52b538935ca08f41d2dda470f41b55 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Mon, 18 May 2020 11:08:35 -0500 Subject: [PATCH 37/49] Add Face Masks and bump version --- setup.py | 2 +- spoke/__init__.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 423c6c3..a17b457 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.20', + version = '1.0.21', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index e227b18..996920c 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.20' +__version__ = '1.0.21' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -325,6 +325,8 @@ def __init__(self, **kwargs): '2x2-clear', '3x3-clear', '4x4-clear', '6x6-clear', # socks 'sock-small', 'sock-medium', 'sock-large', + # face masks + 'facemasksmall', 'facemasklarge', )), Quantity = Required(), PrintImage = Required(Image), From 4441737b804a87eb7ccf46979bb2ba95673f70e6 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Tue, 1 Dec 2020 10:37:58 -0600 Subject: [PATCH 38/49] Add iphone 12 cases and bump version --- setup.py | 2 +- spoke/__init__.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index a17b457..1e88264 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.21', + version = '1.0.22', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index 996920c..3d42597 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.21' +__version__ = '1.0.22' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -309,6 +309,8 @@ def __init__(self, **kwargs): 'iph10tough', 'iphxsmaxbt', 'iphxsmaxtough', 'iphxrbt', 'iphxrtough', 'iph11bt', 'iph11tough', 'iph11probt', 'iph11protough', 'iph11promaxbt', 'iph11promaxtough', + 'iph12minibt', 'iph12minitough', 'iph12probt', + 'iph12protough', 'iph12promaxbt', 'iph12promaxtough', # buttons 'button-round-125', 'button-round-225', # samsung / galaxy From 89873f7a9d2fd557cfec421ce6817e667155cabf Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Fri, 8 Oct 2021 11:32:03 -0500 Subject: [PATCH 39/49] Add iphone 13 cases and bump version --- setup.py | 2 +- spoke/__init__.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 1e88264..9334b5c 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.22', + version = '1.0.23', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index 3d42597..566872f 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.22' +__version__ = '1.0.23' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -311,6 +311,8 @@ def __init__(self, **kwargs): 'iph11protough', 'iph11promaxbt', 'iph11promaxtough', 'iph12minibt', 'iph12minitough', 'iph12probt', 'iph12protough', 'iph12promaxbt', 'iph12promaxtough', + 'iph13bt', 'iph13tough', 'iph13minibt', 'iph13minitough', + 'iph13probt', 'iph13protough', 'iph13promaxbt', 'iph13promaxtough', # buttons 'button-round-125', 'button-round-225', # samsung / galaxy From a0a4c312b170022b09ae2d4793cbe3f5db8b69b9 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Wed, 23 Feb 2022 11:58:28 -0600 Subject: [PATCH 40/49] Add skus for puzzles and bump version --- setup.py | 2 +- spoke/__init__.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 9334b5c..a49516c 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.23', + version = '1.0.24', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index 566872f..aece1ce 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.23' +__version__ = '1.0.24' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -331,6 +331,8 @@ def __init__(self, **kwargs): 'sock-small', 'sock-medium', 'sock-large', # face masks 'facemasksmall', 'facemasklarge', + # puzzles + '8x10-puzzle', '11x14-puzzle', '16x20-puzzle', )), Quantity = Required(), PrintImage = Required(Image), From 03e2a4770b6cd98dafaf962d49485110d99c05d8 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Fri, 23 Sep 2022 10:09:06 -0500 Subject: [PATCH 41/49] Add iPhone 14 case skus and bump version --- setup.py | 2 +- spoke/__init__.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index a49516c..32eb5cb 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.24', + version = '1.0.25', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index aece1ce..b5a9dd6 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.24' +__version__ = '1.0.25' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -313,6 +313,8 @@ def __init__(self, **kwargs): 'iph12protough', 'iph12promaxbt', 'iph12promaxtough', 'iph13bt', 'iph13tough', 'iph13minibt', 'iph13minitough', 'iph13probt', 'iph13protough', 'iph13promaxbt', 'iph13promaxtough', + 'iph14snapps', 'iph14prosnapps', 'iph14plussnapps', 'iph14promaxsnapps', + 'iph14toughps', 'iph14protoughps', 'iph14plustoughps', 'iph14promaxtoughps', # buttons 'button-round-125', 'button-round-225', # samsung / galaxy From 1533ffc9522762dcd60fe9757097a1cb3a470cf7 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Tue, 28 Feb 2023 09:45:51 -0600 Subject: [PATCH 42/49] Mouse Pad / Desk Mat skus and bump version --- setup.py | 2 +- spoke/__init__.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 32eb5cb..f2ed4d5 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.25', + version = '1.0.26', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index b5a9dd6..4ce6169 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.25' +__version__ = '1.0.26' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -335,6 +335,8 @@ def __init__(self, **kwargs): 'facemasksmall', 'facemasklarge', # puzzles '8x10-puzzle', '11x14-puzzle', '16x20-puzzle', + # mouse pad / desk mat + '9x7mousepad', 'smallmat', 'largemat', 'xlargemat', )), Quantity = Required(), PrintImage = Required(Image), From 39eff85f28566bef396bf7a08ae10a8a5ad0163a Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Tue, 19 Sep 2023 13:59:34 -0500 Subject: [PATCH 43/49] Add iphone 15 cases and bump version --- setup.py | 2 +- spoke/__init__.py | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index f2ed4d5..e80f785 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.26', + version = '1.0.27', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index 4ce6169..df8241d 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -8,7 +8,7 @@ from lxml import etree import requests -__version__ = '1.0.26' +__version__ = '1.0.27' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -315,6 +315,14 @@ def __init__(self, **kwargs): 'iph13probt', 'iph13protough', 'iph13promaxbt', 'iph13promaxtough', 'iph14snapps', 'iph14prosnapps', 'iph14plussnapps', 'iph14promaxsnapps', 'iph14toughps', 'iph14protoughps', 'iph14plustoughps', 'iph14promaxtoughps', + 'SP10599', # iphone 15 slim + 'SP10603', # iphone 15 tough + 'SP10601', # iphone 15 plus slim + 'SP10605', # iphone 15 plus tough + 'SP10600', # iphone 15 pro slim + 'SP10604', # iphone 15 pro tough + 'SP10602', # iphone 15 pro max slim + 'SP10606', # iphone 15 pro max tough # buttons 'button-round-125', 'button-round-225', # samsung / galaxy From 984c958b0bc66de145563769452829c3f8f6d4bf Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Tue, 23 Jul 2024 13:25:52 -0500 Subject: [PATCH 44/49] Update python-spoke for Python 3.6 --- .travis.yml | 2 +- setup.py | 6 +++--- spoke/__init__.py | 9 +++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index aa406ae..d642cc1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: python python: - - "2.7" + - "3.6" # command to install dependencies install: - python setup.py install diff --git a/setup.py b/setup.py index e80f785..6c6678c 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.27', + version = '1.0.28', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), @@ -12,6 +12,6 @@ author_email = 'rob.hoelz@skinnycorp.com', url = 'https://github.com/Threadless/python-spoke', keywords = 'spoke', - install_requires = ['lxml==3.3.5', 'requests==2.20.0'], - tests_require = ['nose==1.3.1', 'python-termstyle==0.1.10', 'rednose==0.4.1'], + install_requires = ['lxml==4.9.3', 'requests==2.27.0'], + tests_require = ['nose==1.3.7', 'rednose==1.3.0'], ) diff --git a/spoke/__init__.py b/spoke/__init__.py index df8241d..a4953e7 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -7,8 +7,9 @@ from lxml import etree import requests +import six -__version__ = '1.0.27' +__version__ = '1.0.28' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -449,7 +450,7 @@ def _generate_tree(self, tag_name, serializers, node): else: element = etree.Element(tag_name) - if not isinstance(node, basestring): + if not isinstance(node, str): node = str(node) element.text = node @@ -474,11 +475,11 @@ def serialize_it(tag_name, value): Key = self.Key, Order = Order, )) - return etree.tostring(request, pretty_print=True) + return etree.tostring(request, encoding='utf-8', pretty_print=True) def _send_request(self, request): res = self.transport.send(request) - tree = etree.fromstring(res) + tree = etree.fromstring(res.decode('utf-8')) result = tree.xpath('//result')[0].text if result == 'Success': From c46c3c2792a0cd5be61d056da539fd825ff17cfb Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Wed, 16 Apr 2025 11:59:19 -0500 Subject: [PATCH 45/49] Add iphone 16 cases and bump version --- setup.py | 2 +- spoke/__init__.py | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 6c6678c..56c5979 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.28', + version = '1.0.29', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index a4953e7..a0dd5ea 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -9,7 +9,7 @@ import requests import six -__version__ = '1.0.28' +__version__ = '1.0.29' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -324,6 +324,14 @@ def __init__(self, **kwargs): 'SP10604', # iphone 15 pro tough 'SP10602', # iphone 15 pro max slim 'SP10606', # iphone 15 pro max tough + 'SP10625', # iphone 16 slim + 'SP10629', # iphone 16 tough + 'SP10627', # iphone 16 plus slim + 'SP10631', # iphone 16 plus tough + 'SP10626', # iphone 16 pro slim + 'SP10630', # iphone 16 pro tough + 'SP10628', # iphone 16 pro max slim + 'SP10632', # iphone 16 pro max tough # buttons 'button-round-125', 'button-round-225', # samsung / galaxy From 337da5658cc11d0bafd6a17b09500cdc8f8e1d99 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Wed, 22 Oct 2025 11:21:32 -0500 Subject: [PATCH 46/49] Add iphone 17 cases and bump version --- setup.py | 2 +- spoke/__init__.py | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 56c5979..b4551d7 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.29', + version = '1.0.30', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index a0dd5ea..8f12661 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -9,7 +9,7 @@ import requests import six -__version__ = '1.0.29' +__version__ = '1.0.30' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError'] @@ -332,6 +332,14 @@ def __init__(self, **kwargs): 'SP10630', # iphone 16 pro tough 'SP10628', # iphone 16 pro max slim 'SP10632', # iphone 16 pro max tough + 'SP10803', # iphone 17 slim + 'SP10815', # iphone 17 tough + 'SP10812', # iphone 17 pro slim + 'SP10824', # iphone 17 pro tough + 'SP10809', # iphone 17 pro max slim + 'SP10821', # iphone 17 pro max tough + 'SP10806', # iphone 17 air slim + 'SP10818', # iphone 17 air tough # buttons 'button-round-125', 'button-round-225', # samsung / galaxy From cf9c372430ae1f8ec9e7df4a5d214ac00aa2bf1b Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Wed, 22 Oct 2025 11:21:49 -0500 Subject: [PATCH 47/49] Bump requests version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b4551d7..9b9eec3 100644 --- a/setup.py +++ b/setup.py @@ -12,6 +12,6 @@ author_email = 'rob.hoelz@skinnycorp.com', url = 'https://github.com/Threadless/python-spoke', keywords = 'spoke', - install_requires = ['lxml==4.9.3', 'requests==2.27.0'], + install_requires = ['lxml==4.9.3', 'requests==2.32.4'], tests_require = ['nose==1.3.7', 'rednose==1.3.0'], ) From 221c98f9251e8b949158210be5c8f2653d305611 Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Wed, 22 Oct 2025 12:20:39 -0500 Subject: [PATCH 48/49] Revert requests bump --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9b9eec3..b4551d7 100644 --- a/setup.py +++ b/setup.py @@ -12,6 +12,6 @@ author_email = 'rob.hoelz@skinnycorp.com', url = 'https://github.com/Threadless/python-spoke', keywords = 'spoke', - install_requires = ['lxml==4.9.3', 'requests==2.32.4'], + install_requires = ['lxml==4.9.3', 'requests==2.27.0'], tests_require = ['nose==1.3.7', 'rednose==1.3.0'], ) From 8c4fe60cc1225d40645fea577221d124a3a281da Mon Sep 17 00:00:00 2001 From: Dominic Bruno Date: Wed, 22 Oct 2025 12:46:57 -0500 Subject: [PATCH 49/49] Bump to 1.0.31 --- setup.py | 2 +- spoke/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index b4551d7..f0ae929 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name = 'Python-Spoke', - version = '1.0.30', + version = '1.0.31', packages = find_packages(), description = 'API bindings for Spoke API', long_description = open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r').read(), diff --git a/spoke/__init__.py b/spoke/__init__.py index 8f12661..68fe70e 100644 --- a/spoke/__init__.py +++ b/spoke/__init__.py @@ -9,7 +9,7 @@ import requests import six -__version__ = '1.0.30' +__version__ = '1.0.31' __all__ = ['Case', 'Comment', 'Image', 'OrderInfo', 'PackSlipCustomInfo', 'Spoke', 'ValidationError', 'SpokeError']