[464] | 1 | # QED
|
---|
[422] | 2 |
|
---|
[464] | 3 | This document describes how to develop this code base and the source
|
---|
| 4 | code organisation.
|
---|
[422] | 5 |
|
---|
[464] | 6 | ## Development, Install and Deploy
|
---|
[422] | 7 |
|
---|
[464] | 8 | Source files are located in `src`. Build and deployment is managed
|
---|
| 9 | with _Grunt_, a node based task runner.
|
---|
[422] | 10 |
|
---|
[520] | 11 | First make sure _node_, _npm_, _couchdb_, _heroku_, _formena_, _git_
|
---|
| 12 | and _svn_ are installed. To run _grunt_, you'll have to install the
|
---|
| 13 | commandline client with `npm install -g grunt-cli`.
|
---|
[464] | 14 |
|
---|
[520] | 15 | QED can run in two modes, _dev_ and _production_. This is controlled
|
---|
| 16 | by the environment variable `QED_ENV`. If it is not present, _dev_ is
|
---|
| 17 | the assumed mode. In development mode, QED runs agains another
|
---|
| 18 | database than in production. So, to run the production server, you
|
---|
| 19 | must use `QED_ENV=production grunt run`. Usually when developing you
|
---|
| 20 | will use the dev mode and you can omit the QED_ENV variable. The value
|
---|
| 21 | of QED_ENV on heroku is already set to production (this can be done
|
---|
| 22 | with `heroku config:set QED_ENV=production --app quod-erat` and is
|
---|
| 23 | persisent).
|
---|
| 24 |
|
---|
[464] | 25 | From source to a deployable version goes in few steps.
|
---|
[520] | 26 | 1. Develop in `src`. You can run `grunt` (or `grunt compile`) to do
|
---|
| 27 | compiling of Coffee and LESS sources and linting of Javascript,
|
---|
| 28 | HTML etc.
|
---|
| 29 | 1. Run a server with `grunt run` and test. If client sources are
|
---|
| 30 | changed, you only have to run `grunt compile` and reload the
|
---|
| 31 | browser, for server sources you have to restart it.
|
---|
| 32 | 1. You can create a _Dojo_ build with `grunt build`, which will merge
|
---|
| 33 | and compress sources. You can also run `grunt run-build`, which
|
---|
| 34 | will do the build and start it locally for testing.
|
---|
| 35 | 1. When you feel your changes are production ready, you can deploy to
|
---|
| 36 | Heroku by running `grunt deploy`. The heroku app must know about
|
---|
| 37 | _quod-erat_ already, so you might have to add it by hand the first
|
---|
| 38 | time.
|
---|
[464] | 39 |
|
---|
[520] | 40 | ## Database management
|
---|
[464] | 41 |
|
---|
[520] | 42 | There are _grunt_ tasks to push local database to Cloudant, pull the
|
---|
| 43 | oter way or make a backup of the Cloudant database. Which database is
|
---|
| 44 | used (dev or production) is again controlled by `QED_ENV`.
|
---|
| 45 |
|
---|
| 46 | In `src/server/bin` are some scripts to check if all database
|
---|
| 47 | documents are valid and to upload the latest version of the design
|
---|
| 48 | documents. Both the design documents and the database schema are
|
---|
| 49 | versioned and QED won't start if the versions don't match.
|
---|
| 50 |
|
---|
| 51 | If an update required changes to (normally) immutable documents, you
|
---|
| 52 | can disable the modification check with
|
---|
| 53 | `config-db-for-upgrade.js`. It's usually a good idea to write and
|
---|
| 54 | update script instead of doing things by hand. Don't forget to restore
|
---|
| 55 | the check with `config-db.js`, although a server restart will also do
|
---|
| 56 | that for you.
|
---|
| 57 |
|
---|
| 58 | Synchronisation doesn't ignore validation checks, so if you had to
|
---|
| 59 | disable the validation to do an upgrade, you also have to disable
|
---|
| 60 | validation on the database that you synchronize to. Currently this is
|
---|
| 61 | not automated, so you have to run the scripts yourself in a sane
|
---|
| 62 | order.
|
---|
| 63 |
|
---|
| 64 | If you want to test locally but with the Cloudant database instead of
|
---|
| 65 | localhost, run like `CLOUDANT_URL=<ur> QED_ENV=dev grunt run`. You can
|
---|
| 66 | get the url by running `heroku config:get CLOUDANT_URL --app
|
---|
| 67 | quod-erat`.
|
---|
| 68 |
|
---|
| 69 | ## File organisation
|
---|
| 70 |
|
---|
[464] | 71 | * _/_ Project root
|
---|
| 72 | * _build/_ Builds go here
|
---|
| 73 | * _development/_ Uncompressed build
|
---|
| 74 | * _production/_ Minified build
|
---|
| 75 | * _docs/_ Project documentation, design documents etc
|
---|
| 76 | * _src/_ Source code
|
---|
| 77 | * _client/_ Dojo web client
|
---|
| 78 | * _server/_ Node/Express server
|
---|
| 79 | * _Procfile_ Heroku process description
|
---|
| 80 |
|
---|
| 81 | ```
|
---|
[422] | 82 | client/
|
---|
| 83 | The web application for QED.
|
---|
| 84 | routes.js
|
---|
| 85 | Contains the mapping from URLs to pages.
|
---|
| 86 | run.js
|
---|
| 87 | The script for starting the web application (the researchers part).
|
---|
| 88 | stddeps.js
|
---|
| 89 | Contains many dependencies that are used declarativly in the
|
---|
| 90 | templates. Maybe it can be deprecated with Dojo 1.8+'s auto require
|
---|
| 91 | if the build scans templates as well.
|
---|
| 92 | store.js
|
---|
| 93 | Module that returns a fully configured store for the rest of the
|
---|
| 94 | application to use for database access. Handles caching and exposes
|
---|
| 95 | some common serialization functions.
|
---|
| 96 | view.js
|
---|
| 97 | Script that starts the survey part (the respondent part).
|
---|
| 98 | data/
|
---|
| 99 | Apache proxy configuration for transparant access to CouchDB.
|
---|
| 100 | dijit/
|
---|
| 101 | Dijit library (UI components)
|
---|
| 102 | dojo/
|
---|
| 103 | Dojo library (Dojo JS framework)
|
---|
| 104 | dojox/
|
---|
| 105 | DojoX library (contrib library for Dojo and Dijit)
|
---|
| 106 | qed/
|
---|
| 107 | Sourcecode of the QED application
|
---|
| 108 | app/
|
---|
| 109 | Small app framework for handling pages, content, notifications
|
---|
| 110 | and URL history. Our application is build on this.
|
---|
| 111 | css/
|
---|
| 112 | Contains all CSS of the application. Should be distributed better
|
---|
| 113 | with the widgets. The styling is based on LESS, although a copy
|
---|
| 114 | of the CSS is still there.
|
---|
| 115 | model/
|
---|
| 116 | Contains all code dependent on our model, that is, the concrete
|
---|
| 117 | representation of our database documents.
|
---|
| 118 | classes/
|
---|
| 119 | Smart classes on top of the database documents, to help with
|
---|
| 120 | creating and validating objects.
|
---|
| 121 | widgets/
|
---|
| 122 | All widgets that are specific for objects of our model.
|
---|
| 123 | pages/
|
---|
| 124 | The pages in the application. Are wired up to URLs in the routes.js
|
---|
| 125 | file.
|
---|
| 126 | store/
|
---|
| 127 | Dojo Store implementations for Couch and Elastic.
|
---|
| 128 | ui/
|
---|
| 129 | Deprecated. Used to contain all widgets, but these are now split
|
---|
| 130 | between general and model specific widgets. Contains a few widgets
|
---|
| 131 | that were not yet refactored.
|
---|
| 132 | widgets/
|
---|
| 133 | Contains general widgets that are used in our application but do
|
---|
| 134 | not depend on our model.
|
---|
| 135 | util/
|
---|
| 136 | Dojo utils (e.g. build infrastructure)
|
---|
[464] | 137 | ```
|
---|