Ruby HTML CSS Shell JavaScript
Latest commit 7a1af18 Sep 19, 2017 @redconfetti redconfetti committed on GitHub Merge pull request #6823 from nkutub/SISRP-35467
SISRP-35467 CalCentral displaying letter grading option for all P/NP classes, correct in BCS
Failed to load latest commit information.
app Merge pull request #6822 from redconfetti/SISRP-31687-squashed Sep 18, 2017
bin NOJIRA Move "rails" script to Rails 4 directory May 12, 2014
config SISRP-31687 - Implement dynamic labeling based on chronological logic Sep 18, 2017
db CLC-6743 Graduate Division joins OEC Sep 14, 2017
docker CLC-5107 Introducing Vagrant/Docker env for developers Apr 9, 2015
docs Fix broken Markdown headings Apr 18, 2017
fixtures Merge pull request #6821 from lyttam/SISRP-34658 Sep 18, 2017
lib CLC-6719 Fix Travis-CI & Bamboo scripts Jul 28, 2017
log [NOJIRA] Add the log directory so `rake` works again Nov 16, 2012
public SISRP-31687 - Implement dynamic labeling based on chronological logic Sep 18, 2017
script Adds GEMSET param to build-torquebox script Aug 8, 2017
spec Merge pull request #6822 from redconfetti/SISRP-31687-squashed Sep 18, 2017
src Merge pull request #6823 from nkutub/SISRP-35467 Sep 19, 2017
tmp CLC-4989 Set alternate tmp directory to prevent FFI error starting To… Mar 16, 2015
versions Bumping version number to next release Aug 1, 2017
.csslintrc CLC-3930 - Ignore Canvas CSS file for CSSLint Jun 27, 2014
.dockerignore CLC-5107 Introducing Vagrant/Docker env for developers Apr 9, 2015
.editorconfig CalCentral-Rails start Nov 15, 2012
.gitattributes CLC-714 - Add Git Attributes file Nov 17, 2012
.gitignore SISRP-23846 - CalCentral CSS Style Guide Jul 6, 2017
.jscsrc CLC-6224 - Update bCourses default theme for New UI May 3, 2016
.jshintignore CLC-4735 - Update `jshintignore` Jan 30, 2015
.jshintrc SISRP-31567 - TEMPORARY: adds debug logging to Student Success Apr 13, 2017
.nvmrc SISRP-18114 - Update gulp-streamify and add .nvmrc Apr 19, 2016
.rspec CLC-3565, rspec v3 upgrade - no more 'require spec_helper' on line 1,… Oct 10, 2014
.rvmrc SISRP-26133 - Reverts back to jruby-1.7.19 Aug 8, 2017
.scss-lint.yml CLC-6433, enable ColorVariable linter (scss_lint) and fix correspondi… Aug 15, 2016
.travis.yml SISRP-31687 - Attempt to fix jRuby install with TravisCI Sep 18, 2017 CLC-3472: Add jscs - JavaScript Style Checker Mar 19, 2014
Capfile [CLC-506] Capistrano tasks for bamboo Jan 7, 2013
Dockerfile SISRP-26133 - Reverts back to jruby-1.7.19 Aug 8, 2017
Dockerfile.gulp CLC-5107 Introducing Vagrant/Docker env for developers Apr 9, 2015
Gemfile SISRP-26133 - Reverts back to jruby-1.7.19 Aug 8, 2017
Gemfile.lock Fixes rspec-rails dependency Aug 8, 2017
Guardfile CLC-4015: Fix LiveReload Jul 29, 2014
LICENSE CLC-4664 - Update license to 2015 Jan 5, 2015 Fix broken Markdown headings Apr 18, 2017 SISRP-26133 - Reverts back to jruby-1.7.19 Aug 8, 2017
Rakefile CLC-2055 Use TorqueBox instead of Trinidad. Jun 18, 2013
Vagrantfile CLC-5107 Introducing Vagrant/Docker env for developers Apr 9, 2015 CalCentral-Rails start Nov 15, 2012
d CLC-5107 Introducing Vagrant/Docker env for developers Apr 9, 2015
gulpfile.js SISRP-23846 - CalCentral CSS Style Guide Jul 6, 2017
package.json Revert "SISRP-31448 - 9.3 - Node Packages Updates" Jul 27, 2017


