Skip to content

Commit

Permalink
Merge pull request quantopian#681 from quantopian/sanest-setup
Browse files Browse the repository at this point in the history
Sanest setup
  • Loading branch information
llllllllll committed Aug 19, 2015
2 parents 30847a1 + d444f59 commit cfce3a7
Show file tree
Hide file tree
Showing 3 changed files with 181 additions and 68 deletions.
36 changes: 10 additions & 26 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,42 +1,26 @@
language: python
sudo: false
cache:
directories:
- $HOME/.cache/pip
matrix:
include:
- python: 2.7
env:
- PANDAS_VERSION=0.16.0
- NUMPY_VERSION=1.9.2
env: PANDAS_VERSION=0.16.1 NUMPY_VERSION=1.9.2 SCIPY_VERSION=0.15.1
- python: 3.3
env:
- PANDAS_VERSION=0.16.0
- NUMPY_VERSION=1.9.2
env: PANDAS_VERSION=0.16.1 NUMPY_VERSION=1.9.2 SCIPY_VERSION=0.15.1

before_install:
- if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then wget http://repo.continuum.io/miniconda/Miniconda-3.7.0-Linux-x86_64.sh -O miniconda.sh; else wget http://repo.continuum.io/miniconda/Miniconda3-3.7.0-Linux-x86_64.sh -O miniconda.sh; fi
- chmod +x miniconda.sh
- ./miniconda.sh -b
- if [ ${TRAVIS_PYTHON_VERSION:0:1} == "2" ]; then export PATH=/home/travis/miniconda/bin:$PATH; else export PATH=/home/travis/miniconda3/bin:$PATH; fi
- sudo apt-get install gfortran
install:
- conda create -n testenv --yes pip python=$TRAVIS_PYTHON_VERSION
- source activate testenv
- conda install --yes -c https://conda.binstar.org/Quantopian numpy=$NUMPY_VERSION pandas=$PANDAS_VERSION scipy matplotlib Cython patsy statsmodels tornado pyparsing xlrd mock pytz requests six dateutil ta-lib logbook
- grep bottleneck== etc/requirements.txt | xargs pip install
- grep cyordereddict== etc/requirements.txt | xargs pip install
- grep contextlib2== etc/requirements.txt | xargs pip install
- grep click== etc/requirements.txt | xargs pip install
- grep networkx== etc/requirements.txt | xargs pip install
- grep numexpr== etc/requirements.txt | xargs pip install
- grep bcolz== etc/requirements.txt | xargs pip install
- grep pyflakes== etc/requirements_dev.txt | xargs pip install
- grep pep8== etc/requirements_dev.txt | xargs pip install
- grep mccabe== etc/requirements_dev.txt | xargs pip install
- grep flake8== etc/requirements_dev.txt | xargs pip install
- grep nose== etc/requirements_dev.txt | xargs pip install --upgrade --force-reinstall
- grep nose-parameterized== etc/requirements_dev.txt | xargs pip install
- grep nose-ignore-docstring== etc/requirements_dev.txt | xargs pip install
- grep testfixtures== etc/requirements_dev.txt | xargs pip install
- pip install coveralls
- pip install nose-timer
- python setup.py build_ext --inplace
- conda install --yes -c https://conda.binstar.org/Quantopian numpy=$NUMPY_VERSION pandas=$PANDAS_VERSION scipy==$SCIPY_VERSION matplotlib Cython patsy statsmodels tornado pyparsing xlrd mock pytz requests six dateutil ta-lib logbook
- pip install --upgrade pip nose-timer coverage
- pip install -e .[dev]
before_script:
- "flake8 zipline tests"
script:
Expand Down
5 changes: 0 additions & 5 deletions etc/requirements_dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,6 @@ matplotlib==1.4.3

Markdown==2.6.2

# This --allow syntax is for compatibility with pip >= 1.5
# However, this is backwards incompatible change, since previous
# versions of pip do not support that flag.
TA-Lib==0.4.9

# Checking for old PIP packages
futures==3.0.3
requests-futures==0.9.5
Expand Down
208 changes: 171 additions & 37 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,42 +13,186 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import print_function

from setuptools import setup, Extension
from Cython.Build import cythonize
import numpy as np
import re
import sys
from operator import lt, gt, eq, le, ge
from os.path import (
abspath,
dirname,
join,
)
from distutils.version import StrictVersion
from setuptools import (
Extension,
find_packages,
setup,
)

