PyKubeGrader 0.3.12__py3-none-any.whl → 0.3.14__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: PyKubeGrader
3
- Version: 0.3.12
3
+ Version: 0.3.14
4
4
  Summary: Add a short description here!
5
5
  Home-page: https://github.com/pyscaffold/pyscaffold/
6
6
  Author: jagar2
@@ -4,17 +4,17 @@ pykubegrader/initialize.py,sha256=Bwu1q18l18FB9lGppvt-L41D5gzr3S8t6zC0_UbrASw,39
4
4
  pykubegrader/telemetry.py,sha256=0Is-LhpVoKcEjmgqEjCfNLCKJVGAmJaQmD2VHF8KI9w,16396
5
5
  pykubegrader/utils.py,sha256=jlJklKvRhY3O7Hz2aaU1m0y3p_n9eMAXNnAF7LUEaPY,1275
6
6
  pykubegrader/validate.py,sha256=OKnItGyd-L8QPKcsE0KRuwBI_IxKiJzMLJKZiA2j3II,11184
7
- pykubegrader/build/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
8
- pykubegrader/build/api_notebook_builder.py,sha256=vSnBEgHglKjNqwwQnsY0VrWhkwc6q5soJuszNfyKz9o,25748
9
- pykubegrader/build/build_folder.py,sha256=UL5AzApDLRXD0EujHI5nsCbgaYo486SvL4_vYP_HsDE,87645
7
+ pykubegrader/build/__init__.py,sha256=GbGvLEBiHoWgoo0NWK5_NPw1osnGDninQ_uCAjlMucY,312
8
+ pykubegrader/build/api_notebook_builder.py,sha256=294rVGuJLaIPW8a6ClbgPVizNFpBxKxhqr-D3y-do6k,25748
9
+ pykubegrader/build/build_folder.py,sha256=lzbaW-yCGYz8RDYS12GZvzgTuO7qhATchAtbirupWsE,87645
10
10
  pykubegrader/build/clean_folder.py,sha256=8N0KyL4eXRs0DCw-V_2jR9igtFs_mOFMQufdL6tD-38,1323
11
11
  pykubegrader/build/collate.py,sha256=cVvF7tf2U3iiH4R_dbghTcieedIx5w3Fyw9L_llInM8,6754
12
12
  pykubegrader/build/markdown_questions.py,sha256=cSh8mkHK3hh-etJdgrZu9UQi1WPrKQtofkzLCUp1Z-w,4676
13
13
  pykubegrader/grade_reports/__grade_reports.py,sha256=n8H_n9jdZRSPn2zlIf-GQt_Y8w91p6M8ZbdVH76Sg5k,2303
14
14
  pykubegrader/grade_reports/assignments.py,sha256=I9NesLhwLelgqUekXfQCEGH-zTMAOjfb942eZYeh-Yo,7811
15
15
  pykubegrader/grade_reports/class_grade_report.py,sha256=9Uuvy-xoABtjTjv-05VYhmowebgTrgEFSgh1Grws-cQ,5078
16
- pykubegrader/grade_reports/grade_report.py,sha256=ugX0nojj8RdSmVluP9dbGl3B5W0OIb1AjTshDUrVSSs,16267
17
- pykubegrader/grade_reports/grading_config.py,sha256=o_68FrjOLQWqDzEptnA8p42zClLHyqEadAiaa9K2cm0,2374
16
+ pykubegrader/grade_reports/grade_report.py,sha256=_os3x9IpfTcSkIzxzsD06yldTqQu-N5io6VnlzFASoI,16963
17
+ pykubegrader/grade_reports/grading_config.py,sha256=BT85hObvSbietg6SCeHudphM-G2yVzWPS4XqzC0zSV0,2580
18
18
  pykubegrader/grade_reports/test.ipynb,sha256=NkMZHcfBd-uJw3i1Y9ux-epBP5GiVFEhda5wxEbK0cU,808
