{"id":43744769,"url":"https://github.com/elearning-ostfalia/moodle-qtype_proforma","last_synced_at":"2026-02-05T12:14:40.092Z","repository":{"id":41676128,"uuid":"191607020","full_name":"elearning-ostfalia/moodle-qtype_proforma","owner":"elearning-ostfalia","description":"qtype proforma (a moodle-plugin for programming exercises)","archived":false,"fork":false,"pushed_at":"2025-04-08T06:03:20.000Z","size":4361,"stargazers_count":2,"open_issues_count":4,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-08T07:21:58.800Z","etag":null,"topics":["moodle","moodle-plugin","moodle-question-type"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elearning-ostfalia.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"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":"2019-06-12T16:23:44.000Z","updated_at":"2025-03-25T15:10:01.000Z","dependencies_parsed_at":"2024-03-22T11:53:58.150Z","dependency_job_id":"478f269e-9dda-4dfe-a869-23d5e380f6f5","html_url":"https://github.com/elearning-ostfalia/moodle-qtype_proforma","commit_stats":null,"previous_names":[],"tags_count":59,"template":false,"template_full_name":null,"purl":"pkg:github/elearning-ostfalia/moodle-qtype_proforma","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elearning-ostfalia%2Fmoodle-qtype_proforma","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elearning-ostfalia%2Fmoodle-qtype_proforma/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elearning-ostfalia%2Fmoodle-qtype_proforma/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elearning-ostfalia%2Fmoodle-qtype_proforma/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elearning-ostfalia","download_url":"https://codeload.github.com/elearning-ostfalia/moodle-qtype_proforma/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elearning-ostfalia%2Fmoodle-qtype_proforma/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29121688,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-05T10:47:47.471Z","status":"ssl_error","status_checked_at":"2026-02-05T10:45:08.119Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["moodle","moodle-plugin","moodle-question-type"],"created_at":"2026-02-05T12:14:39.296Z","updated_at":"2026-02-05T12:14:40.077Z","avatar_url":"https://github.com/elearning-ostfalia.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"Requires at least Praktomat Version 4.18\n\nThe ProForma Moodle Question Type is a Moodle Plugin that is used for \nautomatically grading programming questions in Moodle quizzes. Questions are \ninternally stored in the ProFormA format (https://github.com/ProFormA/proformaxml). \n\nTests are run on a back-end system (test runner) that also conforms to the \nProFormA standard (https://github.com/ProFormA/proformaxml) version 2: Praktomat (https://github.com/elearning-ostfalia/Proforma-Praktomat).\n\n\n![system architecture](doc/architecture.png \"System architecture\")\n\nStandard test frameworks are used for specifying tests. Currently the following programming languages and test frameworks are supported:\n\n- Java: JUnit 4, JUnit 5, Checkstyle\n- C++: GoogleTest (with CMake/Makefile)\n- c: GoogleTest, CUnit (with CMake/Makefile)\n- Python: Python Unittest, Python Doctest\n- (Setlx: Test, Syntax Check)\n\nAny other  programming language resp. test framework can be used as long as Praktomat \nsupports it. Since all code is open source, it can be easily extended to other languages and frameworks.\n\nThe plugin comes with a built-in question editor. \nMost questions can be created in Moodle with the built-in editor. \nMore complex questions can be created outside of the system with a stand-alone editor \n(https://proforma.github.io/formatEditor/proformaEditor.html) or by other means \n(e.g. script). These questions can be imported by use of another Moodle plugin.\nThe stand-alone editor is also included in this plugin for \"ProFormA\" questions. \n\nCopyright note: The renderer code partly bases upon the renderer from essay question type (Moodle core).\nSmall code parts (in particular in qbehaviour_adaptiveexternalgrading) are copied from Coderunner \n(https://moodle.org/plugins/qtype_coderunner). The bulktester code bases on same part in Stack.\n  \n## Features\n\n- various submission formats: \n    \n    * editor with programming language support such as syntax highlighting or automatic indentation\n    * explorer/IDE-like environment for creating and editing multiple files, also with programming language support\n    * file upload (for more than one file)\n    * external repository (git or SVN) \n  \n- code snippet as starting point for student in editor\n- immediate feedback for students (optional) \n- supported programming languages are only limited by the available grader back-ends \n\nPlease note that when completing a quiz attempt, you may see the message 'questions without a response'.\nQuestions are considered unanswered even if the answer is not correct. \nThis is a characteristic of 'adaptive' behavior and can also be observed with other question types.\n\n## Screenshots\n\nStudent view with editor input (code template and syntax highlighting): \n![Editor with code template](doc/student_editor.png \"student view with editor\")\n\nAlternative: Simple file explorer if the response consists of more than one file:\n\n![Explorer](doc/student_explorer.png \"student view with explorer\")\n\nAlternative: File upload with filepicker for large files or if the response consists of more than one file:\n\n![Filepicker](doc/student_filepicker.png \"student view with filepicker\")\n\nStudent feedback for Java question:\n\n![Java](doc/student_feedback_2.png \"Java feedback\")\n\nStudent feedback for Python question:\n\n![Python](doc/python.png \"Python feedback\")\n\nMessages in editor:\n\n![Checkstyle](doc/checkstyle_2.PNG \"Checkstyle messages\")\n\n## Installation\n\n####  Prerequisites \n\nThe ProFormA question type requires:\n\n- the Moodle plugin `qbehaviour_adaptiveexternalgrading`\n(https://github.com/elearning-ostfalia/moodle-qbehaviour_adaptiveexternalgrading) for \nquestion engine adaptation and\n\n- a ProFromA grading back-end to run the tests.  \n`ProFormA-Praktomat` (https://github.com/elearning-ostfalia/Proforma-Praktomat) is recommended.\n\nCurrently only simple Java and SetlX (https://randoom.org/Software/SetlX/) questions can be created straight in Moodle. Note that SetlX is disabled by default.\n\nFor importing questions from an external source an import plugin is available (optional):   \n\n- Moodle-Plugin `qformat_proforma` (import for ProFormA questions)\n\nWe have a separate Javascript editor for creating tasks (https://github.com/ProFormA/formatEditor). An online version is available at \nhttps://proforma.github.io/formatEditor/proformaEditor.html\n       \nOf course ProFormA tasks can be created by different other external tools as well.\n\n\nIn order to download all students' submissions for e.g. checking for plagiats the plugins \n\n* `proformasubmexport`: https://github.com/elearning-ostfalia/moodle-proformasubmexport and\n* `responsedownload`:  https://github.com/elearning-ostfalia/moodle-responsedownload\n\nare avaliable.\n\n\n\u003c!-- Import process:\n\n![import](doc/import_en.png \"import\")\n--\u003e\n\n\n#### Streaming\n\nSome PHP files send event driven texts to the browser (server sent events). In order for this to work properly, adjustments may have to be made to your web server.\n\nE.g. when using Apache and proxy_fcgi add the following lines (or similar) to your php???-fpm.conf file:\n\n    ProxyPassMatch \"^/path/to/moodle/question/type/proforma/upload_sse\\.php$\" \"fcgi://localhost\" enablereuse=on flushpackets=on\n    ProxyPassMatch \"^/path/to/moodle/question/type/proforma/checksolution_ajax\\.php$\" \"fcgi://localhost\" enablereuse=on flushpackets=on\n\n## Settings\n\n\n### Admin settings\n\nAt least the following settings must be made:  \n\n* set grader URI to IP address and port number of your 'ProFormA-Praktomat server'\n\n* Moodle 4: Ensure that the servers (IP and port) are not blocked by HTTP security (\"cURL blocked hosts list\" and \"cURL allowed ports list\").\n\nand for the built-in Java question generator: \n\n* set Java version\n* set Checkstyle version\n* set JUnit version\n\nThere is a simple test for the connection between Moodle and Praktomat in the settings page where the grader URI is set. If you press the `save changes` button the connection is checked and in case of an error the error message is displayed. \n\n![connectiontest](doc/connection_test.PNG \"connection test\")\n\n\n### Sample\n\nThe following steps describe how you can create a simple Java question. You should always test your question by actually sending a correct submission to the grader. \n\n* Go to an existing course (or create one)\n* Go to the question back\n* press `Create a new question...`\n* select `ProFormA Task`\n* If a selection dialog is visible then select Java and press 'ok'\n* Fill in: `Question name` =`Test Question`, `Question text` = `test`\n* Go to `1. JUnit Test` and enter `Title` = `JUnit`\n* Enter the following code into the JUnit Test editor: \n \n        import static org.junit.Assert.*;\n        import org.junit.Test;\n\n        public class PalindromTest {\n        \n            @Test\n            public void testRentner() {\n                assertEquals(\"Rentner\", true, MyString.isPalindrom(\"Rentner\"));\n            }\n        }        \n\n* Set `Response filename` to `MyString.java`\n* Press `Save Changes`\n* Select `Edit` -\u003e `Preview`\n* Enter the follwing code into the editor:\n\n        public class MyString {\n            \n            static public Boolean isPalindrom(String aString) \n            {\n                String reverse = new StringBuilder(aString).reverse().toString();\n                return (aString.equalsIgnoreCase(reverse));\n            }\n        }\n\nThen you should see:\n\n![Test Feedback](doc/testfeedback.PNG \"Test Feedback\")\n\n\n\n### Quiz settings\n\nIn order to display the grading feedback to the student you need to set the following \noptions in your Moodle quiz:\n\n* Question behaviour: `Adaptive` (with our without penalties) for displaying immediate feedback\n  or `deferred feedback` if the student  shall not see any feedback \n* Review Options: `Specific Feedback` set to `on` for showing detailed grading results\n* Review Options: opt out `Right Answer` if you do not want to show the model solution\n\n\n### Miscellaneous\n\n#### Bulktest \n\nWith the bulktest index you get a list of all courses using ProFormA questions. \n\n        \u003cyour moodle site\u003e/question/type/proforma/bulktestindex.php\n\nBy clicking on a course you run a bulk test of all ProFormA questions in this course using the associated model solution.\n\nThis script can also be used by a teacher or manager. He or she only gets a list of his or her course(s). \n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felearning-ostfalia%2Fmoodle-qtype_proforma","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felearning-ostfalia%2Fmoodle-qtype_proforma","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felearning-ostfalia%2Fmoodle-qtype_proforma/lists"}