From 555c2ba5768ee46f52ed9c98dbe3109cd9511fde Mon Sep 17 00:00:00 2001 From: Chris Pyles Date: Thu, 3 Sep 2020 10:45:57 -0700 Subject: [PATCH 1/9] starting feature --- .gitignore | 3 ++- test/test-grade/notebooks/fails1.ipynb | 8 +++++++- test/test-grade/notebooks/fails1H.ipynb | 8 +++++++- test/test-grade/notebooks/fails1and3and6.ipynb | 8 +++++++- test/test-grade/notebooks/fails1and4.ipynb | 8 +++++++- test/test-grade/notebooks/fails2.ipynb | 8 +++++++- test/test-grade/notebooks/fails2and3and6H.ipynb | 8 +++++++- test/test-grade/notebooks/fails2and4.ipynb | 8 +++++++- test/test-grade/notebooks/fails2and6H.ipynb | 8 +++++++- test/test-grade/notebooks/fails3.ipynb | 8 +++++++- test/test-grade/notebooks/fails3and4.ipynb | 8 +++++++- test/test-grade/notebooks/fails4.ipynb | 8 +++++++- test/test-grade/notebooks/fails6.ipynb | 8 +++++++- test/test-grade/notebooks/fails6H.ipynb | 8 +++++++- test/test-grade/notebooks/passesAll.ipynb | 8 +++++++- 15 files changed, 100 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index dda125f8b..6a6451cda 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ docs/_build .Rhistory .ionide gs-testing-stuff -.mypy.cache \ No newline at end of file +.mypy.cache +.OTTER_LOG diff --git a/test/test-grade/notebooks/fails1.ipynb b/test/test-grade/notebooks/fails1.ipynb index b9000c605..b485ad227 100644 --- a/test/test-grade/notebooks/fails1.ipynb +++ b/test/test-grade/notebooks/fails1.ipynb @@ -122,7 +122,13 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails1H.ipynb b/test/test-grade/notebooks/fails1H.ipynb index 7aef79cc6..d4b61bb36 100644 --- a/test/test-grade/notebooks/fails1H.ipynb +++ b/test/test-grade/notebooks/fails1H.ipynb @@ -54,7 +54,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails1and3and6.ipynb b/test/test-grade/notebooks/fails1and3and6.ipynb index 06abdd469..69099660b 100644 --- a/test/test-grade/notebooks/fails1and3and6.ipynb +++ b/test/test-grade/notebooks/fails1and3and6.ipynb @@ -122,7 +122,13 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails1and4.ipynb b/test/test-grade/notebooks/fails1and4.ipynb index 5177f5bf0..ed32a1070 100644 --- a/test/test-grade/notebooks/fails1and4.ipynb +++ b/test/test-grade/notebooks/fails1and4.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails2.ipynb b/test/test-grade/notebooks/fails2.ipynb index 2f05d976a..aa23b050e 100644 --- a/test/test-grade/notebooks/fails2.ipynb +++ b/test/test-grade/notebooks/fails2.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails2and3and6H.ipynb b/test/test-grade/notebooks/fails2and3and6H.ipynb index 2b5a3b8d9..77cbc0153 100644 --- a/test/test-grade/notebooks/fails2and3and6H.ipynb +++ b/test/test-grade/notebooks/fails2and3and6H.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails2and4.ipynb b/test/test-grade/notebooks/fails2and4.ipynb index 6e04591f8..9baef4704 100644 --- a/test/test-grade/notebooks/fails2and4.ipynb +++ b/test/test-grade/notebooks/fails2and4.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails2and6H.ipynb b/test/test-grade/notebooks/fails2and6H.ipynb index 439ca9d4e..a37059d42 100644 --- a/test/test-grade/notebooks/fails2and6H.ipynb +++ b/test/test-grade/notebooks/fails2and6H.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails3.ipynb b/test/test-grade/notebooks/fails3.ipynb index 4dacf0931..bc265f43a 100644 --- a/test/test-grade/notebooks/fails3.ipynb +++ b/test/test-grade/notebooks/fails3.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails3and4.ipynb b/test/test-grade/notebooks/fails3and4.ipynb index f7c3fc3fd..091f3acbd 100644 --- a/test/test-grade/notebooks/fails3and4.ipynb +++ b/test/test-grade/notebooks/fails3and4.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails4.ipynb b/test/test-grade/notebooks/fails4.ipynb index f55bdc0c0..228663601 100644 --- a/test/test-grade/notebooks/fails4.ipynb +++ b/test/test-grade/notebooks/fails4.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails6.ipynb b/test/test-grade/notebooks/fails6.ipynb index 21a4be096..d557653f5 100644 --- a/test/test-grade/notebooks/fails6.ipynb +++ b/test/test-grade/notebooks/fails6.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/fails6H.ipynb b/test/test-grade/notebooks/fails6H.ipynb index f7d512d4f..e799bd73f 100644 --- a/test/test-grade/notebooks/fails6H.ipynb +++ b/test/test-grade/notebooks/fails6H.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", diff --git a/test/test-grade/notebooks/passesAll.ipynb b/test/test-grade/notebooks/passesAll.ipynb index fda485640..410bacee9 100644 --- a/test/test-grade/notebooks/passesAll.ipynb +++ b/test/test-grade/notebooks/passesAll.ipynb @@ -49,7 +49,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "otter": { + "tests": [ + "q2b" + ] + } + }, "outputs": [], "source": [ "def negate(x):\n", From cdb72cabf409b26f530482c49383e7b10f359967 Mon Sep 17 00:00:00 2001 From: Chris Pyles Date: Thu, 3 Sep 2020 10:46:12 -0700 Subject: [PATCH 2/9] added new test --- test/test-grade/tests/q2b.py | 39 ++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 test/test-grade/tests/q2b.py diff --git a/test/test-grade/tests/q2b.py b/test/test-grade/tests/q2b.py new file mode 100644 index 000000000..7f35ef294 --- /dev/null +++ b/test/test-grade/tests/q2b.py @@ -0,0 +1,39 @@ +test = { + "name": "q2b", + "points": 2, + "hidden": False, + "suites": [ + { + "cases": [ + { + "code": r""" + >>> negate([]) + Trues + """, + "hidden": False, + "locked": False, + }, + { + "code": r""" + >>> negate({}) + True + """, + "hidden": False, + "locked": False, + }, + { + "code": r""" + >>> negate([1]) + False + """, + "hidden": True, + "locked": False, + }, + ], + "scored": False, + "setup": "", + "teardown": "", + "type": "doctest" + } + ] +} \ No newline at end of file From 22927b7343196192956a9550c908e1593d5c4d1f Mon Sep 17 00:00:00 2001 From: Chris Pyles Date: Thu, 3 Sep 2020 13:44:39 -0700 Subject: [PATCH 3/9] fixing feature --- otter/execute/execute_notebook.py | 31 +++++++++++++++++++++++-------- test/test-grade/tests/q2b.py | 2 +- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/otter/execute/execute_notebook.py b/otter/execute/execute_notebook.py index 143ea80ce..ec89604f4 100644 --- a/otter/execute/execute_notebook.py +++ b/otter/execute/execute_notebook.py @@ -13,9 +13,11 @@ from IPython.core.inputsplitter import IPythonInputSplitter from .check_wrapper import CheckCallWrapper + from ..utils import hide_outputs IGNORE_CELL_TAG = "otter_ignore" +CELL_METADATA_KEY = "otter" def filter_ignored_cells(nb): """ @@ -34,7 +36,7 @@ def filter_ignored_cells(nb): metadata = cell.get("metadata", {}) tags = metadata.get("tags", []) - if IGNORE_CELL_TAG in tags: + if IGNORE_CELL_TAG in tags or metadata.get(CELL_METADATA_KEY, {}).get("ignore", False): del nb['cells'][i] return nb @@ -69,10 +71,14 @@ def execute_notebook(nb, secret='secret', initial_env=None, ignore_errors=False, # add display from IPython global_env["display"] = display + # add dummy Notebook class so that we can collect results w/out altering how the CheckCallWrapper + # needs to function + from ..check.notebook import Notebook + notebook_class_name = f"Notebook_{secret}" + global_env[notebook_class_name] = Notebook + source = "" - # if gradescope: - # source = "import sys\nsys.path.append(\"/autograder/submission\")\n" - # el + if cwd: source = f"import sys\nsys.path.append(r\"{cwd}\")\n" exec(source, global_env) @@ -83,6 +89,9 @@ def execute_notebook(nb, secret='secret', initial_env=None, ignore_errors=False, global_env["np"] = np global_env["random"] = random + if test_dir is None: + test_dir = "/home/tests" + # Before rewriting AST, find cells of code that generate errors. # One round of execution is done beforehand to mimic the Jupyter notebook style of running # (e.g. code runs up to the point of execution). @@ -115,10 +124,7 @@ def execute_notebook(nb, secret='secret', initial_env=None, ignore_errors=False, # if gradescope: # line = re.sub(r"otter\.Notebook\(.*?\)", "otter.Notebook(\"/autograder/submission/tests\")", line) # el - if test_dir: - line = re.sub(r"otter\.Notebook\(.*?\)", f"otter.Notebook(\"{test_dir}\")", line) - else: - line = re.sub(r"otter\.Notebook\(.*?\)", "otter.Notebook(\"/home/tests\")", line) + line = re.sub(r"otter\.Notebook\(.*?\)", f"otter.Notebook(\"{test_dir}\")", line) code_lines.append(line) if source_is_str_bool: code_lines.append('\n') @@ -137,6 +143,15 @@ def execute_notebook(nb, secret='secret', initial_env=None, ignore_errors=False, if not ignore_errors: raise + # add checks from metadata + otter_config = cell.get("metadata", {}).get(CELL_METADATA_KEY, {}) + check_results_list_name = f"check_results_{secret}" + if otter_config.get("tests", []): + tests = otter_config.get("tests", []) + for test in tests: + source += f"\n{check_results_list_name}.append({notebook_class_name}('{test_dir}').check('{test}'))\n" + + tree = ast.parse(source) # # CODE BELOW COMMENTED OUT BECAUSE the only check function is within the Notebook class # if find_check_assignment(tree) or find_check_definition(tree): diff --git a/test/test-grade/tests/q2b.py b/test/test-grade/tests/q2b.py index 7f35ef294..6978c8b84 100644 --- a/test/test-grade/tests/q2b.py +++ b/test/test-grade/tests/q2b.py @@ -8,7 +8,7 @@ { "code": r""" >>> negate([]) - Trues + True """, "hidden": False, "locked": False, From 6604041006497097949be379d3fbc09ed83bc125 Mon Sep 17 00:00:00 2001 From: Chris Pyles Date: Thu, 3 Sep 2020 13:53:49 -0700 Subject: [PATCH 4/9] finished feature --- .../final_grades_correct_notebooks.csv | 101 ------------------ .../final_grades_correct_script.csv | 101 ------------------ 2 files changed, 202 deletions(-) delete mode 100644 test/test-grade/final_grades_correct_notebooks.csv delete mode 100644 test/test-grade/final_grades_correct_script.csv diff --git a/test/test-grade/final_grades_correct_notebooks.csv b/test/test-grade/final_grades_correct_notebooks.csv deleted file mode 100644 index 756967822..000000000 --- a/test/test-grade/final_grades_correct_notebooks.csv +++ /dev/null @@ -1,101 +0,0 @@ -identifier,file,q1,q2,q3,q4,q5,total,possible -2,test-nb-2.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -11,test-nb-11.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -52,test-nb-52.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -9,test-nb-9.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -40,test-nb-40.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -55,test-nb-55.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -21,test-nb-21.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -95,test-nb-95.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -29,test-nb-29.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -14,test-nb-14.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -66,test-nb-66.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -22,test-nb-22.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -87,test-nb-87.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -74,test-nb-74.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -64,test-nb-64.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -86,test-nb-86.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -16,test-nb-16.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -35,test-nb-35.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -94,test-nb-94.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -12,test-nb-12.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -71,test-nb-71.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -31,test-nb-31.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -68,test-nb-68.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -75,test-nb-75.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -59,test-nb-59.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -38,test-nb-38.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -39,test-nb-39.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -78,test-nb-78.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -92,test-nb-92.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -58,test-nb-58.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -60,test-nb-60.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -83,test-nb-83.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -20,test-nb-20.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -32,test-nb-32.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -44,test-nb-44.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -57,test-nb-57.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -23,test-nb-23.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -0,test-nb-0.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -69,test-nb-69.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -1,test-nb-1.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -80,test-nb-80.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -85,test-nb-85.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -73,test-nb-73.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -42,test-nb-42.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -5,test-nb-5.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -67,test-nb-67.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -13,test-nb-13.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -51,test-nb-51.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -63,test-nb-63.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -3,test-nb-3.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -48,test-nb-48.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -28,test-nb-28.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -50,test-nb-50.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -53,test-nb-53.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -65,test-nb-65.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -93,test-nb-93.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -24,test-nb-24.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -47,test-nb-47.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -25,test-nb-25.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -82,test-nb-82.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -41,test-nb-41.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -70,test-nb-70.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -97,test-nb-97.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -37,test-nb-37.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -36,test-nb-36.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -90,test-nb-90.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -49,test-nb-49.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -62,test-nb-62.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -77,test-nb-77.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -56,test-nb-56.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -99,test-nb-99.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -7,test-nb-7.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -72,test-nb-72.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -17,test-nb-17.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -15,test-nb-15.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -30,test-nb-30.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -10,test-nb-10.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -43,test-nb-43.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -79,test-nb-79.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -46,test-nb-46.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -34,test-nb-34.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -89,test-nb-89.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -45,test-nb-45.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -96,test-nb-96.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -76,test-nb-76.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -88,test-nb-88.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -26,test-nb-26.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -4,test-nb-4.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -81,test-nb-81.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -33,test-nb-33.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -54,test-nb-54.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -18,test-nb-18.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -8,test-nb-8.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -84,test-nb-84.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -6,test-nb-6.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -19,test-nb-19.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -91,test-nb-91.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -27,test-nb-27.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -98,test-nb-98.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 -61,test-nb-61.ipynb,1.0,0.0,1.0,0.0,0.0,2.0,5 diff --git a/test/test-grade/final_grades_correct_script.csv b/test/test-grade/final_grades_correct_script.csv deleted file mode 100644 index d935ad804..000000000 --- a/test/test-grade/final_grades_correct_script.csv +++ /dev/null @@ -1,101 +0,0 @@ -identifier,file,q1,q2,q3,q4,q5,total,possible -71,file71.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -78,file78.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -12,file12.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -84,file84.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -76,file76.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -4,file4.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -28,file28.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -41,file41.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -54,file54.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -1,file1.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -18,file18.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -33,file33.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -62,file62.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -11,file11.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -81,file81.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -20,file20.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -93,file93.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -45,file45.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -70,file70.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -15,file15.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -90,file90.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -55,file55.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -73,file73.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -79,file79.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -31,file31.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -98,file98.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -58,file58.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -56,file56.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -7,file7.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -69,file69.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -75,file75.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -0,file0.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -67,file67.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -29,file29.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -34,file34.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -42,file42.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -25,file25.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -85,file85.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -9,file9.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -22,file22.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -24,file24.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -5,file5.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -68,file68.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -50,file50.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -65,file65.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -87,file87.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -37,file37.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -32,file32.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -83,file83.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -6,file6.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -8,file8.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -72,file72.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -51,file51.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -89,file89.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -99,file99.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -63,file63.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -3,file3.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -53,file53.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -46,file46.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -60,file60.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -94,file94.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -49,file49.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -21,file21.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -16,file16.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -48,file48.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -66,file66.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -57,file57.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -17,file17.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -10,file10.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -40,file40.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -74,file74.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -13,file13.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -47,file47.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -27,file27.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -97,file97.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -35,file35.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -95,file95.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -2,file2.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -44,file44.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -38,file38.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -23,file23.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -30,file30.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -59,file59.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -96,file96.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -52,file52.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -82,file82.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -19,file19.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -86,file86.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -26,file26.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -14,file14.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -77,file77.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -39,file39.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -36,file36.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -80,file80.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -43,file43.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -88,file88.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -92,file92.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -64,file64.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -91,file91.py,1.0,0.0,1.0,1.0,1.0,4.0,5 -61,file61.py,1.0,0.0,1.0,1.0,1.0,4.0,5 From 6463e0acec814a21cb3109c224330d58697c059a Mon Sep 17 00:00:00 2001 From: Chris Pyles Date: Mon, 7 Sep 2020 17:08:46 -0700 Subject: [PATCH 5/9] fixing gs docker restructure --- docs/changelog.md | 9 +++ docs/execution.md | 17 ++++++ otter/generate/autograder.py | 59 +++++++++++-------- otter/generate/templates/environment.yml | 12 ++++ otter/generate/templates/run_autograder | 32 ++-------- otter/generate/templates/run_otter.py | 30 ++++++++++ otter/generate/templates/setup.sh | 34 +++++++---- otter/grade/containers.py | 2 +- release.py | 2 - .../gs-autograder-correct/environment.yml | 12 ++++ .../gs-autograder-correct/run_autograder | 32 ++-------- .../run_otter.py} | 10 ++-- .../gs-autograder-correct/setup.sh | 36 ++++++----- .../pdf-autograder-correct/files/data.csv | 3 - .../pdf-autograder-correct/requirements.r | 6 -- .../pdf-autograder-correct/requirements.txt | 18 ------ .../pdf-autograder-correct/setup.sh | 43 -------------- .../pdf-autograder-correct/tests/q1.py | 11 ---- .../pdf-autograder-correct/tests/q3.py | 9 --- .../pdf-autograder-correct/tests/q8.py | 12 ---- .../r-autograder-correct/files/data.csv | 3 - .../r-autograder-correct/requirements.r | 6 -- .../r-autograder-correct/requirements.txt | 18 ------ .../test-assign/r-autograder-correct/setup.sh | 43 -------------- .../r-autograder-correct/tests/q1.R | 36 ----------- .../r-autograder-correct/tests/q3.R | 28 --------- .../r-autograder-correct/tests/q8.R | 33 ----------- .../rmd-autograder-correct/environment.yml | 12 ++++ .../rmd-autograder-correct/run_autograder | 32 ++-------- .../run_otter.py} | 4 +- .../rmd-autograder-correct/setup.sh | 36 ++++++----- test/test_assign.py | 25 ++++---- .../autograder-correct/environment.yml | 12 ++++ .../autograder-correct/run_autograder | 32 ++-------- .../autograder-correct/run_otter.py | 30 ++++++++++ .../autograder-correct/setup.sh | 36 ++++++----- 36 files changed, 299 insertions(+), 476 deletions(-) create mode 100644 otter/generate/templates/environment.yml create mode 100644 otter/generate/templates/run_otter.py create mode 100644 test/test-assign/gs-autograder-correct/environment.yml rename test/test-assign/{pdf-autograder-correct/run_autograder => gs-autograder-correct/run_otter.py} (78%) delete mode 100644 test/test-assign/pdf-autograder-correct/files/data.csv delete mode 100644 test/test-assign/pdf-autograder-correct/requirements.r delete mode 100644 test/test-assign/pdf-autograder-correct/requirements.txt delete mode 100644 test/test-assign/pdf-autograder-correct/setup.sh delete mode 100644 test/test-assign/pdf-autograder-correct/tests/q1.py delete mode 100644 test/test-assign/pdf-autograder-correct/tests/q3.py delete mode 100644 test/test-assign/pdf-autograder-correct/tests/q8.py delete mode 100644 test/test-assign/r-autograder-correct/files/data.csv delete mode 100644 test/test-assign/r-autograder-correct/requirements.r delete mode 100644 test/test-assign/r-autograder-correct/requirements.txt delete mode 100644 test/test-assign/r-autograder-correct/setup.sh delete mode 100644 test/test-assign/r-autograder-correct/tests/q1.R delete mode 100644 test/test-assign/r-autograder-correct/tests/q3.R delete mode 100644 test/test-assign/r-autograder-correct/tests/q8.R create mode 100644 test/test-assign/rmd-autograder-correct/environment.yml rename test/test-assign/{r-autograder-correct/run_autograder => rmd-autograder-correct/run_otter.py} (89%) create mode 100644 test/test_generate/test-autograder/autograder-correct/environment.yml create mode 100644 test/test_generate/test-autograder/autograder-correct/run_otter.py diff --git a/docs/changelog.md b/docs/changelog.md index 2d4c06174..3ef45fa0c 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,14 @@ # Changelog +**v1.0.2:** + +* Moved Gradescope grading to inside conda env within container due to change in Gradescope's grading image +* Added ability to specify additional tests to be run in cell metadata without need of explicit `Notebook.check` cells + +**v1.0.1:** + +* Fixed bug with specification of overwriting requirements in Otter Generate + **v1.0.0:** * Changed structure of CLI into six main commands: `otter assign`, `otter check`, `otter export`, `otter generate`, `otter grade`, and `otter service` diff --git a/docs/execution.md b/docs/execution.md index 1bda388aa..b2f01986e 100644 --- a/docs/execution.md +++ b/docs/execution.md @@ -20,6 +20,7 @@ If students are submitting IPython notebooks (`.ipynb` files), they are executed
  • The code lines are run through an IPython.core.inputsplitter.IPythonInputSplitter
  • The string is run in the dummy environment with otter.Notebook.export and otter.Notebook._log_event patched so that they don't run
  • If the run was successful, the cell contents are added to a collection string. If it fails, the error is ignored unless otherwise indicated.
  • +
  • If the cell has metadata indicating that a check should be run after that cell, the code for the check is added.
  • The collection string is turned into an abstract syntax tree that is then transformed so that all calls of any form to otter.Notebook.check have their return values appended to a prenamed list which is in the dummy environemnt.
  • @@ -30,6 +31,22 @@ If students are submitting IPython notebooks (`.ipynb` files), they are executed The grades for each test are then collected from the list to which they were appended in the dummy environment and any additional tests are run against this resulting environment. Running in this manner has one main advantage: it is robust to variable name collisions. If two tests rely on a variable of the same name, they will not be stymied by the variable being changed between the tests, because the results for one test are collected from when that check is called rather than being run at the end of execution. +It is also possible to specify tests to run in the cell metadata without the need of explicit calls to `Notebook.check`. To do so, add an `otter` field to the cell metadata with the following structure: + +```json +{ + "otter": { + "tests": [ + "q1", + "q2", + "etc." + ] + } +} +``` + +The strings within `tests` should correspond to filenames within the tests directory (without the `.py` extension) as would be passed to `Notebook.check`. Inserting this into the cell metadata will cause Otter to insert a call to a covertly imported `Notebook` instance with the correct filename and collect the results _at that point of execution_, allowing for robustness to variable name collisions without explicit calls to `Notebook.check`. _Note that these tests are not currently seen by any checks in the notebook, so a call to `Notebook.check_all` will not include the results of these tests._ + ## Scripts If students are submitting Python scripts, they are executed as follows: diff --git a/otter/generate/autograder.py b/otter/generate/autograder.py index 978a8425c..bfab4f0a5 100644 --- a/otter/generate/autograder.py +++ b/otter/generate/autograder.py @@ -15,23 +15,16 @@ from .token import APIClient TEMPLATES_DIR = pkg_resources.resource_filename(__name__, "templates") -SETUP_SH_PATH = os.path.join(TEMPLATES_DIR, "setup.sh") -PYTHON_REQUIREMENTS_PATH = os.path.join(TEMPLATES_DIR, "requirements.txt") -R_REQUIREMENTS_PATH = os.path.join(TEMPLATES_DIR, "requirements.r") -RUN_AUTOGRADER_PATH = os.path.join(TEMPLATES_DIR, "run_autograder") -MINICONDA_INSTALL_URL = "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" - -with open(SETUP_SH_PATH) as f: - SETUP_SH = Template(f.read()) - -with open(PYTHON_REQUIREMENTS_PATH) as f: - PYTHON_REQUIREMENTS = Template(f.read()) - -with open(R_REQUIREMENTS_PATH) as f: - R_REQUIREMENTS = Template(f.read()) - -with open(RUN_AUTOGRADER_PATH) as f: - RUN_AUTOGRADER = Template(f.read()) +MINICONDA_INSTALL_URL = "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-x86_64.sh" +OTTER_ENV_NAME = "otter-gradescope-env" +TEMPLATE_FILE_PATHS = { + "setup.sh": os.path.join(TEMPLATES_DIR, "setup.sh"), + "requirements.txt": os.path.join(TEMPLATES_DIR, "requirements.txt"), + "requirements.r": os.path.join(TEMPLATES_DIR, "requirements.r"), + "run_autograder": os.path.join(TEMPLATES_DIR, "run_autograder"), + "run_otter.py": os.path.join(TEMPLATES_DIR, "run_otter.py"), + "environment.yml": os.path.join(TEMPLATES_DIR, "environment.yml"), +} def main(args): """ @@ -53,8 +46,13 @@ def main(args): args.lang = args.lang.lower() assert args.lang.lower() in ["python", "r"], f"{args.lang} is not a supported language" + templates = {} + for fn, fp in TEMPLATE_FILE_PATHS.items(): + with open(fp) as f: + templates[fn] = Template(f.read()) + # format run_autograder - run_autograder = RUN_AUTOGRADER.render( + run_otter_py = templates["run_otter.py"].render( threshold = str(args.threshold), points = str(args.points), show_stdout = str(args.show_stdout), @@ -72,11 +70,20 @@ def main(args): autograder_dir = str(args.autograder_dir), ) + run_autograder = templates["run_autograder"].render( + autograder_dir = str(args.autograder_dir), + ) + # format setup.sh - setup_sh = SETUP_SH.render( + setup_sh = templates["setup.sh"].render( autograder_dir = str(args.autograder_dir), miniconda_install_url = MINICONDA_INSTALL_URL, ottr_branch = "stable", + otter_env_name = OTTER_ENV_NAME, + ) + + environment_yml = templates["environment.yml"].render( + otter_env_name = OTTER_ENV_NAME, ) # create tmp directory to zip inside @@ -97,7 +104,7 @@ def main(args): f = open(os.devnull) # render the templates - python_requirements = PYTHON_REQUIREMENTS.render( + python_requirements = templates["requirements.txt"].render( other_requirements = f.read() if args.lang.lower() == "python" else "", overwrite_requirements = args.lang.lower() == "python" and args.overwrite_requirements ) @@ -105,7 +112,7 @@ def main(args): # reset the stream f.seek(0) - r_requirements = R_REQUIREMENTS.render( + r_requirements = templates["requirements.r"].render( other_requirements = f.read() if args.lang.lower() == "r" else "", overwrite_requirements = args.lang.lower() == "python" and args.overwrite_requirements @@ -132,6 +139,12 @@ def main(args): with open(os.path.join(os.getcwd(), "tmp", "run_autograder"), "w+") as f: f.write(run_autograder) + with open(os.path.join(os.getcwd(), "tmp", "run_otter.py"), "w+") as f: + f.write(run_otter_py) + + with open(os.path.join(os.getcwd(), "tmp", "environment.yml"), "w+") as f: + f.write(environment_yml) + # copy files into tmp if len(args.files) > 0: os.mkdir(os.path.join("tmp", "files")) @@ -158,8 +171,8 @@ def main(args): if os.path.exists(zip_path): os.remove(zip_path) - zip_cmd = ["zip", "-r", zip_path, "run_autograder", "requirements.r", - "setup.sh", "requirements.txt", "tests"] + zip_cmd = ["zip", "-r", zip_path, "run_autograder", "run_otter.py", "requirements.r", + "setup.sh", "requirements.txt", "environment.yml", "tests"] if r_requirements: zip_cmd += ["requirements.r"] diff --git a/otter/generate/templates/environment.yml b/otter/generate/templates/environment.yml new file mode 100644 index 000000000..18a12dd7b --- /dev/null +++ b/otter/generate/templates/environment.yml @@ -0,0 +1,12 @@ +name: {{ otter_env_name }} +channels: + - defaults + - conda-forge +dependencies: + - python=3.7 + - pip + - r-base + - r-essentials + - r-devtools + - pip: + - -r requirements.txt diff --git a/otter/generate/templates/run_autograder b/otter/generate/templates/run_autograder index 32e941ff3..fa7fbd84b 100644 --- a/otter/generate/templates/run_autograder +++ b/otter/generate/templates/run_autograder @@ -1,28 +1,6 @@ -#!/usr/bin/env python3 +#!/usr/bin/env bash -import os -import subprocess - -from otter.generate.run_autograder import main as run_autograder - -config = { - "score_threshold": {{ threshold }}, - "points_possible": {{ points }}, - "show_stdout_on_release": {{ show_stdout }}, - "show_hidden_tests_on_release": {{ show_hidden }}, - "seed": {{ seed }}, - "grade_from_log": {{ grade_from_log }}, - "serialized_variables": {{ serialized_variables }}, - "public_multiplier": {{ public_multiplier }}, - "token": {% if token %}'{{ token }}'{% else %}None{% endif %}, - "course_id": '{{ course_id }}', - "assignment_id": '{{ assignment_id }}', - "filtering": {{ filtering }}, - "pagebreaks": {{ pagebreaks }}, - "debug": False, - "autograder_dir": '{{ autograder_dir }}', - "lang": '{{ lang }}', -} - -if __name__ == "__main__": - run_autograder(config) +export PATH="/root/miniconda3/bin:$PATH" +source /root/miniconda3/etc/profile.d/conda.sh +conda activate otter-gradescope-env +python {{ autograder_dir }}/source/run_otter.py diff --git a/otter/generate/templates/run_otter.py b/otter/generate/templates/run_otter.py new file mode 100644 index 000000000..177029b1f --- /dev/null +++ b/otter/generate/templates/run_otter.py @@ -0,0 +1,30 @@ +""" +Runs Otter on Gradescope with the configurations specified below +""" + +import os +import subprocess + +from otter.generate.run_autograder import main as run_autograder + +config = { + "score_threshold": {{ threshold }}, + "points_possible": {{ points }}, + "show_stdout_on_release": {{ show_stdout }}, + "show_hidden_tests_on_release": {{ show_hidden }}, + "seed": {{ seed }}, + "grade_from_log": {{ grade_from_log }}, + "serialized_variables": {{ serialized_variables }}, + "public_multiplier": {{ public_multiplier }}, + "token": {% if token %}'{{ token }}'{% else %}None{% endif %}, + "course_id": '{{ course_id }}', + "assignment_id": '{{ assignment_id }}', + "filtering": {{ filtering }}, + "pagebreaks": {{ pagebreaks }}, + "debug": False, + "autograder_dir": '{{ autograder_dir }}', + "lang": '{{ lang }}', +} + +if __name__ == "__main__": + run_autograder(config) diff --git a/otter/generate/templates/setup.sh b/otter/generate/templates/setup.sh index e5bd0fdb3..a69db8bc8 100644 --- a/otter/generate/templates/setup.sh +++ b/otter/generate/templates/setup.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -apt-get clean -apt-get update -apt-get install -y python3.7 python3-pip python3.7-dev +# apt-get clean +# apt-get update +# apt-get install -y python3.7 python3-pip python3.7-dev apt-get clean apt-get update @@ -13,11 +13,11 @@ apt-get install -y texlive-xetex texlive-fonts-recommended texlive-generic-recom wget --quiet -O /tmp/wkhtmltopdf.deb https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb apt-get install -y /tmp/wkhtmltopdf.deb -update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 +# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 apt-get clean apt-get update -apt-get install -y install build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev +apt-get install -y build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev # install conda wget -nv -O {{ autograder_dir }}/source/miniconda_install.sh "{{ miniconda_install_url }}" @@ -28,16 +28,24 @@ echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc export PATH=/root/miniconda3/bin:$PATH export TAR="/bin/tar" -# install R dependencies -conda install --yes r-base r-essentials -conda install --yes r-devtools -c conda-forge +# # install R dependencies +# conda install --yes r-base r-essentials +# conda install --yes r-devtools -c conda-forge + +# # install requirements +# pip3 install -r {{ autograder_dir }}/source/requirements.txt +# pip install -r {{ autograder_dir }}/source/requirements.txt +# Rscript {{ autograder_dir }}/source/requirements.r + +# install dependencies with conda +conda env create -f {{ autograder_dir }}/source/environment.yml +conda run -n {{ otter_env_name }} Rscript {{ autograder_dir }}/source/requirements.r -# install requirements -pip3 install -r {{ autograder_dir }}/source/requirements.txt -pip install -r {{ autograder_dir }}/source/requirements.txt -Rscript {{ autograder_dir }}/source/requirements.r +# set conda shell +conda init --all # install ottr; not sure why it needs to happen twice but whatever git clone --single-branch -b {{ ottr_branch }} https://github.com/ucbds-infra/ottr.git {{ autograder_dir }}/source/ottr cd {{ autograder_dir }}/source/ottr -Rscript -e "devtools::install()" || Rscript -e "devtools::install()" +conda run -n {{ otter_env_name }} Rscript -e "devtools::install\\(\\)" +conda run -n {{ otter_env_name }} Rscript -e "devtools::install\\(\\)" diff --git a/otter/grade/containers.py b/otter/grade/containers.py index 355021054..f0ebb20b3 100644 --- a/otter/grade/containers.py +++ b/otter/grade/containers.py @@ -201,7 +201,7 @@ def grade_assignments(tests_dir, notebooks_dir, id, image="ucbdsinfra/otter-grad print(f"Grading {('notebooks', 'scripts')[scripts]} in container {container_id}...") # Now we have the notebooks in home/notebooks, we should tell the container to execute the grade command... - grade_command = ["python", "-m", "otter.grade", "/home/notebooks"] + grade_command = ["python3", "-m", "otter.grade", "/home/notebooks"] # if we want PDF output, add the necessary flag if pdfs: diff --git a/release.py b/release.py index fac9a0ecf..434746780 100644 --- a/release.py +++ b/release.py @@ -12,8 +12,6 @@ "test/test_generate/test-autograder/autograder-correct/requirements.txt", "test/test_generate/test-run-autograder/autograder-correct/source/requirements.txt", "test/test-assign/gs-autograder-correct/requirements.txt", - "test/test-assign/pdf-autograder-correct/requirements.txt", - "test/test-assign/r-autograder-correct/requirements.txt", "test/test-assign/rmd-autograder-correct/requirements.txt", ] diff --git a/test/test-assign/gs-autograder-correct/environment.yml b/test/test-assign/gs-autograder-correct/environment.yml new file mode 100644 index 000000000..ab26dbdad --- /dev/null +++ b/test/test-assign/gs-autograder-correct/environment.yml @@ -0,0 +1,12 @@ +name: otter-gradescope-env +channels: + - defaults + - conda-forge +dependencies: + - python=3.7 + - pip + - r-base + - r-essentials + - r-devtools + - pip: + - -r requirements.txt \ No newline at end of file diff --git a/test/test-assign/gs-autograder-correct/run_autograder b/test/test-assign/gs-autograder-correct/run_autograder index 0dcf5196d..cd0464ddd 100644 --- a/test/test-assign/gs-autograder-correct/run_autograder +++ b/test/test-assign/gs-autograder-correct/run_autograder @@ -1,28 +1,6 @@ -#!/usr/bin/env python3 +#!/usr/bin/env bash -import os -import subprocess - -from otter.generate.run_autograder import main as run_autograder - -config = { - "score_threshold": None, - "points_possible": None, - "show_stdout_on_release": True, - "show_hidden_tests_on_release": True, - "seed": 42, - "grade_from_log": False, - "serialized_variables": {}, - "public_multiplier": 0, - "token": 'token', - "course_id": '123', - "assignment_id": '567', - "filtering": True, - "pagebreaks": True, - "debug": False, - "autograder_dir": '/autograder', - "lang": 'python', -} - -if __name__ == "__main__": - run_autograder(config) \ No newline at end of file +export PATH="/root/miniconda3/bin:$PATH" +source /root/miniconda3/etc/profile.d/conda.sh +conda activate otter-gradescope-env +python /autograder/source/run_otter.py \ No newline at end of file diff --git a/test/test-assign/pdf-autograder-correct/run_autograder b/test/test-assign/gs-autograder-correct/run_otter.py similarity index 78% rename from test/test-assign/pdf-autograder-correct/run_autograder rename to test/test-assign/gs-autograder-correct/run_otter.py index a56b91ed5..c110c6161 100644 --- a/test/test-assign/pdf-autograder-correct/run_autograder +++ b/test/test-assign/gs-autograder-correct/run_otter.py @@ -1,4 +1,6 @@ -#!/usr/bin/env python3 +""" +Runs Otter on Gradescope with the configurations specified below +""" import os import subprocess @@ -14,9 +16,9 @@ "grade_from_log": False, "serialized_variables": {}, "public_multiplier": 0, - "token": None, - "course_id": 'None', - "assignment_id": 'None', + "token": 'token', + "course_id": '123', + "assignment_id": '567', "filtering": True, "pagebreaks": True, "debug": False, diff --git a/test/test-assign/gs-autograder-correct/setup.sh b/test/test-assign/gs-autograder-correct/setup.sh index d9a70c8fe..6e1f18dc5 100644 --- a/test/test-assign/gs-autograder-correct/setup.sh +++ b/test/test-assign/gs-autograder-correct/setup.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -apt-get clean -apt-get update -apt-get install -y python3.7 python3-pip python3.7-dev +# apt-get clean +# apt-get update +# apt-get install -y python3.7 python3-pip python3.7-dev apt-get clean apt-get update @@ -13,14 +13,14 @@ apt-get install -y texlive-xetex texlive-fonts-recommended texlive-generic-recom wget --quiet -O /tmp/wkhtmltopdf.deb https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb apt-get install -y /tmp/wkhtmltopdf.deb -update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 +# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 apt-get clean apt-get update -apt-get install -y install build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev +apt-get install -y build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev # install conda -wget -nv -O /autograder/source/miniconda_install.sh "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" +wget -nv -O /autograder/source/miniconda_install.sh "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-x86_64.sh" chmod +x /autograder/source/miniconda_install.sh /autograder/source/miniconda_install.sh -b echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc @@ -28,16 +28,24 @@ echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc export PATH=/root/miniconda3/bin:$PATH export TAR="/bin/tar" -# install R dependencies -conda install --yes r-base r-essentials -conda install --yes r-devtools -c conda-forge +# # install R dependencies +# conda install --yes r-base r-essentials +# conda install --yes r-devtools -c conda-forge + +# # install requirements +# pip3 install -r /autograder/source/requirements.txt +# pip install -r /autograder/source/requirements.txt +# Rscript /autograder/source/requirements.r + +# install dependencies with conda +conda env create -f /autograder/source/environment.yml +conda run -n otter-gradescope-env Rscript /autograder/source/requirements.r -# install requirements -pip3 install -r /autograder/source/requirements.txt -pip install -r /autograder/source/requirements.txt -Rscript /autograder/source/requirements.r +# set conda shell +conda init --all # install ottr; not sure why it needs to happen twice but whatever git clone --single-branch -b stable https://github.com/ucbds-infra/ottr.git /autograder/source/ottr cd /autograder/source/ottr -Rscript -e "devtools::install()" || Rscript -e "devtools::install()" \ No newline at end of file +conda run -n otter-gradescope-env Rscript -e "devtools::install\\(\\)" +conda run -n otter-gradescope-env Rscript -e "devtools::install\\(\\)" \ No newline at end of file diff --git a/test/test-assign/pdf-autograder-correct/files/data.csv b/test/test-assign/pdf-autograder-correct/files/data.csv deleted file mode 100644 index efb98239f..000000000 --- a/test/test-assign/pdf-autograder-correct/files/data.csv +++ /dev/null @@ -1,3 +0,0 @@ -a,b,c -1,2,3 -4,5,6 \ No newline at end of file diff --git a/test/test-assign/pdf-autograder-correct/requirements.r b/test/test-assign/pdf-autograder-correct/requirements.r deleted file mode 100644 index 91b1ecc46..000000000 --- a/test/test-assign/pdf-autograder-correct/requirements.r +++ /dev/null @@ -1,6 +0,0 @@ - -install.packages(c( - "usethis", - "testthat", - "startup" -), repos="http://cran.us.r-project.org") diff --git a/test/test-assign/pdf-autograder-correct/requirements.txt b/test/test-assign/pdf-autograder-correct/requirements.txt deleted file mode 100644 index 410d36ed0..000000000 --- a/test/test-assign/pdf-autograder-correct/requirements.txt +++ /dev/null @@ -1,18 +0,0 @@ -datascience -jupyter_client -ipykernel -matplotlib -pandas -ipywidgets -scipy -seaborn -sklearn -jinja2 -nbconvert -nbformat -dill -rpy2 -jupytext -numpy==1.16.0 -tornado==5.1.1 -otter-grader==1.0.1 diff --git a/test/test-assign/pdf-autograder-correct/setup.sh b/test/test-assign/pdf-autograder-correct/setup.sh deleted file mode 100644 index d9a70c8fe..000000000 --- a/test/test-assign/pdf-autograder-correct/setup.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env bash - -apt-get clean -apt-get update -apt-get install -y python3.7 python3-pip python3.7-dev - -apt-get clean -apt-get update -apt-get install -y pandoc -apt-get install -y texlive-xetex texlive-fonts-recommended texlive-generic-recommended - -# install wkhtmltopdf -wget --quiet -O /tmp/wkhtmltopdf.deb https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb -apt-get install -y /tmp/wkhtmltopdf.deb - -update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 - -apt-get clean -apt-get update -apt-get install -y install build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev - -# install conda -wget -nv -O /autograder/source/miniconda_install.sh "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" -chmod +x /autograder/source/miniconda_install.sh -/autograder/source/miniconda_install.sh -b -echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc - -export PATH=/root/miniconda3/bin:$PATH -export TAR="/bin/tar" - -# install R dependencies -conda install --yes r-base r-essentials -conda install --yes r-devtools -c conda-forge - -# install requirements -pip3 install -r /autograder/source/requirements.txt -pip install -r /autograder/source/requirements.txt -Rscript /autograder/source/requirements.r - -# install ottr; not sure why it needs to happen twice but whatever -git clone --single-branch -b stable https://github.com/ucbds-infra/ottr.git /autograder/source/ottr -cd /autograder/source/ottr -Rscript -e "devtools::install()" || Rscript -e "devtools::install()" \ No newline at end of file diff --git a/test/test-assign/pdf-autograder-correct/tests/q1.py b/test/test-assign/pdf-autograder-correct/tests/q1.py deleted file mode 100644 index 81c6ec0c9..000000000 --- a/test/test-assign/pdf-autograder-correct/tests/q1.py +++ /dev/null @@ -1,11 +0,0 @@ -test = { 'name': 'q1', - 'points': 2, - 'suites': [ { 'cases': [ {'code': '>>> isinstance(x, int)\nTrue', 'hidden': False, 'locked': False}, - {'code': '>>> None\n', 'hidden': False, 'locked': False}, - {'code': '>>> 0 < x < 100\nTrue', 'hidden': False, 'locked': False}, - {'code': '>>> x\n2', 'hidden': True, 'locked': False}, - {'code': ">>> str(print(x))\n2\n'None'", 'hidden': True, 'locked': False}], - 'scored': True, - 'setup': '', - 'teardown': '', - 'type': 'doctest'}]} diff --git a/test/test-assign/pdf-autograder-correct/tests/q3.py b/test/test-assign/pdf-autograder-correct/tests/q3.py deleted file mode 100644 index 5abffa3be..000000000 --- a/test/test-assign/pdf-autograder-correct/tests/q3.py +++ /dev/null @@ -1,9 +0,0 @@ -test = { 'name': 'q3', - 'points': 1, - 'suites': [ { 'cases': [ {'code': '>>> nine\n9', 'hidden': False, 'locked': False}, - {'code': '>>> square(16)\n256', 'hidden': False, 'locked': False}, - {'code': '>>> square(1)\n1', 'hidden': True, 'locked': False}], - 'scored': True, - 'setup': '', - 'teardown': '', - 'type': 'doctest'}]} diff --git a/test/test-assign/pdf-autograder-correct/tests/q8.py b/test/test-assign/pdf-autograder-correct/tests/q8.py deleted file mode 100644 index eef055468..000000000 --- a/test/test-assign/pdf-autograder-correct/tests/q8.py +++ /dev/null @@ -1,12 +0,0 @@ -test = { 'name': 'q8', - 'points': 1, - 'suites': [ { 'cases': [ {'code': '>>> len(z) == 10\nTrue', 'hidden': False, 'locked': False}, - { 'code': '>>> np.allclose(z, [3.07316461, 3.06854049, 4.48392454, 0.17343951, 0.55016433,\n' - '... 2.87542494, 1.97433776, 4.62849467, 2.18395185, 1.1753926 ])\n' - 'False', - 'hidden': True, - 'locked': False}], - 'scored': True, - 'setup': '', - 'teardown': '', - 'type': 'doctest'}]} diff --git a/test/test-assign/r-autograder-correct/files/data.csv b/test/test-assign/r-autograder-correct/files/data.csv deleted file mode 100644 index efb98239f..000000000 --- a/test/test-assign/r-autograder-correct/files/data.csv +++ /dev/null @@ -1,3 +0,0 @@ -a,b,c -1,2,3 -4,5,6 \ No newline at end of file diff --git a/test/test-assign/r-autograder-correct/requirements.r b/test/test-assign/r-autograder-correct/requirements.r deleted file mode 100644 index 91b1ecc46..000000000 --- a/test/test-assign/r-autograder-correct/requirements.r +++ /dev/null @@ -1,6 +0,0 @@ - -install.packages(c( - "usethis", - "testthat", - "startup" -), repos="http://cran.us.r-project.org") diff --git a/test/test-assign/r-autograder-correct/requirements.txt b/test/test-assign/r-autograder-correct/requirements.txt deleted file mode 100644 index 410d36ed0..000000000 --- a/test/test-assign/r-autograder-correct/requirements.txt +++ /dev/null @@ -1,18 +0,0 @@ -datascience -jupyter_client -ipykernel -matplotlib -pandas -ipywidgets -scipy -seaborn -sklearn -jinja2 -nbconvert -nbformat -dill -rpy2 -jupytext -numpy==1.16.0 -tornado==5.1.1 -otter-grader==1.0.1 diff --git a/test/test-assign/r-autograder-correct/setup.sh b/test/test-assign/r-autograder-correct/setup.sh deleted file mode 100644 index d9a70c8fe..000000000 --- a/test/test-assign/r-autograder-correct/setup.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env bash - -apt-get clean -apt-get update -apt-get install -y python3.7 python3-pip python3.7-dev - -apt-get clean -apt-get update -apt-get install -y pandoc -apt-get install -y texlive-xetex texlive-fonts-recommended texlive-generic-recommended - -# install wkhtmltopdf -wget --quiet -O /tmp/wkhtmltopdf.deb https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb -apt-get install -y /tmp/wkhtmltopdf.deb - -update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 - -apt-get clean -apt-get update -apt-get install -y install build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev - -# install conda -wget -nv -O /autograder/source/miniconda_install.sh "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" -chmod +x /autograder/source/miniconda_install.sh -/autograder/source/miniconda_install.sh -b -echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc - -export PATH=/root/miniconda3/bin:$PATH -export TAR="/bin/tar" - -# install R dependencies -conda install --yes r-base r-essentials -conda install --yes r-devtools -c conda-forge - -# install requirements -pip3 install -r /autograder/source/requirements.txt -pip install -r /autograder/source/requirements.txt -Rscript /autograder/source/requirements.r - -# install ottr; not sure why it needs to happen twice but whatever -git clone --single-branch -b stable https://github.com/ucbds-infra/ottr.git /autograder/source/ottr -cd /autograder/source/ottr -Rscript -e "devtools::install()" || Rscript -e "devtools::install()" \ No newline at end of file diff --git a/test/test-assign/r-autograder-correct/tests/q1.R b/test/test-assign/r-autograder-correct/tests/q1.R deleted file mode 100644 index dc051db05..000000000 --- a/test/test-assign/r-autograder-correct/tests/q1.R +++ /dev/null @@ -1,36 +0,0 @@ -library(testthat) - -test_metadata = " -cases: -- hidden: false - name: q1a - points: 1 -- hidden: false - name: q1b - points: 1 -- hidden: true - name: q1c - points: 1 -- hidden: true - name: q1d - points: 2 -name: q1 - -" - -test_that("q1a", { - expect_true(is.numeric(x)) -}) - -test_that("q1b", { - expect_true(0 < x) - expect_true(x < 100) -}) - -test_that("q1c", { - expect_equal(x, 2) -}) - -test_that("q1d", { - expect_equal(as.character(x), "2") -}) diff --git a/test/test-assign/r-autograder-correct/tests/q3.R b/test/test-assign/r-autograder-correct/tests/q3.R deleted file mode 100644 index 0bba5ed68..000000000 --- a/test/test-assign/r-autograder-correct/tests/q3.R +++ /dev/null @@ -1,28 +0,0 @@ -library(testthat) - -test_metadata = " -cases: -- hidden: false - name: q3a - points: 0.6666666666666666 -- hidden: false - name: q3b - points: 0.6666666666666666 -- hidden: true - name: q3c - points: 0.6666666666666666 -name: q3 - -" - -test_that("q3a", { - expect_equal(nine, 9) -}) - -test_that("q3b", { - expect_equal(square(16), 256) -}) - -test_that("q3c", { - expect_equal(square(1), 1) -}) diff --git a/test/test-assign/r-autograder-correct/tests/q8.R b/test/test-assign/r-autograder-correct/tests/q8.R deleted file mode 100644 index eb5ac5ac4..000000000 --- a/test/test-assign/r-autograder-correct/tests/q8.R +++ /dev/null @@ -1,33 +0,0 @@ -library(testthat) - -test_metadata = " -cases: -- hidden: false - name: q8a - points: 1 -- hidden: true - name: q8b - points: 1 -name: q8 - -" - -test_that("q8a", { - expect_equal(length(z), 10) -}) - -test_that("q8b", { - actual = c( - 6.74191689429334, - 2.87060365720782, - 4.72625682267468, - 5.26572520992208, - 4.808536646282, - 3.78775096781703, - 7.02304399487788, - 3.8106819231738, - 8.03684742775408, - 3.87457180189516 - ) - expect_equal(actual, z) -}) diff --git a/test/test-assign/rmd-autograder-correct/environment.yml b/test/test-assign/rmd-autograder-correct/environment.yml new file mode 100644 index 000000000..ab26dbdad --- /dev/null +++ b/test/test-assign/rmd-autograder-correct/environment.yml @@ -0,0 +1,12 @@ +name: otter-gradescope-env +channels: + - defaults + - conda-forge +dependencies: + - python=3.7 + - pip + - r-base + - r-essentials + - r-devtools + - pip: + - -r requirements.txt \ No newline at end of file diff --git a/test/test-assign/rmd-autograder-correct/run_autograder b/test/test-assign/rmd-autograder-correct/run_autograder index d6b2390e1..cd0464ddd 100644 --- a/test/test-assign/rmd-autograder-correct/run_autograder +++ b/test/test-assign/rmd-autograder-correct/run_autograder @@ -1,28 +1,6 @@ -#!/usr/bin/env python3 +#!/usr/bin/env bash -import os -import subprocess - -from otter.generate.run_autograder import main as run_autograder - -config = { - "score_threshold": None, - "points_possible": None, - "show_stdout_on_release": False, - "show_hidden_tests_on_release": False, - "seed": None, - "grade_from_log": False, - "serialized_variables": {}, - "public_multiplier": 0, - "token": None, - "course_id": 'None', - "assignment_id": 'None', - "filtering": True, - "pagebreaks": True, - "debug": False, - "autograder_dir": '/autograder', - "lang": 'r', -} - -if __name__ == "__main__": - run_autograder(config) \ No newline at end of file +export PATH="/root/miniconda3/bin:$PATH" +source /root/miniconda3/etc/profile.d/conda.sh +conda activate otter-gradescope-env +python /autograder/source/run_otter.py \ No newline at end of file diff --git a/test/test-assign/r-autograder-correct/run_autograder b/test/test-assign/rmd-autograder-correct/run_otter.py similarity index 89% rename from test/test-assign/r-autograder-correct/run_autograder rename to test/test-assign/rmd-autograder-correct/run_otter.py index d6b2390e1..5f79bc131 100644 --- a/test/test-assign/r-autograder-correct/run_autograder +++ b/test/test-assign/rmd-autograder-correct/run_otter.py @@ -1,4 +1,6 @@ -#!/usr/bin/env python3 +""" +Runs Otter on Gradescope with the configurations specified below +""" import os import subprocess diff --git a/test/test-assign/rmd-autograder-correct/setup.sh b/test/test-assign/rmd-autograder-correct/setup.sh index d9a70c8fe..6e1f18dc5 100644 --- a/test/test-assign/rmd-autograder-correct/setup.sh +++ b/test/test-assign/rmd-autograder-correct/setup.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -apt-get clean -apt-get update -apt-get install -y python3.7 python3-pip python3.7-dev +# apt-get clean +# apt-get update +# apt-get install -y python3.7 python3-pip python3.7-dev apt-get clean apt-get update @@ -13,14 +13,14 @@ apt-get install -y texlive-xetex texlive-fonts-recommended texlive-generic-recom wget --quiet -O /tmp/wkhtmltopdf.deb https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb apt-get install -y /tmp/wkhtmltopdf.deb -update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 +# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 apt-get clean apt-get update -apt-get install -y install build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev +apt-get install -y build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev # install conda -wget -nv -O /autograder/source/miniconda_install.sh "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" +wget -nv -O /autograder/source/miniconda_install.sh "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-x86_64.sh" chmod +x /autograder/source/miniconda_install.sh /autograder/source/miniconda_install.sh -b echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc @@ -28,16 +28,24 @@ echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc export PATH=/root/miniconda3/bin:$PATH export TAR="/bin/tar" -# install R dependencies -conda install --yes r-base r-essentials -conda install --yes r-devtools -c conda-forge +# # install R dependencies +# conda install --yes r-base r-essentials +# conda install --yes r-devtools -c conda-forge + +# # install requirements +# pip3 install -r /autograder/source/requirements.txt +# pip install -r /autograder/source/requirements.txt +# Rscript /autograder/source/requirements.r + +# install dependencies with conda +conda env create -f /autograder/source/environment.yml +conda run -n otter-gradescope-env Rscript /autograder/source/requirements.r -# install requirements -pip3 install -r /autograder/source/requirements.txt -pip install -r /autograder/source/requirements.txt -Rscript /autograder/source/requirements.r +# set conda shell +conda init --all # install ottr; not sure why it needs to happen twice but whatever git clone --single-branch -b stable https://github.com/ucbds-infra/ottr.git /autograder/source/ottr cd /autograder/source/ottr -Rscript -e "devtools::install()" || Rscript -e "devtools::install()" \ No newline at end of file +conda run -n otter-gradescope-env Rscript -e "devtools::install\\(\\)" +conda run -n otter-gradescope-env Rscript -e "devtools::install\\(\\)" \ No newline at end of file diff --git a/test/test_assign.py b/test/test_assign.py index 90bf65a9f..944952b99 100644 --- a/test/test_assign.py +++ b/test/test_assign.py @@ -77,10 +77,10 @@ def test_pdf_example(self): self.assertDirsEqual(TEST_FILES_PATH + "output", TEST_FILES_PATH + "pdf-correct", ignore_ext=[".pdf",".zip"]) - # check gradescope zip file - self.check_gradescope_zipfile( - TEST_FILES_PATH + "output/autograder/autograder.zip", TEST_FILES_PATH + "pdf-autograder-correct", - ) + # # check gradescope zip file + # self.check_gradescope_zipfile( + # TEST_FILES_PATH + "output/autograder/autograder.zip", TEST_FILES_PATH + "pdf-autograder-correct", + # ) @patch.object(APIClient,"get_token") def test_gradescope_example(self, mocked_client): @@ -103,7 +103,6 @@ def test_gradescope_example(self, mocked_client): self.assertDirsEqual(TEST_FILES_PATH + "output", TEST_FILES_PATH + "gs-correct", ignore_ext=[".pdf",".zip"]) # check gradescope zip file - self.check_gradescope_zipfile( TEST_FILES_PATH + "output/autograder/autograder.zip", TEST_FILES_PATH + "gs-autograder-correct", ) @@ -122,10 +121,10 @@ def test_r_example(self): self.assertDirsEqual(TEST_FILES_PATH + "output", TEST_FILES_PATH + "r-correct", ignore_ext=[".pdf",".zip"]) - # check gradescope zip file - self.check_gradescope_zipfile( - TEST_FILES_PATH + "output/autograder/autograder.zip", TEST_FILES_PATH + "r-autograder-correct", - ) + # # check gradescope zip file + # self.check_gradescope_zipfile( + # TEST_FILES_PATH + "output/autograder/autograder.zip", TEST_FILES_PATH + "r-autograder-correct", + # ) def test_rmd_example(self): """ @@ -146,8 +145,8 @@ def test_rmd_example(self): TEST_FILES_PATH + "output/autograder/autograder.zip", TEST_FILES_PATH + "rmd-autograder-correct", ) - # def tearDown(self): - # # cleanup - # if os.path.exists(TEST_FILES_PATH + "output"): - # shutil.rmtree(TEST_FILES_PATH + "output") + def tearDown(self): + # cleanup + if os.path.exists(TEST_FILES_PATH + "output"): + shutil.rmtree(TEST_FILES_PATH + "output") diff --git a/test/test_generate/test-autograder/autograder-correct/environment.yml b/test/test_generate/test-autograder/autograder-correct/environment.yml new file mode 100644 index 000000000..ab26dbdad --- /dev/null +++ b/test/test_generate/test-autograder/autograder-correct/environment.yml @@ -0,0 +1,12 @@ +name: otter-gradescope-env +channels: + - defaults + - conda-forge +dependencies: + - python=3.7 + - pip + - r-base + - r-essentials + - r-devtools + - pip: + - -r requirements.txt \ No newline at end of file diff --git a/test/test_generate/test-autograder/autograder-correct/run_autograder b/test/test_generate/test-autograder/autograder-correct/run_autograder index f46d3e85d..cd0464ddd 100644 --- a/test/test_generate/test-autograder/autograder-correct/run_autograder +++ b/test/test_generate/test-autograder/autograder-correct/run_autograder @@ -1,28 +1,6 @@ -#!/usr/bin/env python3 +#!/usr/bin/env bash -import os -import subprocess - -from otter.generate.run_autograder import main as run_autograder - -config = { - "score_threshold": None, - "points_possible": None, - "show_stdout_on_release": False, - "show_hidden_tests_on_release": False, - "seed": None, - "grade_from_log": False, - "serialized_variables": {}, - "public_multiplier": 0, - "token": None, - "course_id": 'None', - "assignment_id": 'None', - "filtering": True, - "pagebreaks": True, - "debug": False, - "autograder_dir": '/autograder', - "lang": 'python', -} - -if __name__ == "__main__": - run_autograder(config) \ No newline at end of file +export PATH="/root/miniconda3/bin:$PATH" +source /root/miniconda3/etc/profile.d/conda.sh +conda activate otter-gradescope-env +python /autograder/source/run_otter.py \ No newline at end of file diff --git a/test/test_generate/test-autograder/autograder-correct/run_otter.py b/test/test_generate/test-autograder/autograder-correct/run_otter.py new file mode 100644 index 000000000..ef1081a49 --- /dev/null +++ b/test/test_generate/test-autograder/autograder-correct/run_otter.py @@ -0,0 +1,30 @@ +""" +Runs Otter on Gradescope with the configurations specified below +""" + +import os +import subprocess + +from otter.generate.run_autograder import main as run_autograder + +config = { + "score_threshold": None, + "points_possible": None, + "show_stdout_on_release": False, + "show_hidden_tests_on_release": False, + "seed": None, + "grade_from_log": False, + "serialized_variables": {}, + "public_multiplier": 0, + "token": None, + "course_id": 'None', + "assignment_id": 'None', + "filtering": True, + "pagebreaks": True, + "debug": False, + "autograder_dir": '/autograder', + "lang": 'python', +} + +if __name__ == "__main__": + run_autograder(config) \ No newline at end of file diff --git a/test/test_generate/test-autograder/autograder-correct/setup.sh b/test/test_generate/test-autograder/autograder-correct/setup.sh index d9a70c8fe..6e1f18dc5 100644 --- a/test/test_generate/test-autograder/autograder-correct/setup.sh +++ b/test/test_generate/test-autograder/autograder-correct/setup.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -apt-get clean -apt-get update -apt-get install -y python3.7 python3-pip python3.7-dev +# apt-get clean +# apt-get update +# apt-get install -y python3.7 python3-pip python3.7-dev apt-get clean apt-get update @@ -13,14 +13,14 @@ apt-get install -y texlive-xetex texlive-fonts-recommended texlive-generic-recom wget --quiet -O /tmp/wkhtmltopdf.deb https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb apt-get install -y /tmp/wkhtmltopdf.deb -update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 +# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 apt-get clean apt-get update -apt-get install -y install build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev +apt-get install -y build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev # install conda -wget -nv -O /autograder/source/miniconda_install.sh "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" +wget -nv -O /autograder/source/miniconda_install.sh "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-x86_64.sh" chmod +x /autograder/source/miniconda_install.sh /autograder/source/miniconda_install.sh -b echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc @@ -28,16 +28,24 @@ echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc export PATH=/root/miniconda3/bin:$PATH export TAR="/bin/tar" -# install R dependencies -conda install --yes r-base r-essentials -conda install --yes r-devtools -c conda-forge +# # install R dependencies +# conda install --yes r-base r-essentials +# conda install --yes r-devtools -c conda-forge + +# # install requirements +# pip3 install -r /autograder/source/requirements.txt +# pip install -r /autograder/source/requirements.txt +# Rscript /autograder/source/requirements.r + +# install dependencies with conda +conda env create -f /autograder/source/environment.yml +conda run -n otter-gradescope-env Rscript /autograder/source/requirements.r -# install requirements -pip3 install -r /autograder/source/requirements.txt -pip install -r /autograder/source/requirements.txt -Rscript /autograder/source/requirements.r +# set conda shell +conda init --all # install ottr; not sure why it needs to happen twice but whatever git clone --single-branch -b stable https://github.com/ucbds-infra/ottr.git /autograder/source/ottr cd /autograder/source/ottr -Rscript -e "devtools::install()" || Rscript -e "devtools::install()" \ No newline at end of file +conda run -n otter-gradescope-env Rscript -e "devtools::install\\(\\)" +conda run -n otter-gradescope-env Rscript -e "devtools::install\\(\\)" \ No newline at end of file From 21ca5f5755c70a6b178cd88d5b6939afb65925dc Mon Sep 17 00:00:00 2001 From: Chris Pyles Date: Mon, 7 Sep 2020 17:51:14 -0700 Subject: [PATCH 6/9] fixed run_autograder test --- .../autograder-correct/source/environment.yml | 12 +++++++ .../autograder-correct/source/run_autograder | 32 +++-------------- .../autograder-correct/source/run_otter.py | 30 ++++++++++++++++ .../autograder-correct/source/setup.sh | 36 +++++++++++-------- 4 files changed, 69 insertions(+), 41 deletions(-) create mode 100644 test/test_generate/test-run-autograder/autograder-correct/source/environment.yml create mode 100644 test/test_generate/test-run-autograder/autograder-correct/source/run_otter.py diff --git a/test/test_generate/test-run-autograder/autograder-correct/source/environment.yml b/test/test_generate/test-run-autograder/autograder-correct/source/environment.yml new file mode 100644 index 000000000..ab26dbdad --- /dev/null +++ b/test/test_generate/test-run-autograder/autograder-correct/source/environment.yml @@ -0,0 +1,12 @@ +name: otter-gradescope-env +channels: + - defaults + - conda-forge +dependencies: + - python=3.7 + - pip + - r-base + - r-essentials + - r-devtools + - pip: + - -r requirements.txt \ No newline at end of file diff --git a/test/test_generate/test-run-autograder/autograder-correct/source/run_autograder b/test/test_generate/test-run-autograder/autograder-correct/source/run_autograder index f46d3e85d..cd0464ddd 100644 --- a/test/test_generate/test-run-autograder/autograder-correct/source/run_autograder +++ b/test/test_generate/test-run-autograder/autograder-correct/source/run_autograder @@ -1,28 +1,6 @@ -#!/usr/bin/env python3 +#!/usr/bin/env bash -import os -import subprocess - -from otter.generate.run_autograder import main as run_autograder - -config = { - "score_threshold": None, - "points_possible": None, - "show_stdout_on_release": False, - "show_hidden_tests_on_release": False, - "seed": None, - "grade_from_log": False, - "serialized_variables": {}, - "public_multiplier": 0, - "token": None, - "course_id": 'None', - "assignment_id": 'None', - "filtering": True, - "pagebreaks": True, - "debug": False, - "autograder_dir": '/autograder', - "lang": 'python', -} - -if __name__ == "__main__": - run_autograder(config) \ No newline at end of file +export PATH="/root/miniconda3/bin:$PATH" +source /root/miniconda3/etc/profile.d/conda.sh +conda activate otter-gradescope-env +python /autograder/source/run_otter.py \ No newline at end of file diff --git a/test/test_generate/test-run-autograder/autograder-correct/source/run_otter.py b/test/test_generate/test-run-autograder/autograder-correct/source/run_otter.py new file mode 100644 index 000000000..ef1081a49 --- /dev/null +++ b/test/test_generate/test-run-autograder/autograder-correct/source/run_otter.py @@ -0,0 +1,30 @@ +""" +Runs Otter on Gradescope with the configurations specified below +""" + +import os +import subprocess + +from otter.generate.run_autograder import main as run_autograder + +config = { + "score_threshold": None, + "points_possible": None, + "show_stdout_on_release": False, + "show_hidden_tests_on_release": False, + "seed": None, + "grade_from_log": False, + "serialized_variables": {}, + "public_multiplier": 0, + "token": None, + "course_id": 'None', + "assignment_id": 'None', + "filtering": True, + "pagebreaks": True, + "debug": False, + "autograder_dir": '/autograder', + "lang": 'python', +} + +if __name__ == "__main__": + run_autograder(config) \ No newline at end of file diff --git a/test/test_generate/test-run-autograder/autograder-correct/source/setup.sh b/test/test_generate/test-run-autograder/autograder-correct/source/setup.sh index d9a70c8fe..6e1f18dc5 100644 --- a/test/test_generate/test-run-autograder/autograder-correct/source/setup.sh +++ b/test/test_generate/test-run-autograder/autograder-correct/source/setup.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -apt-get clean -apt-get update -apt-get install -y python3.7 python3-pip python3.7-dev +# apt-get clean +# apt-get update +# apt-get install -y python3.7 python3-pip python3.7-dev apt-get clean apt-get update @@ -13,14 +13,14 @@ apt-get install -y texlive-xetex texlive-fonts-recommended texlive-generic-recom wget --quiet -O /tmp/wkhtmltopdf.deb https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb apt-get install -y /tmp/wkhtmltopdf.deb -update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 +# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 apt-get clean apt-get update -apt-get install -y install build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev +apt-get install -y build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev libcurl4-openssl-dev # install conda -wget -nv -O /autograder/source/miniconda_install.sh "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" +wget -nv -O /autograder/source/miniconda_install.sh "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-x86_64.sh" chmod +x /autograder/source/miniconda_install.sh /autograder/source/miniconda_install.sh -b echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc @@ -28,16 +28,24 @@ echo "export PATH=/root/miniconda3/bin:\$PATH" >> /root/.bashrc export PATH=/root/miniconda3/bin:$PATH export TAR="/bin/tar" -# install R dependencies -conda install --yes r-base r-essentials -conda install --yes r-devtools -c conda-forge +# # install R dependencies +# conda install --yes r-base r-essentials +# conda install --yes r-devtools -c conda-forge + +# # install requirements +# pip3 install -r /autograder/source/requirements.txt +# pip install -r /autograder/source/requirements.txt +# Rscript /autograder/source/requirements.r + +# install dependencies with conda +conda env create -f /autograder/source/environment.yml +conda run -n otter-gradescope-env Rscript /autograder/source/requirements.r -# install requirements -pip3 install -r /autograder/source/requirements.txt -pip install -r /autograder/source/requirements.txt -Rscript /autograder/source/requirements.r +# set conda shell +conda init --all # install ottr; not sure why it needs to happen twice but whatever git clone --single-branch -b stable https://github.com/ucbds-infra/ottr.git /autograder/source/ottr cd /autograder/source/ottr -Rscript -e "devtools::install()" || Rscript -e "devtools::install()" \ No newline at end of file +conda run -n otter-gradescope-env Rscript -e "devtools::install\\(\\)" +conda run -n otter-gradescope-env Rscript -e "devtools::install\\(\\)" \ No newline at end of file From e259ba2ac7ab57bfedb861e6bd2452b408ba6e19 Mon Sep 17 00:00:00 2001 From: Chris Pyles Date: Mon, 7 Sep 2020 18:22:08 -0700 Subject: [PATCH 7/9] release v1.1.0.b1 --- Dockerfile | 2 +- otter/generate/templates/requirements.txt | 2 +- otter/version.py | 2 +- release.py | 5 +++-- test/test-assign/gs-autograder-correct/requirements.txt | 2 +- test/test-assign/rmd-autograder-correct/requirements.txt | 2 +- .../test-autograder/autograder-correct/requirements.txt | 2 +- .../autograder-correct/source/requirements.txt | 2 +- 8 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3abadba0c..d8b8e27aa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -52,4 +52,4 @@ RUN apt-get clean && \ ADD requirements.txt /tmp/requirements.txt RUN pip install -r /tmp/requirements.txt -RUN pip install otter-grader==1.0.1 +RUN pip install otter-grader==1.1.0.b1 diff --git a/otter/generate/templates/requirements.txt b/otter/generate/templates/requirements.txt index 901c5d079..eb9eca618 100644 --- a/otter/generate/templates/requirements.txt +++ b/otter/generate/templates/requirements.txt @@ -15,6 +15,6 @@ rpy2 jupytext numpy==1.16.0 tornado==5.1.1 -otter-grader==1.0.1 +otter-grader==1.1.0.b1 {% endif %}{% if other_requirements %} {{ other_requirements }}{% endif %} \ No newline at end of file diff --git a/otter/version.py b/otter/version.py index 9b790ef21..72b340462 100644 --- a/otter/version.py +++ b/otter/version.py @@ -6,7 +6,7 @@ from textwrap import dedent -__version__ = "1.0.1" +__version__ = "1.1.0.b1" LOGO_WITH_VERSION = fr""" _________ __ __ diff --git a/release.py b/release.py index 434746780..3008f725a 100644 --- a/release.py +++ b/release.py @@ -25,7 +25,7 @@ def run_release_commands(test, beta, new_version): commands = [ "rm dist/* || :", "python3 setup.py sdist bdist_wheel", - f"python3 -m twine upload dist/*{' --repository-url https://test.pypi.org/legacy/' if test else ''}", + # f"python3 -m twine upload dist/*{' --repository-url https://test.pypi.org/legacy/' if test else ''}", f"docker build . -t ucbdsinfra/otter-grader:{new_version}", f"docker push ucbdsinfra/otter-grader:{new_version}", f"docker build . -t ucbdsinfra/otter-grader{':beta' if beta else ''}", @@ -46,6 +46,7 @@ def run_release_commands(test, beta, new_version): PARSER.add_argument("--dry-run", action="store_true", default=False, help="Update files only but do not push release") PARSER.add_argument("--git", action="store_true", default=False, help="Indicates that new release should be installed via git") PARSER.add_argument("--test", action="store_true", default=False, help="Indicates that new release should be pushed to test PyPI") +PARSER.add_argument("-f", "--force", action="store_true", default=False, help="Force run (ignore uncommitted changes)") OLD_VERSION_REGEX = r"(otter-grader==\d+\.\d+\.\d+(?:\.\w+)?$|git\+https:\/\/github\.com\/ucbds-infra\/otter-grader\.git@[\w\.]+)$" @@ -67,7 +68,7 @@ def run_release_commands(test, beta, new_version): from_git = bool(re.search(r"https://github.com/ucbds-infra/otter-grader\.git@", contents)) from_beta = bool(re.search(r"otter-grader==\d+\.\d+\.\d+\.b\d+", contents)) - if subprocess.run(["git", "diff"], stdout=subprocess.PIPE).stdout.decode("utf-8").strip() and not args.dry_run: + if subprocess.run(["git", "diff"], stdout=subprocess.PIPE).stdout.decode("utf-8").strip() and not args.dry_run and not args.force: # throw error because this will commit everything when you make a release raise RuntimeError( "You have uncommitted changes. Please add and commit these changes before pushing " diff --git a/test/test-assign/gs-autograder-correct/requirements.txt b/test/test-assign/gs-autograder-correct/requirements.txt index 410d36ed0..390366ffc 100644 --- a/test/test-assign/gs-autograder-correct/requirements.txt +++ b/test/test-assign/gs-autograder-correct/requirements.txt @@ -15,4 +15,4 @@ rpy2 jupytext numpy==1.16.0 tornado==5.1.1 -otter-grader==1.0.1 +otter-grader==1.1.0.b1 diff --git a/test/test-assign/rmd-autograder-correct/requirements.txt b/test/test-assign/rmd-autograder-correct/requirements.txt index 410d36ed0..390366ffc 100644 --- a/test/test-assign/rmd-autograder-correct/requirements.txt +++ b/test/test-assign/rmd-autograder-correct/requirements.txt @@ -15,4 +15,4 @@ rpy2 jupytext numpy==1.16.0 tornado==5.1.1 -otter-grader==1.0.1 +otter-grader==1.1.0.b1 diff --git a/test/test_generate/test-autograder/autograder-correct/requirements.txt b/test/test_generate/test-autograder/autograder-correct/requirements.txt index a166959af..bea334119 100644 --- a/test/test_generate/test-autograder/autograder-correct/requirements.txt +++ b/test/test_generate/test-autograder/autograder-correct/requirements.txt @@ -15,6 +15,6 @@ rpy2 jupytext numpy==1.16.0 tornado==5.1.1 -otter-grader==1.0.1 +otter-grader==1.1.0.b1 tqdm diff --git a/test/test_generate/test-run-autograder/autograder-correct/source/requirements.txt b/test/test_generate/test-run-autograder/autograder-correct/source/requirements.txt index a166959af..bea334119 100644 --- a/test/test_generate/test-run-autograder/autograder-correct/source/requirements.txt +++ b/test/test_generate/test-run-autograder/autograder-correct/source/requirements.txt @@ -15,6 +15,6 @@ rpy2 jupytext numpy==1.16.0 tornado==5.1.1 -otter-grader==1.0.1 +otter-grader==1.1.0.b1 tqdm From 18ff10a6ef3d9b46eb29fa78ead4abc5aa707372 Mon Sep 17 00:00:00 2001 From: Chris Pyles Date: Mon, 7 Sep 2020 18:24:39 -0700 Subject: [PATCH 8/9] fixed release.py --- release.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release.py b/release.py index 3008f725a..2e46f2ae3 100644 --- a/release.py +++ b/release.py @@ -25,14 +25,14 @@ def run_release_commands(test, beta, new_version): commands = [ "rm dist/* || :", "python3 setup.py sdist bdist_wheel", - # f"python3 -m twine upload dist/*{' --repository-url https://test.pypi.org/legacy/' if test else ''}", + f"python3 -m twine upload dist/*{' --repository-url https://test.pypi.org/legacy/' if test else ''}", f"docker build . -t ucbdsinfra/otter-grader:{new_version}", f"docker push ucbdsinfra/otter-grader:{new_version}", f"docker build . -t ucbdsinfra/otter-grader{':beta' if beta else ''}", f"docker push ucbdsinfra/otter-grader{':beta' if beta else ''}", "make tutorial", f"git commit -am 'release v{new_version}'", - f"hub release create -a dist/*.tar.gz -a dist/*.whl -m 'v{new_version}{' -p' if beta else ''}' {new_version}", + f"hub release create -a dist/*.tar.gz -a dist/*.whl -m 'v{new_version}' {' -p' if beta else ''} {new_version}", ] for cmd in commands: From 0214f81ba44488c10c7555e8d3112ac0cd6b02e4 Mon Sep 17 00:00:00 2001 From: Chris Pyles Date: Mon, 7 Sep 2020 19:55:07 -0700 Subject: [PATCH 9/9] release v1.1.0 --- Dockerfile | 2 +- otter/generate/templates/requirements.txt | 2 +- otter/version.py | 2 +- release.py | 8 ++++++-- test/test-assign/gs-autograder-correct/requirements.txt | 2 +- test/test-assign/rmd-autograder-correct/requirements.txt | 2 +- .../test-autograder/autograder-correct/requirements.txt | 2 +- .../autograder-correct/source/requirements.txt | 2 +- 8 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index d8b8e27aa..f657719d9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -52,4 +52,4 @@ RUN apt-get clean && \ ADD requirements.txt /tmp/requirements.txt RUN pip install -r /tmp/requirements.txt -RUN pip install otter-grader==1.1.0.b1 +RUN pip install otter-grader==1.1.0 diff --git a/otter/generate/templates/requirements.txt b/otter/generate/templates/requirements.txt index eb9eca618..7762745bb 100644 --- a/otter/generate/templates/requirements.txt +++ b/otter/generate/templates/requirements.txt @@ -15,6 +15,6 @@ rpy2 jupytext numpy==1.16.0 tornado==5.1.1 -otter-grader==1.1.0.b1 +otter-grader==1.1.0 {% endif %}{% if other_requirements %} {{ other_requirements }}{% endif %} \ No newline at end of file diff --git a/otter/version.py b/otter/version.py index 72b340462..cffd413f1 100644 --- a/otter/version.py +++ b/otter/version.py @@ -6,7 +6,7 @@ from textwrap import dedent -__version__ = "1.1.0.b1" +__version__ = "1.1.0" LOGO_WITH_VERSION = fr""" _________ __ __ diff --git a/release.py b/release.py index 2e46f2ae3..3351988eb 100644 --- a/release.py +++ b/release.py @@ -16,7 +16,7 @@ ] -def run_release_commands(test, beta, new_version): +def run_release_commands(test, beta, new_version, no_twine=False): assert shutil.which("hub") is not None, ( "You must have the GitHub CLI installed to use this script. Please see " "https://github.com/github/hub to install it." @@ -35,6 +35,9 @@ def run_release_commands(test, beta, new_version): f"hub release create -a dist/*.tar.gz -a dist/*.whl -m 'v{new_version}' {' -p' if beta else ''} {new_version}", ] + if no_twine: + del commands[2] + for cmd in commands: subprocess.run(cmd, shell=True, check=True) @@ -46,6 +49,7 @@ def run_release_commands(test, beta, new_version): PARSER.add_argument("--dry-run", action="store_true", default=False, help="Update files only but do not push release") PARSER.add_argument("--git", action="store_true", default=False, help="Indicates that new release should be installed via git") PARSER.add_argument("--test", action="store_true", default=False, help="Indicates that new release should be pushed to test PyPI") +PARSER.add_argument("--no-twine", action="store_true", default=False, help="Don't upload the release to PyPI") PARSER.add_argument("-f", "--force", action="store_true", default=False, help="Force run (ignore uncommitted changes)") @@ -124,4 +128,4 @@ def run_release_commands(test, beta, new_version): if args.dry_run: sys.exit() - run_release_commands(args.test, to_beta, new_version_number) + run_release_commands(args.test, to_beta, new_version_number, no_twine=args.no_twine) diff --git a/test/test-assign/gs-autograder-correct/requirements.txt b/test/test-assign/gs-autograder-correct/requirements.txt index 390366ffc..698ce5220 100644 --- a/test/test-assign/gs-autograder-correct/requirements.txt +++ b/test/test-assign/gs-autograder-correct/requirements.txt @@ -15,4 +15,4 @@ rpy2 jupytext numpy==1.16.0 tornado==5.1.1 -otter-grader==1.1.0.b1 +otter-grader==1.1.0 diff --git a/test/test-assign/rmd-autograder-correct/requirements.txt b/test/test-assign/rmd-autograder-correct/requirements.txt index 390366ffc..698ce5220 100644 --- a/test/test-assign/rmd-autograder-correct/requirements.txt +++ b/test/test-assign/rmd-autograder-correct/requirements.txt @@ -15,4 +15,4 @@ rpy2 jupytext numpy==1.16.0 tornado==5.1.1 -otter-grader==1.1.0.b1 +otter-grader==1.1.0 diff --git a/test/test_generate/test-autograder/autograder-correct/requirements.txt b/test/test_generate/test-autograder/autograder-correct/requirements.txt index bea334119..56941eb1d 100644 --- a/test/test_generate/test-autograder/autograder-correct/requirements.txt +++ b/test/test_generate/test-autograder/autograder-correct/requirements.txt @@ -15,6 +15,6 @@ rpy2 jupytext numpy==1.16.0 tornado==5.1.1 -otter-grader==1.1.0.b1 +otter-grader==1.1.0 tqdm diff --git a/test/test_generate/test-run-autograder/autograder-correct/source/requirements.txt b/test/test_generate/test-run-autograder/autograder-correct/source/requirements.txt index bea334119..56941eb1d 100644 --- a/test/test_generate/test-run-autograder/autograder-correct/source/requirements.txt +++ b/test/test_generate/test-run-autograder/autograder-correct/source/requirements.txt @@ -15,6 +15,6 @@ rpy2 jupytext numpy==1.16.0 tornado==5.1.1 -otter-grader==1.1.0.b1 +otter-grader==1.1.0 tqdm