1#!/usr/bin/env python3
2# Copyright (c) 2011-2020 Manfred Moitzi
3# License: MIT License
4import os
5import sys
6from setuptools import setup, find_packages
7from setuptools import Extension
8
9# setuptools docs: https://setuptools.readthedocs.io/en/latest/setuptools.html
10
11# Cython accelerated modules are optional:
12try:
13    from Cython.Distutils import build_ext
14
15    ext_modules = [
16        Extension("ezdxf.acc.vector", [
17            "src/ezdxf/acc/vector.pyx",
18        ], optional=True, language='c++'),
19        Extension("ezdxf.acc.matrix44", [
20            "src/ezdxf/acc/matrix44.pyx",
21        ], optional=True, language='c++'),
22        Extension("ezdxf.acc.bezier4p", [
23            "src/ezdxf/acc/bezier4p.pyx",
24            "src/ezdxf/acc/_cpp_cubic_bezier.cpp",
25        ], optional=True, language='c++'),
26        Extension("ezdxf.acc.bezier3p", [
27            "src/ezdxf/acc/bezier3p.pyx",
28            "src/ezdxf/acc/_cpp_quad_bezier.cpp",
29        ], optional=True, language='c++'),
30        Extension("ezdxf.acc.bspline", [
31            "src/ezdxf/acc/bspline.pyx",
32        ], optional=True, language='c++'),
33        Extension("ezdxf.acc.construct", [
34            "src/ezdxf/acc/construct.pyx",
35        ], optional=True, language='c++'),
36    ]
37    commands = {'build_ext': build_ext}
38except ImportError:
39    ext_modules = []
40    commands = {}
41
42PYPY = hasattr(sys, 'pypy_version_info')
43if PYPY:
44    print("C-extensions are disabled for pypy because JIT complied Python code "
45          "is much faster!")
46    ext_modules = []
47    commands = {}
48
49
50def get_version():
51    v = {}
52    for line in open('./src/ezdxf/version.py').readlines():
53        if line.strip().startswith('__version__'):
54            exec(line, v)
55            return v['__version__']
56    raise IOError('__version__ string not found')
57
58
59def read(fname, until=""):
60    def read_until(lines):
61        last_index = -1
62        for index, line in enumerate(lines):
63            if line.startswith(until):
64                last_index = index
65                break
66        return "".join(lines[:last_index])
67
68    try:
69        with open(os.path.join(os.path.dirname(__file__), fname)) as f:
70            return read_until(f.readlines()) if until else f.read()
71    except IOError:
72        return "File '%s' not found.\n" % fname
73
74
75DRAW = ["matplotlib", "PyQt5"]
76TEST = ["pytest", "geomdl"]
77DEV = ["setuptools", "wheel", "Cython"]
78
79setup(
80    name='ezdxf',
81    version=get_version(),
82    description='A Python package to create/manipulate DXF drawings.',
83    author='Manfred Moitzi',
84    url='https://ezdxf.mozman.at',
85    download_url='https://pypi.org/project/ezdxf/',
86    author_email='me@mozman.at',
87    python_requires='>=3.7',
88    package_dir={'': 'src'},
89    packages=find_packages('src'),
90    zip_safe=False,
91    package_data={'ezdxf': [
92        'pp/*.html',
93        'pp/*.js',
94        'pp/*.css',
95        'tools/font_face_cache.json',
96        'tools/font_measurement_cache.json',
97        'resources/*.png',
98    ]},
99    entry_points={
100        'console_scripts': [
101            'ezdxf = ezdxf.__main__:main',  # ezdxf launcher
102        ]
103    },
104    provides=['ezdxf'],
105    cmdclass=commands,
106    ext_modules=ext_modules,
107    install_requires=['pyparsing>=2.0.1'],
108    setup_requires=['wheel'],
109    tests_require=['pytest', 'geomdl'],
110    extras_require={
111        "draw": DRAW,
112        "test": TEST,
113        "dev": DEV + TEST,
114        "all": DRAW + DEV + TEST,
115    },
116    keywords=['DXF', 'CAD'],
117    long_description=read('README.md') + read('NEWS.md', until='Version 0.10.0'),
118    long_description_content_type="text/markdown",
119    platforms="OS Independent",
120    license="MIT License",
121    classifiers=[
122        "Development Status :: 5 - Production/Stable",
123        "License :: OSI Approved :: MIT License",
124        "Operating System :: OS Independent",
125        "Programming Language :: Python :: 3",
126        "Programming Language :: Python :: 3.7",
127        "Programming Language :: Python :: 3.8",
128        "Programming Language :: Python :: 3.9",
129        "Programming Language :: Python :: Implementation :: CPython",
130        "Programming Language :: Python :: Implementation :: PyPy",
131        "Intended Audience :: Developers",
132        "Topic :: Software Development :: Libraries :: Python Modules",
133    ]
134)
135
136# Development Status :: 3 - Alpha
137# Development Status :: 4 - Beta
138# Development Status :: 5 - Production/Stable
139# Development Status :: 6 - Mature
140# Development Status :: 7 - Inactive
141