#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.7 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.

== Prerequisites == 

Melange depends on two things to be able to set up your system:
 * python (version 2.7)
 * virtualenv (version 1.10 or later)

== Setting up ==

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

{{{
git clone http://code.google.com/p/soc/
cd soc
virtualenv venv
venv/bin/pip install -U setuptools
venv/bin/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 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 -o devvin -f your-melange-instance &&
thirdparty/google_appengine/appcfg.py update build
}}}


== Running the test suite ==

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

{{{
bin/run-tests
}}}

This will run, by default, all types of tests. This is the same as running

{{{
bin/run-tests -t js,pyunit
}}}

So, using {{{ -t }}} switch it's possible to choose a list of comma-separated types of tests to run.

To run only pyunit tests:

{{{
bin/run-tests -t pyunit
}}}

To run only js tests:

{{{
bin/run-tests -t js
}}}

= Checking Out the Code =

To check out Melange source code run the following command:

Using Git repository:

{{{
git clone http://code.google.com/p/soc/
}}}

= 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 -o devvin
}}}

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

{{{
thirdparty/google_appengine/dev_appserver.py 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 -o devvin -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 GCI 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].

The code that is used for showing pages can be found in app/soc/modules/`<module_name>`/views.

= Troubleshooting =

==NoneTypeAttributeError==
{{{

Traceback (most recent call last):
  File "bootstrap.py", line 105, in <module>
    ws.find(pkg_resources.Requirement.parse(requirement)).location
AttributeError: 'NoneType' object has no attribute 'location'

}}}

[https://bugs.launchpad.net/zc.buildout/+bug/515398]

I was able to solve the problem by removing the python-pkg-resources package. I think the bootstrap script, being able to import pkg_resources, assumes that I have Distribute or Setuptools installed, which is not the case.



== 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. Note that you should _only_ do this if you get an exception when opening a page, if you only get DeprecationWarnings you can safely ignore those. 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
}}}

== setuptools-0.6c11-py2.6.egg-info: Permission denied ==

{{{
$ python bootstrap.py 
install_dir /tmp/tmp9byusF
Getting distribution for 'distribute'.
install_dir /home/sverre/code/Melange/eggs/tmp6eeuMe
Before install bootstrap.
Scanning installed packages
Setuptools installation detected at /usr/lib/python2.6/dist-packages
Non-egg installation
Removing elements out of the way...
Already patched.
/usr/lib/python2.6/dist-packages/setuptools.egg-info already patched.
After install bootstrap.
Creating /usr/local/lib/python2.6/dist-packages/setuptools-0.6c11-py2.6.egg-info
  Getting distribution for 'distribute'.
Error: Couldn't install: distribute 0.6.15
}}}

Related: https://bugs.launchpad.net/zc.buildout/+bug/656303
There's an easy workaround:

{{{
sudo easy_install distribute==0.6.15
}}}

== ImportError: No module named _sqlite3 ==

{{{
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.5/sqlite3/__init__.py", line 24, in <module>
    from dbapi2 import *
  File "/usr/local/lib/python2.5/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ImportError: No module named _sqlite3
}}}

This happens when you've manually compiled python 2.5, you should consider instead using the version of python that comes with your OS. If not, compile python 2.5 with sqlite support. See also [http://stackoverflow.com/questions/1210664/no-module-named-sqlite3 this article] on stackoverflow.

== ImportError: No 'check_packages' attribute ==

{{{
ImportError: <module 'setuptools.dist' from ...> has no 'check_packages' attribute
}}}

If your bin/buildout fails with this error and you run bootstrap.py with python 2.5, try running it again with python2.6 instead.

== pkg_resources.VersionConflict: (setuptools 0.6c11 (/usr/lib/python2.7/dist-packages), Requirement.parse('setuptools>=0.7')) ==

{{{
$ python bootstrap.py 
Traceback (most recent call last):  File "bootstrap.py", line 159, in <module>    ws.require(requirement)  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 686, in require    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 588, in resolve    raise VersionConflict(dist,req) # XXX put more info herepkg_resources.VersionConflict: (setuptools 0.6c11 (/usr/lib/python2.7/dist-packages), Requirement.parse('setuptools>=0.7'))
}}}

Your version of setuptools is too old, the easiest way to fix this is to run:
{{{
sudo easy_install -U setuptools
sudo easy_install -U virtualenv # optional
}}}