#!/usr/bin/env python import os import sys from setuptools import setup, Extension, Command from distutils.command.build import build from distutils.command.build_ext import build_ext from distutils.errors import (CCompilerError, DistutilsExecError, DistutilsPlatformError) from distutils import log # large portions ripped off from simplejson's setup.py if sys.platform == 'win32' and sys.version_info > (2, 6): # 2.6's distutils.msvc9compiler can raise an IOError when failing to find the compiler # It can also raise ValueError http://bugs.python.org/issue7511 ext_errors = (CCompilerError, DistutilsExecError, DistutilsPlatformError, IOError, ValueError) else: ext_errors = (CCompilerError, DistutilsExecError, DistutilsPlatformError) IS_PYPY = hasattr(sys, 'pypy_translation_info') class BuildFailed(Exception): pass class ve_build_ext(build_ext): def run(self): try: build_ext.run(self) except DistutilsPlatformError: raise BuildFailed() def build_extension(self, ext): try: build_ext.build_extension(self, ext) except ext_errors: raise BuildFailed() class TestCommand(Command): """Command for running unittests without install.""" user_options = [("args=", None, '''The command args string passed to unittest framework, such as --args="-v -f"''')] def initialize_options(self): self.args = '' pass def finalize_options(self): pass def run(self): self.run_command('build') bld = self.distribution.get_command_obj('build') #Add build_lib in to sys.path so that unittest can found DLLs and libs sys.path = [os.path.abspath(bld.build_lib)] + sys.path import shlex import unittest test_argv0 = [sys.argv[0] + ' test --args='] #For transfering args to unittest, we have to split args #by ourself, so that command like: #python setup.py test --args="-v -f" #can be executed, and the parameter '-v -f' can be #transfering to unittest properly. test_argv = test_argv0 + shlex.split(self.args) unittest.main(module='jellyfish.test', argv=test_argv) def run_setup(build_c): kw = {} if build_c: kw = dict(ext_modules= [Extension("jellyfish.cjellyfish", ['cjellyfish/jellyfishmodule.c', 'cjellyfish/jaro.c', 'cjellyfish/hamming.c', 'cjellyfish/levenshtein.c', 'cjellyfish/damerau_levenshtein.c', 'cjellyfish/mra.c', 'cjellyfish/soundex.c', 'cjellyfish/metaphone.c', 'cjellyfish/nysiis.c', 'cjellyfish/porter.c'])], cmdclass=dict(build_ext=ve_build_ext, test=TestCommand), packages=['jellyfish'], ) else: kw = dict(cmdclass=dict(test=TestCommand), packages=['jellyfish']) with open('README.rst') as readme: long_description = readme.read() setup(name="jellyfish", version="0.3.3", platforms=["any"], description=("a library for doing approximate and " "phonetic matching of strings."), url="http://github.com/sunlightlabs/jellyfish", long_description=long_description, classifiers=["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Text Processing :: Linguistic"], **kw) try: run_setup(not IS_PYPY) except BuildFailed: print('*'*75) print('WARNING: C extension could not be compiled, falling back to pure Python.') print('*'*75) run_setup(False) print('*'*75) print('WARNING: C extension could not be compiled, falling back to pure Python.') print('*'*75)