ext_modules = [
Extension(
'zipline.assets._assets',
['zipline/assets/_assets.pyx'],
include_dirs=[np.get_include()],
),
Extension(
'zipline.lib.adjusted_array',
['zipline/lib/adjusted_array.pyx'],
include_dirs=[np.get_include()],
),
Extension(
'zipline.lib.adjustment',
['zipline/lib/adjustment.pyx'],
include_dirs=[np.get_include()],
),
Extension(

class LazyCythonizingList(list):
cythonized = False

def lazy_cythonize(self):
if self.cythonized:
return
self.cythonized = True

from Cython.Build import cythonize
from numpy import get_include

self[:] = cythonize(
[
Extension(*ext_args, include_dirs=[get_include()])
for ext_args in self
]
)

def __iter__(self):
self.lazy_cythonize()
return super(LazyCythonizingList, self).__iter__()

def __getitem__(self, num):
self.lazy_cythonize()
return super(LazyCythonizingList, self).__getitem__(num)


ext_modules = LazyCythonizingList([
('zipline.assets._assets', ['zipline/assets/_assets.pyx']),
('zipline.lib.adjusted_array', ['zipline/lib/adjusted_array.pyx']),
('zipline.lib.adjustment', ['zipline/lib/adjustment.pyx']),
(
'zipline.data.ffc.loaders._us_equity_pricing',
['zipline/data/ffc/loaders/_us_equity_pricing.pyx'],
include_dirs=[np.get_include()],
['zipline/data/ffc/loaders/_us_equity_pricing.pyx']
),
]
])


STR_TO_CMP = {
'<': lt,
'<=': le,
'=': eq,
'==': eq,
'>': gt,
'>=': ge,
}


def _filter_requirements(lines_iter):
for line in lines_iter:
line = line.strip()
if not line or line.startswith('#'):
continue

# pip install -r understands line with ;python_version<'3.0', but
# whatever happens inside extras_requires doesn't. Parse the line
# manually and conditionally add it if needed.
if ';' not in line:
yield line
continue

requirement, version_spec = line.split(';')
try:
groups = re.match(
"(python_version)([<>=]{1,2})(')([0-9\.]+)(')(.*)",
version_spec,
).groups()
comp = STR_TO_CMP[groups[1]]
version_spec = StrictVersion(groups[3])
except Exception as e:
# My kingdom for a 'raise from'!
raise AssertionError(
"Couldn't parse requirement line; '%s'\n"
"Error was:\n"
"%r" % (line, e)
)

sys_version = '.'.join(list(map(str, sys.version_info[:3])))
if comp(sys_version, version_spec):
yield requirement


def read_requirements(path):
"""
Read a requirements.txt file, expressed as a path relative to Zipline root.
"""
real_path = join(dirname(abspath(__file__)), path)
with open(real_path) as f:
return list(_filter_requirements(f.readlines()))


def install_requires():
return read_requirements('etc/requirements.txt')


def extras_requires():
dev_reqs = read_requirements('etc/requirements_dev.txt')
talib_reqs = ['TA-Lib==0.4.9']
return {
'dev': dev_reqs,
'talib': talib_reqs,
'all': dev_reqs + talib_reqs,
}


def module_requirements(requirements_path, module_names):
module_names = set(module_names)
found = set()
module_lines = []
parser = re.compile("([^=<>]+)([<=>]{1,2})(.*)")
for line in read_requirements(requirements_path):
match = parser.match(line)
if match is None:
raise AssertionError("Could not parse requirement: '%s'" % line)

groups = match.groups()
name = groups[0]
if name in module_names:
found.add(name)
module_lines.append(line)

if found != module_names:
raise AssertionError(
"No requirements found for %s." % module_names - found
)
return module_lines


def pre_setup():
if not set(sys.argv) & {'install', 'develop', 'egg_info', 'bdist_wheel'}:
return

try:
import pip
if StrictVersion(pip.__version__) < StrictVersion('7.1.0'):
raise AssertionError(
"Zipline installation requires pip>=7.1.0, but your pip "
"version is {version}. \n"
"You can upgrade your pip with "
"'pip install --upgrade pip'.".format(
version=pip.__version__,
)
)
except ImportError:
raise AssertionError("Zipline installation requires pip")

required = ('Cython', 'numpy')
for line in module_requirements('etc/requirements.txt', required):
pip.main(['install', line])


pre_setup()


setup(
name='zipline',
version='0.8.0rc1',
description='A backtester for financial algorithms.',
author='Quantopian Inc.',
author_email='[email protected]',
packages=['zipline'],
ext_modules=cythonize(ext_modules),
packages=find_packages('.', include=['zipline', 'zipline.*']),
ext_modules=ext_modules,
scripts=['scripts/run_algo.py'],
include_package_data=True,
license='Apache 2.0',
Expand All @@ -65,17 +209,7 @@
'Topic :: Scientific/Engineering :: Information Analysis',
'Topic :: System :: Distributed Computing',
],
install_requires=[
'Logbook',
'pytz',
'requests',
'numpy',
'pandas',
'six',
'Cython',
],
extras_require={
'talib': ["talib"],
},
install_requires=install_requires(),
extras_require=extras_requires(),
url="http://zipline.io"
)

0 comments on commit cfce3a7

Please sign in to comment.