Skip to content

Commit 534f9b6

Browse files
authored
Merge pull request #14 from exelearning/development-toolbox
Add Docker Support and Makefile for Development, Linting, and Fixing
2 parents 78432c7 + 0e19131 commit 534f9b6

File tree

93 files changed

+1520
-1223
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+1520
-1223
lines changed

.github/workflows/moodle-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
strategy:
3131
fail-fast: false
3232
matrix:
33-
php: ['7.4', '8.1', '8.3']
33+
php: ['8.1', '8.3']
3434
moodle-branch: ['MOODLE_401_STABLE', 'MOODLE_404_STABLE']
3535
database: [pgsql, mariadb]
3636

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
.aider*
2+
.env
3+
4+
# mess detector rules
5+
phpmd-rules.xml
6+
7+
# Composer ignores
8+
/vendor/
9+
/composer.lock
10+
/composer.phar

Makefile

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
# Makefile to facilitate the use of Docker in the exelearning-web project
2+
3+
# Detect the operating system and shell environment
4+
ifeq ($(OS),Windows_NT)
5+
# Initially assume Windows shell
6+
SHELLTYPE := windows
7+
# Check if we are in Cygwin or MSYS (e.g., Git Bash)
8+
ifdef MSYSTEM
9+
SHELLTYPE := unix
10+
else ifdef CYGWIN
11+
SHELLTYPE := unix
12+
endif
13+
else
14+
SHELLTYPE := unix
15+
endif
16+
17+
# Check if Docker is running
18+
# This target verifies if Docker is installed and running on the system.
19+
check-docker:
20+
ifeq ($(SHELLTYPE),windows)
21+
@echo "Detected system: Windows (cmd, powershell)"
22+
@docker version > NUL 2>&1 || (echo. & echo Error: Docker is not running. Please make sure Docker is installed and running. & echo. & exit 1)
23+
else
24+
@echo "Detected system: Unix (Linux/macOS/Cygwin/MinGW)"
25+
@docker version > /dev/null 2>&1 || (echo "" && echo "Error: Docker is not running. Please make sure Docker is installed and running." && echo "" && exit 1)
26+
endif
27+
28+
# Check if the .env file exists, if not, copy from .env.dist
29+
# This target ensures that the .env file is present by copying it from .env.dist if it doesn't exist.
30+
check-env:
31+
ifeq ($(SHELLTYPE),windows)
32+
@if not exist .env ( \
33+
echo The .env file does not exist. Copying from .env.dist... && \
34+
copy .env.dist .env \
35+
) 2>nul
36+
else
37+
@if [ ! -f .env ]; then \
38+
echo "The .env file does not exist. Copying from .env.dist..."; \
39+
cp .env.dist .env; \
40+
fi
41+
endif
42+
43+
# Start Docker containers in interactive mode
44+
# This target builds and starts the Docker containers, allowing interaction with the terminal.
45+
up: check-docker
46+
docker compose up --build
47+
48+
# Start Docker containers in background mode (daemon)
49+
# This target builds and starts the Docker containers in the background.
50+
upd: check-docker
51+
docker compose up -d
52+
53+
# Stop and remove Docker containers
54+
# This target stops and removes all running Docker containers.
55+
down: check-docker
56+
docker compose down
57+
58+
# Pull the latest images from the registry
59+
# This target pulls the latest Docker images from the registry.
60+
pull: check-docker
61+
docker compose -f docker-compose.yml pull
62+
63+
# Build or rebuild Docker containers
64+
# This target builds or rebuilds the Docker containers.
65+
build: check-docker
66+
docker compose build
67+
68+
# Open a shell inside the moodle container
69+
# This target opens an interactive shell session inside the running Moodle container.
70+
shell: check-docker
71+
docker compose exec moodle sh
72+
73+
# Clean up and stop Docker containers, removing volumes and orphan containers
74+
# This target stops all containers and removes them along with their volumes and any orphan containers.
75+
clean: check-docker
76+
docker compose down -v --remove-orphans
77+
78+
# Install PHP dependencies using Composer
79+
install-deps:
80+
COMPOSER_ALLOW_SUPERUSER=1 composer install --no-interaction --prefer-dist --optimize-autoloader --no-progress
81+
82+
# Run code linting using Composer
83+
lint:
84+
composer lint
85+
86+
# Automatically fix code style issues using Composer
87+
fix:
88+
composer fix
89+
90+
# Run tests using Composer
91+
test:
92+
composer test
93+
94+
# Run PHP Mess Detector using Composer
95+
phpmd:
96+
composer phpmd
97+
98+
# Run Behat tests using Composer
99+
behat:
100+
composer behat
101+
# Display help with available commands
102+
# This target lists all available Makefile commands with a brief description.
103+
help:
104+
@echo "Available commands:"
105+
@echo " up - Start Docker containers in interactive mode"
106+
@echo " upd - Start Docker containers in background mode (daemon)"
107+
@echo " down - Stop and remove Docker containers"
108+
@echo " build - Build or rebuild Docker containers"
109+
@echo " pull - Pull the latest images from the registry"
110+
@echo " clean - Clean up and stop Docker containers, removing volumes and orphan containers"
111+
@echo " shell - Open a shell inside the exelearning-web container"
112+
@echo " install-deps - Install PHP dependencies using Composer"
113+
@echo " lint - Run code linting using Composer"
114+
@echo " fix - Automatically fix code style issues using Composer"
115+
@echo " test - Run tests using Composer"
116+
@echo " phpmd - Run PHP Mess Detector using Composer"
117+
@echo " behat - Run Behat tests using Composer"
118+
@echo " help - Display this help with available commands"
119+
120+
121+
# Set help as the default goal if no target is specified
122+
.DEFAULT_GOAL := help