19
19
  pykubegrader/graders/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
20
20
  pykubegrader/graders/late_assignments.py,sha256=_2-rA5RqO0BWY9WAQA_mbCxxPKTOiJOl-byD2CYWaE0,1393
@@ -39,9 +39,9 @@ pykubegrader/widgets_base/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-
39
39
  pykubegrader/widgets_base/multi_select.py,sha256=WhpS7a8V3BOuEfEyFPzcDhMbgr7p1a4FFh_mKU1HLbI,4226
40
40
  pykubegrader/widgets_base/reading.py,sha256=ChUS3NOTa_HLtNpxR8hGX80LPKMvYMypnR6dFknfxus,5430
41
41
  pykubegrader/widgets_base/select.py,sha256=qP31bjTWIn8LEgKwtNUJbgJnum6P7bx6A_At-u1ivFk,2750
42
- PyKubeGrader-0.3.12.dist-info/LICENSE.txt,sha256=YTp-Ewc8Kems8PJEE27KnBPFnZSxoWvSg7nnknzPyYw,1546
43
- PyKubeGrader-0.3.12.dist-info/METADATA,sha256=7USplQzGd4_ZEtmIrZtZIoB3pI89kOLaPHvn_hWeWdw,2758
44
- PyKubeGrader-0.3.12.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
45
- PyKubeGrader-0.3.12.dist-info/entry_points.txt,sha256=RR57KvzDRJrP4omy5heS5cZ3E7g56YxcxJhDnp57ZU0,253
46
- PyKubeGrader-0.3.12.dist-info/top_level.txt,sha256=e550Klfze6higFxER1V62fnGOcIgiKRbsrl9CC4UdtQ,13
47
- PyKubeGrader-0.3.12.dist-info/RECORD,,
42
+ PyKubeGrader-0.3.14.dist-info/LICENSE.txt,sha256=YTp-Ewc8Kems8PJEE27KnBPFnZSxoWvSg7nnknzPyYw,1546
43
+ PyKubeGrader-0.3.14.dist-info/METADATA,sha256=V-63Jn1GT9fcURDnCllMN2yhYLkUslXm0GnnUb4X95A,2758
44
+ PyKubeGrader-0.3.14.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
45
+ PyKubeGrader-0.3.14.dist-info/entry_points.txt,sha256=RR57KvzDRJrP4omy5heS5cZ3E7g56YxcxJhDnp57ZU0,253
46
+ PyKubeGrader-0.3.14.dist-info/top_level.txt,sha256=e550Klfze6higFxER1V62fnGOcIgiKRbsrl9CC4UdtQ,13
47
+ PyKubeGrader-0.3.14.dist-info/RECORD,,
@@ -1 +1,10 @@
1
+ # Auto-generated __init__.py
1
2
 
3
+ from . import clean_folder
4
+ from . import api_notebook_builder
5
+ from . import collate
6
+ from . import build_folder
7
+ from . import passwords
8
+ from . import markdown_questions
9
+
10
+ __all__ = ['clean_folder', 'api_notebook_builder', 'collate', 'build_folder', 'passwords', 'markdown_questions']
@@ -204,7 +204,7 @@ class FastAPINotebookBuilder:
204
204
  max_question_points = self.get_max_question_points(cell_dict)
205
205
 
206
206
  # store the max points for the question
207
- self.max_question_points[f"{cell_dict["question"]}"] = max_question_points
207
+ self.max_question_points[f'{cell_dict["question"]}'] = max_question_points
208
208
 
209
209
  self.total_points += max_question_points
210
210
 
@@ -83,7 +83,7 @@ class NotebookProcessor:
83
83
  self.require_key = assignment.get("require_key", False)
84
84
  self.assignment_tag = assignment.get(
85
85
  "assignment_tag",
86
- f"week{assignment.get("week")}-{self.assignment_type}",
86
+ f'week{assignment.get("week")}-{self.assignment_type}',
87
87
  )
88
88
  else:
