blob: 15d6d2958044e862b58dfed635570c09bb409a54 [file] [log] [blame]
#!/usr/bin/env python
import os
import sys
from setuptools import setup, Extension, Command
from distutils.command.build_ext import build_ext
from distutils.errors import CCompilerError, DistutilsExecError, DistutilsPlatformError
# large portions ripped off from simplejson's setup.py
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 (CCompilerError, DistutilsExecError, DistutilsPlatformError):
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 = ""
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 transferring 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
# transferring to unittest properly.
test_argv = test_argv0 + shlex.split(self.args)
unittest.main(module="jellyfish.test", argv=test_argv)
def run_setup(build_c):
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",
],
define_macros=[("CJELLYFISH_PYTHON", "1")],
)
],
cmdclass=dict(build_ext=ve_build_ext, test=TestCommand),
)
else:
kw = dict(cmdclass=dict(test=TestCommand))
with open("README.md") as readme:
long_description = readme.read()
setup(
name="jellyfish",
version="0.10.0",
python_requires=">3.6",
platforms=["any"],
description=(
"a library for doing approximate and " "phonetic matching of strings."
),
url="http://github.com/jamesturk/jellyfish",
long_description=long_description,
long_description_content_type="text/markdown",
classifiers=[
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: BSD License",
"Natural Language :: English",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Topic :: Text Processing :: Linguistic",
],
packages=["jellyfish"],
package_data={"jellyfish": ["*.pyi", "py.typed"]},
**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)