setup.py 8.32 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/python
# coding: utf8
# /*##########################################################################
#
# Copyright (c) 2015-2019 European Synchrotron Radiation Facility
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# ###########################################################################*/

__authors__ = ["Jérôme Kieffer", "Thomas Vincent", "H. Payno"]
__date__ = "12/02/2019"
__license__ = "MIT"


import sys
import os
import logging
import io

logging.basicConfig(level=logging.INFO)

logger = logging.getLogger("nxtomomill.setup")


try:
    from setuptools import Command
    from setuptools.command.build_ext import build_ext
    from setuptools.command.sdist import sdist
payno's avatar
payno committed
46

47
48
49
50
51
52
53
54
    logger.info("Use setuptools")
except ImportError:
    try:
        from numpy.distutils.core import Command
    except ImportError:
        from distutils.core import Command
    from distutils.command.build_ext import build_ext
    from distutils.command.sdist import sdist
payno's avatar
payno committed
55

56
57
58
59
60
    logger.info("Use distutils")

try:
    import sphinx
    import sphinx.util.console
payno's avatar
payno committed
61

62
63
64
65
66
67
68
69
70
    sphinx.util.console.color_terminal = lambda: False
    from sphinx.setup_command import BuildDoc
except ImportError:
    sphinx = None


PROJECT = "nxtomomill"

if "LANG" not in os.environ and sys.platform == "darwin" and sys.version_info[0] > 2:
payno's avatar
payno committed
71
72
    print(
        """WARNING: the LANG environment variable is not defined,
73
74
75
an utf-8 LANG is mandatory to use setup.py, you may face unexpected UnicodeError.
export LANG=en_US.utf-8
export LC_ALL=en_US.utf-8
payno's avatar
payno committed
76
77
"""
    )
78
79
80
81
82
83
84


def get_version():
    """Returns current version number from version.py file"""
    dirname = os.path.dirname(os.path.abspath(__file__))
    sys.path.insert(0, dirname)
    import nxtomomill.version
payno's avatar
payno committed
85

86
87
88
89
90
91
92
93
94
95
96
97
98
    sys.path = sys.path[1:]
    return nxtomomill.version.strictversion


def get_readme():
    """Returns content of README.rst file"""
    dirname = os.path.dirname(os.path.abspath(__file__))
    filename = os.path.join(dirname, "README.md")
    with io.open(filename, "r", encoding="utf-8") as fp:
        long_description = fp.read()
    return long_description


payno's avatar
payno committed
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
classifiers = [
    "Development Status :: 4 - Beta",
    "Environment :: Console",
    "Environment :: MacOS X",
    "Environment :: Win32 (MS Windows)",
    "Intended Audience :: Education",
    "Intended Audience :: Science/Research",
    "License :: OSI Approved :: MIT License",
    "Natural Language :: English",
    "Operating System :: MacOS",
    "Operating System :: Microsoft :: Windows",
    "Operating System :: POSIX",
    "Programming Language :: Python :: 3.6",
    "Programming Language :: Python :: 3.7",
    "Programming Language :: Python :: 3.8",
    "Topic :: Scientific/Engineering :: Physics",
    "Topic :: Software Development :: Libraries :: Python Modules",
]
117
118
119
120
121

########
# Test #
########

payno's avatar
payno committed
122

123
124
class PyTest(Command):
    """Command to start tests running the script: run_tests.py"""
payno's avatar
payno committed
125

126
127
128
129
130
131
132
133
134
135
136
137
    user_options = []

    description = "Execute the unittests"

    def initialize_options(self):
        pass

    def finalize_options(self):
        pass

    def run(self):
        import subprocess
payno's avatar
payno committed
138
139

        errno = subprocess.call([sys.executable, "run_tests.py"])
140
141
142
143
144
145
146
147
148
        if errno != 0:
            raise SystemExit(errno)


# ################### #
# build_doc command   #
# ################### #

if sphinx is None:
payno's avatar
payno committed
149

150
151
    class SphinxExpectedCommand(Command):
        """Command to inform that sphinx is missing"""
payno's avatar
payno committed
152

153
154
155
156
157
158
159
160
161
162
        user_options = []

        def initialize_options(self):
            pass

        def finalize_options(self):
            pass

        def run(self):
            raise RuntimeError(
payno's avatar
payno committed
163
164
165
                "Sphinx is required to build or test the documentation.\n"
                "Please install Sphinx (http://www.sphinx-doc.org)."
            )
166
167
168
169
170
171