89
89
  self.assignment_type = self.assignment_tag.split("-")[0].lower()
@@ -10,8 +10,10 @@ from pykubegrader.grade_reports.grading_config import (
10
10
  optional_drop_week,
11
11
  exclude_from_running_avg,
12
12
  custom_grade_adjustments,
13
+ duplicated_scores,
13
14
  )
14
15
 
16
+
15
17
  import pandas as pd
16
18
  from datetime import datetime
17
19
  from IPython.display import display
@@ -29,7 +31,7 @@ class GradeReport:
29
31
  start_date (str, optional): The start date of the course. Defaults to "2025-01-06".
30
32
  verbose (bool, optional): Indicates if verbose output should be displayed. Defaults to True.
31
33
  """
32
- self.assignments, self.student_subs = get_assignments_submissions(params=params)
34
+ self.assignments, self.student_subs = get_assignments_submissions(params=params)
33
35
 
34
36
  self.start_date = start_date
35
37
  self.verbose = verbose
@@ -48,6 +50,7 @@ class GradeReport:
48
50
  self.calculate_grades()
49
51
  self.update_assignments_not_due_yet()
50
52
  self.calculate_grades()
53
+ self.duplicate_scores()
51
54
  self.drop_lowest_n_for_types(1)
52
55
  self.update_weekly_table()
53
56
  self._build_running_avg()
@@ -400,13 +403,26 @@ class GradeReport:
400
403
 
401
404
  # Exempt the lowest `n` assignments
402
405
  dropped = []
403
- i = -1
406
+ i = 0
407
+ j = 0
404
408
  while i < n:
405
- i += 1
406
- valid_assignments[i].exempted = True
407
- if valid_assignments[i].week in self.optional_drop_week:
409
+ valid_assignments[i+j].exempted = True
410
+ if valid_assignments[i+j].week in self.optional_drop_week:
411
+ j += 1
408
412
  continue
409
- dropped.append(valid_assignments[i])
410
- self.student_assignments_dropped.append(valid_assignments[i])
413
+ dropped.append(valid_assignments[i+j])
414
+ self.student_assignments_dropped.append(valid_assignments[i+j])
415
+ i += 1
411
416
 
412
417
  self.calculate_grades()
418
+
419
+ def duplicate_scores(self):
420
+ """Duplicate scores from one assignment to another"""
421
+
422
+ for (week, assignment_type), (duplicate_week, duplicate_assignment_type) in duplicated_scores:
423
+ assignment = self.get_graded_assignment(week, assignment_type)[0]
424
+ duplicate_assignment = self.get_graded_assignment(duplicate_week, duplicate_assignment_type)[0]
425
+ duplicate_assignment.score = assignment.score
426
+ duplicate_assignment._score = assignment._score
427
+ duplicate_assignment.exempted = assignment.exempted
428
+
@@ -22,7 +22,8 @@ custom_grade_adjustments = {
22
22
  ("lecture", 4): lambda score: 100.0 if score > 0 else 0.0,
23
23
  ("lecture", 5): lambda score: 100.0 if score > 0 else 0.0,
24
24
  ("lecture", 7): lambda score: 100.0,
25
- }
25
+ ("quiz", 7): lambda score: min(score, 100.0),
26
+ }
26
27
 
27
28
  # Exempted assignments, key is a tuple of assignment type and week
28
29
  globally_exempted_assignments = [
@@ -61,6 +62,9 @@ dropped_assignments = [
61
62
  "labattendance",
62
63
  ]
63
64
 
65
+ # Duplicated scores, a list of tuples of assignment types and weeks where the scores will be duplicated
66
+ duplicated_scores = [[(7, "lab"), (7, "homework")]]
67
+
64
68
  # TAs and other users to skip in class grade report
65
69
  skipped_users = ['JCA', 'jca92', 'cnp68', 'dak329', 'xz498', 'ag4328', 'rg897', 'jce63', 'qt49']
66
70