From 4322671dac20c5bc52e02603d2736097274e78d5 Mon Sep 17 00:00:00 2001 From: Gero Lueckemeyer <gero.lueckemeyer@hft-stuttgart.de> Date: Tue, 31 Oct 2023 00:11:25 +0100 Subject: [PATCH] adjusted member and method names to moodle approval criteria --- dta.zip | Bin 17666 -> 17623 bytes dta/locallib.php | 14 +++---- dta/models/DtaResult.php | 77 +++++++++++++++++---------------------- dta/utils/backend.php | 10 ++--- dta/utils/database.php | 46 +++++++++++------------ dta/utils/view.php | 10 ++--- 6 files changed, 74 insertions(+), 83 deletions(-) diff --git a/dta.zip b/dta.zip index 058011e5f47c791a59811716eb8e7b49d6464a6a..bcedf44ce40e8e836a93f87059f9a6f3eb78b6d7 100644 GIT binary patch delta 9988 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 delta 10012 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 ZL4f}IeU4Hj5KiDYDH&K)k$=*F{{!mP1JD2f diff --git a/dta/locallib.php b/dta/locallib.php index a21cb6e..a218bde 100644 --- a/dta/locallib.php +++ b/dta/locallib.php @@ -153,7 +153,7 @@ class assign_submission_dta extends assign_submission_plugin { $file = reset($files); // Send file to backend. - return DtaBackendUtils::sendTestConfigToBackend($this->assignment, $file); + return DtaBackendUtils::sendtestconfigtobackend($this->assignment, $file); } /** @@ -275,7 +275,7 @@ class assign_submission_dta extends assign_submission_plugin { $file = reset($files); // Send file to backend. - $response = DtaBackendUtils::sendSubmissionToBackend($this->assignment, $file); + $response = DtaBackendUtils::sendsubmissiontobackend($this->assignment, $file); // With a null response, return an error. if (is_null($response)) { @@ -283,10 +283,10 @@ class assign_submission_dta extends assign_submission_plugin { } // Convert received json to valid class instances. - $resultsummary = DtaResultSummary::decodeJson($response); + $resultsummary = DtaResultSummary::decodejson($response); // Persist new results to database. - DbUtils::storeResultSummaryToDatabase($this->assignment->get_instance()->id, $submission->id, $resultsummary); + DbUtils::storeresultsummarytodatabase($this->assignment->get_instance()->id, $submission->id, $resultsummary); return true; } @@ -303,7 +303,7 @@ class assign_submission_dta extends assign_submission_plugin { public function view_summary(stdClass $submission, & $showviewlink) { $showviewlink = true; - return ViewSubmissionUtils::generateSummaryHtml( + return ViewSubmissionUtils::generatesummaryhtml( $this->assignment->get_instance()->id, $submission->id ); @@ -316,7 +316,7 @@ class assign_submission_dta extends assign_submission_plugin { * @return string detailed results html */ public function view(stdClass $submission) { - return ViewSubmissionUtils::generateDetailHtml( + return ViewSubmissionUtils::generatedetailhtml( $this->assignment->get_instance()->id, $submission->id ); @@ -383,7 +383,7 @@ class assign_submission_dta extends assign_submission_plugin { * @return bool */ public function delete_instance() { - DbUtils::uninstallPluginCleanUp(); + DbUtils::uninstallplugincleanup(); return true; } diff --git a/dta/models/DtaResult.php b/dta/models/DtaResult.php index 9740c5a..3a3ff30 100644 --- a/dta/models/DtaResult.php +++ b/dta/models/DtaResult.php @@ -18,8 +18,8 @@ defined('MOODLE_INTERNAL') || die(); class DtaResult { - public $packageName; - public $className; + public $packagename; + public $classname; public $name; /** @@ -32,12 +32,12 @@ class DtaResult { */ public $state; - public $failureType; - public $failureReason; + public $failuretype; + public $failurereason; public $stacktrace; - public $columnNumber; - public $lineNumber; + public $columnnumber; + public $linenumber; public $position; /** @@ -59,58 +59,50 @@ class DtaResult { class DtaResultSummary { public $timestamp; - public $globalStacktrace; - public $successfulTestCompetencyProfile; - public $overallTestCompetencyProfile; + public $globalstacktrace; + public $successfultestcompetencies; + public $overalltestcompetencies; public $results; /** * @param string $jsonString jsonString containing DtaResultSummary * @return DtaResultSummary */ - public static function decodeJson($jsonstring): DtaResultSummary { + public static function decodejson($jsonstring): DtaResultSummary { $response = json_decode($jsonstring); $summary = new DtaResultSummary(); $summary->timestamp = $response->timestamp; - $summary->globalStacktrace = $response->globalStacktrace; + $summary->globalstacktrace = $response->globalstacktrace; - $summary->successfulTestCompetencyProfile = $response->successfulTestCompetencyProfile; - $summary->overallTestCompetencyProfile = $response->overallTestCompetencyProfile; + $summary->successfultestcompetencies = $response->successfulTestCompetencyProfile; + $summary->overalltestcompetencies = $response->overallTestCompetencyProfile; - $summary->results = self::decodeJsonResultArray($response->results); + $summary->results = self::decodejsonresultarray($response->results); return $summary; } - private static function decodeJsonCompetencyArray($jsonarray): array { - $ret = array(); - foreach ($jsonarray as $entry) { - $ret[] = $entry; - } - return $ret; - } - /** * @param array $jsonArray decoded json array of results array * @return array of DtaResult */ - private static function decodeJsonResultArray($jsonarray): array { + private static function decodejsonresultarray($jsonarray): array { $ret = array(); foreach ($jsonarray as $entry) { $value = new DtaResult(); - $value->packageName = $entry->packageName; - $value->className = $entry->className; + $value->packagename = $entry->packageName; + $value->classname = $entry->className; $value->name = $entry->name; $value->state = $entry->state; - $value->failureType = $entry->failureType; - $value->failureReason = $entry->failureReason; + $value->failuretype = $entry->failureType; + $value->failurereason = $entry->failureReason; $value->stacktrace = $entry->stacktrace; - $value->columnNumber = $entry->columnNumber; - $value->lineNumber = $entry->lineNumber; + $value->columnnumber = $entry->columnNumber; + $value->linenumber = $entry->lineNumber; $value->position = $entry->position; $ret[] = $value; @@ -118,39 +110,38 @@ class DtaResultSummary { return $ret; } + public function resultcount(): int { + return count($this->results); + } + /** * @param int $state state ordinal number * @return int count of occurences provided state has */ - public function stateOccurenceCount(int $state): int { + public function stateoccurencecount(int $state): int { $num = 0; foreach ($this->results as $r) { if ($r->state == $state) { $num++; } } - return $num; } - public function compilationErrorCount(): int { - return $this->stateOccurenceCount(3); + public function compilationerrorcount(): int { + return $this->stateoccurencecount(3); } - public function failedCount(): int { - return $this->stateOccurenceCount(2); - } - - public function resultCount(): int { - return count($this->results); + public function failedcount(): int { + return $this->stateoccurencecount(2); } - public function successfulCount(): int { - return $this->stateOccurenceCount(1); + public function successfulcount(): int { + return $this->stateoccurencecount(1); } - public function unknownCount(): int { - return $this->stateOccurenceCount(0); + public function unknowncount(): int { + return $this->stateoccurencecount(0); } } diff --git a/dta/utils/backend.php b/dta/utils/backend.php index 706ecb8..173352b 100644 --- a/dta/utils/backend.php +++ b/dta/utils/backend.php @@ -19,7 +19,7 @@ class DtaBackendUtils { /** * @return string backend host base url */ - private static function getBackendBaseUrl(): string { + private static function getbackendbaseurl(): string { $backendaddress = get_config(assign_submission_dta::COMPONENT_NAME, "backendHost"); if (empty($backendaddress)) { @@ -37,8 +37,8 @@ class DtaBackendUtils { * * @return bool true if no error occurred */ - public static function sendTestConfigToBackend($assignment, $file): bool { - $backendaddress = self::getBackendBaseUrl(); + public static function sendtestconfigtobackend($assignment, $file): bool { + $backendaddress = self::getbackendbaseurl(); if (empty($backendaddress)) { return true; } @@ -68,8 +68,8 @@ class DtaBackendUtils { * * @return string json string with testresults or null on error */ - public static function sendSubmissionToBackend($assignment, $file): ?string { - $backendaddress = self::getBackendBaseUrl(); + public static function sendsubmissiontobackend($assignment, $file): ?string { + $backendaddress = self::getbackendbaseurl(); if (empty($backendaddress)) { return true; } diff --git a/dta/utils/database.php b/dta/utils/database.php index 0255d1a..0eb2380 100644 --- a/dta/utils/database.php +++ b/dta/utils/database.php @@ -22,13 +22,13 @@ class DbUtils { private const TABLE_RESULT = "assignsubmission_dta_result"; /** - * get's summary with all corresponding result entries + * gets summary with all corresponding result entries * * @param int $assignmentid assignment id to search for * @param int $submissionid submission id to search for * @return DttResultSummary representing given submission */ - public static function getResultSummaryFromDatabase( + public static function getresultsummaryfromdatabase( int $assignmentid, int $submissionid ): DtaResultSummary { @@ -48,23 +48,23 @@ class DbUtils { // Create a summary instance. $summary = new DtaResultSummary(); $summary->timestamp = $summaryrecord->timestamp; - $summary->globalStacktrace = $summaryrecord->global_stacktrace; - $summary->successfulTestCompetencyProfile = $summaryrecord->successful_competencies; - $summary->overallTestCompetencyProfile = $summaryrecord->tested_competencies; + $summary->globalstacktrace = $summaryrecord->global_stacktrace; + $summary->successfultestcompetencies = $summaryrecord->successful_competencies; + $summary->overalltestcompetencies = $summaryrecord->tested_competencies; $summary->results = array(); // Create result instances and add to array of summary instance. foreach ($resultsarray as $rr) { $result = new DtaResult(); - $result->packageName = $rr->package_name; - $result->className = $rr->class_name; + $result->packagename = $rr->package_name; + $result->classname = $rr->class_name; $result->name = $rr->name; $result->state = $rr->state; - $result->failureType = $rr->failure_type; - $result->failureReason = $rr->failure_reason; + $result->failuretype = $rr->failure_type; + $result->failurereason = $rr->failure_reason; $result->stacktrace = $rr->stacktrace; - $result->columnNumber = $rr->column_number; - $result->lineNumber = $rr->line_number; + $result->columnnumber = $rr->column_number; + $result->linenumber = $rr->line_number; $result->position = $rr->position; $summary->results[] = $result; @@ -81,7 +81,7 @@ class DbUtils { * @param int submissionid submission of this result * @param DttResultSummary instance to persist */ - public static function storeResultSummaryToDatabase( + public static function storeresultsummarytodatabase( int $assignmentid, int $submissionid, DtaResultSummary $summary @@ -92,26 +92,26 @@ class DbUtils { $summaryrecord = new stdClass(); $summaryrecord->assignment_id = $assignmentid; $summaryrecord->submission_id = $submissionid; - $summaryrecord->successful_competencies = $summary->successfulTestCompetencyProfile; - $summaryrecord->tested_competencies = $summary->overallTestCompetencyProfile; $summaryrecord->timestamp = $summary->timestamp; - $summaryrecord->global_stacktrace = $summary->globalStacktrace; - + $summaryrecord->global_stacktrace = $summary->globalstacktrace; + $summaryrecord->successful_competencies = $summary->successfultestcompetencies; + $summaryrecord->tested_competencies = $summary->overalltestcompetencies; + // Prepare results to persist to array. $resultrecords = array(); foreach ($summary->results as $r) { $record = new stdClass(); $record->assignment_id = $assignmentid; $record->submission_id = $submissionid; - $record->package_name = $r->packageName; - $record->class_name = $r->className; + $record->package_name = $r->packagename; + $record->class_name = $r->classname; $record->name = $r->name; $record->state = $r->state; - $record->failure_type = $r->failureType; - $record->failure_reason = $r->failureReason; + $record->failure_type = $r->failuretype; + $record->failure_reason = $r->failurereason; $record->stacktrace = $r->stacktrace; - $record->column_number = $r->columnNumber; - $record->line_number = $r->lineNumber; + $record->column_number = $r->columnnumber; + $record->line_number = $r->linenumber; $record->position = $r->position; $resultrecords[] = $record; } @@ -144,7 +144,7 @@ class DbUtils { /** * cleans up database if plugin is uninstalled */ - public static function uninstallPluginCleanUp(): void { + public static function uninstallplugincleaup(): void { global $DB; $DB->delete_records(self::TABLE_RESULT, null); diff --git a/dta/utils/view.php b/dta/utils/view.php index 3927c54..2193b61 100644 --- a/dta/utils/view.php +++ b/dta/utils/view.php @@ -23,7 +23,7 @@ class ViewSubmissionUtils { * @param int submissionid submission to create a report for * @return string html */ - public static function generateSummaryHtml( + public static function generatesummaryhtml( int $assignmentid, int $submissionid ): string { @@ -64,7 +64,7 @@ class ViewSubmissionUtils { * @param int assignmentid assignment * @param int submissionid submission to create a report for */ - public static function generateDetailHtml( + public static function generatedetailhtml( int $assignmentid, int $submissionid ): string { @@ -104,7 +104,7 @@ class ViewSubmissionUtils { $resultrowattributes = $tablerowattributes; $resultrowattributes['class'] = $resultrowattributes['class'] . " " . $unknownattributes; - + $body .= html_writer::tag("tr", $tmp, $resultrowattributes); $tmp = ""; @@ -205,7 +205,7 @@ class ViewSubmissionUtils { $body = ""; $spacerrow = null; - foreach($summary->results as $r) { + foreach ($summary->results as $r) { // Add spacer first if not null. if (!is_null($spacerrow)) { $body .= $spacerrow; @@ -256,7 +256,7 @@ class ViewSubmissionUtils { "td", "failure type", $attributes); - + $tmp .= html_writer::tag( "td", $r->failureType, -- GitLab