# ############################# #
# numpy.distutils Configuration #
# ############################# #

payno's avatar
payno committed
172
173

def configuration(parent_package="", top_path=None):
174
175
176
177
178
179
180
181
182
    """Recursive construction of package info to be used in setup().

    See http://docs.scipy.org/doc/numpy/reference/distutils.html#numpy.distutils.misc_util.Configuration
    """
    try:
        from numpy.distutils.misc_util import Configuration
    except ImportError:
        raise ImportError(
            "To install this package, you must install numpy first\n"
payno's avatar
payno committed
183
184
            "(See https://pypi.python.org/pypi/numpy)"
        )
185
186
187
188
189
    config = Configuration(None, parent_package, top_path)
    config.set_options(
        ignore_setup_xxx_py=True,
        assume_default_configuration=True,
        delegate_options_to_subpackages=True,
payno's avatar
payno committed
190
191
        quiet=True,
    )
192
193
194
    config.add_subpackage(PROJECT)
    return config

payno's avatar
payno committed
195

196
197
198
199
# ##### #
# setup #
# ##### #

payno's avatar
payno committed
200

201
202
203
204
205
206
def get_project_configuration(dry_run):
    """Returns project arguments for setup"""
    install_requires = [
        # for the script launcher and pkg_resources
        "setuptools",
        "numpy",
payno's avatar
payno committed
207
        "silx >= 0.14",
208
        "h5py >= 3.0",
payno's avatar
payno committed
209
        "tomoscan >= 0.4",
210
211
    ]

payno's avatar
payno committed
212
213
214
    setup_requires = [
        "setuptools",
    ]
215
216

    # extras requirements: target 'full' to install all dependencies at once
payno's avatar
payno committed
217
    full_requires = []
218
219

    extras_require = {
payno's avatar
payno committed
220
        "full": full_requires,
221
222
    }

payno's avatar
payno committed
223
    package_data = {}
224
225

    entry_points = {
payno's avatar
payno committed
226
        "gui_scripts": ("nxtomomill = nxtomomill.__main__:main",),
227
228
    }

payno's avatar
payno committed
229
    cmdclass = dict(test=PyTest)
230
231
232
233
234
235
236
237
238
239
240
241

    if dry_run:
        # DRY_RUN implies actions which do not require NumPy
        #
        # And they are required to succeed without Numpy for example when
        # pip is used to install nxtomomill when Numpy is not yet present in
        # the system.
        setup_kwargs = {}
    else:
        config = configuration()
        setup_kwargs = config.todict()

payno's avatar
payno committed
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
    setup_kwargs.update(
        name=PROJECT,
        version=get_version(),
        url="https://gitlab.esrf.fr/tomotools/nxtomomill",
        author="data analysis unit",
        author_email="christian.nemoz@esrf.fr",
        classifiers=classifiers,
        description="applications to convert data to nx " "compliant format",
        long_description=get_readme(),
        install_requires=install_requires,
        setup_requires=setup_requires,
        extras_require=extras_require,
        cmdclass=cmdclass,
        package_data=package_data,
        zip_safe=False,
        entry_points=entry_points,
    )
259
260
261
262
263
264
265
266
267
268
269
    return setup_kwargs


def setup_package():
    """Run setup(**kwargs)

    Depending on the command, it either runs the complete setup which depends on numpy,
    or a *dry run* setup with no dependency on numpy.
    """

    # Check if action requires build/install
payno's avatar
payno committed
270
271
272
273
274
275
276
277
    dry_run = len(sys.argv) == 1 or (
        len(sys.argv) >= 2
        and (
            "--help" in sys.argv[1:]
            or sys.argv[1]
            in ("--help-commands", "egg_info", "--version", "clean", "--name")
        )
    )
278
279
280
281
282

    if dry_run:
        # DRY_RUN implies actions which do not require dependencies, like NumPy
        try:
            from setuptools import setup
payno's avatar
payno committed
283

284
285
286
            logger.info("Use setuptools.setup")
        except ImportError:
            from distutils.core import setup
payno's avatar
payno committed
287

288
289
290
291
292
293
            logger.info("Use distutils.core.setup")
    else:
        try:
            from setuptools import setup
        except ImportError:
            from numpy.distutils.core import setup
payno's avatar
payno committed
294

295
296
297
298
299
300
301
302
            logger.info("Use numpy.distutils.setup")

    setup_kwargs = get_project_configuration(dry_run)
    setup(**setup_kwargs)


if __name__ == "__main__":
    setup_package()