Skip to content

Commit

Permalink
Using sessions in requests to optimize performace
Browse files Browse the repository at this point in the history
  • Loading branch information
VadVergasov committed Jan 10, 2021
1 parent 7895cae commit 80a65a9
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 21 deletions.
40 changes: 24 additions & 16 deletions codeforces_api/api_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,21 @@ class CodeforcesApi(CodeforcesApiRequestMaker):
Class for using official API requests.
"""

session = None

def __init__(self):
"""
Initializing class. All we will need is session to optimize performance.
"""
self.session = requests.Session()

def blog_entry_comments(self, blog_entry_id):
"""
Get blogEntry.commnets for blog , blog_entry_id required.
Returns parsed response from codeforces.com.
"""
request = requests.get(
request = self.session.get(
self.generate_url(
"blogEntry.comments", **{"blogEntryId": str(blog_entry_id)}
)
Expand All @@ -33,7 +41,7 @@ def blog_entry_view(self, blog_entry_id):
request_url = self.generate_url(
"blogEntry.view", **{"blogEntryId": str(blog_entry_id)}
)
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def contest_hacks(self, contest_id):
Expand All @@ -45,7 +53,7 @@ def contest_hacks(self, contest_id):
request_url = self.generate_url(
"contest.hacks", **{"contestId": str(contest_id)}
)
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def contest_list(self, gym=False):
Expand All @@ -55,7 +63,7 @@ def contest_list(self, gym=False):
Returns parsed response from codeforces.com
"""
request_url = self.generate_url("contest.list", **{"gym": str(gym)})
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def contest_rating_changes(self, contest_id):
Expand All @@ -67,7 +75,7 @@ def contest_rating_changes(self, contest_id):
request_url = self.generate_url(
"contest.ratingChanges", **{"contestId": str(contest_id)}
)
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def contest_standings(
Expand Down Expand Up @@ -113,7 +121,7 @@ def contest_standings(
if room != -1:
parameters["room"] = str(room)
request_url = self.generate_url("contest.standings", **parameters)
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def contest_status(self, contest_id, handle="", start=-1, count=-1):
Expand All @@ -138,7 +146,7 @@ def contest_status(self, contest_id, handle="", start=-1, count=-1):
if count != -1:
parameters["count"] = str(count)
request_url = self.generate_url("contest.status", **parameters)
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def problemset_problems(self, tags=[""], problemset_name=""):
Expand All @@ -161,7 +169,7 @@ def problemset_problems(self, tags=[""], problemset_name=""):
if problemset_name != "":
parameters["problemsetName"] = problemset_name
request_url = self.generate_url("problemset.problems", **parameters)
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def problemset_recent_status(self, count, problemset_name=""):
Expand All @@ -184,7 +192,7 @@ def problemset_recent_status(self, count, problemset_name=""):
if problemset_name != "":
parameters["problemsetName"] = problemset_name
request_url = self.generate_url("problemset.recentStatus", **parameters)
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def recent_actions(self, max_count=100):
Expand All @@ -200,7 +208,7 @@ def recent_actions(self, max_count=100):
if max_count > 100:
raise OverflowError("Max_count should be less or equal to 1000")
request_url = self.generate_url("recentActions", **{"maxCount": str(max_count)})
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def user_blog_entries(self, handle):
Expand All @@ -214,7 +222,7 @@ def user_blog_entries(self, handle):
if handle == "":
raise TypeError("Handle should not be empty")
request_url = self.generate_url("user.blogEntries", **{"handle": str(handle)})
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def user_friends(self, only_online=False):
Expand All @@ -232,7 +240,7 @@ def user_friends(self, only_online=False):
request_url = self.generate_url(
"user.friends", **{"onlyOnline": str(only_online)}
)
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def user_info(self, handles):
Expand All @@ -248,7 +256,7 @@ def user_info(self, handles):
if len(handles) > 10000:
raise OverflowError("Max count of handles should be less or equal to 10000")
request_url = self.generate_url("user.info", **{"handles": handles})
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def user_rated_list(self, active_only=False):
Expand All @@ -262,7 +270,7 @@ def user_rated_list(self, active_only=False):
request_url = self.generate_url(
"user.ratedList", **{"activeOnly": str(active_only)}
)
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def user_rating(self, handle):
Expand All @@ -274,7 +282,7 @@ def user_rating(self, handle):
Returns parsed response from codeforces.com.
"""
request_url = self.generate_url("user.rating", **{"handle": str(handle)})
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)

def user_status(self, handle, start=-1, count=-1):
Expand All @@ -297,5 +305,5 @@ def user_status(self, handle, start=-1, count=-1):
if count != -1:
parameters["count"] = str(count)
request_url = self.generate_url("user.status", **parameters)
request = requests.get(request_url)
request = self.session.get(request_url)
return self.get_response(request)
17 changes: 13 additions & 4 deletions codeforces_api/parse_methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@


class CodeforcesParser:

session = None

def __init__(self):
"""
Initializing class. All we will need is session to optimize performance.
"""
self.session = requests.Session()

def get_solution(self, contest_id, submit_id):
"""
Returns source code for specified submit.
Expand All @@ -14,16 +23,16 @@ def get_solution(self, contest_id, submit_id):
submit_id is the id of sumbission.
"""
solutionPage = requests.get(
solutionPage = self.session.get(
"https://codeforces.com/contest/"
+ str(contest_id)
+ "/submission/"
+ str(submit_id)
)
if int(solutionPage.status_code) != 200:
raise Exception("Returned not OK code" + str(solutionPage))
raise Exception("Returned not OK code " + str(solutionPage))
tree2 = html.fromstring(solutionPage.text)
code = tree2.xpath('//*[@id="pageContent"]/div[3]/pre/text()')
code = tree2.xpath("//pre[@id='program-source-text']/text()")
if len(code) == 0:
raise ValueError("Incorrect contest_id or submit_id" + str(code))
raise ValueError("Incorrect contest_id or submit_id " + str(code))
return code[0].replace("\r", "")
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

setup(
name="CodeforcesApiPy",
version="1.3.3",
version="1.4.0",
description="Implementation of codeforces.com API",
platforms="any",
url="https://github.com/VadVergasov/CodeforcesApiPy",
Expand Down
6 changes: 6 additions & 0 deletions tests/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import codeforces_api
import conf
import time

MAIN = codeforces_api.CodeforcesApi(conf.API_KEY, conf.API_SECRET)

Expand All @@ -14,16 +15,21 @@
HACKS = MAIN.contest_hacks(1311)
LIST = MAIN.contest_list()
RATING_CHANGES = MAIN.contest_rating_changes(1311)
time.sleep(1)
STANDINGS = MAIN.contest_standings(1311, handles=["tourist", "VadVergasov"])
STATUS = MAIN.contest_status(1311)
PROBLEMS = MAIN.problemset_problems()
RECENT_STATUS = MAIN.problemset_recent_status(10)
RECENT_ACTIONS = MAIN.recent_actions()
time.sleep(1)
USER_ENTRIES = MAIN.user_blog_entries("VadVergasov")
FRIENDS = MAIN.user_friends(True)
INFO = MAIN.user_info(["tourist", "VadVergasov"])
RATINGS = MAIN.user_rated_list(True)
USER_RATING = MAIN.user_rating("VadVergasov")
time.sleep(1)
USER_STATUS = MAIN.user_status("VadVergasov")

SOLUTION = PARSER.get_solution(1322, 72628149)

print("No errors found!")

0 comments on commit 80a65a9

Please sign in to comment.