From 9ebc76bcdce34165ff1622c51dbfd308302d9b0c Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Wed, 12 Apr 2017 14:50:29 -0700 Subject: [PATCH] modernized installation procedure - set VERSION to 3.1.0 (introduce a patch level 0 so that it becomes easier to publish packages with small fixes, eg for installation) - got rid of ancient ez_install: just use pip - updated README and INSTALL - updated classifiers in setup.py (license: LGPL v2.1 and other meta data); updated URL to point to http://propka.org because unlike http://propka.ki.ku.dk it is not completely dead and has a link to the pdb2pqr propka server as well as the GitHub page --- INSTALL | 18 +--- MANIFEST.in | 2 +- README.md | 11 --- ez_setup.py | 258 ---------------------------------------------------- setup.cfg | 2 + setup.py | 22 +++-- 6 files changed, 23 insertions(+), 290 deletions(-) delete mode 100644 ez_setup.py create mode 100644 setup.cfg mode change 100644 => 100755 setup.py diff --git a/INSTALL b/INSTALL index 3865f52..04e0e36 100644 --- a/INSTALL +++ b/INSTALL @@ -1,19 +1,11 @@ ## Installation Clone repository or unpack the tar ball and install with -[setuptools](http://pythonhosted.org/setuptools/index.html) (note: if -you don't have setuptools installed you will need an internet -connection so that the installation procedure can sownload the -required files): +[pip](https://pip.pypa.io): - cd propka-3.1 - python setup.py install --user + pip install propka-3.1/ -This will install the `propka31` script in your executable directory, -as configured for setuptools, for instance `~/.local/bin`. You can -change the bin directory with the `--install-scripts` option. For -example, in order to install in my `bin` directory in my home -directory: - - python setup.py install --user --install-scripts ~/bin +This will install the `propka31` script in your executable +directory. The `propka` Python module will also become available for +import. diff --git a/MANIFEST.in b/MANIFEST.in index eb21e09..5627430 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ include README.md INSTALL -include ez_setup.py setup.py +include setup.py include propka.cfg diff --git a/README.md b/README.md index 6e36338..d914a42 100644 --- a/README.md +++ b/README.md @@ -16,17 +16,6 @@ in publications: See [propka.ki.ku.dk](http://propka.ki.ku.dk/) for the PROPKA web server, using the [tutorial](http://propka.ki.ku.dk/~luca/wiki/index.php/PROPKA_3.1_Tutorial). -## Modifications - -This release of PROPKA 3.1 was modified by Oliver Beckstein - from the released version. - -* Included patches from - https://github.com/schrodinger/propka-3.1/tree/python27-compat to - make it compatible with Python 2.7 - -* Packaged for installation with setuptools. - ## Installation diff --git a/ez_setup.py b/ez_setup.py deleted file mode 100644 index 2535472..0000000 --- a/ez_setup.py +++ /dev/null @@ -1,258 +0,0 @@ -#!python -"""Bootstrap setuptools installation - -If you want to use setuptools in your package's setup.py, just include this -file in the same directory with it, and add this to the top of your setup.py:: - - from ez_setup import use_setuptools - use_setuptools() - -If you want to require a specific version of setuptools, set a download -mirror, or use an alternate download directory, you can do so by supplying -the appropriate options to ``use_setuptools()``. - -This file can also be run as a script to install or upgrade setuptools. -""" -import os -import shutil -import sys -import tempfile -import tarfile -import optparse -import subprocess - -from distutils import log - -try: - from site import USER_SITE -except ImportError: - USER_SITE = None - -DEFAULT_VERSION = "0.9.6" -DEFAULT_URL = "https://pypi.python.org/packages/source/s/setuptools/" - -def _python_cmd(*args): - args = (sys.executable,) + args - return subprocess.call(args) == 0 - -def _install(tarball, install_args=()): - # extracting the tarball - tmpdir = tempfile.mkdtemp() - log.warn('Extracting in %s', tmpdir) - old_wd = os.getcwd() - try: - os.chdir(tmpdir) - tar = tarfile.open(tarball) - _extractall(tar) - tar.close() - - # going in the directory - subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) - os.chdir(subdir) - log.warn('Now working in %s', subdir) - - # installing - log.warn('Installing Setuptools') - if not _python_cmd('setup.py', 'install', *install_args): - log.warn('Something went wrong during the installation.') - log.warn('See the error message above.') - # exitcode will be 2 - return 2 - finally: - os.chdir(old_wd) - shutil.rmtree(tmpdir) - - -def _build_egg(egg, tarball, to_dir): - # extracting the tarball - tmpdir = tempfile.mkdtemp() - log.warn('Extracting in %s', tmpdir) - old_wd = os.getcwd() - try: - os.chdir(tmpdir) - tar = tarfile.open(tarball) - _extractall(tar) - tar.close() - - # going in the directory - subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) - os.chdir(subdir) - log.warn('Now working in %s', subdir) - - # building an egg - log.warn('Building a Setuptools egg in %s', to_dir) - _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) - - finally: - os.chdir(old_wd) - shutil.rmtree(tmpdir) - # returning the result - log.warn(egg) - if not os.path.exists(egg): - raise IOError('Could not build the egg.') - - -def _do_download(version, download_base, to_dir, download_delay): - egg = os.path.join(to_dir, 'setuptools-%s-py%d.%d.egg' - % (version, sys.version_info[0], sys.version_info[1])) - if not os.path.exists(egg): - tarball = download_setuptools(version, download_base, - to_dir, download_delay) - _build_egg(egg, tarball, to_dir) - sys.path.insert(0, egg) - import setuptools - setuptools.bootstrap_install_from = egg - - -def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, - to_dir=os.curdir, download_delay=15): - # making sure we use the absolute path - to_dir = os.path.abspath(to_dir) - was_imported = 'pkg_resources' in sys.modules or \ - 'setuptools' in sys.modules - try: - import pkg_resources - except ImportError: - return _do_download(version, download_base, to_dir, download_delay) - try: - pkg_resources.require("setuptools>=" + version) - return - except pkg_resources.VersionConflict: - e = sys.exc_info()[1] - if was_imported: - sys.stderr.write( - "The required version of setuptools (>=%s) is not available,\n" - "and can't be installed while this script is running. Please\n" - "install a more recent version first, using\n" - "'easy_install -U setuptools'." - "\n\n(Currently using %r)\n" % (version, e.args[0])) - sys.exit(2) - else: - del pkg_resources, sys.modules['pkg_resources'] # reload ok - return _do_download(version, download_base, to_dir, - download_delay) - except pkg_resources.DistributionNotFound: - return _do_download(version, download_base, to_dir, - download_delay) - - -def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, - to_dir=os.curdir, delay=15): - """Download setuptools from a specified location and return its filename - - `version` should be a valid setuptools version number that is available - as an egg for download under the `download_base` URL (which should end - with a '/'). `to_dir` is the directory where the egg will be downloaded. - `delay` is the number of seconds to pause before an actual download - attempt. - """ - # making sure we use the absolute path - to_dir = os.path.abspath(to_dir) - try: - from urllib.request import urlopen - except ImportError: - from urllib2 import urlopen - tgz_name = "setuptools-%s.tar.gz" % version - url = download_base + tgz_name - saveto = os.path.join(to_dir, tgz_name) - src = dst = None - if not os.path.exists(saveto): # Avoid repeated downloads - try: - log.warn("Downloading %s", url) - src = urlopen(url) - # Read/write all in one block, so we don't create a corrupt file - # if the download is interrupted. - data = src.read() - dst = open(saveto, "wb") - dst.write(data) - finally: - if src: - src.close() - if dst: - dst.close() - return os.path.realpath(saveto) - - -def _extractall(self, path=".", members=None): - """Extract all members from the archive to the current working - directory and set owner, modification time and permissions on - directories afterwards. `path' specifies a different directory - to extract to. `members' is optional and must be a subset of the - list returned by getmembers(). - """ - import copy - import operator - from tarfile import ExtractError - directories = [] - - if members is None: - members = self - - for tarinfo in members: - if tarinfo.isdir(): - # Extract directories with a safe mode. - directories.append(tarinfo) - tarinfo = copy.copy(tarinfo) - tarinfo.mode = 448 # decimal for oct 0700 - self.extract(tarinfo, path) - - # Reverse sort directories. - if sys.version_info < (2, 4): - def sorter(dir1, dir2): - return cmp(dir1.name, dir2.name) - directories.sort(sorter) - directories.reverse() - else: - directories.sort(key=operator.attrgetter('name'), reverse=True) - - # Set correct owner, mtime and filemode on directories. - for tarinfo in directories: - dirpath = os.path.join(path, tarinfo.name) - try: - self.chown(tarinfo, dirpath) - self.utime(tarinfo, dirpath) - self.chmod(tarinfo, dirpath) - except ExtractError: - e = sys.exc_info()[1] - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - -def _build_install_args(options): - """ - Build the arguments to 'python setup.py install' on the setuptools package - """ - install_args = [] - if options.user_install: - if sys.version_info < (2, 6): - log.warn("--user requires Python 2.6 or later") - raise SystemExit(1) - install_args.append('--user') - return install_args - -def _parse_args(): - """ - Parse the command line for options - """ - parser = optparse.OptionParser() - parser.add_option( - '--user', dest='user_install', action='store_true', default=False, - help='install in user site package (requires Python 2.6 or later)') - parser.add_option( - '--download-base', dest='download_base', metavar="URL", - default=DEFAULT_URL, - help='alternative URL from where to download the setuptools package') - options, args = parser.parse_args() - # positional arguments are ignored - return options - -def main(version=DEFAULT_VERSION): - """Install or upgrade setuptools and EasyInstall""" - options = _parse_args() - tarball = download_setuptools(download_base=options.download_base) - return _install(tarball, _build_install_args(options)) - -if __name__ == '__main__': - sys.exit(main()) diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..3c6e79c --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal=1 diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 index 94e7ea4..d0319c1 --- a/setup.py +++ b/setup.py @@ -1,13 +1,12 @@ +#! /usr/bin/python # PROPKA 3.1 # # # setuptools installation of PROPKA 3.1 -import ez_setup -ez_setup.use_setuptools() from setuptools import setup, find_packages -VERSION = "3.1" +VERSION = "3.1.0" setup(name="PROPKA", version=VERSION, @@ -31,14 +30,23 @@ in publications: residues in empirical pKa predictions." Journal of Chemical Theory and Computation 7, no. 2 (2011): 525-537. -See http://propka.ki.ku.dk/ for the PROPKA web server, -using the tutorial http://propka.ki.ku.dk/~luca/wiki/index.php/PROPKA_3.1_Tutorial . +See http://propka.org/ for the PROPKA web server. """, author="Jan H. Jensen", author_email="jhjensen@chem.ku.dk", - license="", - url="http://propka.ki.ku.dk/", + license="LGPL v2.1", + url="http://propka.org", keywords="science", + classifiers=[ + 'Development Status :: 6 - Mature', + 'Environment :: Console', + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)', + 'Operating System :: POSIX', + 'Programming Language :: Python', + 'Topic :: Scientific/Engineering :: Bio-Informatics', + 'Topic :: Scientific/Engineering :: Chemistry', + ], packages=find_packages(exclude=['scripts']), package_data = {'propka': ['*.dat', '*.cfg']}, #scripts = ["scripts/propka31.py"], # use entry point below