Dependency Status devDependency Status Code Climate

  • Master Build: Build Status
  • QA Build: Build Status



  1. Install Java 7 JDK:

  2. Install Postgres:

    Note: To install Postgres, you must first install Homebrew.

    Install Homebrew with the following command:

    ruby -e "$(curl -fsSL"

    Run the following command in Terminal after installation:

    brew --version

    Then run the following:

    brew update
    brew install postgresql
    initdb /usr/local/var/postgres
    1. For Mountain Lion & Mavericks users ONLY: Fix Postgres paths.

    2. For Mountain Lion & Mavericks users ONLY: If you can connect to Postgres via psql, but not via JDBC (you see "Connection refused" errors in the CalCentral app log), then edit /usr/local/var/postgres/pg_hba.conf and make sure you have these lines:

      host    all             all               md5
      host    all             all             samehost                md5
    3. For Mountain Lion & Mavericks users ONLY: Install XQuartz and make sure that /opt/X11/bin is on your PATH.

  3. Start Postgres, add users and create the necessary databases. (If your PostgreSQL server is managed externally, you'll probably need to create a schema that matches the database username. See CLC-893 for details.):

    pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
    psql postgres
    create database calcentral_development;
    create user calcentral_development with password 'secret' createdb;
    grant all privileges on database calcentral_development to calcentral_development;
    alter database calcentral_development owner to calcentral_development;
    create database calcentral;
    create user calcentral with password 'secret' createdb;
    grant all privileges on database calcentral to calcentral;
    alter database calcentral owner to calcentral;
    create database calcentral_test;
    create user calcentral_test with password 'secret' createdb;
    grant all privileges on database calcentral_test to calcentral_test;
    alter database calcentral_test owner to calcentral_test;

    Note: At this point, exit out of Postgres. To do this, type "\q" and then press ENTER.

  4. Fork this repository, then:

    git clone[your GitHub Account]/calcentral.git
    # e.g. git clone
  5. Go inside the calcentral repository:

    cd calcentral
    # Answer "yes" if it asks you to trust a new .rvmrc file.
  6. Install JRuby:

    rvm get head
    rvm install jruby-1.7.19
    cd ..
    cd calcentral
    # Answer "yes" again if it asks you to trust a new .rvmrc file.
    rvm list
    # Make sure that everything looks fine
    # If it mentions "broken", you'll need to reinstall
  7. Make JRuby faster for local development by running this or put in your .bashrc:

    export JRUBY_OPTS="--dev"
  8. Download and install xvfb. On a Mac, you get xvfb by installing XQuartz.

  9. Download the appropriate gems with Bundler:

    gem install bundler
    bundle install
  10. Set up a local settings directory:

    mkdir ~/.calcentral_config

    Default settings are loaded from your source code in config/settings.yml and config/settings/ENVIRONMENT_NAME.yml. For example, the configuration used when running tests with RAILS_ENV=test is determined by the combination of config/settings/test.yml and config/settings.yml. Because we don't store passwords and other sensitive data in source code, any RAILS_ENV other than test requires overriding some default settings. Do this by creating ENVIRONMENT.local.yml files in your ~/.calcentral_config directory. For example, your ~/.calcentral_config/development.local.yml file may include access tokens and URLs for a locally running Canvas server. You can also create Ruby configuration files like "settings.local.rb" and "development.local.rb" to amend the standard config/environments/*.rb files.

  11. Install JDBC driver (for Oracle connection)

  1. Initialize PostgreSQL database tables:

    rake environment db:schema:load db:seed
  2. Make yourself powerful:

    rake superuser:create UID=[your numeric CalNet UID]
    # e.g. rake superuser:create UID=61889
  3. Install the front-end tools:

    npm install
    npm install -g gulp
  4. Start the front-end build & watch for changes:

    gulp build
  5. Start the server:

    rails s
  6. Access your development server at localhost:3000. Do not use, as you will not be able to grant access to bApps.

Note: Usually you won't have to do any of the following steps when you're developing on CalCentral.

Enable live updates

In order to have live updates you'll need to perform the following steps:

  1. Install and run memcached.

  2. Add the following lines to development.local.yml:

  store: "memcached"
  1. Start the server with TorqueBox (see below).

Back-end Testing

Back-end (rspec) tests live in spec/*.

To run the tests from the command line:


To run the tests faster, use spork, which is a little server that keeps the Rails app initialized while you change code and run multiple tests against it. Command line:

# (...wait a minute for startup...)
rspec --drb spec/lib/my_spec.rb

You can even run Spork right inside IntelliJ RubyMine or IDEA.

Front-end Linting

Front-end linting can be done by running the following commands:

rm -rf node_modules
npm install -g jshint
npm install -g jscs
gulp build
jshint .
jscs .

This will check for any potential JavaScript issues and whether you formatted the code correctly.


Browsersync makes developing faster by synchronizing file changes and interactions across multiple devices. Browsersync will automatically:

  • Update the browser when SCSS files are changed
  • Reload the browser when a template or JS file is changed

Browsersync is turned on by default during development mode. To turn it off, set the option to false:

gulp --browsersync false

During production mode, Browsersync is turned off.

Your rails server must finish starting up before executing Browsersync. Once Browsersync is executed, access your development server at localhost:3001. No real time file changes will be reflected at localhost:3000.

While the server is running, you can access Browsersync settings at localhost:3002, where you can change sync options, view history, and more.

Role-Aware Testing

Some features of CalCentral are only accessible to users with particular roles, such as student. These features may be invisible when logged in as yourself. In particular:

  • My Academics will only appear in the navigation if logged in as a student. However, the "Oski Bear" test student does not fake data loaded on dev and QA. To test My Academics, log in as user test-212385 or test-212381 (ask a developer for the passwords to these if you need them). Once logged in as a test student, append /academics to the URL to access My Academics.


Emulating production mode locally

  1. Make sure you have a separate production database:

    psql postgres
    create database calcentral_production;
    grant all privileges on database calcentral_production to calcentral_development;
  2. In calcentral_config/production.local.yml, you'll need the following entries:

    secret_token: "Some random 30-char string"
    postgres: [credentials for your separate production db (copy/modify from development.local.yml)]
    campusdb: [copy from main config/settings.yml, modify if needed]
    google_proxy: and canvas_proxy: [copy from development.local.yml]
        serve_static_assets: true
  3. Populate the production db by invoking your production settings:

    RAILS_ENV="production" rake db:schema:load db:seed
  4. Precompile the front-end assets

    gulp build --env production
  5. Start the server in production mode:

    rails s -e production
  6. If you're not able to connect to Google or Canvas, export the data in the oauth2 from your development db and import them into the same table in your production db.

  7. After testing, remove the static assets:

    gulp build-clean

Start the server with TorqueBox

In production we use TorqueBox as this provides us with messaging, scheduling, caching, and daemons.

  1. Deploy into TorqueBox (only needs to happen once in a while):

    bundle exec torquebox deploy .
  2. Start the server:

    bundle exec torquebox run -p=3000

Test connection

Make sure you are on the Berkeley network or connected through preconfigured VPN for the Oracle connection. If you use a VPN, use group 1-Campus_VPN.

Enable basic authentication

Basic authentication will enable you to log in without using CAS. This is necessary when your application can't be CAS authenticated or when you're testing mobile browsers. Note: only enable this in fake mode or in development.

  1. Add the following setting to your environment.yml file (e.g. development.yml):

      enabled: true
      password: topsecret!
  2. (Re)start the server for the changes to take effect.

  3. Click on the footer (Berkeley logo) when you load the page.

  4. You should be seeing the Basic Auth screen. As the login you should use a UID (e.g. 61889 for oski) and then the password from the settings file.

"Act As" another user

To help another user debug an issue, you can "become" them on CalCentral. To assume the identity of another user, you must:

  • Currently be logged in as a designated superuser
  • Be accessing a machine/server which the other user has previously logged into (e.g. from localhost, you can't act as a random student, since that student has probably never logged in at your terminal)

Access the URL:


where 123456 is the UID of the user to emulate.

Note: The Act As feature will only reveal data from data sources we control, e.g. Canvas. Google data will be completely suppressed, EXCEPT for test users. The following user uids have been configured as test users.

To become yourself again, access:



Logging behavior and destination can be controlled from the command line or shell scripts via env variables:

  • LOGGER_STDOUT=false - Only log to the default files
  • LOGGER_STDOUT=true - Log to standard output as well as the default files
  • LOGGER_STDOUT=only - Only log to standard output
  • LOGGER_LEVEL=DEBUG - Set logging level; acceptable values are 'FATAL', 'ERROR', 'WARN', 'INFO', and 'DEBUG'


  1. On Mac OS X, to get RubyMine to pick up the necessary environment variables, open a new shell, set the environment variables, and:

    /Applications/ &
  2. If you want to explore the Oracle database on Mac OS X, use SQL Developer.


See docs/

Creating timeshifted fake data feeds

Proxies running in fake mode use WebMock to substitute fixture data for connections to external services (Canvas, Google, etc). This fake data lives in fixtures/json and fixtures/xml.

Fixture files can represent time information by tokens that are substituted with appropriately shifted values when fixture data is loaded. See config/initializers/timeshift.rb for the dictionary of substitutions.

Rake tasks:

To view other rake task for the project: rake -T

  • rake spec:xml - Runs rake spec, but pipes the output to xml using the rspec_junit_formatter gem, for JUnit compatible test result reports

Memcached tasks:

A few rake tasks to help monitor statistics and more:

  • rake memcached:clear - Invalidate all memcached keys and reset memcached stats from all cluster nodes.

  • rake memcached:get_stats - Fetch memcached stats from all cluster nodes. Per-slab stats may point out specific types of data which are being overcached or undercached, or indicate a need to reconfigure memcached.

  • rake memcached:dump_slab slab=NUMBER - Shows which cached items are currently stored in the "slab" with the given ID. The list won't include the keys of expired or evicted items.

  • WARNING: do not run rake memcached:clear on the production cluster unless you know what you're doing!

  • All memcached tasks take the optional param of hosts. So, if say you weren't running these tasks on the cluster layers themselves, or only wanted to tinker with a certain subset of clusters: rake memcached:get_stats hosts="localhost:11212,localhost:11213,localhost:11214"

Using the feature toggle:

To selectively enable/disable a feature, add a property to the features section of settings.yml, e.g.:

  wizbang: false
  neato: true

After server restart, these properties will appear in each users' status feed. You can now use data-ng-if in Angular to wrap the feature:

<div data-ng-if="user.profile.features.neato">
  Some neato feature...

Keeping developer seed data updated

seeds.rb is intended for use only on developer machines, so they have a semi-realistic copy of production lists of superusers, links, etc. ./db/developer-seed-data.sql has the data used by rake db:seed. Occasionally we'll want to update it from production. To do that, log into a prod node and do:

pg_dump calcentral -O -x --inserts --clean -f developer-seed-data.sql -t link_categories \
-t link_categories_link_sections -t link_sections -t link_sections_links -t links \
-t links_user_roles -t user_auths -t user_roles -t fin_aid_years -t summer_sub_terms \
-h postgres-hostname -p postgres-port-number -U calcentral

Copy the file into your source tree and get it merged into master.

Living Styleguide

The SCSS files under src/assets/stylesheets contain a style of notation known as KSS, which are used to generate a living styleguide via SC-5 Styleguide. See source at Github.

To generate this styleguide run:

gulp styleguide

This will generate the styleguide in public/styleguide, which will open automatically in your browser at http://localhost:3006/. Modifications to SCSS files under /src/assets/stylesheets are watched and reloaded into the guide on-the-fly.