Made finding packages and its data easier by using the excellent finddata utility. Also extended the manifest template to now ship with all test related data.

This commit is contained in:
Jannis Leidel
2011-01-20 13:00:46 +01:00
parent 38715cf301
commit ee69369136
3 changed files with 105 additions and 17 deletions

View File

@@ -1,4 +1,5 @@
include AUTHORS
include README.rst
include LICENSE
recursive-include compressor/templates/compressor *.html
recursive-include compressor/templates/compressor *.html
recursive-include compressor/tests/media *.js *.css *.png

99
finddata.py Normal file
View File

@@ -0,0 +1,99 @@
# (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.
import os
import sys
from fnmatch import fnmatchcase
from distutils.util import convert_path
# 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')
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
if __name__ == '__main__':
import pprint
pprint.pprint(
find_package_data(show_ignored=True))

View File

@@ -1,5 +1,6 @@
import os
from setuptools import setup
from setuptools import setup, find_packages
from finddata import find_package_data
def read(fname):
return open(os.path.join(os.path.dirname(__file__), fname)).read()
@@ -13,23 +14,10 @@ setup(
license = 'BSD',
description = "Compresses linked and inline javascript or CSS into a single cached file.",
long_description = README,
packages = [
'compressor',
'compressor.conf',
'compressor.filters',
'compressor.filters.jsmin',
'compressor.filters.cssmin',
'compressor.templatetags',
'compressor.management',
'compressor.management.commands',
],
author = 'Jannis Leidel',
author_email = 'jannis@leidel.info',
package_data = {
'compressor': [
'templates/compressor/*.html',
],
},
packages = find_packages(),
package_data = find_package_data('compressor'),
install_requires = [
'BeautifulSoup',
],