Skip to content

Commit 91c6ffb

Browse files
committed
add method and data to queries
1 parent 16234da commit 91c6ffb

2 files changed

Lines changed: 48 additions & 25 deletions

File tree

resources/lib/twitch/queries.py

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717

1818

1919
class _Query(object):
20-
def __init__(self, url, headers={}):
20+
def __init__(self, url, headers={}, data={}, method='GET'):
2121
self._headers = headers
22+
self._data = data
2223
self._url = url
24+
self._method = method
2325

2426
self._params = dict()
2527
self._urlkws = dict()
@@ -33,10 +35,18 @@ def url(self):
3335
def headers(self):
3436
return self._headers
3537

38+
@property
39+
def data(self):
40+
return self._data
41+
3642
@property
3743
def params(self):
3844
return self._params
3945

46+
@property
47+
def method(self):
48+
return self._method
49+
4050
@property
4151
def urlkws(self):
4252
return self._urlkws
@@ -45,6 +55,12 @@ def add_path(self, path):
4555
self._url = urljoin(self._url, path)
4656
return self
4757

58+
def add_data(self, key, value, default=None):
59+
assert_new(self._data, key)
60+
if value != default:
61+
self._data[key] = value
62+
return self
63+
4864
def add_param(self, key, value, default=None):
4965
assert_new(self._params, key)
5066
if value != default:
@@ -57,12 +73,12 @@ def add_urlkw(self, kw, replacement):
5773
return self
5874

5975
def __str__(self):
60-
return 'Query to {url}, params {params}, headers {headers}'.format(
61-
url=self.url, params=self.params, headers=self.headers)
76+
return '{method} Query to {url}, params {params}, data {data}, headers {headers}'.format(
77+
url=self.url, params=self.params, headers=self.headers, data=self.data, method=self.method)
6278

6379
def execute(self, f):
6480
try:
65-
return f(self.url, self.params, self.headers)
81+
return f(self.url, self.params, self.headers, self.data, self.method)
6682
except:
6783
raise ResourceUnavailableException(str(self))
6884

@@ -80,42 +96,42 @@ def execute(self):
8096

8197

8298
class ApiQuery(JsonQuery):
83-
def __init__(self, path, headers={}):
99+
def __init__(self, path, headers={}, data={}, method='GET'):
84100
headers.setdefault('Client-ID', CLIENT_ID)
85101
headers.setdefault('Authorization', 'OAuth {access_token}'.format(access_token=OAUTH_TOKEN))
86-
super(ApiQuery, self).__init__(_kraken_baseurl, headers)
102+
super(ApiQuery, self).__init__(_kraken_baseurl, headers, data, method)
87103
self.add_path(path)
88104

89105

90106
class HiddenApiQuery(JsonQuery):
91-
def __init__(self, path, headers={}):
107+
def __init__(self, path, headers={}, data={}, method='GET'):
92108
headers.setdefault('Client-Id', CLIENT_ID)
93109
headers.setdefault('Authorization', 'OAuth {access_token}'.format(access_token=OAUTH_TOKEN))
94-
super(HiddenApiQuery, self).__init__(_hidden_baseurl, headers)
110+
super(HiddenApiQuery, self).__init__(_hidden_baseurl, headers, data, method)
95111
self.add_path(path)
96112

97113

98114
class UsherQuery(DownloadQuery):
99-
def __init__(self, path, headers={}):
115+
def __init__(self, path, headers={}, data={}, method='GET'):
100116
headers.setdefault('Client-Id', CLIENT_ID)
101117
headers.setdefault('Authorization', 'OAuth {access_token}'.format(access_token=OAUTH_TOKEN))
102-
super(UsherQuery, self).__init__(_usher_baseurl, headers)
118+
super(UsherQuery, self).__init__(_usher_baseurl, headers, data, method)
103119
self.add_path(path)
104120

105121

106122
class V5Query(ApiQuery):
107-
def __init__(self, path):
108-
super(V5Query, self).__init__(path, _v5_headers)
123+
def __init__(self, path, method='GET'):
124+
super(V5Query, self).__init__(path, _v5_headers, method=method)
109125

110126

111127
class V3Query(ApiQuery):
112-
def __init__(self, path):
113-
super(V3Query, self).__init__(path, _v3_headers)
128+
def __init__(self, path, method='GET'):
129+
super(V3Query, self).__init__(path, _v3_headers, method=method)
114130

115131

116132
class V2Query(ApiQuery):
117-
def __init__(self, path):
118-
super(V2Query, self).__init__(path, _v2_headers)
133+
def __init__(self, path, method='GET'):
134+
super(V2Query, self).__init__(path, _v2_headers, method=method)
119135

120136

121137
def assert_new(d, k):
@@ -132,8 +148,8 @@ def wrapper(*args, **kwargs):
132148
if not isinstance(qry, _Query):
133149
raise ValueError('{} did not return a Query, was: {}'.format(
134150
f.__name__, repr(qry)))
135-
log.debug('QUERY: url: %s, params: %s, '
151+
log.debug('%s QUERY: url: %s, params: %s, data: %s, '
136152
'headers: %r, target_func: %r',
137-
qry.url, qry.params, qry.headers, f.__name__)
153+
qry.method, qry.url, qry.params, qry.data, qry.headers, f.__name__)
138154
return qry.execute()
139155
return wrapper

resources/lib/twitch/scraper.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,41 @@
1717
MAX_RETRIES = 5
1818

1919

20-
def get_json(baseurl, parameters={}, headers={}):
20+
def get_json(baseurl, parameters={}, headers={}, data={}, method='GET'):
2121
'''Download Data from an URL and returns it as JSON
2222
@param url Url to download from
2323
@param parameters Parameter dict to be encoded with url
2424
@param headers Headers dict to pass with Request
25+
@param data Request body
26+
@param method Request method
2527
@returns JSON Object with data from URL
2628
'''
27-
jsonString = download(baseurl, parameters, headers)
29+
jsonString = download(baseurl, parameters, headers, data, method)
2830
jsonDict = json.loads(jsonString)
2931
log.debug(json.dumps(jsonDict, indent=4, sort_keys=True))
3032
return jsonDict
3133

3234

33-
def download(baseurl, parameters={}, headers={}):
35+
def download(baseurl, parameters={}, headers={}, data={}, method='GET'):
3436
'''Download Data from an url and returns it as a String
37+
@param method Request method
3538
@param baseurl Url to download from (e.g. http://www.google.com)
3639
@param parameters Parameter dict to be encoded with url
3740
@param headers Headers dict to pass with Request
41+
@param data Request body
42+
@param method Request method
3843
@returns String of data from URL
3944
'''
4045
url = '?'.join([baseurl, urlencode(parameters)])
4146
log.debug('Downloading: ' + url)
42-
data = ""
47+
content = ""
4348
for _ in range(MAX_RETRIES):
4449
try:
4550
headers.update({USER_AGENT: USER_AGENT_STRING})
46-
response = requests.get(url, headers=headers)
47-
data = response.content
51+
response = requests.request(method=method, url=url, headers=headers, data=data)
52+
content = response.content
53+
if not content and response.status_code == 204:
54+
content = '{"status": 204}'
4855
break
4956
except Exception as err:
5057
if not isinstance(err, URLError):
@@ -53,4 +60,4 @@ def download(baseurl, parameters={}, headers={}):
5360
log.debug("Error %s during HTTP Request, retrying", repr(err))
5461
else:
5562
raise
56-
return data
63+
return content

0 commit comments

Comments
 (0)