forked from fastai/fastai
-
Notifications
You must be signed in to change notification settings - Fork 0
/
setup.py
221 lines (188 loc) · 6.61 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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""The setup script."""
import re
from setuptools import setup, find_packages
from distutils.core import Command
class DepsCommand(Command):
"""A custom distutils command to print selective dependency groups.
# show available dependency groups:
python setup.py -q deps
# print dependency list for specified groups
python setup.py -q deps --dep-groups=core,vision
# see all options:
python setup.py -q deps --help
"""
description = 'show dependency groups and their packages'
user_options = [
# format: (long option, short option, description).
('dep-groups=', None, 'comma separated dependency groups'),
('dep-quote', None, 'quote each dependency'),
('dep-conda', None, 'adjust output for conda'),
]
def initialize_options(self):
"""Set default values for options."""
self.dep_groups = ''
self.dep_quote = False
self.dep_conda = False
def finalize_options(self):
"""Post-process options."""
pass
def parse(self):
arg = self.dep_groups.strip()
return re.split(r' *, *', arg) if len(arg) else []
def run(self):
"""Run command."""
wanted_groups = self.parse()
deps = []
invalid_groups = []
for grp in wanted_groups:
if grp in dep_groups: deps.extend(dep_groups[grp])
else: invalid_groups.append(grp)
if invalid_groups or not wanted_groups:
print("Available dependency groups:", ", ".join(sorted(dep_groups.keys())))
if invalid_groups:
print(f"Error: Invalid group name(s): {', '.join(invalid_groups)}")
exit(1)
else:
# prepare for shell word splitting (no whitespace in items)
deps = [re.sub(" ", "", x, 0) for x in sorted(set(deps))]
if self.dep_conda:
for i in range(len(deps)):
# strip pip-specific syntax
deps[i] = re.sub(r';.*', '', deps[i])
# rename mismatching package names
deps[i] = re.sub(r'^torch>', 'pytorch>', deps[i])
if self.dep_quote:
# for manual copy-n-paste (assuming no " in vars)
print(" ".join(map(lambda x: f'"{x}"', deps)))
else:
# if fed directly to `pip install` via backticks/$() don't quote
print(" ".join(deps))
# note: version is maintained inside fastai/version.py
exec(open('fastai/version.py').read())
with open('README.md') as readme_file: readme = readme_file.read()
# helper functions to make it easier to list dependencies not as a python list, but vertically w/ optional built-in comments to why a certain version of the dependency is listed
def cleanup(x): return re.sub(r' *#.*', '', x.strip()) # comments
def to_list(buffer): return list(filter(None, map(cleanup, buffer.splitlines())))
### normal dependencies ###
#
# these get resolved and installed via either of these two:
#
# pip install fastai
# pip install -e .
#
# IMPORTANT: when updating these, please make sure to sync conda/meta.yaml
dep_groups = {
'core': to_list("""
bottleneck # performance-improvement for numpy
dataclasses ; python_version<'3.7'
fastprogress>=0.1.19
beautifulsoup4
matplotlib
numexpr # performance-improvement for numpy
numpy>=1.15
nvidia-ml-py3
pandas
packaging
Pillow
pyyaml
pynvx>=1.0.0 ; platform_system=="Darwin" # only pypi at the moment
requests
scipy
torch>=1.0.0
typing ; python_version<'3.7'
"""),
'text': to_list("""
spacy>=2.0.18
"""),
'vision': to_list("""
torchvision
"""),
}
requirements = [y for x in dep_groups.values() for y in x]
### developer dependencies ###
#
# anything else that's not required by a user to run the library, but
# either is an enhancement or a developer-build requirement goes here.
#
# the [dev] feature is documented here:
# https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies
#
# these, including the normal dependencies, get installed with:
#
# pip install "fastai[dev]"
#
# or via an editable install:
#
# pip install -e ".[dev]"
#
# some of the listed modules appear in test_requirements as well, as explained below.
#
dev_requirements = { 'dev' : to_list("""
coverage # make coverage
distro
ipython
jupyter
jupyter_contrib_nbextensions
nbconvert>=5.4
nbdime # help with nb diff/merge
nbformat
notebook>=5.7.0
pip>=9.0.1
pipreqs>=0.4.9
pytest>=4.4.0
pytest-xdist # make test-fast (faster parallel testing)
responses # for requests testing
traitlets
wheel>=0.30.0
""") }
### setup dependencies ###
# need at least setuptools>=36.2 to support syntax:
# dataclasses ; python_version<'3.7'
setup_requirements = to_list("""
pytest-runner
setuptools>=36.2
""")
# notes:
#
# * these deps will be installed locally under .eggs/ and will not be
# visible to pytest unless it's invoked via `python setup test`.
# Therefore it's the best to install them explicitly with:
# pip install -e .[dev]
#
### test dependencies ###
test_requirements = to_list("""
pytest
""")
# list of classifiers: https://pypi.org/pypi?%3Aaction=list_classifiers
setup(
cmdclass = { 'deps': DepsCommand },
name = 'fastai',
version = __version__,
packages = find_packages(),
include_package_data = True,
install_requires = requirements,
setup_requires = setup_requirements,
extras_require = dev_requirements,
tests_require = test_requirements,
python_requires = '>=3.6',
test_suite = 'tests',
description = "fastai makes deep learning with PyTorch faster, more accurate, and easier",
long_description = readme,
long_description_content_type = 'text/markdown',
keywords = 'fastai, deep learning, machine learning',
license = "Apache Software License 2.0",
url = 'https://github.com/fastai/fastai',
author = "Jeremy Howard",
author_email = 'info@fast.ai',
classifiers = [
'Development Status :: 5 - Production/Stable',
'Intended Audience :: Developers',
'License :: OSI Approved :: Apache Software License',
'Natural Language :: English',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
],
zip_safe = False,
)