Some ground rules:
- To avoid disappointment, new features should be discussed on the mailing list ([email protected]) before serious work starts.
- Write tests! Pull requests will be rejected if sufficient tests aren't provided. See the guidance below on the testing conventions that Oscar uses.
- Write docs! Please update the documentation when altering behaviour or introducing new features.
- Write good commit messages: see Tim Pope's excellent note.
- Make pull requests against Oscar's master branch unless instructed otherwise.
After forking, run:
git clone [email protected]:<username>/django-oscar.git cd django-oscar mkvirtualenv oscar # using virtualenvwrapper make install
Oscar uses a nose testrunner which can be invoked using:
./runtests.py
To run a subset of tests, you can use filesystem or module paths. These two commands will run the same set of tests:
./runtests.py tests/unit/order ./runtests.py tests.unit.order
To run an individual test class, use one of:
./runtests.py tests/unit/order:TestSuccessfulOrderCreation ./runtests.py tests.unit.order:TestSuccessfulOrderCreation
(Note the ':'.)
To run an individual test, use one of:
./runtests.py tests/unit/order:TestSuccessfulOrderCreation.test_creates_order_and_line_models ./runtests.py tests.unit.order:TestSuccessfulOrderCreation.test_creates_order_and_line_models
Oscar's testrunner uses the progressive plugin when running all tests, but uses the spec plugin when running a subset. It is a good practice to name your test cases and methods so that the spec output reads well. For example:
$ ./runtests.py tests/unit/offer/benefit_tests.py:TestAbsoluteDiscount nosetests --verbosity 1 tests/unit/offer/benefit_tests.py:TestAbsoluteDiscount -s -x --with-spec Creating test database for alias 'default'... Absolute discount - consumes all lines for multi item basket cheaper than threshold - consumes all products for heterogeneous basket - consumes correct quantity for multi item basket more expensive than threshold - correctly discounts line - discount is applied to lines - gives correct discount for multi item basket cheaper than threshold - gives correct discount for multi item basket more expensive than threshold - gives correct discount for multi item basket with max affected items set - gives correct discount for single item basket cheaper than threshold - gives correct discount for single item basket equal to threshold - gives correct discount for single item basket more expensive than threshold - gives correct discounts when applied multiple times - gives correct discounts when applied multiple times with condition - gives no discount for a non discountable product - gives no discount for an empty basket ---------------------------------------------------------------------- Ran 15 tests in 0.295s
Oscar ships with a 'sandbox' site which can be run locally to play around with Oscar using a browser. Set it up by:
make sandbox cd sites/sandbox ./manage.py runserver
This will create the database and load some fixtures for categories and shipping countries.
Note that Oscar uses PIL and Sorl for thumbnailing, and so you will need
libjpeg-dev
installed in your OS so that your PIL installation supports
JPEGS.
Oscar ships with a Vagrant virtual machine that can be used to test integration with various services in a controlled environment. For instance, it is used to test that the migrations run correctly in both MySQL and Postgres.
To create the machine, first ensure that Vagrant and puppet are installed. You will require a
puppet version that supports puppet module install
, that is > 2.7.14. Now
run:
make puppet
to fetch the required puppet modules for provisioning. Finally, run:
vagrant up
to create the virtual machine and provision it.
To test the migrations against MySQL and Postgres, do the following:
SSH onto the VM:
vagrant ssh
Change to sandbox folder and activate virtualenv:
cd /vagrant/sites/sandbox source /var/www/virtualenv/bin/activate
Run helper script:
./test_migrations.sh This will recreate the Oscar database in both MySQL and Postgres and rebuild it using ``syncdb`` and ``migrate``.
You can browse the Oscar sandbox site in two ways:
Start Django's development server on port 8000:
vagrant ssh cd /vagrant/sites/sandbox source /var/www/virtualenv/bin/activate ./manage.py runserver 0.0.0.0:8000
The Vagrant machine forwards port 8000 to post 8080 and so the site can be accessed at http://localhost:8080 on your host machine.
The Vagrant machine install Apache2 and mod_wsgi. You can browse the site through Apache at http://localhost:8081 on your host machine.
There's a helper script for building the docs locally:
cd docs ./test_docs.sh
- PEP8 everywhere while remaining sensible
- List pages should use plurals; e.g.
/products/
,/notifications/
- Detail pages should simply be a PK/slug on top of the list page; e.g.
/products/the-bible/
,/notifications/1/
- Create pages should have 'create' as the final path segment; e.g.
/dashboard/notifications/create/
- Update pages are sometimes the same as detail pages (i.e., when in the
dashboard). In those cases, just use the detail convention, eg
/dashboard/notifications/3/
. If there is a distinction between the detail page and the update page, use/dashboard/notifications/3/update/
. - Delete pages; e.g.,
/dashboard/notifications/3/delete/
Classes should be named according to:
'%s%sView' % (class_name, verb)
For example, ProductUpdateView
, OfferCreateView
and
PromotionDeleteView
. This doesn't fit all situations, but it's a good basis.