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:
@@ -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
99
finddata.py
Normal 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))
|
20
setup.py
20
setup.py
@@ -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',
|
||||
],
|
||||
|
Reference in New Issue
Block a user