Conflicts: cms/djangoapps/contentstore/course_info_model.py cms/djangoapps/contentstore/module_info_model.py cms/djangoapps/contentstore/tests/factories.py cms/djangoapps/contentstore/tests/test_course_settings.py cms/djangoapps/contentstore/views.py cms/djangoapps/models/settings/course_details.py cms/djangoapps/models/settings/course_grading.py cms/templates/edit_subsection.html common/djangoapps/mitxmako/shortcuts.py common/djangoapps/static_replace.py common/djangoapps/util/converters.py common/djangoapps/xmodule_modifiers.py common/lib/xmodule/setup.py common/lib/xmodule/xmodule/abtest_module.py common/lib/xmodule/xmodule/capa_module.py common/lib/xmodule/xmodule/course_module.py common/lib/xmodule/xmodule/discussion_module.py common/lib/xmodule/xmodule/error_module.py common/lib/xmodule/xmodule/html_module.py common/lib/xmodule/xmodule/js/src/video/display.coffee common/lib/xmodule/xmodule/mako_module.py common/lib/xmodule/xmodule/modulestore/mongo.py common/lib/xmodule/xmodule/modulestore/store_utilities.py common/lib/xmodule/xmodule/modulestore/xml.py common/lib/xmodule/xmodule/modulestore/xml_importer.py common/lib/xmodule/xmodule/raw_module.py common/lib/xmodule/xmodule/self_assessment_module.py common/lib/xmodule/xmodule/seq_module.py common/lib/xmodule/xmodule/template_module.py common/lib/xmodule/xmodule/tests/__init__.py common/lib/xmodule/xmodule/tests/test_export.py common/lib/xmodule/xmodule/tests/test_import.py common/lib/xmodule/xmodule/video_module.py common/lib/xmodule/xmodule/x_module.py common/lib/xmodule/xmodule/xml_module.py lms/djangoapps/courseware/access.py lms/djangoapps/courseware/courses.py lms/djangoapps/courseware/grades.py lms/djangoapps/courseware/models.py lms/djangoapps/courseware/module_render.py lms/djangoapps/courseware/tests/tests.py lms/djangoapps/courseware/views.py lms/djangoapps/django_comment_client/utils.py lms/templates/staff_problem_info.html lms/templates/video.html rakefile
5.3 KiB
Development Tasks
Prerequisites
Ruby
To install all of the libraries needed for our rake commands, run bundle install.
This will read the Gemfile and install all of the gems specified there.
Python
Run the following::
pip install -r requirements.txt
pip install -r test-requirements.txt
Binaries
Install the following:
- Mongodb (http://www.mongodb.org/)
Databases
First start up the mongo daemon. E.g. to start it up in the background using a config file:
mongod --config /usr/local/etc/mongod.conf &
Check out the course data directories that you want to work with into the
GITHUB_REPO_ROOT (by default, ../data). Then run the following command:
rake resetdb
Starting development servers
Both the LMS and Studio can be started using the following shortcut tasks
rake lms # Start the LMS
rake cms # Start studio
rake lms[cms.dev] # Start LMS to run alongside Studio
rake lms[cms.dev_preview] # Start LMS to run alongside Studio in preview mode
Under the hood, this executes django-admin.py runserver --pythonpath=$WORKING_DIRECTORY --settings=lms.envs.dev,
which starts a local development server.
Both of these commands take arguments to start the servers in different environments or with additional options:
# Start the LMS using the test configuration, on port 5000
rake lms[test,5000] # Executes django-admin.py runserver --pythonpath=$WORKING_DIRECTORY --setings=lms.envs.test 5000
N.B. You may have to escape the [ characters, depending on your shell: rake "lms[test,5000]"
Running tests
Python Tests
This runs all the tests (long, uses collectstatic):
rake test
If if you aren't changing static files, can run rake test once, then run
rake fasttest_lms
or
rake fasttest_cms
xmodule can be tested independently, with this:
rake test_common/lib/xmodule
To run a single django test class:
django-admin.py test --settings=lms.envs.test --pythonpath=. lms/djangoapps/courseware/tests/tests.py:TestViewAuth
To run a single django test:
django-admin.py test --settings=lms.envs.test --pythonpath=. lms/djangoapps/courseware/tests/tests.py:TestViewAuth.test_dark_launch
To run a single nose test file:
nosetests common/lib/xmodule/xmodule/tests/test_stringify.py
To run a single nose test:
nosetests common/lib/xmodule/xmodule/tests/test_stringify.py:test_stringify
Very handy: if you uncomment the --pdb argument in NOSE_ARGS in lms/envs/test.py, it will drop you into pdb on error. This lets you go up and down the stack and see what the values of the variables are. Check out http://docs.python.org/library/pdb.html
Javascript Tests
These commands start a development server with jasmine testing enabled, and launch your default browser pointing to those tests
rake browse_jasmine_{lms,cms}
To run the tests headless, you must install phantomjs (http://phantomjs.org/download.html).
rake phantomjs_jasmine_{lms,cms}
If the phantomjs binary is not on the path, set the PHANTOMJS_PATH environment variable to point to it
PHANTOMJS_PATH=/path/to/phantomjs rake phantomjs_jasmine_{lms,cms}
Getting More Information
Run the following to see a list of all rake tasks available and their arguments
rake -T
Testing using queue servers
When testing problems that use a queue server on AWS (e.g. sandbox-xqueue.edx.org), you'll need to run your server on your public IP, like so.
django-admin.py runserver --settings=lms.envs.dev --pythonpath=. 0.0.0.0:8000
When you connect to the LMS, you need to use the public ip. Use ifconfig to figure out the numnber, and connect e.g. to http://18.3.4.5:8000/
Content development
If you change course content, while running the LMS in dev mode, it is unnecessary to restart to refresh the modulestore.
Instead, hit /migrate/modules to see a list of all modules loaded, and click on links (eg /migrate/reload/edx4edx) to reload a course.
Gitreload-based workflow
github (or other equivalent git-based repository systems) used for course content can be setup to trigger an automatic reload when changes are pushed. Here is how:
-
Each content directory in mitx_all/data should be a clone of a git repo
-
The user running the mitx gunicorn process should have its ssh key registered with the git repo
-
The list settings.ALLOWED_GITRELOAD_IPS should contain the IP address of the git repo originating the gitreload request. By default, this list is ['207.97.227.253', '50.57.128.197', '108.171.174.178'] (the github IPs). The list can be overridden in the startup file used, eg lms/envs/dev*.py
-
The git post-receive-hook should POST to /gitreload with a JSON payload. This payload should define at least
{ "repository" : { "name" : reload_dir }
where reload_dir is the directory name of the content to reload (ie mitx_all/data/reload_dir should exist)
The mitx server will then do "git reset --hard HEAD; git clean -f -d; git pull origin" in that directory. After the pull, it will reload the modulestore for that course.
Note that the gitreload-based workflow is not meant for deployments on AWS (or elsewhere) which use collectstatic, since collectstatic is not run by a gitreload event.
Also, the gitreload feature needs MITX_FEATURES['ENABLE_LMS_MIGRATION'] = True in the django settings.