From 8cee6011a947a25473f9275f06eaec9fed1d560a Mon Sep 17 00:00:00 2001 From: kaz3r <125219813+kaz3r@users.noreply.github.com> Date: Wed, 23 Jul 2025 01:26:06 +0300 Subject: [PATCH 1/4] grading: added counters for issues and commits --- grading.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 grading.py diff --git a/grading.py b/grading.py new file mode 100644 index 0000000..71f06ec --- /dev/null +++ b/grading.py @@ -0,0 +1,18 @@ +def commits_substring_count(resp: list, needle: str): + i=0 + for commit in resp: + i += needle in commit['commit']['message'] + return i + +def issues_substring_count(resp: list, needle: str): + i=0 + for issue in resp: + i += needle in issue['title'] + return i + +def commits_local_count(resp: list): + i=0 + for commit in resp: + if not (commit['commit']['committer']['email'] == 'noreply@github.com' and commit['commit']['verification']['verified']): + i += 1 + return i \ No newline at end of file From 561109fa003af08502bc86de280992cace4b2627 Mon Sep 17 00:00:00 2001 From: kaz3r <125219813+kaz3r@users.noreply.github.com> Date: Sun, 31 Aug 2025 10:51:04 +0300 Subject: [PATCH 2/4] Added counters validation --- main.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 5d2c207..7abacda 100644 --- a/main.py +++ b/main.py @@ -11,6 +11,7 @@ from dotenv import load_dotenv from itsdangerous import TimestampSigner, BadSignature import re +import grading load_dotenv() app = FastAPI() @@ -430,8 +431,30 @@ def grade_lab(course_id: str, group_id: str, lab_id: str, request: GradeRequest) summary.append(f"{emoji} {name} — {html_url}") total_checks = len(check_runs) - result_string = f"{passed_count}/{total_checks} тестов пройдено" + if lab_config['validation']: + valComm=lab_config['validation'].get('commits') + if valComm is not None: + total_checks += len(valComm) + for chk in valComm: + match chk.get('filter'): + case 'message': + if grading.commits_substring_count(commits_resp.json(), chk['contains']) >= chk['min-count']: + passed_count += 1 + case 'console': + if grading.commits_local_count(commits_resp.json()) >= chk['min-count']: + passed_count += 1 + + valIssu=lab_config['validation'].get('issues') + if valIssu is not None: + total_checks += len(valIssu) + issues_resp = requests.get(f"https://api.github.com/repos/{org}/{repo_name}/issues") + if issues_resp.json(): # issues are present + for chk in valIssu: + if grading.issues_substring_count(issues_resp.json(), chk['contains']) >= chk['min-count']: + passed_count += 1 + + result_string = f"{passed_count}/{total_checks} тестов пройдено" final_result = "✓" if passed_count == total_checks else "✗" scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"] From bb7096c0a46dc44d5738fd6a623f3ec1fba58abe Mon Sep 17 00:00:00 2001 From: kaz3r <125219813+kaz3r@users.noreply.github.com> Date: Mon, 1 Sep 2025 17:59:03 +0300 Subject: [PATCH 3/4] Added additional comments --- grading.py | 3 +++ main.py | 14 +++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/grading.py b/grading.py index 71f06ec..1169713 100644 --- a/grading.py +++ b/grading.py @@ -1,16 +1,19 @@ def commits_substring_count(resp: list, needle: str): + """Counts commits with substring in message. Accepts parsed JSON from response to github api""" i=0 for commit in resp: i += needle in commit['commit']['message'] return i def issues_substring_count(resp: list, needle: str): + """Counts issues with substring in title. Accepts parsed JSON from response to github api""" i=0 for issue in resp: i += needle in issue['title'] return i def commits_local_count(resp: list): + """Counts commits made w/o using github web. Accepts parsed JSON from response to github api""" i=0 for commit in resp: if not (commit['commit']['committer']['email'] == 'noreply@github.com' and commit['commit']['verification']['verified']): diff --git a/main.py b/main.py index 7abacda..eb74a27 100644 --- a/main.py +++ b/main.py @@ -433,25 +433,25 @@ def grade_lab(course_id: str, group_id: str, lab_id: str, request: GradeRequest) total_checks = len(check_runs) if lab_config['validation']: - valComm=lab_config['validation'].get('commits') + valComm=lab_config['validation'].get('commits') # geting validation rules for commits if valComm is not None: total_checks += len(valComm) - for chk in valComm: + for chk in valComm: # checking every rule from the list match chk.get('filter'): - case 'message': + case 'message': # substring check if grading.commits_substring_count(commits_resp.json(), chk['contains']) >= chk['min-count']: passed_count += 1 - case 'console': + case 'console': # local commits check if grading.commits_local_count(commits_resp.json()) >= chk['min-count']: passed_count += 1 - valIssu=lab_config['validation'].get('issues') + valIssu=lab_config['validation'].get('issues') # geting validation rules for issues if valIssu is not None: total_checks += len(valIssu) issues_resp = requests.get(f"https://api.github.com/repos/{org}/{repo_name}/issues") if issues_resp.json(): # issues are present - for chk in valIssu: - if grading.issues_substring_count(issues_resp.json(), chk['contains']) >= chk['min-count']: + for chk in valIssu: # checking every rule from the list + if grading.issues_substring_count(issues_resp.json(), chk['contains']) >= chk['min-count']: # substring check passed_count += 1 result_string = f"{passed_count}/{total_checks} тестов пройдено" From 9dfd501055cfedc3c02a27cda67877ee10b7d433 Mon Sep 17 00:00:00 2001 From: kaz3r <125219813+kaz3r@users.noreply.github.com> Date: Tue, 2 Sep 2025 07:59:33 +0300 Subject: [PATCH 4/4] fix --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index eb74a27..e62cd64 100644 --- a/main.py +++ b/main.py @@ -432,7 +432,7 @@ def grade_lab(course_id: str, group_id: str, lab_id: str, request: GradeRequest) total_checks = len(check_runs) - if lab_config['validation']: + if lab_config.get('validation'): valComm=lab_config['validation'].get('commits') # geting validation rules for commits if valComm is not None: total_checks += len(valComm)