#summary How to get started with Melange
#labels Featured,Phase-Guidelines,Contents-Draft,Importance-Featured

<wiki:toc max_depth="1" />

= Prerequisites =

[MelangeIntro Melange] is a web application written in python 2.5 ([http://www.python.org/download/releases/2.5.5/ install]) that runs on
[http://code.google.com/appengine/ Google App Engine].

= TL;DR = 

You should read the text below, but if you want a quick refresher on how to get running, here's the TL;DR.

== Setting up ==

If you do not yet have a melange directory set up, run the following commands.

{{{
hg clone http://soc.googlecode.com/hg/ melange && 
cd melange &&
python bootstrap.py && 
bin/buildout && 
bin/gen-app-yaml local-devel &&
bin/paver build --skip-pylint && 
}}}

== Running locally ==

If you want to run melange locally, run the following command

{{{
thirdparty/google_appengine/dev_appserver.py --allow_skipped_files build
}}}

== Creating an !AppEngine instance ==

If you do not already have an !AppEngine instance, follow these steps, otherwise you can skip this part.

 * Go to http://www.appspot.com and sign in with a Google Account
 * Click "Create an application"
 * Verify your account if prompted
 * In the "Create an Application" page, fill in an identifier (cannot be changed), you will need this later on when deploying
 * Fill in a title (can be changed later)
 * Set the "Authentication Options" on either "Open to all Google Accounts users (default)" or "Restricted to the following Google Apps domain".
 * Hit "Create Application"

== Deploying to your own instance ==

Assuming you have an !AppEngine instance called 'your-melange-instance'

{{{
scripts/gen_app_yaml.py -f your-melange-instance &&
thirdparty/google_appengine/dev_appserver.py --allow_skipped_files build
}}}

== Running the test suite ==

If you want to run the test suit, run the following

{{{
bin/run-tests
}}}

Currently our functional tests are broken, to ignore the functional tests run:

{{{
bin/run-tests -e test_functional
}}}

= Checking Out the Code =

We have switched from Subversion to Mercurial, so our svn repository is no longer updated.

To check out Melange source code run the following command:

Using Mercurial repository:

{{{
hg clone http://soc.googlecode.com/hg/ melange
}}}

You can use TortoiseHg to do the checkout from http://soc.googlecode.com/hg/ Mercurial repository.

= Setting up your Client =
Change directories into the working directory (the one created by checking out the code). Google App Engine requires a file `app.yaml` in the application directory. For now, you can create a dummy `app.yaml` file by running:
{{{
scripts/gen_app_yaml.py local-devel
}}}

= Running the Code Locally =
You can start the server on your computer by running:

{{{
thirdparty/google_appengine/dev_appserver.py --allow_skipped_files build
}}}

You should now be able to see the running server at [http://localhost:8080/] .  Congrats!  You've got Melange running!

(If you want to run on a different port, you can use the `--port` argument.  Other arguments are described [http://code.google.com/appengine/docs/thedevwebserver.html here].)

(Since you are starting from scratch, you will probably want some sample data. Visit [http://localhost:8080/seed_db] to have Melange generate data for you and save your fingers for code!)

= Running on and Deploying to App Engine's cluster =
If you want to run an instance of Melange on Google's App Engine infrastructure, there are a few more steps to make sure it deploys the right data to the right place.

== Set the application name ==
In `app/app.yaml` there's an application name that in the above steps was set to fake-application-name.  After registering an application on Google App Engine, use any text editor to change the line that starts with `application: fake-application-name` to instead read `application: <your-instance-name>`. You can also run the script again:

{{{
scripts/gen_app_yaml.py -f proper-application-name
}}}


== Building With Paver ==

Because
[http://code.google.com/p/soc/source/browse/#svn/trunk/app/tiny_mce Tiny MCE]
(and possibly some other third-party content and JavaScript incorporated
into Melange) is large,
[http://code.google.com/p/googleappengine/source/browse/#svn/trunk/google/appengine/ext/zipserve zipserve]
is used to combine this content into `.zip` archive files (to avoid
file-count limits in Google App Engine).  A side effect of this is that,
for Tiny MCE to work in the `textarea` controls on your local working copy,
launched with `thirdparty/google_appengine`, you still need to run a build script
to produce these <tt>.zip</tt> files at least once.

To do this, you will need to execute the `bin/paver` script, using the following command

{{{
bin/paver build --skip-pylint
}}}

This script will create a `build/` directory at the same level as the
`app/` directory (and the `scripts/` directory) in the `hg` working copy.

== Deploying to Google App Engine ==

Once you have your application configured correctly and you have
executed the `paver` script found in the `bin` folder,
you are ready to deploy your Melange image to your specific Google
App Engine instance.

You can run the contents of the `build/` directory, in
order to test what would actually be uploaded by `appcfg.py upload`
to Google App Engine by using:

{{{
bin/gae_develop build
}}}

Once you are satisfied that `build/` contains everything needed, you can deploy
to your Google App Engine instance with:

{{{
thirdparty/google_appengine/appcfg.py update build
}}}

= Contributing =

There are a number of ways that you can contribute to the Melange project.

== Discussion ==

If you are interested in contributing to the Melange project, please join our
[MailingListsGuidelines#General_discussion_list general discussion mailing list].
Also,feel free to join us [IrcChannelGuidelines on IRC].


== Bug Hunting and Feature Requests ==

If you are (or were) a mentor or student participant in GSoC or GHOP but do not have the time to contribute patches to Melange, we can still use your help.  While a great deal of code is already done, some parts of the web application are not entirely bug free yet, or feature complete.
Please consider writing up a feature request, or bug report. Please be precise when you file a [http://tinyurl.com/new-issue New Issue].

== Patches ==

[ContributionReviews#Patches Patches] to the code are also welcome,
[ContributionReviews#Suggested_patches_from_casual_contributors even from non-committers].

= Troubleshooting =

== AppConfigNotFoundError ==


{{{
soc-read-only$ thirdparty/google_appengine/dev_appserver.py app
Traceback (most recent call last):
  File "soc-read-only/thirdparty/google_appengine/google/appengine/tools/dev_appserver.py", line 2638, in LoadAppConfig
    raise AppConfigNotFoundError
google.appengine.tools.dev_appserver.AppConfigNotFoundError
}}}

This error means that it can not find a app.yaml file. Please check the following things,

 * You are running the command in the directory you checked out.
 * You have created the app.yaml from app.yaml.template in step [GettingStarted#Running_the_Code Running the Code].


== Socket.error ==  

{{{
File "/usr/lib/python2.5/BaseHTTPServer.py", line 101, in server_bind
    SocketServer.TCPServer.server_bind(self)
  File "/usr/lib/python2.5/SocketServer.py", line 341, in server_bind
    self.socket.bind(self.server_address)
  File "<string>", line 1, in bind
socket.error: (98, 'Address already in use')
}}}

This error means that some other program is running on port 8080 (the default port that appengine starts on). This can also happen if you try and run two copies of the program at once.

To run the program on a different port use the --port argument, for example
{{{
thirdparty/google_appengine/dev_appserver.py --port=9999 build
}}}

You will then need to connect to the correct port when browsing to the site. IE In the above example you would need to go to [http://localhost:9999/].

== BadValueError ==

{{{
File "/google_appengine/google/appengine/ext/db/__init__.py" in filter
  1482.       raise BadValueError('Filtering on lists is not supported')

Exception Type: BadValueError at /
Exception Value: Filtering on lists is not supported
}}}

This error means you are running a version of AppEngine that does not support the IN operator, please use the version of appengine that ships with Melange under /thirdparty/google_appengine, or update to a recent enough version (that is, >= 1.1.9).

== <type 'exceptions.ImportError'> ==  

Google App Engine SDK currently runs only on Python 2.5. If your system provides Python 2.6 or later as the default version of Python, you are likely to get the following warning as soon as you start the SDK by running 
{{{
thirdparty/google_appengine/dev_appserver.py build
}}}

{{{
thirdparty/google_appengine/google/appengine/tools/appcfg.py:40: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
  import sha
INFO     2009-04-29 19:49:06,517 appengine_rpc.py] Server: appengine.google.com
INFO     2009-04-29 19:49:06,529 appcfg.py] Checking for updates to the SDK.
thirdparty/google_appengine/google/appengine/api/datastore_types.py:555: DeprecationWarning: object.__init__() takes no parameters
  super(Email, self).__init__(self, email)
thirdparty/google_appengine/google/appengine/api/datastore_types.py:745: DeprecationWarning: object.__init__() takes no parameters
  super(PhoneNumber, self).__init__(self, phone)
thirdparty/google_appengine/google/appengine/api/datastore_types.py:532: DeprecationWarning: object.__init__() takes no parameters
  super(Link, self).__init__(self, link)
}}}

And when you try to access a page using any URL, you get this exception
{{{
  File "thirdparty/google_appengine/google/appengine/tools/dev_appserver.py", line 996, in decorate
    return func(self, *args, **kwargs)
  File "thirdparty/google_appengine/google/appengine/tools/dev_appserver.py", line 1444, in LoadModuleRestricted
    description)
  File "/usr/lib/python2.6/multiprocessing/__init__.py", line 83, in <module>
    import _multiprocessing
ImportError: No module named _multiprocessing
}}}

The workaround for this is to install Python 2.5 on your machine. It will be then be accessible by using python2.5 on the command line. Then open thirdparty/google_appengine/dev_appserver.py in your favorite text editor and replace the first line, 
{{{
#!/usr/bin/env python
}}}

with 
{{{
#!/usr/bin/env python2.5
}}}

Save the changes in the file, close it and restart the GAE development server.

Depending on the operating system (Mac OS X, different linux distributions) you just might be able to create symbolic link `python` for `python2.5` file that way you don't have to modify dev_appserver.py file.


== <class 'django.core.exceptions.ImproperlyConfigured'> ==  

{{{
Error importing middleware app_profiler.app_profiler: "No module named pstats"
args = ('Error importing middleware app_profiler.app_profiler: "No module named pstats"',)
message = 'Error importing middleware app_profiler.app_profiler: "No module named pstats"'
}}}

This error means you're missing _pstats_ Python module. It happens at least on Ubuntu Jaunty. This module is part of _python-profiler_ package. So to install it you can open a console and write:

{{{
sudo apt-get install python-profiler
}}}