-
Notifications
You must be signed in to change notification settings - Fork 1
/
setup.py
199 lines (152 loc) · 5.39 KB
/
setup.py
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
"""Project: Eskapade - A python-based package for data analysis.
Created: 2017/08/08
Description:
setup script.
Authors:
KPMG Big Data team, Amstelveen, The Netherlands
Redistribution and use in source and binary forms, with or without
modification, are permitted according to the terms listed in the file
LICENSE.
"""
import os
import logging
import sys
from setuptools import find_packages
from setuptools import setup
from setuptools.command.test import test as TestCommand
from setup_cxx import CMakeExtension, CMakeBuild
NAME = 'Eskapade-ROOT'
MAJOR = 0
REVISION = 9
PATCH = 0
DEV = False
# Note: also update version at: README.rst and docs/source/conf.py
VERSION = '{major}.{revision}.{patch}'.format(major=MAJOR, revision=REVISION, patch=PATCH)
FULL_VERSION = VERSION
if DEV:
FULL_VERSION += '.dev'
root_numpy_req = 'root_numpy>=4.7.3'
REQUIREMENTS = [
'eskapade>=0.8.2',
root_numpy_req,
]
CMD_CLASS = dict()
COMMAND_OPTIONS = dict()
logging.basicConfig()
logger = logging.getLogger(__file__)
def write_version_py(filename: str = 'python/esroofit/version.py') -> None:
"""Write package version to version.py.
This will ensure that the version in version.py is in sync with us.
:param filename: The version.py to write too.
:type filename: str
:return:
:rtype: None
"""
# Do not modify the indentation of version_str!
version_str = """\"\"\"THIS FILE IS AUTO-GENERATED BY ESKAPADE SETUP.PY.\"\"\"
name = '{name!s}'
version = '{version!s}'
full_version = '{full_version!s}'
release = {is_release!s}
"""
version_file = open(filename, 'w')
try:
version_file.write(version_str.format(name=NAME.lower(),
version=VERSION,
full_version=FULL_VERSION,
is_release=not DEV))
finally:
version_file.close()
# Determine if ROOT analysis modules will be installed.
# If ROOT is not set up, ROOT analysis modules are excluded.
EXCLUDE_PACKAGES = []
EXTERNAL_MODULES = []
try:
import ROOT
import ROOT.RooFit
import ROOT.RooStats
EXTERNAL_MODULES.append(CMakeExtension('esroofit.lib.esroofit', 'cxx/esroofit'))
CMD_CLASS['build_ext'] = CMakeBuild
except ImportError:
# installing on readthedocs?
if os.environ.get('READTHEDOCS') == 'True':
REQUIREMENTS.remove(root_numpy_req)
else:
logger.fatal('PyROOT and RooFit are missing! Not going to install ROOT analysis modules!')
EXCLUDE_PACKAGES.append('*root_analysis*')
EXCLUDE_PACKAGES.append('*root_numpy*')
raise RuntimeError('root-config is not in PATH and ROOTSYS is not set. Is ROOT installed correctly?')
# This is for auto-generating documentation.
# One can generate documentation by executing:
# python setup.py build_sphinx -i
HAVE_SPHINX = True
try:
from sphinx.setup_command import BuildDoc
cmd_string = 'build_sphinx'
CMD_CLASS[cmd_string] = BuildDoc
COMMAND_OPTIONS[cmd_string] = {
'project': ('setup.py', NAME),
'version': ('setup.py', VERSION),
'release': ('setup.py', FULL_VERSION)
}
except ImportError:
logger.fatal('Missing Sphinx packages!')
HAVE_SPHINX = False
class PyTest(TestCommand):
"""A pytest runner helper."""
user_options = [('pytest-args=', 'a', 'Arguments to pass to pytest')]
def initialize_options(self):
TestCommand.initialize_options(self)
self.pytest_args = ''
def run_tests(self):
import shlex
# We only install this when needed.
import pytest
errno = pytest.main(shlex.split(self.pytest_args))
sys.exit(errno)
CMD_CLASS['test'] = PyTest
def setup_package() -> None:
"""The main setup method.
It is responsible for setting up and installing the package.
It also provides commands for generating docs and running tests.
To generate sphinx docs execute:
>>> python setup.py build_sphinx -i
in the project folder.
To run tests execute:
>>> python setup test -a "some pytest test arguments"
in the project folder.
:return:
:rtype: None
"""
write_version_py()
setup(name=NAME,
version=FULL_VERSION,
url='http://eskapade.kave.io',
license='',
author='KPMG N.V. The Netherlands',
author_email='kave@kpmg.com',
description='Root for Eskapade',
python_requires='>=3.5',
package_dir={'': 'python'},
packages=find_packages(where='python', exclude=EXCLUDE_PACKAGES),
# Setuptools requires that package data are located inside the package.
# This is a feature and not a bug, see
# http://setuptools.readthedocs.io/en/latest/setuptools.html#non-package-data-files
package_data={
NAME.lower(): ['data/*']
},
install_requires=REQUIREMENTS,
tests_require=['pytest>=3.2.2'],
ext_modules=EXTERNAL_MODULES,
cmdclass=CMD_CLASS,
command_options=COMMAND_OPTIONS,
# The following 'creates' executable scripts for *nix and Windows.
# As an added the bonus the Windows scripts will auto-magically
# get a .exe extension.
#
# eskapade: main/app application entry point.
# eskapade_trial: test entry point.
entry_points={}
)
if __name__ == '__main__':
setup_package()