From 70f382d5b15c852298a3cb74b8e1a31ff14c83fc Mon Sep 17 00:00:00 2001
From: Adam Djellouli <37275728+djeada@users.noreply.github.com>
Date: Wed, 26 Mar 2025 21:21:53 -0100
Subject: [PATCH] Refactor question utils for enhanced performance,
readability, and extended functionality while preserving backward
compatibility (#10551)
---
scripts/question_utils.py | 82 +++++++++++++++------------------------
1 file changed, 31 insertions(+), 51 deletions(-)
diff --git a/scripts/question_utils.py b/scripts/question_utils.py
index 765ad91..a51fc33 100644
--- a/scripts/question_utils.py
+++ b/scripts/question_utils.py
@@ -7,66 +7,50 @@ from random import choice
from typing import List
import re
-p = pathlib.Path(__file__).parent.parent.joinpath("README.md")
+README_PATH = pathlib.Path(__file__).parent.parent / "README.md"
+EXERCISES_PATH = pathlib.Path(__file__).parent.parent / "exercises"
+
+DETAILS_PATTERN = re.compile(r"(.*?) ", re.DOTALL)
+SUMMARY_PATTERN = re.compile(r"(.*?)", re.DOTALL)
+B_PATTERN = re.compile(r"(.*?)", re.DOTALL)
-def get_file_list():
- file_list = ""
- with open(p, "rb") as f:
- for line in f.readlines():
- file_list += line.rstrip().decode()
- return file_list
+def get_file_content() -> str:
+ with README_PATH.open("r", encoding="utf-8") as f:
+ return f.read()
-def get_question_list(file_list: List[str]) -> list:
- file_list = re.findall("(.*?) ", file_list)
- questions_list = []
- for i in file_list:
- q = re.findall(r"(.*?)", i)[0]
- questions_list.append(q)
- return questions_list
+def get_question_list(file_content: str) -> List[str]:
+ details = DETAILS_PATTERN.findall(file_content)
+ return [SUMMARY_PATTERN.search(detail).group(1) for detail in details if SUMMARY_PATTERN.search(detail)]
-def get_answered_questions(question_list: List[str]) -> list:
- t = []
- question_list = re.findall("(.*?) ", question_list)
- for i in question_list:
- q = re.findall(r"(.*?)", i)
- if q and q[0] == "":
- continue
- a = re.findall(r"(.*?)", i)
- if a and a[0] == "":
- continue
- else:
- t.append(q[0])
- return t
+def get_answered_questions(file_content: str) -> List[str]:
+ details = DETAILS_PATTERN.findall(file_content)
+ answered = []
+ for detail in details:
+ summary_match = SUMMARY_PATTERN.search(detail)
+ b_match = B_PATTERN.search(detail)
+ if summary_match and b_match and summary_match.group(1).strip() and b_match.group(1).strip():
+ answered.append(summary_match.group(1))
+ return answered
-def get_answers_count() -> List:
- """
- Return [answer_questions,all_questions] ,PASS complete. FAIL incomplete.
- >>> get_answers_count()
- [463, 463]
- """
- ans_questions = get_answered_questions(get_file_list())
- len_ans_questions = len(ans_questions)
- all_questions = get_question_list(get_file_list())
- len_all_questions = len(all_questions)
- return [len_ans_questions, len_all_questions]
+def get_answers_count() -> List[int]:
+ file_content = get_file_content()
+ answered = get_answered_questions(file_content)
+ all_questions = get_question_list(file_content)
+ return [len(answered), len(all_questions)]
def get_challenges_count() -> int:
- challenges_path = (
- pathlib.Path(__file__).parent.parent.joinpath("exercises").glob("*.md")
- )
- return len(list(challenges_path))
+ return len(list(EXERCISES_PATH.glob("*.md")))
-# WIP WAITING FEEDBACK
-def get_random_question(question_list: List[str], with_answer=False):
+def get_random_question(question_list: List[str], with_answer: bool = False) -> str:
if with_answer:
- return choice(get_answered_questions(question_list))
- return choice(get_question_list(question_list))
+ return choice(get_answered_questions(get_file_content()))
+ return choice(get_question_list(get_file_content()))
"""Use this question_list. Unless you have already opened/worked/need the file, then don't or
@@ -74,7 +58,7 @@ you will end up doing the same thing twice.
eg:
#my_dir/main.py
from scripts import question_utils
-print(question_utils.get_answered_questions(question_utils.question_list)
+print(question_utils.get_answered_questions(question_utils.get_question_list(question_utils.get_file_content()))
>> 123
# noqa: E501
"""
@@ -83,7 +67,3 @@ if __name__ == "__main__":
import doctest
doctest.testmod()
- # print(get_question_list(get_file_list()))
- # print(get_answered_questions(get_file_list()))
- # print(get_random_question(get_file_list(),True))
- # print(get_random_question(get_file_list(),False))