An SDK for authoring Popcorn projects.
We're writing Butter so that it runs in modern, HTML5 compatible browsers. For version 1.0, we're targeting modern HTML5 desktop browsers. In the current version we are supporting:
- Chrome stable
- Firefox stable
- Internet Explorer 9+
- Safari stable
- node v0.8 or higher
- npm (comes with node v0.8 installer)
- mongodb v2.0.8 or higher
- A working build environment:
- Mac OS X - Xcode or Command Line Tools package
- Windows - Python 2.5+ and Visual Studio 2010 (C++ Express edition works fine)
- Linux - build-essential package on Debian/Ubuntu, or the equivalent for your distro
git clone --recursive https://github.com/mozilla/butter.git
cd butter
npm install
- Run
node make server
. - Navigate to http://localhost:8888/ in your favourite browser.
If you want to change the bind IP or port check the Configuration section below.
Running node make deploy
will compile all the necessary files into the dist/
folder.
Run NODE_ENV=production node app.js
in the dist/cornfield
directory in order to run the server in production mode.
Cornfield is PopcornMaker's back-end server system, designed to serve content to users, store their ongoing work, and publish what they've done.
There are two types of storage Cornfield needs to run:
-
A database: To store user project data, a database is required. Cornfield uses the
Sequelize
middleware, so multiple database options are available. You are responsible for setting up and maintaining a PostgreSQL or MySQL database enrivonment if you choose to use either, so make sure a user has access to a database calledpopcorn
for cornfield to run correctly. -
A data-blob store: To store published projects, Cornfield can use the filesystem, or Amazon's S3. See the configuration options below for setting up this feature for your environment.
There are several configuration files in cornfield/config/ that control how cornfield works. They are applied in order from most general to most specific to present one configuration to the server:
- default.json
- hostname.json
- environment.json
- hostname-environment.json
- runtime.json
hostname and environment are variable:
- hostname - The hostname of the machine. Defaults to the output of
hostname
on the cli. - environment - The value of the
NODE_ENV
environment variable. Defaults todevelopment
.
To change the cornfield configuration for your deployment of Butter, it's best to create a new file called hostname-environment.json that overrides the cornfield defaults.
-
server
settings for the cornfield serverbindIP
the IP or hostname to use for the server (e.g., localhost).bindPort
the Port number to use for the server (e.g., 8888). If using a port number lower than 1024, the server will have to be run as root.
-
logger
settings for server loggingformat
the logging format to use. Possible values include: default, short, tiny, dev.
-
session
settings for user sessionssecret
the sessions secret (i.e., some long string)duration
the session's duration (e.g., 2419200000)
-
staticMiddleware
settings for cornfield Connect middlewaremaxAge
the max age of static assests
-
dirs
settings for various directories, paths, hostnameswwwRoot
the server's WWW root directory (e.g.,../
)templates
the location of templates (e.g.,../templates
)appHostname
the hostname URL for the application, usually the same asserver.bindIP
andserver.bindPort
(e.g.,http://localhost:8888
)embedHostname
[optional] the hostname URL where published embed documents are stored, if different fromdirs.appHostname
(e.g.,http://s3.amazonaws.com/your-bucket
)
-
templates
list of templates to serve. The format is as follows:<template-name>
:{{templateBase}}<path/to/template/config.json>
. The{{templateBase}}
string will be replaced by the value indirs.templates
(e.g., "basic": "{{templateBase}}basic/config.json") -
exportedAssets
list of scripts to include in exported assets. These are things like popcorn.js or other scripts that your exported projects depend upon in order to run. -
additionalStaticRoots
list of additional roots to use. -
database
database configuration optionsdatabase
the database name. Used by mysql and postgresqlusername
the username to use when connecting to the database. Used by mysql and postgresqlpassword
the password for the username. Used by mysql and postgresqloptions
additional sequelize options. Please see the sequelize manual for the complete listing.dialect
the sql dialect of the database. Default ismysql
, must be one ofmysql
,sqlite
, orpostgresql
storage
the storage engine for sqlite. Default is:memory:
, an in-memory db, must be a string representing a file path or:memory:
logging
function to print sql queries to console. Default isconsole.log
, must be a function orfalse
host
hostname of the mysql or postgresql server. Default islocalhost
port
port of the mysql or postgresql server. Default is3306
pool
connection pooling options for mysql and postgresql. Default is nonemaxConnections
- maximum number of connections open in the poolmaxIdleTime
- maximum time in seconds to leave an idle connection open in the pool
-
publishStore
afileStore
used to publish project HTML files (seefileStore
below for details) -
feedbackStore
afileStore
used to publish feedback from the user as JSON (seefileStore
below for details) -
crashStore
afileStore
used to publish crash reports from the user as JSON (seefileStore
below for details)
The fileStore
type is used to setup a backend for storing data:
type
the type of file store to use. Possible values includelocal
(i.e., local file system) ands3
(i.e., Amazon S3)options
options for the file store, which depends on the type chosen.- local options
root
the root directory under which all exported files are placed (e.g.,./view
)namePrefix
[optional] the path prefix to add to any filenames passed to the local file store. For example, if using "v" all filenames will become "v/"nameSuffix
[optional] the filename suffix to use for all filenames (e.g., ".html")
- s3 options
key
the AWS S3 key to use for authenticationsecret
the AWS S3 secret to use for authenticationbucket
the AWS S3 bucket name to use for storing key/value pairsnamePrefix
[optional] the prefix to add to any key names passed to the s3 file store. For example, if using "v" all keys will become "v/"nameSuffix
[optional] the suffix to add to any key names passed to the s3 file store. For example, if using ".json" all keys will end in ".json"contentType
[optional] the mime type to use for data written to S3. If none giventext/plain
is used.
- local options
alice-production.json:
This sample config uses a mix of the local file system as well as Amazon S3 for storage.
{
"server" : {
"bindIP" : "0.0.0.0",
"bindPort" : "80"
},
"logger" : {
"format" : "default"
},
"session" : {
"secret": "1721f7a15316469fa4a9-5117d0d20e9f"
},
"staticMiddleware": {
"maxAge": "3600000"
},
"dirs": {
"appHostname": "http://example.org",
"embedHostname": "http://s3.amazonaws.com/my-bucket"
},
"publishStore": {
"type": "s3",
"options": {
"namePrefix": "v",
"key": "my-s3-key",
"secret": "my-s3-secret",
"contentType": "text/html"
}
},
"feedbackStore": {
"type": "local",
"options": {
"root": "./view",
"namePrefix": "feedback",
"nameSuffix": ".json"
}
},
"crashStore": {
"type": "local",
"options": {
"root": "./view",
"namePrefix": "crash",
"nameSuffix": ".json"
}
}
}
Before contributing a new patch be sure to run the following:
- Run
node make check
to lint butter - Run
node make server
and navigate tohttp://localhost:8888/test
to run the browser tests
If you are contributing changes to cornfield, make sure you run the cornfield tests from the butter root directory this command:
npm test
Cornfield will attempt to run tests for using a mysql backend, but they will not run if mysql is not set up properly. To ensure that they run, use the DB_HOST
, DB_DATABASE
, DB_USERNAME
, and DB_PASSWORD
environment variables to tell the tests which host, database, username, and password to use respectively. If DB_HOST
is left blank, localhost
is assumed.
- Chat with the Popcorn community on irc.mozilla.org in the #popcorn channel. The developers hang out here on a daily basis.
- We also have a mailing list that you can subscribe to.
- File bugs and feature requests on our issue tracker.
- The latest code can be found on our Github repository.
- If you'd like to contribute code, file a ticket on our issue tracker, and link to it from your Github pull request.
Our design files are organized on dropbox, at this link: https://www.dropbox.com/sh/7vm2rvw3axvkp0k/Tk4MKH4nZe You can ask Kate ( k88hudson on IRC or Twitter ) to be added as a collaborator if you want to drop your files in here.
- References: screen shots and other reference work from the webmaker project or HTML5 ecosystem
- Wireframes: documents about the functionality/interaction/description of features
- Visual Comps: UI mock-ups and style guide
When someone assigns you a ticket, it will show up in your lighthouse queue with a status of ui-comps-requested
or assigned
.
If you want someone to review or give feedback on your work, the best thing to do is:
- Put a link to your files in the ticket ( on our dropbox or somewhere externally )
- Change the status of the ticket to
peer-review-requested
orfeedback-requested
, and choose a member of the team to be responsible.
All of our code changes to Butter are documented in tickets, and go through two levels of peer-review. If you are interested in working on a ticket chose one from the list of open tickets, ping any of the developers on IRC, and they will assign it to you.
- Each ticket is a separate branch, usually named after the ticket number. IE
t1234
- All commit messages must include the ticket number. IE
Bug 1234 - Fixed a thing
or[t1234] Fixed a thing
- Before submitting a pull request, make sure you have rebased against the latest revision of master.
All code changes in butter have to go through two levels of peer review. This improves the integrity of our code, and everyone goes through the process, from casual contributors to our most senior developers.
- After you have made a pull-request, post the link (e.g. mozilla#662) in the corresponding ticket.
- Set the status of the ticket to
peer-review requested
, and choose someone to review your code. If you're not sure who should review your code, ask in #popcorn on IRC. - After you get a review, you will see (1) comments in the diff in your pull-request and (2) comments in lighthouse. Keep an eye on the ticket to see when your review is done.
- Complete the changes that were requested, or if you disagree or need more information, comment in the pull-request or lighthouse. Commit and push up.
- After your review passes, your reviewer will pass the ticket on to
super-review-requested
. You will likely have more changes after that review. - After your final round of changes, your ticket will change to
review-looks-good
. Hurrah! Ask someone to help you merge your code into master.
Once code has been reviewed (PR+ and SR+), and you want to land it, you need to follow our rebase strategy. Don't use Github's "Merge pull request". Instead, please do the following:
git checkout master
git pull mozilla master
This assumes your remote to Mozilla's butter is called mozillagit checkout mybranch
git rebase -i master
Squash your commits here, where it makes sense- Make sure everything still works in Butter at this point
git push origin mybranch --force
git checkout master
git merge mybranch --ff-only
No need for a commit message, as we're not doing a merge commitgit push mozilla master
- Paste URL to commits in ticket, and mark it as "Staged"
We use this landing strategy in order to make backing-out failed commits easier.