aicc.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
$cfgexescorm = get_config('exescorm');
4141

42-
$url = new moodle_url('/mod/exescorm/aicc.php', array('command' => $command, 'session_id' => $sessionid));
42+
$url = new moodle_url('/mod/exescorm/aicc.php', ['command' => $command, 'session_id' => $sessionid]);
4343
if ($aiccdata !== 0) {
4444
$url->param('aicc_data', $aiccdata);
4545
}
@@ -57,7 +57,7 @@
5757
if (empty($exescormsession)) {
5858
throw new \moodle_exception('invalidhacpsession', 'exescorm');
5959
}
60-
$aiccuser = $DB->get_record('user', array('id' => $exescormsession->userid), 'id,username,lastname,firstname', MUST_EXIST);
60+
$aiccuser = $DB->get_record('user', ['id' => $exescormsession->userid], 'id,username,lastname,firstname', MUST_EXIST);
6161
}
6262

6363
if (!empty($command)) {
@@ -83,7 +83,7 @@
8383
}
8484

8585
if ($sco = exescorm_get_sco($scoid, EXESCORM_SCO_ONLY)) {
86-
if (!$exescorm = $DB->get_record('exescorm', array('id' => $sco->exescorm))) {
86+
if (!$exescorm = $DB->get_record('exescorm', ['id' => $sco->exescorm])) {
8787
throw new \moodle_exception('cannotcallscript');
8888
}
8989
} else {
@@ -99,7 +99,7 @@
9999
exescorm_debug_log_write("aicc", "HACP Request:\r\n$aiccrequest", $scoid);
100100
ob_start();
101101

102-
if ($exescorm = $DB->get_record('exescorm', array('id' => $sco->exescorm))) {
102+
if ($exescorm = $DB->get_record('exescorm', ['id' => $sco->exescorm])) {
103103
switch ($command) {
104104
case 'getparam':
105105
if ($status == 'Not Initialized') {
@@ -233,7 +233,7 @@
233233
$attempt, $element, $value);
234234
break;
235235
case 'cmi.core.lesson_status':
236-
$statuses = array(
236+
$statuses = [
237237
'passed' => 'passed',
238238
'completed' => 'completed',
239239
'failed' => 'failed',
@@ -245,16 +245,16 @@
245245
'f' => 'failed',
246246
'i' => 'incomplete',
247247
'b' => 'browsed',
248-
'n' => 'not attempted'
249-
);
250-
$exites = array(
248+
'n' => 'not attempted',
249+
];
250+
$exites = [
251251
'logout' => 'logout',
252252
'time-out' => 'time-out',
253253
'suspend' => 'suspend',
254254
'l' => 'logout',
255255
't' => 'time-out',
256256
's' => 'suspend',
257-
);
257+
];
258258
$values = explode(',', $value);
259259
$value = '';
260260
if (count($values) > 1) {
@@ -402,11 +402,11 @@
402402
case 'exitau':
403403
if ($status == 'Running') {
404404
if (isset($exescormsession->sessiontime) && ($exescormsession->sessiontime != '')) {
405-
if ($track = $DB->get_record('exescorm_scoes_track', array("userid" => $aiccuser->id,
405+
if ($track = $DB->get_record('exescorm_scoes_track', ["userid" => $aiccuser->id,
406406
"exescormid" => $exescorm->id,
407407
"scoid" => $sco->id,
408408
"attempt" => $attempt,
409-
"element" => 'cmi.core.total_time'))) {
409+
"element" => 'cmi.core.total_time'])) {
410410
// Add session_time to total_time.
411411
$value = exescorm_add_time($track->value, $exescormsession->sessiontime);
412412
$track->value = $value;

amd/src/fullscreen.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ define([
2929
'core/templates'
3030
], function($, Str, Ajax, Templates) {
3131
"use strict";
32+
/* eslint-disable no-console */
3233
/**
3334
* @constructor
3435
*/

backup/moodle2/backup_exescorm_stepslib.php

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ protected function define_structure() {
3636
$userinfo = $this->get_setting_value('userinfo');
3737

3838
// Define each element separated.
39-
$exescorm = new backup_nested_element('exescorm', array('id'), array(
39+
$exescorm = new backup_nested_element('exescorm', ['id'], [
4040
'name', 'exescormtype', 'reference', 'intro',
4141
'introformat', 'version', 'maxgrade', 'grademethod',
4242
'whatgrade', 'maxattempt', 'forcecompleted', 'forcenewattempt',
@@ -47,56 +47,56 @@ protected function define_structure() {
4747
'height', 'timeopen', 'timeclose', 'timemodified',
4848
'completionstatusrequired', 'completionscorerequired',
4949
'completionstatusallscos',
50-
'autocommit'));
50+
'autocommit']);
5151

5252
$scoes = new backup_nested_element('scoes');
5353

54-
$sco = new backup_nested_element('sco', array('id'), array(
54+
$sco = new backup_nested_element('sco', ['id'], [
5555
'manifest', 'organization', 'parent', 'identifier',
56-
'launch', 'exescormtype', 'title', 'sortorder'));
56+
'launch', 'exescormtype', 'title', 'sortorder']);
5757

5858
$scodatas = new backup_nested_element('sco_datas');
5959

60-
$scodata = new backup_nested_element('sco_data', array('id'), array(
61-
'name', 'value'));
60+
$scodata = new backup_nested_element('sco_data', ['id'], [
61+
'name', 'value']);
6262

6363
$seqruleconds = new backup_nested_element('seq_ruleconds');
6464

65-
$seqrulecond = new backup_nested_element('seq_rulecond', array('id'), array(
66-
'conditioncombination', 'ruletype', 'action'));
65+
$seqrulecond = new backup_nested_element('seq_rulecond', ['id'], [
66+
'conditioncombination', 'ruletype', 'action']);
6767

6868
$seqrulecondsdatas = new backup_nested_element('seq_rulecond_datas');
6969

70-
$seqrulecondsdata = new backup_nested_element('seq_rulecond_data', array('id'), array(
71-
'refrencedobjective', 'measurethreshold', 'operator', 'cond'));
70+
$seqrulecondsdata = new backup_nested_element('seq_rulecond_data', ['id'], [
71+
'refrencedobjective', 'measurethreshold', 'operator', 'cond']);
7272

7373
$seqrolluprules = new backup_nested_element('seq_rolluprules');
7474

75-
$seqrolluprule = new backup_nested_element('seq_rolluprule', array('id'), array(
75+
$seqrolluprule = new backup_nested_element('seq_rolluprule', ['id'], [
7676
'childactivityset', 'minimumcount', 'minimumpercent', 'conditioncombination',
77-
'action'));
77+
'action']);
7878

7979
$seqrollupruleconds = new backup_nested_element('seq_rllprlconds');
8080

81-
$seqrolluprulecond = new backup_nested_element('seq_rllprlcond', array('id'), array(
82-
'cond', 'operator'));
81+
$seqrolluprulecond = new backup_nested_element('seq_rllprlcond', ['id'], [
82+
'cond', 'operator']);
8383

8484
$seqobjectives = new backup_nested_element('seq_objectives');
8585

86-
$seqobjective = new backup_nested_element('seq_objective', array('id'), array(
87-
'primaryobj', 'objectiveid', 'satisfiedbymeasure', 'minnormalizedmeasure'));
86+
$seqobjective = new backup_nested_element('seq_objective', ['id'], [
87+
'primaryobj', 'objectiveid', 'satisfiedbymeasure', 'minnormalizedmeasure']);
8888

8989
$seqmapinfos = new backup_nested_element('seq_mapinfos');
9090

91-
$seqmapinfo = new backup_nested_element('seq_mapinfo', array('id'), array(
91+
$seqmapinfo = new backup_nested_element('seq_mapinfo', ['id'], [
9292
'targetobjectiveid', 'readsatisfiedstatus', 'readnormalizedmeasure', 'writesatisfiedstatus',
93-
'writenormalizedmeasure'));
93+
'writenormalizedmeasure']);
9494

9595
$scotracks = new backup_nested_element('sco_tracks');
9696

97-
$scotrack = new backup_nested_element('sco_track', array('id'), array(
97+
$scotrack = new backup_nested_element('sco_track', ['id'], [
9898
'userid', 'attempt', 'element', 'value',
99-
'timemodified'));
99+
'timemodified']);
100100

101101
// Build the tree.
102102
$exescorm->add_child($scoes);
@@ -127,24 +127,24 @@ protected function define_structure() {
127127
$scotracks->add_child($scotrack);
128128

129129
// Define sources.
130-
$exescorm->set_source_table('exescorm', array('id' => backup::VAR_ACTIVITYID));
130+
$exescorm->set_source_table('exescorm', ['id' => backup::VAR_ACTIVITYID]);
131131

132132
// Order is important for several EXESCORM calls (especially exescorm_scoes)
133133
// in the following calls to set_source_table.
134-
$sco->set_source_table('exescorm_scoes', array('exescorm' => backup::VAR_PARENTID), 'sortorder, id');
135-
$scodata->set_source_table('exescorm_scoes_data', array('scoid' => backup::VAR_PARENTID), 'id ASC');
136-
$seqrulecond->set_source_table('exescorm_seq_ruleconds', array('scoid' => backup::VAR_PARENTID), 'id ASC');
134+
$sco->set_source_table('exescorm_scoes', ['exescorm' => backup::VAR_PARENTID], 'sortorder, id');
135+
$scodata->set_source_table('exescorm_scoes_data', ['scoid' => backup::VAR_PARENTID], 'id ASC');
136+
$seqrulecond->set_source_table('exescorm_seq_ruleconds', ['scoid' => backup::VAR_PARENTID], 'id ASC');
137137
$seqrulecondsdata->set_source_table(
138-
'exescorm_seq_rulecond', array('ruleconditionsid' => backup::VAR_PARENTID), 'id ASC'
138+
'exescorm_seq_rulecond', ['ruleconditionsid' => backup::VAR_PARENTID], 'id ASC'
139139
);
140-
$seqrolluprule->set_source_table('exescorm_seq_rolluprule', array('scoid' => backup::VAR_PARENTID), 'id ASC');
141-
$seqrolluprulecond->set_source_table('exescorm_seq_rllprlcond', array('rollupruleid' => backup::VAR_PARENTID), 'id ASC');
142-
$seqobjective->set_source_table('exescorm_seq_objective', array('scoid' => backup::VAR_PARENTID), 'id ASC');
143-
$seqmapinfo->set_source_table('exescorm_seq_mapinfo', array('objectiveid' => backup::VAR_PARENTID), 'id ASC');
140+
$seqrolluprule->set_source_table('exescorm_seq_rolluprule', ['scoid' => backup::VAR_PARENTID], 'id ASC');
141+
$seqrolluprulecond->set_source_table('exescorm_seq_rllprlcond', ['rollupruleid' => backup::VAR_PARENTID], 'id ASC');
142+
$seqobjective->set_source_table('exescorm_seq_objective', ['scoid' => backup::VAR_PARENTID], 'id ASC');
143+
$seqmapinfo->set_source_table('exescorm_seq_mapinfo', ['objectiveid' => backup::VAR_PARENTID], 'id ASC');
144144

145145
// All the rest of elements only happen if we are including user info.
146146
if ($userinfo) {
147-
$scotrack->set_source_table('exescorm_scoes_track', array('scoid' => backup::VAR_PARENTID), 'id ASC');
147+
$scotrack->set_source_table('exescorm_scoes_track', ['scoid' => backup::VAR_PARENTID], 'id ASC');
148148
}
149149

150150
// Define id annotations.

0 commit comments

Comments
 (0)