commit b064bda7e24b9bdd0cdf1b1b81cb09220edc4513
Author: Kostas Papadimitriou <kpap@grnet.gr>
Date:   Fri Nov 25 15:17:09 2011 +0200

    Fixed static files packaging
    
    - proper include of static files on both package_data and MANIFEST.in

diff --git a/snf-app/setup.py b/snf-app/setup.py
index 9e7038f..ac9e8cc 100644
--- a/snf-app/setup.py
+++ b/snf-app/setup.py
@@ -2,6 +2,9 @@ import distribute_setup
 distribute_setup.use_setuptools()
 
 import os
+
+from distutils.util import convert_path
+from fnmatch import fnmatchcase
 from setuptools import setup, find_packages
 from synnefo import get_version
 
@@ -42,13 +45,96 @@ EXTRAS_REQUIRES = {
 TESTS_REQUIRES = [
 ]
 
-PACKAGE_DATA = {
-    '': ['templates/*.html', 'fixtures/*.json',
-         'templates/*.xml', 'templates/partials/*.html',
-         'templates/*.txt', 'templates/userdata/*.html'],
 
-    'synnefo': ['settings.d/*.conf']
-}
+# Provided as an attribute, so you can append to these instead
+# of replicating them:
+standard_exclude = ["*.py", "*.pyc", "*$py.class", "*~", ".*", "*.bak"]
+standard_exclude_directories = [
+    ".*", "CVS", "_darcs", "./build", "./dist", "EGG-INFO", "*.egg-info", "snf-0.7"
+]
+
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# Note: you may want to copy this into your setup.py file verbatim, as
+# you can't import this from another package, when you don't know if
+# that package is installed yet.
+def find_package_data(
+    where=".",
+    package="",
+    exclude=standard_exclude,
+    exclude_directories=standard_exclude_directories,
+    only_in_packages=True,
+    show_ignored=False):
+    """
+    Return a dictionary suitable for use in ``package_data``
+    in a distutils ``setup.py`` file.
+
+    The dictionary looks like::
+
+        {"package": [files]}
+
+    Where ``files`` is a list of all the files in that package that
+    don"t match anything in ``exclude``.
+
+    If ``only_in_packages`` is true, then top-level directories that
+    are not packages won"t be included (but directories under packages
+    will).
+
+    Directories matching any pattern in ``exclude_directories`` will
+    be ignored; by default directories with leading ``.``, ``CVS``,
+    and ``_darcs`` will be ignored.
+
+    If ``show_ignored`` is true, then all the files that aren"t
+    included in package data are shown on stderr (for debugging
+    purposes).
+
+    Note patterns use wildcards, or can be exact paths (including
+    leading ``./``), and all searching is case-insensitive.
+    """
+    out = {}
+    stack = [(convert_path(where), "", package, only_in_packages)]
+    while stack:
+        where, prefix, package, only_in_packages = stack.pop(0)
+        for name in os.listdir(where):
+            fn = os.path.join(where, name)
+            if os.path.isdir(fn):
+                bad_name = False
+                for pattern in exclude_directories:
+                    if (fnmatchcase(name, pattern)
+                        or fn.lower() == pattern.lower()):
+                        bad_name = True
+                        if show_ignored:
+                            print >> sys.stderr, (
+                                "Directory %s ignored by pattern %s"
+                                % (fn, pattern))
+                        break
+                if bad_name:
+                    continue
+                if (os.path.isfile(os.path.join(fn, "__init__.py"))
+                    and not prefix):
+                    if not package:
+                        new_package = name
+                    else:
+                        new_package = package + "." + name
+                    stack.append((fn, "", new_package, False))
+                else:
+                    stack.append((fn, prefix + name + "/", package, only_in_packages))
+            elif package or not only_in_packages:
+                # is a file
+                bad_name = False
+                for pattern in exclude:
+                    if (fnmatchcase(name, pattern)
+                        or fn.lower() == pattern.lower()):
+                        bad_name = True
+                        if show_ignored:
+                            print >> sys.stderr, (
+                                "File %s ignored by pattern %s"
+                                % (fn, pattern))
+                        break
+                if bad_name:
+                    continue
+                out.setdefault(package, []).append(prefix+name)
+    return out
 
 setup(
     name = 'synnefo',
@@ -67,7 +153,7 @@ setup(
     packages = PACKAGES,
     package_dir= {'': PACKAGES_ROOT},
     include_package_data = True,
-    package_data = PACKAGE_DATA,
+    package_data = find_package_data('.'),
     zip_safe = False,
 
     install_requires = INSTALL_REQUIRES,
