.. _codebase-chapter: ======================== Codebase Documentation ======================== This chapter covers the libraries that GNU MediaGoblin uses as well as various recipes for getting things done. .. Note:: This chapter is in flux. Clearly there are things here that aren't documented. If there's something you have questions about, please ask! See `the join page on the website `_ for where we hang out. For more information on how to get started hacking on GNU MediaGoblin, see :ref:`hacking-howto`. Software Stack ============== * Project infrastructure * `Python `_: the language we're using to write this * `Nose `_: for unit tests * `buildout `_: for getting dependencies, building a runtime environment, ... * Data storage * `MongoDB `_: the document database backend for storage * Web application * `Paste Deploy `_ and `Paste Script `_: we'll use this for configuring and launching the application * `WebOb `_: nice abstraction layer from HTTP requests, responses and WSGI bits * `Routes `_: for URL routing * `Beaker `_: for handling sessions * `Jinja2 `_: the templating engine * `MongoKit `_: the lightweight ORM for MongoDB we're using which will make it easier to define structures and all that * `WTForms `_: for handling, validation, and abstraction from HTML forms * `Celery `_: for task queuing (resizing images, encoding video, ...) * `RabbitMQ `_: for sending tasks to celery * Front end * `JQuery `_: for groovy JavaScript things What's where ============ After you've run buildout, you're faced with the following directory tree:: mediagoblin/ |- mediagoblin/ #source code | |- tests/ | |- templates/ | |- auth/ | \- submit/ |- docs/ #documentation | | #the below directories are generated by | #buildout. | |- bin/ #scripts |- develop-eggs/ |- eggs/ |- mediagoblin.egg-info/ |- parts/ |- user_dev/ #sessions, etc As you can see, all the code for GNU MediaGoblin is in the ``mediagoblin`` directory. Here are some interesting files and what they do: :routing.py: maps url paths to views :views.py: views handle http requests :models.py: holds the mongodb schemas---these are the data structures we're working with You'll notice that there are several sub-directories: tests, templates, auth, submit, ... ``tests`` holds the unit test code. ``templates`` holds all the templates for the output. ``auth`` and ``submit`` are modules that enacpsulate authentication and media item submission. If you look in these directories, you'll see they have their own ``routing.py``, ``view.py``, and ``models.py`` in addition to some other code. Recipes ======= FIXME - write this