Skip to content

Commit 1b53aac

Browse files
committed
Added different request types support
1 parent b678e61 commit 1b53aac

File tree

4 files changed

+41
-94
lines changed

4 files changed

+41
-94
lines changed

codeforces_api/api_request_maker.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def __init__(self, api_key=None, secret=None, random_number=1000000):
4040

4141
def generate_request(self, method_name, **fields):
4242
"""
43-
Generates request URL for API.
43+
Generates request URL and data for API.
4444
"""
4545

4646
request_url = "https://codeforces.com/api/" + str(method_name)
@@ -100,7 +100,7 @@ def get_response(self, request):
100100
try:
101101
response = request.json()
102102
self.check_return_code(response)
103-
return response
103+
return response["result"]
104104
except json.decoder.JSONDecodeError as error:
105105
raise ValueError(
106106
"A lot of users, try to reduce the number of users in the list"

codeforces_api/api_requests.py

Lines changed: 37 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -12,83 +12,76 @@ class CodeforcesApi(CodeforcesApiRequestMaker):
1212
"""
1313

1414
session = None
15+
method = None
1516

16-
def __init__(self, api_key=None, secret=None, random_number=1000000):
17+
def _make_request(self, method, **payload):
18+
"""
19+
Making request to codeforces.com
20+
21+
Uses different methods (POST or GET) but be aware of 413 error when using GET.
22+
"""
23+
request_data = self.generate_request(method, **payload)
24+
request = self.session.request(
25+
self.method, request_data["request_url"], data=request_data["data"]
26+
)
27+
return self.get_response(request)
28+
29+
def __init__(self, api_key=None, secret=None, random_number=1000000, method="POST"):
1730
"""
1831
Initializing class. All we will need is a session to optimize performance.
1932
"""
2033
super().__init__(api_key, secret, random_number)
2134
self.session = requests.Session()
35+
if method == "POST" or method == "GET":
36+
self.method = method
37+
else:
38+
raise ValueError("method should be POST or GET")
2239

2340
def blog_entry_comments(self, blog_entry_id):
2441
"""
2542
Get blogEntry.commnets for blog, blog_entry_id required.
2643
2744
Returns parsed response from codeforces.com.
2845
"""
29-
request_data = self.generate_request(
46+
return self._make_request(
3047
"blogEntry.comments", **{"blogEntryId": str(blog_entry_id)}
3148
)
32-
request = self.session.post(
33-
request_data["request_url"], data=request_data["data"]
34-
)
35-
return self.get_response(request)
3649

3750
def blog_entry_view(self, blog_entry_id):
3851
"""
3952
Get blogEntry.view for blog, blog_entry_id required.
4053
4154
Returns parsed response from codeforces.com.
4255
"""
43-
request_data = self.generate_request(
56+
return self._make_request(
4457
"blogEntry.view", **{"blogEntryId": str(blog_entry_id)}
4558
)
46-
request = self.session.post(
47-
request_data["request_url"], data=request_data["data"]
48-
)
49-
return self.get_response(request)
5059

5160
def contest_hacks(self, contest_id):
5261
"""
5362
Get contest.hacks for contest, contest_id required.
5463
5564
Returns parsed response from codeforces.com.
5665
"""
57-
request_data = self.generate_request(
58-
"contest.hacks", **{"contestId": str(contest_id)}
59-
)
60-
request = self.session.post(
61-
request_data["request_url"], data=request_data["data"]
62-
)
63-
return self.get_response(request)
66+
return self._make_request("contest.hacks", **{"contestId": str(contest_id)})
6467

6568
def contest_list(self, gym=False):
6669
"""
6770
Get all contests you can get all gym by gym parameter.
6871
6972
Returns parsed response from codeforces.com
7073
"""
71-
request_data = self.generate_request(
72-
"contest.list", **{"gym": str(gym).lower()}
73-
)
74-
request = self.session.post(
75-
request_data["request_url"], data=request_data["data"]
76-
)
77-
return self.get_response(request)
74+
return self._make_request("contest.list", **{"gym": str(gym).lower()})
7875

7976
def contest_rating_changes(self, contest_id):
8077
"""
8178
Get contest.ratingChanges for the contest, contest_id required.
8279
8380
Returns parsed response from codeforces.com.
8481
"""
85-
request_data = self.generate_request(
82+
return self._make_request(
8683
"contest.ratingChanges", **{"contestId": str(contest_id)}
8784
)
88-
request = self.session.post(
89-
request_data["request_url"], data=request_data["data"]
90-
)
91-
return self.get_response(request)
9285

9386
def contest_standings(
9487
self,
@@ -132,15 +125,13 @@ def contest_standings(
132125
handles_str = ""
133126
for handle in handles:
134127
handles_str += str(handle) + ";"
135-
request_data = self.generate_request("user.info", **{"handles": handles_str})
128+
request_data = self.generate_request(
129+
"user.info", **{"handles": handles_str}
130+
)
136131
parameters["handles"] = handles_str
137132
if room != -1:
138133
parameters["room"] = str(room)
139-
request_data = self.generate_request("contest.standings", **parameters)
140-
request = self.session.post(
141-
request_data["request_url"], data=request_data["data"]
142-
)
143-
return self.get_response(request)
134+
return self._make_request("contest.standings", **parameters)
144135

145136
def contest_status(self, contest_id, handle="", start=-1, count=-1):
146137
"""
@@ -163,11 +154,7 @@ def contest_status(self, contest_id, handle="", start=-1, count=-1):
163154
parameters["start"] = str(start)
164155
if count != -1:
165156
parameters["count"] = str(count)
166-
request_data = self.generate_request("contest.status", **parameters)
167-
request = self.session.post(
168-
request_data["request_url"], data=request_data["data"]
169-
)
170-
return self.get_response(request)
157+
return self._make_request("contest.status", **parameters)
171158

172159
def problemset_problems(self, tags=[""], problemset_name=""):
173160
"""
@@ -186,11 +173,7 @@ def problemset_problems(self, tags=[""], problemset_name=""):
186173
parameters["tags"] = tags
187174
if problemset_name != "":
188175
parameters["problemsetName"] = problemset_name
189-
request_data = self.generate_request("problemset.problems", **parameters)
190-
request = self.session.post(
191-
request_data["request_url"], data=request_data["data"]
192-
)
193-
return self.get_response(request)
176+
return self._make_request("problemset.problems", **parameters)
194177

195178
def problemset_recent_status(self, count, problemset_name=""):
196179
"""
@@ -211,11 +194,7 @@ def problemset_recent_status(self, count, problemset_name=""):
211194
}
212195
if problemset_name != "":
213196
parameters["problemsetName"] = problemset_name
214-
request_data = self.generate_request("problemset.recentStatus", **parameters)
215-
request = self.session.post(
216-
request_data["request_url"], data=request_data["data"]
217-
)
218-
return self.get_response(request)
197+
return self._make_request("problemset.recentStatus", **parameters)
219198

