| | 14 | |
| | 15 | def find_package_data( package='', where='.', only_in_packages=True): |
| | 16 | """Finds static resources in package. Adapted from turbogears.finddata.""" |
| | 17 | out = {} |
| | 18 | exclude = ('*.py', '*.pyc', '*~', '.*', '*.bak', '*.swp*') |
| | 19 | exclude_directories = ('.*', 'CVS', '_darcs', './build', './dist', 'EGG-INFO', '*.egg-info') |
| | 20 | stack = [(convert_path(where), '', package, only_in_packages)] |
| | 21 | while stack: |
| | 22 | where, prefix, package, only_in_packages = stack.pop(0) |
| | 23 | for name in os.listdir(where): |
| | 24 | fn = os.path.join(where, name) |
| | 25 | if os.path.isdir(fn): |
| | 26 | bad_name = False |
| | 27 | for pattern in exclude_directories: |
| | 28 | if (fnmatchcase(name, pattern) |
| | 29 | or fn.lower() == pattern.lower()): |
| | 30 | bad_name = True |
| | 31 | print >> sys.stderr, ( |
| | 32 | "Directory %s ignored by pattern %s" |
| | 33 | % (fn, pattern)) |
| | 34 | break |
| | 35 | if bad_name: |
| | 36 | continue |
| | 37 | if os.path.isfile(os.path.join(fn, '__init__.py')): |
| | 38 | if not package: |
| | 39 | new_package = name |
| | 40 | else: |
| | 41 | new_package = package + '.' + name |
| | 42 | stack.append((fn, '', new_package, False)) |
| | 43 | else: |
| | 44 | stack.append((fn, prefix + name + '/', package, only_in_packages)) |
| | 45 | elif package or not only_in_packages: |
| | 46 | # is a file |
| | 47 | bad_name = False |
| | 48 | for pattern in exclude: |
| | 49 | if (fnmatchcase(name, pattern) |
| | 50 | or fn.lower() == pattern.lower()): |
| | 51 | bad_name = True |
| | 52 | print >> sys.stderr, ( |
| | 53 | "File %s ignored by pattern %s" |
| | 54 | % (fn, pattern)) |
| | 55 | break |
| | 56 | if bad_name: |
| | 57 | continue |
| | 58 | out.setdefault(package, []).append(prefix+name) |
| | 59 | return out |