Tutorial

Part 0: Overview

This is the directory structure for a minimal Complexity site:

my_repo/
├── project/       <--------- input
│   ├── assets/
│   │   ├── css/
│   │   ├── js/
│   │   └── img/
│   │
│   └── templates/
│       ├── base.html
│       ├── index.html
│       └── about.html
│
└── www/          <---------- output
    ├── index.html
    ├── about/
    │   └── index.html
    ├── css/
    ├── js/
    └── img/

Part 1: Setup

First, grab a copy of the example Complexity site:

git clone https://github.com/audreyr/complexity-example.git

Open everything in a text editor. You should see a main project/ directory with subfolders for your work:

  • Study the template files in templates/. We’ll go over them shortly.
  • Notice the assets/ directory. That is where you put your static files.
  • Creating additional directories in assets/ (e.g. ico/) is fine; they’ll get copied over to www/ without modification.

At the same level as project/, a www/ directory will be auto-generated. It will contain your final rendered templates and optimized static assets.

When you’re done, you should have a project structure like that in https://github.com/audreyr/complexity-example.

Part 2: What’s in a Complexity Site?

Here’s what a very simple Complexity site looks like:

project/templates/base.html:

<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %} - Built with Complexity</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap -->
    <link href="/css/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body>
    <div class="container">
        <div class="navbar">
            <div class="navbar-inner">
                <a class="brand" href="#">Complexity</a>
                <ul class="nav">
                    <li><a href="/">Home</a></li>
                    <li><a href="/about/">About</a></li>
                </ul>
            </div>
        </div>

        {% block content %}
        {% endblock %}
    </div>

<script src="http://code.jquery.com/jquery.js"></script>
<script src="/js/bootstrap.min.js"></script>
</body>
</html>

project/templates/index.html:

{% extends "base.html" %}

{% block title %}Home{% endblock %}

{% block content %}
<div class="row">
    <div class="span12">
        <h1>Home</h1>
        <p>This is the Home page of your website.</p>
    </div>
</div>
{% endblock %}

project/templates/about.html:

{% extends "base.html" %}

{% block title %}About{% endblock %}

{% block content %}
<div class="row">
    <div class="span12">
        <h1>About</h1>
        <p>This is the About page of your website.</p>
    </div>
</div>
{% endblock %}

Notice how index.html and about.html both share a common parent template, base.html.

Part 3: Generate the Site and Serve It Locally

Run the complexity command, passing it input and output directories:

$ complexity project/

This results in the following:

  • A www/ directory gets created, containing your generated static HTML site.

  • Templates are rendered and output to files smartly:

    • Any templates starting with “base” are assumed to be parent templates and not rendered on their own (e.g. base.html, base_section.html)
    • Templates named index.html are output to the same corresponding locations in www/.
    • Other templates are expanded in order to hide the ”.html” extension. For example, about.html is expanded to about/index.html.
  • A lightweight server starts up locally, serving your site so that you can see how it looks and check that everything works.

Open a web browser to http://127.0.0.1:9090. You should see your newly generated site!

In an upcoming release, the following will also occur during Complexity’s generation process:

  • CSS will be minified and concatenated.
  • SCSS and/or LESS will compiled to CSS, then minified and concatenated.
  • JS will minified, concatenated, and obfuscated.

Development is happening at a rapid pace, so stay tuned. To keep updated, watch and star https://github.com/audreyr/complexity on GitHub.

Part 4: Upload the Site to Amazon S3

For site deployment we’ll use the “alotofeffort” tool. It is designed for use with Complexity, but it works with non-Complexity sites just as well.

Install it:

$ pip install alotofeffort

Save the following in ~/.boto:

[Credentials]
aws_access_key_id = ...
aws_secret_access_key = ...

Replace ... with your AWS access credentials, of course.

Then deploy the www/ directory to any S3 bucket that you own:

$ alotofeffort www/ your-s3-bucketname

Your site is now live! Go to the URL that alotofeffort prints out after it finishes uploading.

Point your domain name at that URL, and you’ll be done.