Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add python setup script #73

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions bdd_data/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__version__ = '0.0.1'
147 changes: 147 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Installation:
pip install git+https://github.com/ucbdrive/bdd-data.git
"""
from setuptools import setup
from setuptools import find_packages
import sys
from os.path import exists


def parse_version(fpath):
"""
Statically parse the version number from a python file
"""
import ast
if not exists(fpath):
raise ValueError('fpath={!r} does not exist'.format(fpath))
with open(fpath, 'r') as file_:
sourcecode = file_.read()
pt = ast.parse(sourcecode)

class VersionVisitor(ast.NodeVisitor):
def visit_Assign(self, node):
for target in node.targets:
if getattr(target, 'id', None) == '__version__':
self.version = node.value.s
visitor = VersionVisitor()
visitor.visit(pt)
return visitor.version


def parse_description():
"""
Parse the description in the README file

CommandLine:
pandoc --from=markdown --to=rst --output=README.rst README.md
python -c "import setup; print(setup.parse_description())"
"""
from os.path import dirname, join, exists
readme_fpath = join(dirname(__file__), 'README.rst')
# This breaks on pip install, so check that it exists.
if exists(readme_fpath):
with open(readme_fpath, 'r') as f:
text = f.read()
return text
return ''


def parse_requirements(fname='requirements.txt', with_version=False):
"""
Parse the package dependencies listed in a requirements file but strips
specific versioning information.

Args:
fname (str): path to requirements file
with_version (bool, default=False): if true include version specs

Returns:
List[str]: list of requirements items
"""
from os.path import exists
import re
require_fpath = fname

def parse_line(line):
"""
Parse information from a line in a requirements text file
"""
if line.startswith('-r '):
# Allow specifying requirements in other files
target = line.split(' ')[1]
for info in parse_require_file(target):
yield info
else:
info = {'line': line}
if line.startswith('-e '):
info['package'] = line.split('#egg=')[1]
else:
# Remove versioning from the package
pat = '(' + '|'.join(['>=', '==', '>']) + ')'
parts = re.split(pat, line, maxsplit=1)
parts = [p.strip() for p in parts]

info['package'] = parts[0]
if len(parts) > 1:
op, rest = parts[1:]
if ';' in rest:
# Handle platform specific dependencies
version, plat_deps = map(str.strip, rest.split(';'))
info['platform_deps'] = plat_deps
else:
version = rest # NOQA
info['version'] = (op, version)
yield info

def parse_require_file(fpath):
with open(fpath, 'r') as f:
for line in f.readlines():
line = line.strip()
if line and not line.startswith('#'):
for info in parse_line(line):
yield info

def gen_packages_items():
if exists(require_fpath):
for info in parse_require_file(require_fpath):
parts = [info['package']]
if with_version and 'version' in info:
parts.extend(info['version'])
if not sys.version.startswith('3.4'):
# apparently package_deps are broken in 3.4
plat_deps = info.get('platform_deps')
if plat_deps is not None:
parts.append(';' + plat_deps)
item = ''.join(parts)
yield item

packages = list(gen_packages_items())
return packages


NAME = 'bdd_data'
VERSION = parse_version('bdd_data/__init__.py')


if __name__ == '__main__':
setup(
name=NAME,
version=VERSION,
author='UCB',
description=('supporting code for BDD100K data and Scalabel.'),
long_description=parse_description(),
long_description_content_type='text/markdown',
install_requires=parse_requirements('requirements.txt'),
author_email='[email protected]',
url='https://github.com/ucbdrive/bdd-data',
license='BSD',
packages=find_packages('bdd_data*'),
classifiers=[
# List of classifiers available at:
# https://pypi.python.org/pypi?%3Aaction=list_classifiers
'Development Status :: 4 - Beta',
],
)