Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion config.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@
INFO_UNSUPPORTED_TEST = '[INFO] Unsupported Test'

# snarky comment control
SNARKY_SUBMISSION_CNT_THRESHHOLD = 0.9 # be snarky when score < 90%
SNARKY_SUBMISSION_CNT_THRESHHOLD = 0.9 # be snarky only when score < 90%
# see also: snarky_submission_comments.py

# cpp compilation config
CXX = 'g++'
Expand Down
2 changes: 2 additions & 0 deletions documentation/files.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

| file | description |
| ---- | ----------- |
| `config.py` | Constants that are more-or-less configurable. |
| `documentation/files.md` | descriptions of all files |
| `documentation/README.md` | links to documentation |
| `documentation/test_specifications.md` | documentation on the test specification format |
| `snarky_submission_comments.py` | configuration for snarky comments about the number of submissions |
| `support/c++/test_compiling.py` | helper methods for compiling c++ tests<br/>contains the method `compile_test(test: Attributes) -> Tuple[bool, str]` |
| `support/c++/test_running.py` | helper methods for running c++ tests<br/>contains the method `run_test(test: Attributes) -> PartialTestResult` |
| `support/c++/test_writing.py` | helper methods for writing c++ tests<br/>contains the method `write_test(test: Attributes) -> None` |
Expand Down
59 changes: 8 additions & 51 deletions run_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,22 @@

'''
TODO(pcr):
* move configuration stuff to configuration file (and let it be assignment-specific)
* enable assignment-specific configuration stuff
* refine attribute requirements
* add command line option to run a specific test or set of tests
* use @target attribute for coverage tests and some other test(s) that don't use it but could/should
'''

from typing import List, Dict, Any, Tuple
from os.path import exists as path_exists
import json
from argparse import ArgumentParser, Namespace
from config import DEFAULT_STDOUT_VISIBILITY, DEFAULT_VISIBILITY, OCTOTHORPE_LINE, OCTOTHORPE_WALL,\
SNARKY_SUBMISSION_CNT_THRESHHOLD
from config import (
DEFAULT_STDOUT_VISIBILITY,
DEFAULT_VISIBILITY,
OCTOTHORPE_LINE,
OCTOTHORPE_WALL,
SNARKY_SUBMISSION_CNT_THRESHHOLD)
from snarky_submission_comments import snarky_comment_about_number_of_submissions
from results import Result, TestResult
from test_parsing import read_tests
from attributes import Attributes
Expand Down Expand Up @@ -275,53 +279,6 @@ def main(args: Namespace) -> Result:
}
)

def snarky_comment_about_number_of_submissions(num_submissions: int) -> str:
'''
make a snarky comment based on their number of submissions
'''
comment = "I'm not even mad, that's amazing."
if num_submissions < 4:
comment = (
"That's OK. Make sure that you reflect on the feedback and think before you code. "
"Before making another submission, write test cases to reproduce the errors and then "
"use your favorite debugging technique to isolate and fix the errors. You can do it!")
elif num_submissions < 7:
comment = (
"You should take some time before your next submission to think about the errors and "
"how to fix them. Start by reproducing the errors with test cases locally.")
elif num_submissions < 10:
comment = (
"Why don't you take a break, take a walk, take nap, and come back to this "
"after you've had a chance to think a bit more. "
"Remember: start by reproducing the error, then isolate it and fix it.")
elif num_submissions < 15:
comment = (
"It looks like you're having difficulty finding and fixing your errors. "
"You should come to office hours. We can help you.")
elif num_submissions < 20:
comment = (
"If you haven't gone to office hours yet, you really should. "
"We want to help you. How's your coverage? You can't test what you don't cover.")
elif num_submissions < 30:
comment = (
"Did you know that you can not only compile locally, but you can also test locally? "
"You should try it.")
elif num_submissions < 40:
comment = (
"literally nobody: \n"
" you: autograder go brrr.")
elif num_submissions < 50:
comment = (
"I'm almost out of snarky ways to comment on how many submissions you've made. "
"That's how many submissions you've made.")
elif num_submissions < 75:
comment = (
"Big yikes. No cap, fam, take several seats. This ain't it, chief. "
"Your code and development process are sus AF. Periodt.")
elif num_submissions < 100:
comment = "Your number of submissions to this assignment is too damn high."
return comment + '\n'

