diff --git a/.travis.yml b/.travis.yml index d5290fe17..ab9a7ca83 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,78 +1,79 @@ # -*- coding: utf-8 -*- # # This file is part of Invenio. # Copyright (C) 2013, 2014, 2015 CERN. # # Invenio is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # Invenio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Invenio; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. notifications: email: false services: - mysql - redis - mongodb language: python env: - - REQUIREMENTS=lowest - - REQUIREMENTS=release - - REQUIREMENTS=devel + - REQUIREMENTS=lowest REXTRAS=docs + - REQUIREMENTS=release REXTRAS=docs + - REQUIREMENTS=devel REXTRAS=docs python: # FIXME: the build times out on Python 2.6 (inveniosoftware/invenio#1789) # - "2.6" - "2.7" before_install: - "sudo add-apt-repository -y ppa:chris-lea/node.js" - "sudo apt-get update" - - "python requirements.py > .travis-lowest-requirements.txt" - - "touch .travis-release-requirements.txt" + - "travis_retry pip install mock" + - "python requirements.py --extras=$REXTRAS --level=min > .travis-lowest-requirements.txt" + - "python requirements.py --extras=$REXTRAS --level=pypi > .travis-release-requirements.txt" + - "python requirements.py --extras=$REXTRAS --level=dev > .travis-devel-requirements.txt" install: - "sudo apt-get -qy install apache2 libapache2-mod-wsgi libapache2-mod-xsendfile ssl-cert poppler-utils git subversion nodejs --fix-missing" - "sudo a2enmod actions" - "sudo a2enmod version || echo ':('" - "sudo a2enmod rewrite" - "sudo mkdir /etc/apache2/ssl" - "sudo /usr/sbin/make-ssl-cert generate-default-snakeoil /etc/apache2/ssl/apache.pem" - "travis_retry pip install unittest2" - - "travis_retry pip install -r requirements.txt --quiet" - "travis_retry pip install -r .travis-$REQUIREMENTS-requirements.txt --allow-all-external --quiet" - - "travis_retry pip install -e .[docs] --quiet --process-dependency-links" + - "travis_retry pip install -e .[$REXTRAS] --quiet --process-dependency-links" - "python setup.py compile_catalog" - "sudo su -c \"npm update\"" - "sudo su -c \"npm install --silent -g bower less clean-css uglify-js requirejs\"" # All the step below this points are solely for test purposes, don't use them # to setup your invenio installation. Please do RTFM instead (INSTALL.rst). - "./scripts/setup_devmode.sh" before_script: - "inveniomanage apache create-config" - "sudo ln -s $VIRTUAL_ENV/var/invenio.base-instance/apache/invenio-apache-vhost.conf /etc/apache2/sites-enabled/invenio.conf" - "sudo ln -s $VIRTUAL_ENV/var/invenio.base-instance/apache/invenio-apache-vhost-ssl.conf /etc/apache2/sites-enabled/invenio-ssl.conf" - "sudo /usr/sbin/a2dissite *default* || echo ':('" - "sudo /usr/sbin/a2enmod ssl" # enable SSL module - "sudo apachectl configtest && sudo service apache2 restart || echo 'Apache failed ...'" - "inveniomanage database init --yes-i-know || echo ':('" - "inveniomanage database create --quiet || echo ':('" # - "inveniomanage demosite populate --yes-i-know" script: - "sphinx-build -qnNW docs docs/_build/html" - "python setup.py test" # - "wget -O /dev/null http://localhost" diff --git a/Dockerfile b/Dockerfile index 9fc05e406..97296d006 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,105 +1,101 @@ # This file is part of Invenio. # Copyright (C) 2015 CERN. # # Invenio is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # Invenio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Invenio; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ############################################################################### ## 1. Base (stable) ## ############################################################################### FROM python:2.7 MAINTAINER CERN # nodejs repo # detects distribution and adds the right repo # See: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager#debian-and-ubuntu-based-linux-distributions RUN curl -sL https://deb.nodesource.com/setup | bash - # install requirements from repos RUN apt-get update && \ apt-get -qy install poppler-utils git subversion nodejs mysql-client sudo --fix-missing # install python requirements RUN pip install --upgrade pip && \ pip install mock && \ pip install unittest2 && \ pip install watchdog # install nodejs requirements RUN npm update && \ npm install --silent -g bower less clean-css uglify-js requirejs # add invenio user RUN useradd --home-dir /home/invenio --create-home --shell /bin/bash --uid 1000 invenio ############################################################################### ## 2. Requirements (semi-stable) ## ############################################################################### # select proper requierments level #ENV REQUIREMENTS lowest ENV REQUIREMENTS release #ENV REQUIREMENTS devel +ENV REXTRAS development,docs # add requirement files -COPY ./.travis-devel-requirements.txt ./requirements.txt ./requirements.py ./setup.cfg ./setup.py /code/ +COPY ./requirements-devel.txt ./requirements.py ./setup.cfg ./setup.py /code/ COPY ./invenio/version.py /code/invenio/version.py WORKDIR /code # install python requirements # the different levels get composed from different sources # higher levels include all requirements of lower levels -COPY ./scripts/deduplicate_requirements.py /code/scripts/deduplicate_requirements.py -RUN python requirements.py > requirements.py.txt && \ - touch .travis-lowest-requirements.txt && \ - touch .travis-release-requirements.txt && \ - touch .travis-devel-requirements.txt && \ - cat requirements.txt requirements.py.txt .travis-lowest-requirements.txt | scripts/deduplicate_requirements.py > requirements-lowest.txt && \ - cat .travis-release-requirements.txt requirements-lowest.txt | scripts/deduplicate_requirements.py > requirements-release.txt && \ - cat .travis-devel-requirements.txt requirements-release.txt | scripts/deduplicate_requirements.py > requirements-devel.txt && \ - pip install -r requirements-$REQUIREMENTS.txt --allow-all-external --quiet +RUN python requirements.py --extras=$REXTRAS --level=min > requirements.py.lowest.txt && \ + python requirements.py --extras=$REXTRAS --level=pypi > requirements.py.release.txt && \ + python requirements.py --extras=$REXTRAS --level=dev > requirements.py.devel.txt && \ + pip install -r requirements.py.$REQUIREMENTS.txt --allow-all-external --quiet ############################################################################### ## 3. Code (changing) ## ############################################################################### # add current directory as `/code`. COPY . /code ############################################################################### ## 4. Build (changing) ## ############################################################################### # install invenio -RUN pip install -e .[development,docs] --quiet +RUN pip install -e .[$REXTRAS] --quiet # build translation catalog RUN python setup.py compile_catalog # step back # in general code should not be writeable, especially because we are using # `pip install -e` RUN mkdir -p /code/src && \ mkdir -p /usr/local/var/invenio.base-instance && \ chown -R invenio:invenio /code && \ chown -R root:root /code/invenio && \ chown -R root:root /code/scripts && \ chown -R root:root /code/setup.* && \ chown -R root:root /code/src && \ chown -R invenio:invenio /usr/local/var/invenio.base-instance USER invenio diff --git a/.travis-devel-requirements.txt b/requirements-devel.txt similarity index 100% rename from .travis-devel-requirements.txt rename to requirements-devel.txt diff --git a/requirements-docs.txt b/requirements-docs.txt index 5c00e2285..f3ce80203 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -1,3 +1,6 @@ --r requirements.txt +# !WARNING! !WARNING! !WARNING! !WARNING! !WARNING! !WARNING! !WARNING! +# Do NOT delete this file, even when it seems to be useless! +# It used by read Read the Docs to build our documentation! +# !WARNING! !WARNING! !WARNING! !WARNING! !WARNING! !WARNING! !WARNING! -e .[docs] diff --git a/requirements.py b/requirements.py old mode 100644 new mode 100755 index 1978f99e1..5434eebe4 --- a/requirements.py +++ b/requirements.py @@ -1,44 +1,181 @@ +#!/usr/bin/env python2 +# # -*- coding: utf-8 -*- +# # This file is part of Invenio. -# Copyright (C) 2013, 2014 CERN. +# Copyright (C) 2013, 2014, 2015 CERN. # # Invenio is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # Invenio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Invenio; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. -"""Generate minimal requirements from setup.py.""" +"""Generate minimal requirements from `setup.py` + `requirements-devel.txt`.""" from __future__ import print_function +import argparse +import re +import sys + import mock + import pkg_resources + import setuptools -import sys +def parse_set(string): + """Parse set from comma separated string.""" + string = string.strip() + if string: + return set(string.split(",")) + else: + return set() + + +def minver_error(pkg_name): + """Report error about missing minimum version constraint and exit.""" + print( + "ERROR: specify minimal version of '{}' using '>=' or '=='".format(pkg_name), + file=sys.stderr + ) + sys.exit(1) + + +def parse_pip_file(path): + """Parse pip requirements file.""" + # requirement lines sorted by importance + # also collect other pip commands + rdev = dict() + rnormal = [] + stuff = [] + + try: + with open(path) as f: + for line in f: + line = line.strip() + + # see https://pip.readthedocs.org/en/1.1/requirements.html + if line.startswith("-e"): + # devel requirement + splitted = line.split("#egg=") + rdev[splitted[1].lower()] = line + + elif line.startswith("-r"): + # recursive file command + splitted = re.split("-r\\s+", line) + subrdev, subrnormal, substuff = parse_pip_file(splitted[1]) + for k, v in subrdev.iteritems(): + if k not in rdev: + rdev[k] = v + rnormal.extend(subrnormal) + result.extend(substuff) + + elif line.startswith("-"): + # another special command we don't recognize + stuff.append(line) + + else: + # ordenary requirement, similary to them used in setup.py + rnormal.append(line) + except IOError: + print( + "Warning: could not parse requirements file '{}'!", + file=sys.stderr + ) + + return rdev, rnormal, stuff + if __name__ == '__main__': + parser = argparse.ArgumentParser( + description="Calculates requirements for different purposes", + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + parser.add_argument( + "-l", "--level", + choices=["min", "pypi", "dev"], + default="pypi", + help="Specifies desired requirements level." + "'min' requests the minimal requirement that is specified, " + "'pypi' requests the maximum version that satisfies the " + "constrains and is available in PyPi. " + "'dev' includes experimental developer versions for VCSs." + ) + parser.add_argument( + "-e", "--extras", + default="", + help="Comma separated list of extras.", + type=parse_set + ) + args = parser.parse_args() + + result = dict() + requires = [] + stuff = [] + if args.level == "dev": + result, requires, stuff = parse_pip_file("requirements-devel.txt") + with mock.patch.object(setuptools, 'setup') as mock_setup: - import setup # pylint: disable=F401 + import setup + assert setup # silence warning about unused imports # called arguments are in `mock_setup.call_args` - args, kwargs = mock_setup.call_args - install_requires = kwargs.get('install_requires', []) - - for pkg in pkg_resources.parse_requirements(install_requires): - if len(pkg.specs): - if pkg.specs[0][0] == '>=': - print("{0.project_name}=={0.specs[0][1]}".format(pkg)) - elif pkg.specs[0][0] == '>': - print( - "{0.project_name} specify exact minimal version using " - "'>=' instead of '>'.".format(pkg), file=sys.stderr) + mock_args, mock_kwargs = mock_setup.call_args + requires = mock_kwargs.get('install_requires', []) + + requires_extras = mock_kwargs.get('extras_require', {}) + for e in args.extras: + if e in requires_extras: + requires.extend(requires_extras[e]) + + for pkg in pkg_resources.parse_requirements(requires): + # skip things we already know + # FIXME be smarter about merging things + if pkg.key in result: + continue + + specs = dict(pkg.specs) + if ((">=" in specs) and (">" in specs)) \ + or (("<=" in specs) and ("<" in specs)): + print( + "ERROR: Do not specify such weird constraints! ('{}')".format(pkg), + file=sys.stderr + ) + sys.exit(1) + + if '==' in specs: + result[pkg.key] = "{}=={}".format(pkg.project_name, specs['==']) + + elif '>=' in specs: + if args.level == "min": + result[pkg.key] = "{}=={}".format(pkg.project_name, specs['>=']) + else: + result[pkg.key] = pkg + + elif '>' in specs: + if args.level == "min": + minver_error(pkg.project_name) + else: + result[pkg.key] = pkg + + else: + if args.level == "min": + minver_error(pkg.project_name) + else: + result[pkg.key] = pkg + + for s in stuff: + print(s) + + for k in sorted(result.iterkeys()): + print(result[k]) diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 15c2d2dc1..000000000 --- a/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -# requires numpy before it can be installed -#-e svn://svn.code.sf.net/p/gnuplot-py/code/trunk#egg=gnuplot-py diff --git a/scripts/deduplicate_requirements.py b/scripts/deduplicate_requirements.py deleted file mode 100755 index f1dd80946..000000000 --- a/scripts/deduplicate_requirements.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python2 -# -*- coding: utf-8 -*- -# This file is part of Invenio. -# Copyright (C) 2015 CERN. -# -# Invenio is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# Invenio is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Invenio; if not, write to the Free Software Foundation, Inc., -# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - -r""" -Deduplicator for pip requiremts. - -Use it as part of a pipe, e.g. - cat requirements.txt requirements-dev.txt requirements-extra.txt \ - | deduplicate_requirements.py > requirements-final.txt -""" - -import fileinput -import re - -# requirement lines sorted by importance -# also collect other pip commands -high = dict() -low = dict() -stuff = [] - - -def parse(line): - """Parse one line of a pip requirements file.""" - line = line.strip() - - # see https://pip.readthedocs.org/en/1.1/requirements.html - if line.startswith("-e"): - splitted = line.split("#egg=") - high[splitted[1]] = line - - elif line.startswith("-r"): - splitted = re.split("-r\\s+", line) - try: - with open(splitted[1]) as f: - for line in f: - parse(line) - except IOError: - pass - - elif line.startswith("-"): - stuff.append(line) - - else: - splitted = re.split("[>=]=", line) - low[splitted[0]] = line - -# get all lines from stdin -for line in fileinput.input(): - parse(line) - -# set of requirements we already emitted -already = set() - -# emit lines -# first unknown commands -# then high level requirements -# then low level requirements - -for line in stuff: - print(line) - -for k, v in high.iteritems(): - if k not in already: - already.add(k) - print(v) - -for k, v in low.iteritems(): - if k not in already: - already.add(k) - print(v) diff --git a/setup.py b/setup.py index 7f4308936..2bad3909b 100644 --- a/setup.py +++ b/setup.py @@ -1,351 +1,349 @@ # -*- coding: utf-8 -*- # # This file is part of Invenio. # Copyright (C) 2013, 2014, 2015 CERN. # # Invenio is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # Invenio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Invenio; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. """Invenio is a framework for digital libraries and data repositories. Invenio enables you to run your own digital library or document repository on the web. Invenio covers all aspects of digital library management, from document ingestion, through classification, indexing and further processing, to curation, archiving, and dissemination. The flexibility and performance of Invenio make it a comprehensive solution for management of document repositories of moderate to large sizes (several millions of records). Links ----- * `website `_ * `documentation `_ * `development `_ """ import os import sys from distutils.command.build import build from setuptools import find_packages, setup from setuptools.command.install_lib import install_lib class _build(build): # noqa """Compile catalog before building the package.""" sub_commands = [('compile_catalog', None)] + build.sub_commands class _install_lib(install_lib): # noqa """Custom install_lib command.""" def run(self): """Compile catalog before running installation command.""" install_lib.run(self) self.run_command('compile_catalog') install_requires = [ "alembic>=0.6.6", "Babel>=1.3", "bagit>=1.5.1", "BeautifulSoup>=3.2.1", "BeautifulSoup4>=4.3.2", "celery>=3.1.8", # Cerberus>=0.7.1 api changes and is not yet supported "Cerberus>=0.7,<0.7.1", "chardet>=2.3.0", "datacite>=0.1.0", "dictdiffer>=0.0.3", "feedparser>=5.1", "fixture>=1.5", "Flask>=0.10.1", "Flask-Admin>=1.0.9", "Flask-Assets>=0.10", "Flask-Babel>=0.9", "Flask-Breadcrumbs>=0.2", "Flask-Cache>=0.12", "Flask-Collect>=1.1.1", "Flask-Email>=1.4.4", "Flask-Gravatar>=0.4.2", "Flask-Login>=0.2.7", "Flask-Menu>=0.2", "Flask-OAuthlib>=0.6.0,<0.7", # quick fix for issue #2158 "Flask-Principal>=0.4", "Flask-Registry>=0.2", "Flask-RESTful>=0.2.12", "Flask-Script>=2.0.5", # Development version is used, will switch to >=2.0 once released. "Flask-SQLAlchemy>=2.0", "Flask-WTF>=0.10.2", "fs>=0.4", "intbitset>=2.0", "invenio-client>=0.1.0", "jellyfish>=0.3.2", "Jinja2>=2.7", "libmagic>=1.0", "lxml>=3.3", "mechanize>=0.2.5", "mistune>=0.4.1", "msgpack-python>=0.3", "MySQL-python>=1.2.5", "numpy>=1.7", "nydus>=0.10.8", # pyparsing>=2.0.2 has a new api and is not compatible yet "pyparsing>=2.0.1,<2.0.2", "python-twitter>=2.0", "pyPDF>=1.13", - "pyPDF2", + "pyPDF2>=1.17", "PyLD>=0.5.2", "pyStemmer>=1.3", "python-dateutil>=1.5", "python-magic>=0.4.6", - "pytz", - "rauth", + "pytz>=2014.1", + "rauth>=0.7.0", "raven>=5.0.0", "rdflib>=4.1.2", "redis>=2.8.0", "reportlab>=2.7,<3.2", "requests>=2.3,<2.4", "setuptools>=2.2", "six>=1.7.2", - "Sphinx", - "SQLAlchemy>=0.9.8,<1.0", + "Sphinx>=1.3", + "SQLAlchemy>=0.9.9,<1.0", "SQLAlchemy-Utils[encrypted]>=0.28.2,<0.30", - "unidecode", + "unidecode>=0.04.1", "workflow>=1.2.0", "WTForms>=2.0.1", - "wtforms-alchemy>=0.12.6" + "wtforms-alchemy>=0.12.6,<0.13.1" ] extras_require = { "docs": [ - "sphinx_rtd_theme" + "sphinx_rtd_theme>=0.1.7" ], "development": [ "Flask-DebugToolbar==0.9.0", "watchdog==0.8.3", ], "dropbox": [ "dropbox>=2.1.0" ], "elasticsearch": [ "pyelasticsearch>=0.6.1" ], "googledrive": [ "google-api-python-client>=1.2", - "apiclient", - "oauth2client", + "apiclient>=1.0.0", + "oauth2client>=1.4.0", "urllib3>=1.8.3" ], "img": [ - "qrcode", + "qrcode>=5.1", "Pillow>=2.7.0" ], "mongo": [ - "pymongo" + "pymongo>=3.0" ], "misc": [ # was requirements-extras "gnuplot-py==1.8", - "flake8", # extra=kwalitee? + "flake8>=2.0.0", # extra=kwalitee? "pychecker==0.8.19", # extra=kwalitee? - "pylint", # extra=kwalitee? - "nosexcover", # test? - "python-onedrive", # extra=cloud? - "python-openid", # extra=sso? + "pylint>=1.4.0", # extra=kwalitee? + "nosexcover>=1.0.0", # test? + "python-onedrive>=15.0.0", # extra=cloud? + "python-openid>=2.2.0", # extra=sso? ], "mixer": [ - "mixer", + "mixer>=5.1.0", ], "sso": [ - "Flask-SSO>=0.1" + "Flask-SSO>=0.2" ], "postgresql": [ "psycopg2>=2.5", ], # Alternative XML parser # # For pyRXP, the version on PyPI many not be the right one. # # $ pip install # > https://www.reportlab.com/ftp/pyRXP-1.16-daily-unix.tar.gz#egg=pyRXP # "pyrxp": [ # Any other versions are not supported. "pyRXP==1.16-daily-unix" ], "rabbitmq": [ "amqp>=1.4.5", ], "github": [ "github3.py>=0.9" ], } extras_require["docs"] += extras_require["elasticsearch"] extras_require["docs"] += extras_require["img"] extras_require["docs"] += extras_require["mongo"] extras_require["docs"] += extras_require["sso"] extras_require["docs"] += extras_require["github"] # FIXME extras_require["docs"] += extras_require["dropbox"] # FIXME extras_require["docs"] += extras_require["googledrive"] tests_require = [ - # FIXME remove limit after 0.8.4 is out and urllib3's requirements - # (urllib3==1.7.1) will be removed in HTTPretty - "httpretty<=0.8.0", + "httpretty>=0.8.4", "Flask-Testing>=0.4.1", - "mock", - "nose", - "selenium", + "mock>=1.0.0", + "nose>=1.3.0", + "selenium>=2.45.0", "unittest2>=0.5", ] setup_requires = [ 'Babel>=1.3', ] # Add `tests` dependencies to `extras_require` so that developers # could install test dependencies also with pip: extras_require["tests"] = tests_require # Compatibility with Python 2.6 if sys.version_info < (2, 7): install_requires += [ - "argparse", - "importlib" + "argparse>=1.3.0", + "importlib>=1.0.0" ] # Get the version string. Cannot be done with import! g = {} with open(os.path.join("invenio", "version.py"), "rt") as fp: exec(fp.read(), g) version = g["__version__"] packages = find_packages(exclude=['docs']) packages.append('invenio_docs') setup( name='invenio', version=version, url='https://github.com/inveniosoftware/invenio', license='GPLv2', author='CERN', author_email='info@invenio-software.org', description='Invenio digital library framework', long_description=__doc__, packages=packages, package_dir={'invenio_docs': 'docs'}, include_package_data=True, zip_safe=False, platforms='any', entry_points={ 'console_scripts': [ 'inveniomanage = invenio.base.manage:main', 'plotextractor = invenio.utils.scripts.plotextractor:main', # Legacy 'alertengine = invenio.legacy.webalert.scripts.alertengine:main', 'batchuploader = invenio.legacy.bibupload.scripts.batchuploader', 'bibcheck = invenio.legacy.bibcheck.scripts.bibcheck:main', 'bibcircd = invenio.legacy.bibcirculation.scripts.bibcircd:main', 'bibauthorid = ' ' invenio.legacy.bibauthorid.scripts.bibauthorid:main', 'bibcatalog = invenio.legacy.bibcatalog.scripts.bibcatalog:main', 'bibclassify = invenio.modules.classifier.scripts.classifier:main', 'bibconvert = invenio.legacy.bibconvert.scripts.bibconvert:main', 'bibdocfile = invenio.legacy.bibdocfile.scripts.bibdocfile:main', 'bibedit = invenio.legacy.bibedit.scripts.bibedit:main', 'bibencode = invenio.modules.encoder.scripts.encoder:main', 'bibexport = invenio.legacy.bibexport.scripts.bibexport:main', 'bibindex = invenio.legacy.bibindex.scripts.bibindex:main', 'bibmatch = invenio.legacy.bibmatch.scripts.bibmatch:main', 'bibrank = invenio.legacy.bibrank.scripts.bibrank:main', 'bibrankgkb = invenio.legacy.bibrank.scripts.bibrankgkb:main', 'bibreformat = invenio.legacy.bibformat.scripts.bibreformat:main', 'bibsort = invenio.legacy.bibsort.scripts.bibsort:main', 'bibsched = invenio.legacy.bibsched.scripts.bibsched:main', 'bibstat = invenio.legacy.bibindex.scripts.bibstat:main', 'bibtaskex = invenio.legacy.bibsched.scripts.bibtaskex:main', 'bibtasklet = invenio.legacy.bibsched.scripts.bibtasklet:main', 'bibtex = invenio.modules.sequencegenerator.scripts.bibtex:main', 'bibupload = invenio.legacy.bibupload.scripts.bibupload:main', 'convert_journals = ' ' invenio.legacy.docextract.scripts.convert_journals:main', 'dbexec = invenio.legacy.miscutil.scripts.dbexec:main', 'dbdump = invenio.legacy.miscutil.scripts.dbdump:main', 'docextract = invenio.legacy.docextract.scripts.docextract:main', 'elmsubmit = invenio.legacy.elmsubmit.scripts.elmsubmit:main', 'gotoadmin = invenio.modules.redirector.scripts.redirector:main', 'hepdataharvest = ' ' invenio.utils.hepdata.scripts.hepdataharvest:main', 'inveniocfg = invenio.legacy.inveniocfg:main', 'inveniogc = invenio.legacy.websession.scripts.inveniogc:main', 'inveniounoconv = ' ' invenio.legacy.websubmit.scripts.inveniounoconv:main', 'oaiharvest = invenio.legacy.oaiharvest.scripts.oaiharvest:main', 'oairepositoryupdater = ' ' invenio.legacy.oairepository.scripts.oairepositoryupdater:main', 'arxiv-pdf-checker = invenio.legacy.pdfchecker:main', 'refextract = invenio.legacy.refextract.scripts.refextract:main', 'textmarc2xmlmarc = ' ' invenio.legacy.bibrecord.scripts.textmarc2xmlmarc:main', 'webaccessadmin = ' ' invenio.modules.access.scripts.webaccessadmin:main', 'webauthorprofile = ' ' invenio.legacy.webauthorprofile.scripts.webauthorprofile:main', 'webcoll = invenio.legacy.websearch.scripts.webcoll:main', 'webmessageadmin = ' ' invenio.legacy.webmessage.scripts.webmessageadmin:main', 'webstatadmin = invenio.legacy.webstat.scripts.webstatadmin:main', 'websubmitadmin = ' ' invenio.legacy.websubmit.scripts.websubmitadmin:main', 'xmlmarc2textmarc = ' ' invenio.legacy.bibrecord.scripts.xmlmarc2textmarc:main', 'xmlmarclint = invenio.legacy.bibrecord.scripts.xmlmarclint:main', ], "distutils.commands": [ "inveniomanage = invenio.base.setuptools:InvenioManageCommand", ] }, setup_requires=setup_requires, install_requires=install_requires, extras_require=extras_require, classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Web Environment', 'Intended Audience :: Developers', 'License :: OSI Approved :: GNU General Public License v2' ' or later (GPLv2+)', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', ], test_suite='invenio.testsuite.suite', tests_require=tests_require, cmdclass={ 'build': _build, 'install_lib': _install_lib, }, )