Skip to content

Commit 1af7ca7

Browse files
Refactor utility functions for problem handling in modes
Extracted and centralized common methods like `log_problem_details`, `open_in_browser`, and `create_and_solve_handler` into standalone functions in `PracticeMode.py`. Updated other mode classes to use these functions, reducing code duplication and improving maintainability.
1 parent 0080014 commit 1af7ca7

File tree

5 files changed

+81
-77
lines changed

5 files changed

+81
-77
lines changed

modes/CustomPracticeMode.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from modes.PracticeMode import PracticeMode
1+
from modes.PracticeMode import PracticeMode, log_problem_details, open_in_browser, create_and_solve_handler
22
from utils.constants import difficulty_map
33
from utils.logger import log, LogLevel
44
from handlers.CacheHandler import cached_api
@@ -15,9 +15,9 @@ def handle(self, args):
1515
continue
1616
difficulty_label = difficulty_map[problem["difficulty"].lower()]
1717
url = f"https://leetcode.com/problems/{problem['titleSlug']}"
18-
self.log_problem_details(problem, difficulty_label, url)
19-
self.open_in_browser(url, args["open_in_browser"])
20-
self.create_and_solve_handler(
18+
log_problem_details(problem, difficulty_label, url)
19+
open_in_browser(url, args["open_in_browser"])
20+
create_and_solve_handler(
2121
slug, problem["codeSnippets"], difficulty_label, args
2222
)
2323
except Exception as e:

modes/DailyChallengeMode.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from modes.PracticeMode import PracticeMode
1+
from modes.PracticeMode import PracticeMode, log_problem_details, open_in_browser, create_and_solve_handler
22
from utils.constants import difficulty_map
33
from utils.logger import log, LogLevel
44
from handlers.CacheHandler import cached_api
@@ -15,9 +15,9 @@ def handle(self, args):
1515
url = f"https://leetcode.com{daily_challenge['link'].removesuffix('/')}"
1616
log("🎯 Daily Coding Challenge:", LogLevel.INFO)
1717
log(f"📅 Date: {daily_challenge['date']}", LogLevel.INFO)
18-
self.log_problem_details(daily_challenge["question"], difficulty_label, url)
19-
self.open_in_browser(url, args["open_in_browser"])
20-
self.create_and_solve_handler(
18+
log_problem_details(daily_challenge["question"], difficulty_label, url)
19+
open_in_browser(url, args["open_in_browser"])
20+
create_and_solve_handler(
2121
daily_challenge["question"]["titleSlug"],
2222
daily_challenge["codeSnippets"],
2323
difficulty_label,

modes/PracticeMode.py

Lines changed: 65 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -68,71 +68,74 @@ def get_random_study_plan_problem(slug: str) -> Optional[Dict[str, Any]]:
6868
return cached_api.fetch_problem(problem["titleSlug"])
6969

7070

71+
def create_and_solve_handler(
72+
problem_slug, code_snippets, difficulty_label, args
73+
):
74+
# Determine the starter code based on the chosen language
75+
76+
code = ""
77+
for item in code_snippets:
78+
if item.get("lang").lower() == args["language"].lower():
79+
code = item.get("code")
80+
break
81+
82+
if not code:
83+
log(
84+
f"Starter code not found for language: {args['language']}",
85+
LogLevel.ERROR,
86+
)
87+
return
88+
89+
handler = SolutionHandler(
90+
problem=problem_slug,
91+
code=code,
92+
difficulty=difficulty_label,
93+
editor=args["editor"],
94+
language=args["language"],
95+
time_limit=args["time_limit"],
96+
)
97+
handler.solve()
98+
99+
100+
def open_in_browser(url, open_flag):
101+
if open_flag:
102+
import webbrowser
103+
104+
webbrowser.open(url)
105+
106+
107+
def log_problem_details(problem, difficulty_label, url):
108+
log(f"🎯 Problem Selected: {problem.get('title', 'Unknown')}", LogLevel.INFO)
109+
log(f"✨ Difficulty: {difficulty_label}", LogLevel.INFO)
110+
log(f"🔗 URL: {url}", LogLevel.INFO)
111+
112+
topic_tags = problem.get("topicTags", [])
113+
if topic_tags:
114+
tags = ", ".join(tag.get("name", "Unknown") for tag in topic_tags)
115+
log(f"🏷️ Tags: {tags}", LogLevel.INFO)
116+
117+
ac_rate = problem.get("acRate")
118+
if ac_rate is not None:
119+
log(f"📈 Acceptance Rate: {ac_rate:.2f}%", LogLevel.INFO)
120+
121+
# Assuming `content` is the Markdown content
122+
content = problem.get("content")
123+
if content:
124+
try:
125+
html_content = markdown.markdown(content)
126+
127+
text_maker = html2text.HTML2Text()
128+
text_maker.ignore_links = True
129+
plain_text = text_maker.handle(html_content)
130+
131+
log(plain_text, LogLevel.INFO)
132+
except Exception as e:
133+
log(f"Failed to convert problem content: {str(e)}", LogLevel.ERROR)
134+
135+
71136
class PracticeMode:
72137
def __init__(self):
73138
pass
74139

75140
def handle(self, args):
76141
raise NotImplementedError("This method should be implemented by subclasses.")
77-
78-
def log_problem_details(self, problem, difficulty_label, url):
79-
log(f"🎯 Problem Selected: {problem.get('title', 'Unknown')}", LogLevel.INFO)
80-
log(f"✨ Difficulty: {difficulty_label}", LogLevel.INFO)
81-
log(f"🔗 URL: {url}", LogLevel.INFO)
82-
83-
topic_tags = problem.get("topicTags", [])
84-
if topic_tags:
85-
tags = ", ".join(tag.get("name", "Unknown") for tag in topic_tags)
86-
log(f"🏷️ Tags: {tags}", LogLevel.INFO)
87-
88-
ac_rate = problem.get("acRate")
89-
if ac_rate is not None:
90-
log(f"📈 Acceptance Rate: {ac_rate:.2f}%", LogLevel.INFO)
91-
92-
# Assuming `content` is the Markdown content
93-
content = problem.get("content")
94-
if content:
95-
try:
96-
html_content = markdown.markdown(content)
97-
98-
text_maker = html2text.HTML2Text()
99-
text_maker.ignore_links = True
100-
plain_text = text_maker.handle(html_content)
101-
102-
log(plain_text, LogLevel.INFO)
103-
except Exception as e:
104-
log(f"Failed to convert problem content: {str(e)}", LogLevel.ERROR)
105-
106-
def open_in_browser(self, url, open_flag):
107-
if open_flag:
108-
import webbrowser
109-
110-
webbrowser.open(url)
111-
112-
def create_and_solve_handler(
113-
self, problem_slug, code_snippets, difficulty_label, args
114-
):
115-
# Determine the starter code based on the chosen language
116-
117-
code = ""
118-
for item in code_snippets:
119-
if item.get("lang").lower() == args["language"].lower():
120-
code = item.get("code")
121-
break
122-
123-
if not code:
124-
log(
125-
f"Starter code not found for language: {args['language']}",
126-
LogLevel.ERROR,
127-
)
128-
return
129-
130-
handler = SolutionHandler(
131-
problem=problem_slug,
132-
code=code,
133-
difficulty=difficulty_label,
134-
editor=args["editor"],
135-
language=args["language"],
136-
time_limit=args["time_limit"],
137-
)
138-
handler.solve()

modes/RandomProblemMode.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from modes.PracticeMode import PracticeMode, get_random_problem
1+
from modes.PracticeMode import PracticeMode, get_random_problem, log_problem_details, open_in_browser, \
2+
create_and_solve_handler
23
from utils.constants import difficulty_map
34
from utils.logger import log, LogLevel
45

@@ -13,9 +14,9 @@ def handle(self, args):
1314
return
1415
difficulty_label = difficulty_map[problem["difficulty"].lower()]
1516
url = f"https://leetcode.com/problems/{problem['titleSlug']}"
16-
self.log_problem_details(problem, difficulty_label, url)
17-
self.open_in_browser(url, args["open_in_browser"])
18-
self.create_and_solve_handler(
17+
log_problem_details(problem, difficulty_label, url)
18+
open_in_browser(url, args["open_in_browser"])
19+
create_and_solve_handler(
1920
problem["titleSlug"], problem["codeSnippets"], difficulty_label, args
2021
)
2122
except Exception as e:

modes/StudyPlanMode.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ def handle(self, args):
1313
return
1414
difficulty_label = difficulty_map[problem["difficulty"].lower()]
1515
url = f"https://leetcode.com/problems/{problem['titleSlug']}"
16-
self.log_problem_details(problem, difficulty_label, url)
17-
self.open_in_browser(url, args["open_in_browser"])
18-
self.create_and_solve_handler(
16+
log_problem_details(problem, difficulty_label, url)
17+
open_in_browser(url, args["open_in_browser"])
18+
create_and_solve_handler(
1919
problem["titleSlug"], problem["codeSnippets"], difficulty_label, args
2020
)
2121
except Exception as e:

0 commit comments

Comments
 (0)