def ordinal_suffix(number: int) -> str:
'''
determine the ordinal suffix for the given integer, e.g. 1st, 2nd, 3rd, 4th, etc.
Expand Down
80 changes: 80 additions & 0 deletions snarky_submission_comments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
'''
configuration for snarky comments about the number of submissions
'''

# the comment to make when the number of submissions exceeds all threshholds
ULTIMATE_COMMENT = "I'm not even mad, that's amazing."

# try to keep this in increasing order of threshhold
# but if you mess it up, there is a sort at the end which will fix it for you
SNARKY_SUBMISSION_COMMENTS = [
# upper submission threshhold, comment
(
4,
("That's OK. Make sure that you reflect on the feedback and think before you code. "
"Before making another submission, write test cases to reproduce the errors and then "
"use your favorite debugging technique to isolate and fix the errors. You can do it!")
),
(
7,
("You should take some time before your next submission to think about the errors and "
"how to fix them. Start by reproducing the errors with test cases locally.")
),
(
10,
("Why don't you take a break, take a walk, take nap, and come back to this "
"after you've had a chance to think a bit more. "
"Remember: start by reproducing the error, then isolate it and fix it.")
),
(
15,
("It looks like you're having difficulty finding and fixing your errors. "
"You should come to office hours. We can help you.")
),
(
20,
("If you haven't gone to office hours yet, you really should. "
"We want to help you. How's your coverage? You can't test what you don't cover.")
),
(
30,
("Did you know that you can not only compile locally, but you can also test locally? "
"You should try it.")
),
(
40,
("literally nobody: \n"
" you: autograder go brrr.")
),
(
50,
("I'm almost out of snarky ways to comment on how many submissions you've made. "
"That's how many submissions you've made.")
),
(
75,
("Big yikes. No cap, fam, take several seats. This ain't it, chief. "
"Your code and development process are sus AF. Periodt.")
),
(
100,
"Your number of submissions to this assignment is too damn high."
)
]

# sort the entries by ascending threshhold (just in case)
SNARKY_SUBMISSION_COMMENTS.sort(key=lambda t : t[0])

def snarky_comment_about_number_of_submissions(num_submissions: int) -> str:
"""make a snarky comment based on their number of submissions

Args:
num_submissions (int): the number of submissions (i.e. the number of this submission)

Returns:
str: a (snarky) comment about the number of submissions
"""
for submission_threshhold, comment in SNARKY_SUBMISSION_COMMENTS:
if num_submissions < submission_threshhold:
return comment + '\n'
return ULTIMATE_COMMENT + '\n'
27 changes: 27 additions & 0 deletions tests/test_snarky_submission_comments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""
tests for snarky_comment_about_number_of_submissions
"""
import unittest

from snarky_submission_comments import snarky_comment_about_number_of_submissions

class TestSnarkyComments(unittest.TestCase):
"""
tests for snarky_comment_about_number_of_submissions
"""
def test_snarky_comments(self):
"""
tests for snarky_comment_about_number_of_submissions
"""
self.assertTrue(snarky_comment_about_number_of_submissions(1).startswith('That\'s OK.'))
self.assertTrue(snarky_comment_about_number_of_submissions(3).startswith('That\'s OK.'))
self.assertTrue(
snarky_comment_about_number_of_submissions(4).startswith('You should take some time'))
self.assertEqual(
snarky_comment_about_number_of_submissions(99),
'Your number of submissions to this assignment is too damn high.\n'
)
self.assertEqual(
snarky_comment_about_number_of_submissions(100),
'I\'m not even mad, that\'s amazing.\n'
)