-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathclient.py
More file actions
97 lines (76 loc) · 3.03 KB
/
Copy pathclient.py
File metadata and controls
97 lines (76 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import requests
from enum import Enum
class RequestError(Exception):
def __init__(self, status_code, error_code, error_message, error_id):
self.status_code = status_code
self.error_code = error_code
self.error_message = error_message
self.error_id = error_id
super(RequestError, self).__init__(error_message)
class Client(object):
DEFAULT_ENDPOINT = 'https://analytics.adobe.io/api/'
def __init__(self, api_key, company_id, token, endpoint=DEFAULT_ENDPOINT):
self._api_key = api_key
self._company_id = company_id
self._token = token
self._endpoint = '{}{}'.format(endpoint, company_id)
self._auth_headers = self._compose_auth_headers()
self._methods = {Request.Method.GET: requests.get, Request.Method.POST: requests.post}
def execute(self, request):
headers = request.headers.copy()
headers.update(self._auth_headers)
url = '{}{}'.format(self._endpoint, request.resource)
raw_response = self._methods[request.method](url, headers=headers, json=request.payload)
response = raw_response.json()
if 'errorCode' in response:
raise RequestError(raw_response.status_code,
response['errorCode'],
response['errorDescription'],
response['errorId'])
return response
def _compose_auth_headers(self):
return {
'x-api-key': self._api_key,
'x-proxy-global-company-id': self._company_id,
'Authorization': 'Bearer {}'.format(self._token)}
def __str__(self):
return """
\033[1m{:<10s}\033[0m{:>15s}
\033[1m{:<10s}\033[0m{:>10s}
\033[1m{:<10s}\033[0m{:>10s}
\033[1m{:<10s}\033[0m{:>10s}
""".format('API Key:', self._api_key, 'Token:', self._token, 'Company Id:', self._company_id,
'Endpoint:', self._endpoint)
class Request(object):
Method = Enum('Method', 'GET POST')
def __init__(self, method, resource, headers=None, payload=None):
self._method = method
self._resource = resource
self._headers = {}
if headers:
assert isinstance(headers, dict)
self._headers = headers
self._payload = {}
if payload:
assert isinstance(payload, dict)
self._payload = payload
@property
def method(self):
return self._method
@property
def resource(self):
return self._resource
@property
def headers(self):
return self._headers
@property
def payload(self):
return self._payload
def __str__(self):
return """
\033[1m{:<10s}\033[0m{:>15s}
\033[1m{:<10s}\033[0m{:>10s}
\033[1m{:<10s}\033[0m{:>10s}
\033[1m{:<10s}\033[0m{:>10s}
""".format('Method:', self._method, 'Resource:', self._resource, 'Headers:', self._headers,
'Payload:', self._payload)