dodona
dodona copied to clipboard
🧑💻 Learn to code for secondary and higher education
Dodona
Dodona is an online exercise platform for learning to code. It wants to teach students how to program in the most meaningful and effective way possible. Dodona acts as an online co-teacher, designed to give every student access to high quality education. The focus is on automatic corrections and giving meaningful feedback on the submitted solutions from students.
This repository contains the source code of the web application. If you simply want to use Dodona, please go to https://dodona.be.
The documentation for end users can be found at https://docs.dodona.be.
Supporting Dodona
Dodona is free to use for schools and we would like to keep it that way! Keeping this platform up and running takes a lot of time, just as supporting hundreds of schools and thousands of students. If you would like to fund Dodona, you can find more information on https://dodona.be/en/support-us/ or get in touch by emailing us at [email protected].
Contacting us
There are several ways to contact us:
- To report a bug, please use GitHub Issues.
- If you have a question to which the answer might be of use to others, please use GitHub Discussions.
- For more specific questions, use our contact form, send an email to [email protected] or come chat with us in our general chat or our support chat.
Local development
If you want to help with development, issues tagged with the student label are a good starting point.
Development Setup
- Install and start
mysqlormariadb. - If using
mysql, change thesql-modein themysqldconfiguration block:sql-mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' - Create a
dodonauser with access to thedodonaanddodona_test-Ndatabases. You will need as much test databases as you have CPU threads.CREATE USER 'dodona'@'localhost' IDENTIFIED BY 'dodona'; GRANT ALL ON dodona.* TO 'dodona'@'localhost'; GRANT ALL ON dodona_test.* TO 'dodona'@'localhost'; GRANT ALL ON `dodona_test-0`.* TO 'dodona'@'localhost'; ... GRANT ALL ON `dodona_test-N`.* TO 'dodona'@'localhost'; - Install the correct
rubyversion using RVM (the currently used version can be found here). - Install the correct
nodeversion usingnvmand yarn (any modern node version should do). - Run
bundle installandyarn install - Create and seed the database with
rails db:setup. (If something goes wrong with the database, you can userails db:resetto drop, rebuild and reseed the database.) If the error "Could not initialize python judge" arises, useSKIP_PYTHON_JUDGE=true rails db:setup - Run
bin/serverto start the server. More information on how to start the development setup can be found here. Dodona will be available on a subdomain of localhost: http://dodona.localhost:3000. - CAS authentication does not work in development. Instead the seed database from step 7 provides three users via login tokens. The relevant login links are displayed in an announcement on the home page of Dodona.
Evaluating exercises locally
These steps are not required to run the server, but you need docker to actually evaluate exercises.
- Install and start
docker. - Run
docker pull dodona/dodona-python
If you want to build the docker images yourself:
- Clone the docker-images repository.
- Build a docker image. The
build.shscripts builds all images. But with the initial data, onlydodona-pythonis needed. You can build this image withdocker build --pull --force-rm -t "dodona-python" -f "dodona-python.dockerfile" ..
Loading visualisations locally
These steps are not required to run the server, but are needed to let the visualisations load.
- Install and start
memcached. - Create the following file
tmp/caching-dev.txtin the root of the project.
Windows
Some gems and dependencies (such as memcached) do not work on Windows. You should use WSL 2 instead, and run everything inside WSL. This means you use WSL for the database, memcached, git, Docker, etc.
Starting a local server
The simplest way to start the server is with the rails s command. But this will not process the submission queue, and javascript will be compiled by webpack in the background (without output when something goes wrong).
- To process the submission queue, delayed job needs to be started with the
bin/delayed_job startcommand. - With
yarn build:css --watchyour css is reloaded live (use without the--watchflag when you need to build the stylesheets and live reload is not wanted). - With
yarn build:js --watchyour javascript is reloaded live (use without the--watchflag when you need to build the javascript and live reload is not wanted).
To start the rails server, delayed job, css bundling and js bundling at the same time, simply run bin/server.
This has one letdown: debugging with byebug is broken.
Localhost subdomain
Dodona uses subdomains in order to sandbox exercise descriptions (which are arbitrary HTML pages and could be used for malicious purposes if not properly sandboxed). We serve the main application in development from http://dodona.localhost:3000 and exercise descriptions from http://sandbox.localhost:3000.
If this does not work out of the box you can add the following lines to your /etc/hosts file:
127.0.0.1 dodona.localhost
127.0.0.1 sandbox.localhost
Running linters and tests
To lint the code, run rubocop for Ruby and yarn lint for JavaScript.
We have tests in JavaScript, Ruby, and system tests:
- For JavaScript, run
yarn test - For the system tests, run
bundle exec rails test:system - For the ruby tests, run
bundle exec rails test
There is also a type check for code written in TypeScript. This can be executed with yarn typeCheck.
Tips
- Use the
PARALLEL_WORKERSENV var to specify the number of threads to use. - Use
TestProfto profile the ruby tests - Use
bundle exec rails test filenameto run a single test file, usebundle exec rails test filename:linenumberto run a specific test