Skip to content

Commit aec6ca2

Browse files
author
Will Myers
authored
Add api_version to Client config (#21)
* Add api_version to Client config * add trailing commas
1 parent 1e1c9a1 commit aec6ca2

File tree

5 files changed

+55
-8
lines changed

5 files changed

+55
-8
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
Current Version
2+
- Add api_version to Client config
23
- Add tox
34
- Add support for python3.6
45
- Add flake8 to test suite

pybutton/client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class Client(object):
2727
Defaults to None.
2828
(N.B: Button's API is only exposed through HTTPS. This option is
2929
provided purely as a convenience for testing and development.)
30+
api_version: A specific API version label to use for the request
3031
3132
Attributes:
3233
orders (pybutton.Resource): Resource for managing Button Orders.
@@ -63,4 +64,5 @@ def config_with_defaults(config):
6364
'timeout': config.get('timeout'),
6465
'hostname': config.get('hostname', 'api.usebutton.com'),
6566
'port': config.get('port', defaultPort),
67+
'api_version': config.get('api_version'),
6668
}

pybutton/resources/resource.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,23 @@ def api_delete(self, path):
8282
'''
8383
return self._api_request(path, 'DELETE')
8484

85+
def _headers(self):
86+
'''Generate the HTTP headers used for a request
87+
'''
88+
89+
api_key_bytes = '{0}:'.format(self.api_key).encode()
90+
authorization = b64encode(api_key_bytes).decode()
91+
92+
headers = {
93+
'Authorization': 'Basic {0}'.format(authorization),
94+
'User-Agent': USER_AGENT,
95+
}
96+
97+
if self.config['api_version']:
98+
headers['X-Button-API-Version'] = self.config['api_version']
99+
100+
return headers
101+
85102
def _api_request(self, path, method, data=None, query=None):
86103
'''Make an HTTP request
87104
@@ -107,19 +124,12 @@ def _api_request(self, path, method, data=None, query=None):
107124
path,
108125
query,
109126
)
110-
api_key_bytes = '{0}:'.format(self.api_key).encode()
111-
authorization = b64encode(api_key_bytes).decode()
112-
113-
headers = {
114-
'Authorization': 'Basic {0}'.format(authorization),
115-
'User-Agent': USER_AGENT,
116-
}
117127

118128
try:
119129
resp = request(
120130
url,
121131
method,
122-
headers,
132+
self._headers(),
123133
data,
124134
self.config['timeout'],
125135
)

pybutton/test/client_test.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def test_config(self):
4444
'port': 443,
4545
'secure': True,
4646
'timeout': None,
47+
'api_version': None,
4748
})
4849

4950
# Port and timeout overrides
@@ -57,6 +58,7 @@ def test_config(self):
5758
'port': 88,
5859
'secure': True,
5960
'timeout': 5,
61+
'api_version': None,
6062
})
6163

6264
# Hostname and secure overrides
@@ -70,4 +72,17 @@ def test_config(self):
7072
'port': 80,
7173
'secure': False,
7274
'timeout': None,
75+
'api_version': None,
76+
})
77+
78+
config = config_with_defaults({
79+
'api_version': '2017-01-01',
80+
})
81+
82+
self.assertEqual(config, {
83+
'hostname': 'api.usebutton.com',
84+
'port': 443,
85+
'secure': True,
86+
'timeout': None,
87+
'api_version': '2017-01-01',
7388
})

pybutton/test/resources/resource_test.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
'secure': True,
1717
'port': 443,
1818
'timeout': None,
19+
'api_version': None,
1920
}
2021

2122

@@ -34,6 +35,7 @@ def test_api_request(self, request):
3435
self.assertEqual(args[1], 'GET')
3536
self.assertTrue(len(args[2]['User-Agent']) != 0)
3637
self.assertEqual(args[2]['Authorization'], 'Basic c2stWFhYOg==')
38+
self.assertTrue('X-Button-API-Version' not in args[2])
3739
self.assertEqual(args[3], None)
3840

3941
@patch('pybutton.resources.resource.request')
@@ -82,6 +84,23 @@ def test_api_request_with_data(self, request):
8284
self.assertEqual(args[2]['Authorization'], 'Basic c2stWFhYOg==')
8385
self.assertEqual(args[3], data)
8486

87+
@patch('pybutton.resources.resource.request')
88+
def test_api_request_with_api_version(self, request):
89+
config = {
90+
'hostname': 'api.usebutton.com',
91+
'secure': True,
92+
'port': 443,
93+
'timeout': None,
94+
'api_version': '2017-01-01',
95+
}
96+
97+
request.return_value = {'object': {}}
98+
resource = Resource('sk-XXX', config)
99+
resource._api_request('/v2/api', 'GET')
100+
101+
args = request.call_args[0]
102+
self.assertEqual(args[2]['X-Button-API-Version'], '2017-01-01')
103+
85104
@patch('pybutton.resources.resource.request')
86105
def test_api_request_with_error(self, request):
87106
data = {'c': 3}

0 commit comments

Comments
 (0)