from distutils.core import setup import fnmatch, os.path from libpathod import version def _fnmatch(name, patternList): for i in patternList: if fnmatch.fnmatch(name, i): return True return False def _splitAll(path): parts = [] h = path while 1: if not h: break h, t = os.path.split(h) parts.append(t) parts.reverse() return parts def findPackages(path, dataExclude=[]): """ Recursively find all packages and data directories rooted at path. Note that only data _directories_ and their contents are returned - non-Python files at module scope are not, and should be manually included. dataExclude is a list of fnmatch-compatible expressions for files and directories that should not be included in pakcage_data. Returns a (packages, package_data) tuple, ready to be passed to the corresponding distutils.core.setup arguments. """ packages = [] datadirs = [] for root, dirs, files in os.walk(path, topdown=True): if "__init__.py" in files: p = _splitAll(root) packages.append(".".join(p)) else: dirs[:] = [] if packages: datadirs.append(root) # Now we recurse into the data directories package_data = {} for i in datadirs: if not _fnmatch(i, dataExclude): parts = _splitAll(i) module = ".".join(parts[:-1]) acc = package_data.get(module, []) for root, dirs, files in os.walk(i, topdown=True): sub = os.path.join(*_splitAll(root)[1:]) if not _fnmatch(sub, dataExclude): for fname in files: path = os.path.join(sub, fname) if not _fnmatch(path, dataExclude): acc.append(path) else: dirs[:] = [] package_data[module] = acc return packages, package_data with open("README.txt", "rb") as f: long_description = f.read() packages, package_data = findPackages("libpathod") setup( name="pathod", version=version.VERSION, description="A pathological HTTP/S daemon for testing and stressing clients.", long_description=long_description, author="Aldo Cortesi", author_email="aldo@corte.si", url="http://pathod.net", packages=packages, package_data=package_data, entry_points={ 'console_scripts': [ "pathod = libpathod.main:pathod", "pathoc = libpathod.main:pathoc" ] }, classifiers=[ "License :: OSI Approved :: MIT License", "Development Status :: 5 - Production/Stable", "Operating System :: POSIX", "Programming Language :: Python", "Programming Language :: Python :: 2", "Topic :: Internet", "Topic :: Internet :: WWW/HTTP :: HTTP Servers", "Topic :: Software Development :: Testing", "Topic :: Software Development :: Testing :: Traffic Generation", "Topic :: Internet :: WWW/HTTP", ], install_requires=[ 'netlib>=%s' % version.MINORVERSION, "requests>=2.4.0", "Flask>=0.10.1" ], extras_require={ 'dev': [ "mock>=1.0.1", "nose>=1.3.0", "nose-cov>=1.6", "coveralls>=0.4.1" ] } )