220199
def recent_actions(self, max_count=100):
221200
"""
@@ -229,13 +208,7 @@ def recent_actions(self, max_count=100):
229208
"""
230209
if max_count > 100:
231210
raise OverflowError("Max_count should be less or equal to 1000")
232-
request_data = self.generate_request(
233-
"recentActions", **{"maxCount": str(max_count)}
234-
)
235-
request = self.session.post(
236-
request_data["request_url"], data=request_data["data"]
237-
)
238-
return self.get_response(request)
211+
return self._make_request("recentActions", **{"maxCount": str(max_count)})
239212

240213
def user_blog_entries(self, handle):
241214
"""
@@ -247,13 +220,7 @@ def user_blog_entries(self, handle):
247220
"""
248221
if handle == "":
249222
raise TypeError("Handle should not be empty")
250-
request_data = self.generate_request(
251-
"user.blogEntries", **{"handle": str(handle)}
252-
)
253-
request = self.session.post(
254-
request_data["request_url"], data=request_data["data"]
255-
)
256-
return self.get_response(request)
223+
return self._make_request("user.blogEntries", **{"handle": str(handle)})
257224

258225
def user_friends(self, only_online=False):
259226
"""
@@ -267,13 +234,9 @@ def user_friends(self, only_online=False):
267234
"""
268235
if self.anonimus:
269236
raise TypeError("Auth is required.")
270-
request_data = self.generate_request(
237+
return self._make_request(
271238
"user.friends", **{"onlyOnline": str(only_online).lower()}
272239
)
273-
request = self.session.post(
274-
request_data["request_url"], data=request_data["data"]
275-
)
276-
return self.get_response(request)
277240

278241
def user_info(self, handles):
279242
"""
@@ -290,11 +253,7 @@ def user_info(self, handles):
290253
handles_str = ""
291254
for handle in handles:
292255
handles_str += str(handle) + ";"
293-
request_data = self.generate_request("user.info", **{"handles": handles_str})
294-
request = self.session.post(
295-
request_data["request_url"], data=request_data["data"]
296-
)
297-
return self.get_response(request)
256+
return self._make_request("user.info", **{"handles": handles_str})
298257

299258
def user_rated_list(self, active_only=False):
300259
"""
@@ -304,13 +263,9 @@ def user_rated_list(self, active_only=False):
304263
305264
Returns parsed response from codeforces.com.
306265
"""
307-
request_data = self.generate_request(
266+
return self._make_request(
308267
"user.ratedList", **{"activeOnly": str(active_only).lower()}
309268
)
310-
request = self.session.post(
311-
request_data["request_url"], data=request_data["data"]
312-
)
313-
return self.get_response(request)
314269

315270
def user_rating(self, handle):
316271
"""
@@ -320,11 +275,7 @@ def user_rating(self, handle):
320275
321276
Returns parsed response from codeforces.com.
322277
"""
323-
request_data = self.generate_request("user.rating", **{"handle": str(handle)})
324-
request = self.session.post(
325-
request_data["request_url"], data=request_data["data"]
326-
)
327-
return self.get_response(request)
278+
return self._make_request("user.rating", **{"handle": str(handle)})
328279

329280
def user_status(self, handle, start=-1, count=-1):
330281
"""
@@ -345,8 +296,4 @@ def user_status(self, handle, start=-1, count=-1):
345296
parameters["from"] = str(start)
346297
if count != -1:
347298
parameters["count"] = str(count)
348-
request_data = self.generate_request("user.status", **parameters)
349-
request = self.session.post(
350-
request_data["request_url"], data=request_data["data"]
351-
)
352-
return self.get_response(request)
299+
return self._make_request("user.status", **parameters)

codeforces_api/parse_methods.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def get_tags(self, contest_id, index, include_rating=False):
5151
"""
5252
if self.problem_tags == dict():
5353
cf_api = CodeforcesApi()
54-
for problem in cf_api.problemset_problems()["result"]["problems"]:
54+
for problem in cf_api.problemset_problems()["problems"]:
5555
if str(problem["contestId"]) not in self.problem_tags.keys():
5656
self.problem_tags[str(problem["contestId"])] = dict()
5757
self.problem_tags[str(problem["contestId"])][

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setup(
77
name="CodeforcesApiPy",
8-
version="1.5.1",
8+
version="1.6.0",
99
description="Implementation of codeforces.com API",
1010
platforms="any",
1111
url="https://github.com/VadVergasov/CodeforcesApiPy",

0 commit comments

Comments
 (0)