From 5f2b4ada0ac7f36430ee3f1048bdbff9456f259a Mon Sep 17 00:00:00 2001 From: Gero Lueckemeyer <gero.lueckemeyer@hft-stuttgart.de> Date: Mon, 13 Nov 2023 13:46:37 +0100 Subject: [PATCH] added documentation comments --- dta.zip | Bin 19339 -> 20153 bytes dta/db/upgrade.php | 3 +- dta/lang/en/assignsubmission_dta.php | 1 + dta/lib.php | 1 + dta/locallib.php | 20 ++++-- dta/models/DtaResult.php | 93 ++++++++++++++++++++++++++- dta/settings.php | 1 + dta/utils/view.php | 31 +++++---- dta/version.php | 1 + 9 files changed, 131 insertions(+), 20 deletions(-) diff --git a/dta.zip b/dta.zip index b35770daf7870b735d46f7150169198a2a38df19..cc6f4c3f06c523eb5039144924d3f51da123844b 100644 GIT binary patch delta 14176 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 delta 13380 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 diff --git a/dta/db/upgrade.php b/dta/db/upgrade.php index 7ee51ec..65e64b4 100644 --- a/dta/db/upgrade.php +++ b/dta/db/upgrade.php @@ -19,6 +19,7 @@ * * @package assignsubmission_dta * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @copyright Gero Lueckemeyer and student project teams */ /** @@ -28,6 +29,6 @@ */ function xmldb_assignsubmission_dta_upgrade($oldversion) { global $CFG; - + // Currently no adjustments necessary for Moodle upgrades. Works without changes since the first MoJEC version. return true; } diff --git a/dta/lang/en/assignsubmission_dta.php b/dta/lang/en/assignsubmission_dta.php index 2b8d945..54cffa3 100644 --- a/dta/lang/en/assignsubmission_dta.php +++ b/dta/lang/en/assignsubmission_dta.php @@ -19,6 +19,7 @@ * * @package assignsubmission_dta * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @copyright Gero Lueckemeyer and student project teams */ // General. diff --git a/dta/lib.php b/dta/lib.php index b412fe9..c090bfc 100644 --- a/dta/lib.php +++ b/dta/lib.php @@ -19,6 +19,7 @@ * * @package assignsubmission_dta * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @copyright Gero Lueckemeyer and student project teams */ /** diff --git a/dta/locallib.php b/dta/locallib.php index 1e77341..1e65203 100644 --- a/dta/locallib.php +++ b/dta/locallib.php @@ -30,13 +30,21 @@ require_once($CFG->dirroot . '/mod/assign/submission/dta/utils/view.php'); */ class assign_submission_dta extends assign_submission_plugin { - // Broadly used in logic, parametrized for easier change. + /** + * Broadly used in logic, parametrized for easier change. + */ const COMPONENT_NAME = "assignsubmission_dta"; - // Draft file area for dta tests to be uploaded by the teacher. + /** + * Draft file area for dta tests to be uploaded by the teacher. + */ const ASSIGNSUBMISSION_DTA_DRAFT_FILEAREA_TEST = "tests_draft_dta"; - // File area for dta tests to be uploaded by the teacher. + /** + * File area for dta tests to be uploaded by the teacher. + */ const ASSIGNSUBMISSION_DTA_FILEAREA_TEST = "tests_dta"; - // File area for dta submission assignment. + /** + * File area for dta submission assignment. + */ const ASSIGNSUBMISSION_DTA_FILEAREA_SUBMISSION = "submissions_dta"; /** @@ -304,7 +312,7 @@ class assign_submission_dta extends assign_submission_plugin { public function view_summary(stdClass $submission, & $showviewlink) { $showviewlink = true; - return ViewSubmissionUtils::generatesummaryhtml( + return view_submission_utils::generatesummaryhtml( $this->assignment->get_instance()->id, $submission->id ); @@ -317,7 +325,7 @@ class assign_submission_dta extends assign_submission_plugin { * @return string detailed results html */ public function view(stdClass $submission) { - return ViewSubmissionUtils::generatedetailhtml( + return view_submission_utils::generatedetailhtml( $this->assignment->get_instance()->id, $submission->id ); diff --git a/dta/models/DtaResult.php b/dta/models/DtaResult.php index b666f51..4ca751e 100644 --- a/dta/models/DtaResult.php +++ b/dta/models/DtaResult.php @@ -16,13 +16,33 @@ defined('MOODLE_INTERNAL') || die(); +/** + * entity class for DTA submission plugin result + * + * @package assignsubmission_dta + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @copyright Gero Lueckemeyer and student project teams + */ class DtaResult { - // Broadly used in logic, parametrized for easier change. + /** + * Broadly used in logic, parametrized for easier change. + */ const COMPONENT_NAME = "assignsubmission_dta"; + /** + * Package name of the test. + */ public $packagename; + + /** + * Unit name of the test. + */ public $classname; + + /** + * Name of the test. + */ public $name; /** @@ -35,16 +55,37 @@ class DtaResult { */ public $state; + /** + * Type of test failure if applicable, "" otherwise. + */ public $failuretype; + + /** + * Reason of test failure if applicable, "" otherwise. + */ public $failurereason; + + /** + * Stack trace of test failure if applicable, "" otherwise. + */ public $stacktrace; + /** + * Column number of compile failure if applicable, "" otherwise. + */ public $columnnumber; + /** + * Line number of compile failure if applicable, "" otherwise. + */ public $linenumber; + /** + * Position of compile failure if applicable, "" otherwise. + */ public $position; /** - * @return name of state like defined + * Returns the name of a state with the given number of display. + * @return name of state as defined */ public static function getstatename(int $state): string { if ($state == 1) { @@ -59,15 +100,40 @@ class DtaResult { } } +/** + * entity class for DTA submission plugin result + * + * @package assignsubmission_dta + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @copyright Gero Lueckemeyer and student project teams + */ class DtaResultSummary { + /** + * Result timestamp for chronological ordering and deletion of previous results. + */ public $timestamp; + + /** + * Global stack trace if applicable, "" otherwise. + */ public $globalstacktrace; + + /** + * Successfully tested competencies according to tests and weights, "" otherwise. + */ public $successfultestcompetencies; + /** + * Overall tested competencies according to tests and weights, "" otherwise. + */ public $overalltestcompetencies; + /** + * List of detail results. + */ public $results; /** + * Decodes the JSON result summary returned by the backend service call into the plugin PHP data structure. * @param string $jsonString jsonString containing DtaResultSummary * @return DtaResultSummary */ @@ -87,6 +153,7 @@ class DtaResultSummary { } /** + * Decodes the array of JSON detail results returned by the backend service call into the plugin PHP data structure. * @param array $jsonArray decoded json array of results array * @return array of DtaResult */ @@ -113,11 +180,17 @@ class DtaResultSummary { return $ret; } + + /** + * Returns the number of detail results attached to the summary. + * @return int count of occurences + */ public function resultcount(): int { return count($this->results); } /** + * Returns the number of detail results with the given state attached to the summary. * @param int $state state ordinal number * @return int count of occurences provided state has */ @@ -131,18 +204,34 @@ class DtaResultSummary { return $num; } + /** + * Returns the number of detail results with compilation errors attached to the summary. + * @return int count of occurences + */ public function compilationerrorcount(): int { return $this->stateoccurencecount(3); } + /** + * Returns the number of detail results with test failures attached to the summary. + * @return int count of occurences + */ public function failedcount(): int { return $this->stateoccurencecount(2); } + /** + * Returns the number of detail results with successful tests attached to the summary. + * @return int count of occurences + */ public function successfulcount(): int { return $this->stateoccurencecount(1); } + /** + * Returns the number of detail results with an unknown result - mostly due to compile errors - attached to the summary. + * @return int count of occurences + */ public function unknowncount(): int { return $this->stateoccurencecount(0); } diff --git a/dta/settings.php b/dta/settings.php index 1dcd60a..fe1071a 100644 --- a/dta/settings.php +++ b/dta/settings.php @@ -19,6 +19,7 @@ * * @package assignsubmission_dta * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @copyright Gero Lueckemeyer and student project teams */ defined('MOODLE_INTERNAL') || die(); diff --git a/dta/utils/view.php b/dta/utils/view.php index 98af5c3..db3cd77 100644 --- a/dta/utils/view.php +++ b/dta/utils/view.php @@ -14,9 +14,18 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. -class ViewSubmissionUtils { - - // Broadly used in logic, parametrized for easier change. +/** + * utility class for DTA submission plugin result display + * + * @package assignsubmission_dta + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @copyright Gero Lueckemeyer and student project teams + */ +class view_submission_utils { + + /** + * Broadly used in logic, parametrized for easier change. + */ const COMPONENT_NAME = "assignsubmission_dta"; /** @@ -60,16 +69,16 @@ class ViewSubmissionUtils { $overallcompetencies = explode(";", $summary->overalltestcompetencies); $tmp = ""; - for ($index=0, $size=count($showncompetencies); $index<$size; $index++) { - $shown=$showncompetencies[$index]; - $comp=$overallcompetencies[$index]; + for ($index = 0, $size = count($showncompetencies); $index < $size; $index++) { + $shown = $showncompetencies[$index]; + $comp = $overallcompetencies[$index]; // If the competency was actually assessed by the assignment and tests, add a summary entry. if($shown!="0") { $tmp .= get_string("comp" . $index, self::COMPONENT_NAME) . " " . 100*floatval($shown)/floatval($comp) . "% " . "<br />"; } } - $html .= get_string("success_competencies", self::COMPONENT_NAME) . $tmp . "<br />"; + $html .= get_string("success_competencies", self::COMPONENT_NAME) . "<br />" . $tmp . "<br />"; return html_writer::div($html, "dtaSubmissionSummary"); } @@ -223,11 +232,11 @@ class ViewSubmissionUtils { $showncompetencies = explode(";", $summary->successfultestcompetencies); $overallcompetencies = explode(";", $summary->overalltestcompetencies); - for ($index=0, $size=count($overallcompetencies); $index<$size; $index++) { - $comp=$overallcompetencies[$index]; - $shown=$showncompetencies[$index]; + for ($index = 0, $size = count($overallcompetencies); $index < $size; $index++) { + $comp = $overallcompetencies[$index]; + $shown = $showncompetencies[$index]; // If the competency was actually assessed by the assignment and tests, add a row in the table. - if($comp!="0") { + if($comp != "0") { // New copy of base attributes array. $resultrowattributes = $tablerowattributes; $tmp = ""; diff --git a/dta/version.php b/dta/version.php index ddff0ae..b7de914 100644 --- a/dta/version.php +++ b/dta/version.php @@ -19,6 +19,7 @@ * * @package assignsubmission_dta * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @copyright Gero Lueckemeyer and student project teams */ defined('MOODLE_INTERNAL') || die(); -- GitLab