{"id":19184621,"url":"https://github.com/gatoreducator/gatorgrader","last_synced_at":"2025-05-16T11:05:02.187Z","repository":{"id":24467100,"uuid":"99937865","full_name":"GatorEducator/gatorgrader","owner":"GatorEducator","description":":heavy_check_mark: Automated Grading Tool that Checks the Work of Writers and Programmers","archived":false,"fork":false,"pushed_at":"2025-01-28T21:10:42.000Z","size":4658,"stargazers_count":81,"open_issues_count":29,"forks_count":27,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-05-16T11:04:52.030Z","etag":null,"topics":["auto-grading","github-classroom","grading","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GatorEducator.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-08-10T15:27:37.000Z","updated_at":"2025-02-14T14:38:30.000Z","dependencies_parsed_at":"2024-06-21T13:08:42.230Z","dependency_job_id":"7f8adc9b-ca51-49ee-8955-000ae99a60fb","html_url":"https://github.com/GatorEducator/gatorgrader","commit_stats":{"total_commits":2709,"total_committers":76,"mean_commits":35.64473684210526,"dds":"0.25101513473606496","last_synced_commit":"df643c3c896cf5edb821835130a26066d1466047"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatorEducator%2Fgatorgrader","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatorEducator%2Fgatorgrader/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatorEducator%2Fgatorgrader/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatorEducator%2Fgatorgrader/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GatorEducator","download_url":"https://codeload.github.com/GatorEducator/gatorgrader/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254518384,"owners_count":22084374,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["auto-grading","github-classroom","grading","python"],"created_at":"2024-11-09T11:07:41.157Z","updated_at":"2025-05-16T11:04:57.169Z","avatar_url":"https://github.com/GatorEducator.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GatorGrader\n\n![Image of Logo](https://raw.githubusercontent.com/GatorEducator/gatorgrader/master/.github/gatorgraderlogotitled.png)\n\n\u003cp align=\"center\"\u003e\n\u003cb\u003e\nThe only tool you'll need to ensure your student's code and writing is up to\nspeed!\n\u003c/b\u003e\n\u003c/p\u003e\n\n[![Lint and Test](https://github.com/GatorEducator/gatorgrader/workflows/Lint%20and%20Test/badge.svg?branch=master)](https://github.com/GatorEducator/gatorgrader/actions?query=workflow%3A%22Lint+and+Test%22+branch%3Amaster) [![codecov.io](https://codecov.io/gh/GatorEducator/gatorgrader/branch/master/graph/badge.svg?token=UKBOlE7kG6)](https://codecov.io/gh/GatorEducator/gatorgrader) [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-orange.svg)](https://github.com/GatorEducator/gatorgrader/graphs/commit-activity) [![GitHub license](https://img.shields.io/github/license/GatorEducator/gatorgrader.svg)](https://github.com/GatorEducator/gatorgrader/blob/master/LICENSE.md) [![All Contributors](https://img.shields.io/badge/all_contributors-33-orange.svg?style=flat-square)](#contributors)\n\n## Table of Contents\n\n* [Quickstart Guide](#quickstart-guide)\n* [Key Features](#key-features)\n* [What Do People Think about GatorGrader?](#what-do-people-think-about-gatorgrader)\n* [Installing GatorGrader](#installing-gatorgrader)\n* [Testing GatorGrader](#testing-gatorgrader)\n  + [Automated Testing](#automated-testing)\n  + [Test Coverage](#test-coverage)\n  + [Testing with Multiple Python Versions](#testing-with-multiple-python-versions)\n  + [Code Linting](#code-linting)\n* [Running GatorGrader](#running-gatorgrader)\n* [Using Docker](#using-docker)\n* [Comparison to Other Tools](#comparison-to-other-tools)\n* [Presentations](#presentations)\n* [Contributing](#contributing)\n* [Contributors](#contributors)\n\n## Quickstart Guide\n\n* Starter Repositories\nAn easy way to get started with GatorGrader is to check out our sample starter repositories.\nThe following starter repositories provide examples of how GatorGrader files should be created\nto check programs and documentation for different languages:\n[Java](https://github.com/GatorEducator/java-assignment-starter-100-01),\n[Python](https://github.com/GatorEducator/python-assignment-starter-203-05), [LaTex](https://github.com/GatorEducator/latex-assignment-starter-100-01) and [HTML with CSS](https://github.com/GatorEducator/html-assignment-starter-302-03). These\nexamples also show how to integrate GatorGrader with [GitHub\nClassroom](https://classroom.github.com/) and [Travis\nCI](https://travis-ci.com/). When you follow these examples, the Gradle plugin\nfor GatorGrader will install it automatically when you run `gradle grade` in a\nterminal window. Please be aware that these repositories are meant to have a majority\nof red checks. This is only meant to be a “starter” and give an insight into what must be accomplished within the lab.\n* Solution Repositories\nThe next step to get involved with GatorGrader is to checkout our sample solution\nrepositories. The following solution repositories provide examples of how GatorGrader files should be\ncreated to check programs and documentation for different languages:\n[Java](https://github.com/GatorEducator/java-assignment-solution-100-01),\n[Python](https://github.com/GatorEducator/python-assignment-solution-203-05), [LaTex](https://github.com/GatorEducator/latex-assignment-solution-100-01) , and [HTML with CSS](https://github.com/GatorEducator/html-assignment-solution-302-03). These examples\nalso show how to integrate GatorGrader with  [GitHub\nClassroom](https://classroom.github.com/) and [Travis\nCI](https://travis-ci.com/).  When you follow these examples, the Gradle plugin\nfor GatorGrader will install it automatically when you run `gradle grade` in a\nterminal window. Please be aware that these repositories are meant to have a majority\nof green checks. This is meant to show what must be accomplished within a lab/practical\nand what it looks like when those tasks are completed.\n\n## Key Features\n\nGatorGrader automatically checks the work of technical writers and programmers.\nIt can:\n\n* Enable [GatorGrade](https://github.com/GatorEducator/gatorgrade) to check\n  projects implemented and documented in a wide variety of languages (e.g.,\n  Java, Python, LaTeX, Markdown, HTML, and CSS).\n\n* Integrate with [GitHub Classroom](https://classroom.github.com/) to check\n  solution and starter repositories created for professors and students,\n  respectively.\n\n* Run in a cloud-based environment like [Travis CI](https://travis-ci.com/) or\n  on the command-line of a developer's workstation.\n\n* Operate as a \"batteries included\" grading tool, supporting automated checks\n  like the following:\n\n  * Does a file exist in the correct directory with the requested name?\n\n  * Does technical writing contain the desired number of words and paragraphs?\n\n  * Does source code contain the designated number of language-specific comments?\n\n  * Does source code or technical writing contain a required fragment or match\n    a specified regular expression?\n\n  * Does a command execute correctly and produce the expected number of output\n    lines?\n\n  * Does a command execute and produce output containing a fragment or matching\n    a regular expression?\n\n  * Does a GitHub repository contain the anticipated number of commits?\n\nAligning with key recommendations in a recent [National Academies\nreport](https://www.nap.edu/catalog/24926/assessing-and-responding-to-the-growth-of-computer-science-undergraduate-enrollments),\nGatorGrader helps instructors automatically check student submissions in both\nintroductory and application-oriented classes using languages like Markdown,\nJava, Python, JavaScript, CSS, and HTML. GatorGrader does not aim to solve\nproblems related to building and linting a project or managing an assignment's\nsubmission, instead integrating with existing tools and systems like\n[Gradle](https://gradle.org/), [GitHub](https://github.com/), and [GitHub\nClassroom](https://classroom.github.com/) to effectively handle those tasks.\n\n## Installing GatorGrader\n\nInstalling GatorGrader is not necessary if you intend to use it through [GatorGrade](https://github.com/GatorEducator/gatorgrade).\nIf you want to participate in the development of GatorGrader, the project\nmaintainers suggest the use of [Pyenv](https://github.com/pyenv/pyenv) to\ninstall Python 3.7 or above. In addition to installing [Git](https://git-scm.com/)\nto access the project's GitHub repository, you should also install\n[Poetry](https://python-poetry.org/) for its support of package and virtual\nenvironment management. After completing the installation of these tools, you\ncan type the following command in your terminal window to clone GatorGrader's\nGitHub repository:\n\n```bash\ngit clone https://github.com/GatorEducator/gatorgrader.git\n```\n\nIf you plan to develop new features for GatorGrader or if you want to run the\ntool's test suite in [Pytest](https://github.com/pytest-dev/pytest), then you\nwill need to install a virtual environment for development by typing `poetry install`\nin the directory that contains GatorGrader. For help with this process, refer to\n[Poetry's documentation](https://python-poetry.org/docs/).\n\n## Testing GatorGrader\n\n### Automated Testing\n\nThe developers use [Pytest](https://docs.pytest.org/en/latest/) for the testing\nof GatorGrader. Depending on your goals, there are several different\nconfigurations in which you can run the provided test suite. If you want to run\nthe test suite to see if the test cases are passing, then running this command\nin a terminal window will perform testing with the version of Python with which\nPoetry's virtual environment was initialized.\n\n```\npoetry run task test\n```\n\n### Test Coverage\n\nAlong with running the test suite, the developers of GatorGrader use statement\nand branch coverage to enhance their testing activities. To see the coverage of\nthe tests while also highlighting the lines that are not currently covered by\nthe tests, you can run this command in a terminal window. As with the previous\ncommand, this will run the tests in the version of Python with which Poetry's\nvirtual environment was initialized.\n\n```\npoetry run task cover\n```\n\n### Testing with Multiple Python Versions\n\nThe previous two commands are restricted to running the test suite in the\nversion of Python with which Poetry was initialized. If you have installed multiple\nversions of Python with Pyenv and you want to iteratively initialized Poetry with each\nversion and then run the test suite, then you should first run the following\ncommands to install [Pipx](https://pypa.github.io/pipx/) and use Pipx to\ninstall [Invoke](https://github.com/pyinvoke/invoke). The first of these three\ncommands will install `pipx`, a program that supports the execution of Python\npackages in isolated environments. The second command makes the directory\n`~/.local/bin/` a part of the search path for executable Python programs and the\nthird one installs the `invoke` command so that it is available on your\nworkstation outside of a virtual environment managed by Poetry, thereby ensuring\nthat it is always available to run tasks.\n\n```\npip install pipx --user\npython -m userpath append ~/.local/bin/\npipx install invoke\n```\n\nNow you can run the test suite in the specified versions of Python with the\nfollowing command. This example command will run the test suite in Python 3.6.8\nand Python 3.7.3.\n\n```\ninvoke -c scripts/tasks test --pyenv 3.6.8 --pyenv 3.7.3\n```\n\nIf you want to track test coverage while running the tests in both Python 3.6.8\nand 3.7.3, then you can run the following command.\n\n```\ninvoke -c scripts/tasks cover --pyenv 3.6.8 --pyenv 3.7.3\n```\n\nYou can switch the version with which Poetry is initialized by running the following\ncommand that adopts, for instance, Python 3.7.3.\n\n```\ninvoke -c scripts/tasks switch --pyenv 3.7.3\n```\n\n### Code Linting\n\nThe developers of GatorGrader use linting and code formatting tools, such as\n[Pylint](https://github.com/PyCQA/pylint),\n[Pydocstyle](https://github.com/PyCQA/pydocstyle), and\n[Black](https://github.com/python/black). After installing GatorGrader's\ndevelopment dependencies with Poetry, you can run all of the linters by typing\nthis command in a terminal window.\n\n```bash\npoetry run task lint --check\n```\n\n### Automated Checks\n\nWant to learn about our linting checks? Check us out on our website,\n[GatorGrader](https://www.gatorgrader.org/)! We have detailed\ndescriptions of our linting checks and more! To get an idea of the linting checks we\noffer, here is a quick list:\n\n1. ConfirmFileExists\n\n2. CountCommandOutput\n\n3. CountCommits\n\n4. CountFileLines\n\n5. CountFileParagraphs\n\nWant to learn about our automated checks? Check them out on our website,\n[gatorgrader.org](http://www.gatorgrader.org)! We have detailed\ndescriptions of our automated checks and more!\n\nSomething you should know when working with our checks is that all of\nthem come with some **optional arguments**. Optional arguments that you are likely\nto encounter:\n* `-h`\n* `--help`\n* `--exact`\n* `--advanced`\n\nIf `--help` is tagged along with a check then a help message will be displayed and\nthen exited. If further assistance is needed, please contact us on GitHub.\n\nAnother feature with our automated checks is the **plug-in based approach**. This allows\nusers to implement their own check if our initial checks do not fulfill a check that\nyou find necessary.\n\n## Running GatorGrader\n\nStudents and instructors normally use GatorGrader through [GatorGrade](https://github.com/GatorEducator/gatorgrade),\nspecifying the requested checks in a `gatorgrade.yml` file. When run through GatorGrade, GatorGrader\nreports each check that it performed, additionally sharing a diagnostic message\nfor each check that did not pass. Individuals who want to run GatorGrader as a\nstand-alone Python application can install GatorGrader itself through [Pipx](https://pypa.github.io/pipx/),\nand then run `gatorgrader --help` to get more details on the command-line interface.\n\nInstructors often run GatorGrader in conjunction with other tools that check\nsource code and technical writing. For instance, in a Java-based introductory\ncourse, instructors could verify student submissions with\n[Checkstyle](https://github.com/checkstyle/checkstyle), thereby ensuring that\nthe Java source code adheres to the requirements in the [Google Java Style\nGuide](https://google.github.io/styleguide/javaguide.html). In this course, an\ninstructor could require that Markdown files with technical writing meet the\nstandards described in the [Markdown Syntax\nGuide](https://guides.github.com/features/mastering-markdown/), meaning that all\nMarkdown files must pass the checks performed by the [Markdown linting\ntool](https://github.com/markdownlint/markdownlint). These assignments could\nalso require that all submitted technical writing must adhere to the standards\nset by the [Proselint tool](http://proselint.com/). Since GatorGrader can run an\narbitrary command and check its error code, it is also possible to integrate it\nwith a wide variety of other linters, code formatters, and testing tools.\n\nInstructors may at times need to see a full list of checks to have a better understanding\nand therefore, we feel that it is important to know that there is an easy way for that to happen.\nThis action will be completed through command line and therefore, you can type\n`gatorgrader ListChecks` into your terminal, if you've installed GatorGrader as detailed above.\nThis allows for all of the checks to be printed out as output. This output will have the necessary\nname labeled with the required and optional arguments. If this output does not give enough content,\nwe warmly invite you to navigate to our website, where we go into more detail about our Automated Checks.\n\n## Using Docker\n\n_Note: Docker supports the older GatorGrader execution tool, [GatorGradle](https://github.com/GatorEducator/gatorgradle). It is not needed for GatorGrade!_\n\nA vital part of our process for GatorGrader is to implement and use new techniques\nto further our tool to grow. This is why we chose to use Docker! Docker is a container\nplatform and therefore, allows students using GatorGrader to just open a container\nand have easy access to run all commands that would allow them to build, run, and\ngrade their labs and practicals. Docker is an industry standard and therefore,\ngives us an advantage. To open a container that will allow for the use of GatorGrader,\nrun the following command in your terminal window:\n```\ndocker run -it --rm --name dockagator \\\n  -v \"$(pwd)\":/project \\\n  -v \"$HOME/.dockagator\":/root/.local/share \\\n  gatoreducator/dockagator /bin/bash\n```\nFrom here, you are set! Test it out by building, running, or grading your lab/practical!\nIf you would like to learn more about Docker, please follow this [link](https://www.docker.com).\n\n## Comparison to Other Tools\n\nOther automated grading tools include:\n\n- [autograde-github-classroom](https://github.com/apanangadan/autograde-github-classroom): \"scripts to download and grade submissions to Github Classroom\"\n- [check50](https://github.com/cs50/check50): \"a tool for checking student code\"\n- [Classroom Assistant](https://classroom.github.com/assistant): \"desktop application to help you get student repositories for grading\"\n- [nbgrader](https://github.com/jupyter/nbgrader): \"a system for assigning and grading notebooks\"\n- [nerfherder](https://github.com/kevinwortman/nerfherder): \"scripts for automating grading with GitHub Classroom and Moodle\"\n- [Submitty](https://github.com/Submitty/Submitty): \"homework submission, automated grading, and TA grading system\"\n- [WebCat](https://github.com/web-cat): \"all-in-one plugin for full processing and feedback generation\"\n\nDesigned for instructors who want an alternative to simple scripts or\nstand-alone platforms that do not integrate with industry-standard\ninfrastructure like GitHub and Travis CI, GatorGrader is a tool that\nautomatically checks the work of technical writers and programmers. Unlike other\nsystems, GatorGrader provides a \"batteries included\" approach to automated\ngrading that makes it easy for instructors to combine well-tested checks for\nprojects that students implement in a wide variety of programming languages.\nGatorGrader's developers take its engineering seriously, maintaining\nstandards-compliant source code, a test suite with 100% statement and branch\ncoverage, and top-notch source code and user documentation.\n\n## Presentations\n\nGatorGrader's creators give presentations about the development, use, and\nassessment of the tool. Please contact one of the developers if you would like\nto feature a presentation about GatorGrader at your technical conference. The\nfollowing list includes some of our team's recent presentations:\n\n- [A Hands-on Guide to Teaching Programming with GitHub, Travis CI, and Python](https://speakerdeck.com/gkapfham/a-hands-on-guide-to-teaching-programming-with-github-travis-ci-and-python) \u003cbr\u003e *at PyOhio 2018*\n- [Using GitHub, Travis CI, and Python to Introduce Collaborative Software Development](https://speakerdeck.com/gkapfham/using-github-travis-ci-and-python-to-introduce-collaborative-software-development) \u003cbr\u003e *at PyCon Education Summit 2018*\n- [Using Python, Travis CI, and GitHub to Effectively Teach Programming](https://speakerdeck.com/gkapfham/using-python-travis-ci-and-github-to-effectively-teach-programming) \u003cbr\u003e *at PyGotham 2018*\n\n## Contributing\n\nAre you interested in contributing to\n[GatorGrader](https://github.com/GatorEducator/gatorgrader),\n[GatorGradle](https://github.com/GatorEducator/gatorgradle), or any of the\nsample assignments (e.g.,\n[Java](https://github.com/GatorEducator/java-assigment-starter),\n[LaTeX](https://github.com/GatorEducator/latex-assignment-starter), or [HTML\nwith CSS](https://github.com/GatorEducator/html-css-assignment-starter))? Great,\nbecause we appreciate the involvement of new contributors! Before you raise an\nissue or start to make a contribution to GatorGrader's repository, we ask that\nyou review the project's [code of conduct](CODE_OF_CONDUCT.md) and the\n[contribution guidelines](CONTRIBUTING.md).\n\n## Contributors\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.gregorykapfhammer.com\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/926029?v=4\" width=\"64px;\" alt=\"Gregory M. Kapfhammer\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGregory M. Kapfhammer\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#talk-gkapfham\" title=\"Talks\"\u003e📢\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=gkapfham\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=gkapfham\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#design-gkapfham\" title=\"Design\"\u003e🎨\u003c/a\u003e \u003ca href=\"#infra-gkapfham\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=gkapfham\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://saejinmh.com\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/5274499?v=4\" width=\"64px;\" alt=\"Saejin Mahlau-Heinert\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSaejin Mahlau-Heinert\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=Michionlion\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=Michionlion\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#infra-Michionlion\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e \u003ca href=\"#review-Michionlion\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/dubswalker\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/37150088?v=4\" width=\"64px;\" alt=\"Christian Walker\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eChristian Walker\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#content-dubswalker\" title=\"Content\"\u003e🖋\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/everitt-andrew\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/31443695?v=4\" width=\"64px;\" alt=\"Andrew Everitt\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAndrew Everitt\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=everitt-andrew\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=everitt-andrew\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.christianlussier.com\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/32375724?v=4\" width=\"64px;\" alt=\"Christian Lussier\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eChristian Lussier\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=lussierc\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=lussierc\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.simon-burrows.com\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/25254767?v=4\" width=\"64px;\" alt=\"Simon Burrows\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSimon Burrows\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=burrowss\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.austinbristol.com/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/19804014?v=4\" width=\"64px;\" alt=\"Austin Bristol\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAustin Bristol\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=bristola\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/JattMones\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/22432176?v=4\" width=\"64px;\" alt=\"Matt\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMatt\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=JattMones\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=JattMones\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/cmiller365\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/27263493?v=4\" width=\"64px;\" alt=\"Christopher Miller\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eChristopher Miller\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=cmiller365\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#design-cmiller365\" title=\"Design\"\u003e🎨\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=cmiller365\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://spencerhuang.netlify.com\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/31478964?v=4\" width=\"64px;\" alt=\"Spencer Huang\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSpencer Huang\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=huangs1\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=huangs1\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/ilikerustoo\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/25516043?v=4\" width=\"64px;\" alt=\"Mohammad Khan\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMohammad Khan\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=ilikerustoo\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.shafferz.com\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/26298864?v=4\" width=\"64px;\" alt=\"Zachary Shaffer\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eZachary Shaffer\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=shafferz\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=shafferz\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://alexander.yarkosky.xyz\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/36210455?v=4\" width=\"64px;\" alt=\"Alexander Yarkosky\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAlexander Yarkosky\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/issues?q=author%3AAlex-Yarkosky\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=Alex-Yarkosky\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/thomad74\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/31478969?v=4\" width=\"64px;\" alt=\"Dillon\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDillon\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=thomad74\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://zacharyleonardo.com\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/35816642?v=4\" width=\"64px;\" alt=\"Zachary Leonardo\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eZachary Leonardo\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=leonardoz15\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/mendezjw\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/23535739?v=4\" width=\"64px;\" alt=\"Jonathan W. Mendez\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJonathan W. Mendez\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=mendezjw\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=mendezjw\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/lylet-AC\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/31486141?v=4\" width=\"64px;\" alt=\"Tyler Lyle\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTyler Lyle\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=lylet-AC\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/finneyj2\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/31444681?v=4\" width=\"64px;\" alt=\"finneyj2\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003efinneyj2\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=finneyj2\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=finneyj2\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/schultzh\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/42979565?v=4\" width=\"64px;\" alt=\"schultzh\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eschultzh\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/issues?q=author%3Aschultzh\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=schultzh\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=schultzh\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#review-schultzh\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/alexheinle\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/35603755?v=4\" width=\"64px;\" alt=\"alexheinle\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ealexheinle\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/issues?q=author%3Aalexheinle\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=alexheinle\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=alexheinle\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#review-alexheinle\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/ZachAndrews98\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/15204124?v=4\" width=\"64px;\" alt=\"Zachary Andrews\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eZachary Andrews\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=ZachAndrews98\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#design-ZachAndrews98\" title=\"Design\"\u003e🎨\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=ZachAndrews98\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/toccinAC\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/31412566?v=4\" width=\"64px;\" alt=\"Nicholas Tocci\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eNicholas Tocci\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=toccinAC\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/hodevin\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/31478952?v=4\" width=\"64px;\" alt=\"Devin Ho\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDevin Ho\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=hodevin\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/baldeosinghm\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/42876742?v=4\" width=\"64px;\" alt=\"Matthew Baldeosingh\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMatthew Baldeosingh\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=baldeosinghm\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://durchburch.xyz\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/31478922?v=4\" width=\"64px;\" alt=\"Jordan Durci\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJordan Durci\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=durcij\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.linkedin.com/in/karol-vargas-a9a925b8/\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/31486084?v=4\" width=\"64px;\" alt=\"Karol Vargas\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKarol Vargas\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=karolvargas\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/cerdamejiaj\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/25254696?v=4\" width=\"64px;\" alt=\"Jerfenson Cerda Mejia\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJerfenson Cerda Mejia\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=cerdamejiaj\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=cerdamejiaj\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/ohnoanarrow\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/22673907?v=4\" width=\"64px;\" alt=\"Tara Douglass\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTara Douglass\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=ohnoanarrow\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=ohnoanarrow\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/ALEXANDERB82\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/31444387?v=4\" width=\"64px;\" alt=\"Alexander Butler\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAlexander Butler\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=ALEXANDERB82\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/corlettim\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/35552969?v=4\" width=\"64px;\" alt=\"corlettim\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ecorlettim\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/issues?q=author%3Acorlettim\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=corlettim\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=corlettim\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#review-corlettim\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/quigley-c\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/35495466?v=4\" width=\"64px;\" alt=\"Carson Quigley\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eCarson Quigley\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=quigley-c\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/yeej2\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/22895281?v=4\" width=\"64px;\" alt=\"Joshua Yee\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJoshua Yee\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=yeej2\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=yeej2\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/MaddyKapfhammer\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/23369060?v=4\" width=\"64px;\" alt=\"Madelyn Kapfhammer\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMadelyn Kapfhammer\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=MaddyKapfhammer\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#infra-MaddyKapfhammer\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e \u003ca href=\"https://github.com/GatorEducator/gatorgrader/commits?author=MaddyKapfhammer\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the\n[all-contributors](https://github.com/all-contributors/all-contributors)\nspecification. Contributions of any kind are welcome!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgatoreducator%2Fgatorgrader","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgatoreducator%2Fgatorgrader","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgatoreducator%2Fgatorgrader/lists"}