You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@climate.apache.org by le...@apache.org on 2015/09/27 20:24:07 UTC

[2/3] climate git commit: CLIMATE-539 Get OCW on to PyPI

CLIMATE-539 Get OCW on to PyPI


Project: http://git-wip-us.apache.org/repos/asf/climate/repo
Commit: http://git-wip-us.apache.org/repos/asf/climate/commit/3d5afe86
Tree: http://git-wip-us.apache.org/repos/asf/climate/tree/3d5afe86
Diff: http://git-wip-us.apache.org/repos/asf/climate/diff/3d5afe86

Branch: refs/heads/master
Commit: 3d5afe8618ec23ad2fa6cae2ccb10457cee3ed4e
Parents: 8334a83 29f6655
Author: Lewis John McGibbney <le...@jpl.nasa.gov>
Authored: Fri Sep 25 23:49:10 2015 -0700
Committer: Lewis John McGibbney <le...@jpl.nasa.gov>
Committed: Fri Sep 25 23:49:10 2015 -0700

----------------------------------------------------------------------
 .DS_Store                                       |  Bin 6148 -> 0 bytes
 .mailmap                                        |   28 +
 .pylintrc                                       |  380 +++++
 CHANGES.txt                                     |  112 ++
 KEYS                                            |   84 ++
 MANIFEST.in                                     |    2 +
 doap_CLIMATE.rdf                                |   14 +
 docs/source/conf.py                             |   12 +-
 docs/source/config/config_overview.rst          |   85 ++
 docs/source/config/config_writer.rst            |    5 +
 docs/source/config/dataset_information.rst      |   89 ++
 docs/source/config/evaluation_settings.rst      |   56 +
 docs/source/config/metrics_information.rst      |   12 +
 docs/source/config/plots_settings.rst           |   44 +
 docs/source/index.rst                           |    3 +
 docs/source/ocw/metrics.rst                     |   34 +-
 docs/source/ocw/overview.rst                    |  179 +++
 docs/source/ocw/utils.rst                       |    5 +
 easy-ocw/install-osx.sh                         |    8 +-
 easy-ocw/install-ubuntu-12_04.sh                |  189 ---
 easy-ocw/install-ubuntu.sh                      |  195 +++
 easy-ocw/ocw-pip-dependencies.txt               |    2 +
 examples/esgf_integration_examply.py            |   40 +
 examples/knmi_to_cru31_full_bias.py             |    3 +-
 examples/multi_model_evaluation.py              |  151 ++
 examples/multi_model_taylor_diagram.py          |  144 ++
 examples/simple_model_to_model_bias.py          |   23 +-
 .../simple_model_to_model_bias_DJF_and_JJA.py   |   64 +
 examples/subregions.py                          |   53 +
 examples/subregions_portrait_diagram.py         |  139 ++
 examples/time_series_with_regions.py            |  141 ++
 ez_setup.py                                     |  341 +++++
 mccsearch/GrADsScripts/.DS_Store                |  Bin 6148 -> 0 bytes
 mccsearch/GrADsScripts/accuTRMM.gs              |   11 -
 mccsearch/GrADsScripts/c3.gs                    |   11 -
 .../GrADsScripts/cloudElementVars_template      |   12 -
 .../GrADsScripts/cloudElementVars_template2     |   11 -
 mccsearch/GrADsScripts/cs1.gs                   |   83 -
 mccsearch/GrADsScripts/cs3.gs                   |   10 -
 mccsearch/code/mccSearch.py                     |  798 ++++------
 mccsearch/code/mccSearchUI.py                   |   47 +-
 mccsearch/docs/mccsearch.md                     |   11 +-
 ocw-cli/cli_app.py                              | 1422 ++++++++++++++++++
 ocw-cli/ocw_cli.py                              |  848 -----------
 ocw-config-runner/configuration_parsing.py      |  285 ++++
 ocw-config-runner/configuration_writer.py       |  302 ++++
 ocw-config-runner/evaluation_creation.py        |  178 +++
 ocw-config-runner/example/portrait_diagram.yaml |   30 +
 .../example/simple_model_to_model_bias.yaml     |   35 +
 ocw-config-runner/example/subregion.yaml        |   30 +
 .../example/taylor_diagram_example.yaml         |   36 +
 .../example/time_series_plot_example.yaml       |   31 +
 ocw-config-runner/ocw_evaluation_from_config.py |   72 +
 ocw-config-runner/plot_generation.py            |  204 +++
 ocw-config-runner/tests/test_config_parsing.py  |  806 ++++++++++
 ocw-config-runner/tests/test_config_writer.py   |  768 ++++++++++
 .../tests/test_evaluation_creation.py           |   49 +
 ocw-ui/backend/bottlemet.py                     |  615 --------
 ocw-vm/init-ocw-vm.sh                           |    4 +-
 ocw/data_source/dap.py                          |   22 +-
 ocw/data_source/esgf.py                         |   52 +-
 ocw/data_source/local.py                        |  406 ++---
 ocw/data_source/rcmed.py                        |   49 +-
 ocw/dataset.py                                  |  130 +-
 ocw/dataset_processor.py                        |  368 ++++-
 ocw/evaluation.py                               |  133 +-
 ocw/metrics.py                                  |  225 ++-
 ocw/plotter.py                                  |  396 +++--
 ocw/statistical_downscaling.py                  |  111 ++
 ocw/tests/test_dap.py                           |   11 +-
 ocw/tests/test_dataset.py                       |   19 +-
 ocw/tests/test_dataset_processor.py             |   21 +-
 ocw/tests/test_evaluation.py                    |   78 +
 ocw/tests/test_local.py                         |   14 +
 ocw/tests/test_metrics.py                       |  114 +-
 ocw/tests/test_rcmed.py                         |   23 +-
 ocw/tests/test_utils.py                         |   22 +-
 ocw/utils.py                                    |  259 ++--
 rcmet/LICENSE.txt                               |  218 ---
 rcmet/src/main/python/bin/rcmet.py              |  265 ----
 .../docs/Bottle Web Service Documentation.docx  |  Bin 179630 -> 0 bytes
 rcmet/src/main/python/docs/Makefile             |  153 --
 .../main/python/docs/RCMET_documentation.docx   |  Bin 190254 -> 0 bytes
 rcmet/src/main/python/docs/conf.py              |  260 ----
 rcmet/src/main/python/docs/index.rst            |   22 -
 rcmet/src/main/python/docs/make.bat             |  190 ---
 rcmet/src/main/python/docs/rcmes.cli.rst        |   19 -
 rcmet/src/main/python/docs/rcmes.rst            |   22 -
 rcmet/src/main/python/docs/rcmes.services.rst   |   51 -
 rcmet/src/main/python/docs/rcmes.storage.rst    |   27 -
 rcmet/src/main/python/docs/rcmes.toolkit.rst    |   27 -
 rcmet/src/main/python/docs/rcmes.utils.rst      |   19 -
 rcmet/src/main/python/rcmes/README              |    8 -
 rcmet/src/main/python/rcmes/__init__.py         |   19 -
 rcmet/src/main/python/rcmes/classes.py          |  229 ---
 rcmet/src/main/python/rcmes/cli/__init__.py     |   27 -
 .../python/rcmes/cli/do_rcmes_processing_sub.py |  734 ---------
 .../main/python/rcmes/cli/rcmet20_cordexAF.py   |  996 ------------
 rcmet/src/main/python/rcmes/cli/rcmet_ui.py     |  112 --
 .../main/python/rcmes/resources/cordexAF.cfg    |   30 -
 .../python/rcmes/resources/cordexSubRegions.txt |   25 -
 .../resources/watersheds/CAwsdCU_wgt_ep36_d01   |  189 ---
 .../resources/watersheds/CAwsdCU_wgt_ep36_d02   | 1248 ---------------
 .../resources/watersheds/CAwsdDWR_wgt_ep36_d01  |  341 -----
 .../resources/watersheds/CAwsdDWR_wgt_ep36_d02  | 1364 -----------------
 .../rcmes/resources/watersheds/shasta_d02.txt   |  276 ----
 rcmet/src/main/python/rcmes/storage/__init__.py |   18 -
 rcmet/src/main/python/rcmes/storage/db.py       |  359 -----
 rcmet/src/main/python/rcmes/storage/files.py    |  783 ----------
 rcmet/src/main/python/rcmes/storage/rcmed.py    |  129 --
 rcmet/src/main/python/rcmes/toolkit/__init__.py |   18 -
 .../main/python/rcmes/toolkit/do_data_prep.py   |  366 -----
 rcmet/src/main/python/rcmes/toolkit/metrics.py  | 1080 -------------
 .../main/python/rcmes/toolkit/metrics_kyo.py    |  718 ---------
 rcmet/src/main/python/rcmes/toolkit/plots.py    |  226 ---
 rcmet/src/main/python/rcmes/toolkit/process.py  | 1007 -------------
 .../src/main/python/rcmes/toolkit/visualize.py  |   17 -
 rcmet/src/main/python/rcmes/utils/__init__.py   |   20 -
 .../src/main/python/rcmes/utils/fortranfile.py  |  274 ----
 rcmet/src/main/python/rcmes/utils/misc.py       | 1413 -----------------
 rcmet/src/main/python/rcmes/utils/taylor.py     |  126 --
 .../tests/files/missingSubRegionParam.cfg       |    3 -
 .../tests/files/validSubRegionConfigFile.cfg    |    3 -
 .../main/python/tests/files/validSubRegions.cfg |    7 -
 rcmet/src/main/python/tests/test_files.py       |   87 --
 rcmet/src/main/python/tests/test_metrics.py     |   52 -
 rcmet/src/main/python/tests/test_misc.py        |   74 -
 rcmet/src/main/python/tests/test_process.py     |   44 -
 rcmet/src/main/resources/PyLintREADME.txt       |   26 -
 rcmet/src/main/resources/pyLintRcFile.txt       |  249 ---
 rcmet/src/main/resources/rcmet_use_case.txt     |   57 -
 setup.cfg                                       |    4 +
 setup.py                                        |   30 +-
 133 files changed, 8838 insertions(+), 17022 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/climate/blob/3d5afe86/MANIFEST.in
----------------------------------------------------------------------
diff --cc MANIFEST.in
index 0000000,0000000..4e8da59
new file mode 100644
--- /dev/null
+++ b/MANIFEST.in
@@@ -1,0 -1,0 +1,2 @@@
++include distribute_setup.py
++recursive-include docs *.txt

http://git-wip-us.apache.org/repos/asf/climate/blob/3d5afe86/ez_setup.py
----------------------------------------------------------------------
diff --cc ez_setup.py
index 0000000,0000000..d7bfe97
new file mode 100644
--- /dev/null
+++ b/ez_setup.py
@@@ -1,0 -1,0 +1,341 @@@
++#!/usr/bin/env python
++# Licensed to the Apache Software Foundation (ASF) under one or more
++# contributor license agreements.  See the NOTICE.txt file distributed with
++# this work for additional information regarding copyright ownership.  The ASF
++# licenses this file to you under the Apache License, Version 2.0 (the
++# "License"); you may not use this file except in compliance with the License.
++# You may obtain a copy of the License at
++#
++#     http://www.apache.org/licenses/LICENSE-2.0
++#
++# Unless required by applicable law or agreed to in writing, software
++# distributed under the License is distributed on an "AS IS" BASIS, 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.
++
++"""Bootstrap setuptools installation
++To use setuptools in your package's setup.py, include this
++file in the same directory and add this to the top of your setup.py::
++    from ez_setup import use_setuptools
++    use_setuptools()
++To require a specific version of setuptools, set a download
++mirror, or use an alternate download directory, simply supply
++the appropriate options to ``use_setuptools()``.
++This file can also be run as a script to install or upgrade setuptools.
++The code in this file is taken directly from the Apache OODT project.
++"""
++import os
++import shutil
++import sys
++import tempfile
++import zipfile
++import optparse
++import subprocess
++import platform
++import textwrap
++import contextlib
++
++from distutils import log
++
++try:
++    from urllib.request import urlopen
++except ImportError:
++    from urllib2 import urlopen
++
++try:
++    from site import USER_SITE
++except ImportError:
++    USER_SITE = None
++
++DEFAULT_VERSION = "8.2.1"
++DEFAULT_URL = "https://pypi.python.org/packages/source/s/setuptools/"
++
++def _python_cmd(*args):
++    """
++    Return True if the command succeeded.
++    """
++    args = (sys.executable,) + args
++    return subprocess.call(args) == 0
++
++
++def _install(archive_filename, install_args=()):
++    with archive_context(archive_filename):
++        # 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
++
++
++def _build_egg(egg, archive_filename, to_dir):
++    with archive_context(archive_filename):
++        # building an egg
++        log.warn('Building a Setuptools egg in %s', to_dir)
++        _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir)
++    # returning the result
++    log.warn(egg)
++    if not os.path.exists(egg):
++        raise IOError('Could not build the egg.')
++
++
++class ContextualZipFile(zipfile.ZipFile):
++    """
++    Supplement ZipFile class to support context manager for Python 2.6
++    """
++
++    def __enter__(self):
++        return self
++
++    def __exit__(self, type, value, traceback):
++        self.close()
++
++    def __new__(cls, *args, **kwargs):
++        """
++        Construct a ZipFile or ContextualZipFile as appropriate
++        """
++        if hasattr(zipfile.ZipFile, '__exit__'):
++            return zipfile.ZipFile(*args, **kwargs)
++        return super(ContextualZipFile, cls).__new__(cls)
++
++
++@contextlib.contextmanager
++def archive_context(filename):
++    # extracting the archive
++    tmpdir = tempfile.mkdtemp()
++    log.warn('Extracting in %s', tmpdir)
++    old_wd = os.getcwd()
++    try:
++        os.chdir(tmpdir)
++        with ContextualZipFile(filename) as archive:
++            archive.extractall()
++
++        # going in the directory
++        subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
++        os.chdir(subdir)
++        log.warn('Now working in %s', subdir)
++        yield
++
++    finally:
++        os.chdir(old_wd)
++        shutil.rmtree(tmpdir)
++
++
++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):
++        archive = download_setuptools(version, download_base,
++                                      to_dir, download_delay)
++        _build_egg(egg, archive, to_dir)
++    sys.path.insert(0, egg)
++
++    # Remove previously-imported pkg_resources if present (see
++    # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details).
++    if 'pkg_resources' in sys.modules:
++        del sys.modules['pkg_resources']
++
++    import setuptools
++    setuptools.bootstrap_install_from = egg
++
++
++def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
++        to_dir=os.curdir, download_delay=15):
++    to_dir = os.path.abspath(to_dir)
++    rep_modules = 'pkg_resources', 'setuptools'
++    imported = set(sys.modules).intersection(rep_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.DistributionNotFound:
++        return _do_download(version, download_base, to_dir, download_delay)
++    except pkg_resources.VersionConflict as VC_err:
++        if imported:
++            msg = textwrap.dedent("""
++                The required version of setuptools (>={version}) is not available,
++                and can't be installed while this script is running. Please
++                install a more recent version first, using
++                'easy_install -U setuptools'.
++                (Currently using {VC_err.args[0]!r})
++                """).format(VC_err=VC_err, version=version)
++            sys.stderr.write(msg)
++            sys.exit(2)
++
++        # otherwise, reload ok
++        del pkg_resources, sys.modules['pkg_resources']
++        return _do_download(version, download_base, to_dir, download_delay)
++
++def _clean_check(cmd, target):
++    """
++    Run the command to download target. If the command fails, clean up before
++    re-raising the error.
++    """
++    try:
++        subprocess.check_call(cmd)
++    except subprocess.CalledProcessError:
++        if os.access(target, os.F_OK):
++            os.unlink(target)
++        raise
++
++def download_file_powershell(url, target):
++    """
++    Download the file at url to target using Powershell (which will validate
++    trust). Raise an exception if the command cannot complete.
++    """
++    target = os.path.abspath(target)
++    ps_cmd = (
++        "[System.Net.WebRequest]::DefaultWebProxy.Credentials = "
++        "[System.Net.CredentialCache]::DefaultCredentials; "
++        "(new-object System.Net.WebClient).DownloadFile(%(url)r, %(target)r)"
++        % vars()
++    )
++    cmd = [
++        'powershell',
++        '-Command',
++        ps_cmd,
++    ]
++    _clean_check(cmd, target)
++
++def has_powershell():
++    if platform.system() != 'Windows':
++        return False
++    cmd = ['powershell', '-Command', 'echo test']
++    with open(os.path.devnull, 'wb') as devnull:
++        try:
++            subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
++        except Exception:
++            return False
++    return True
++
++download_file_powershell.viable = has_powershell
++
++def download_file_curl(url, target):
++    cmd = ['curl', url, '--silent', '--output', target]
++    _clean_check(cmd, target)
++
++def has_curl():
++    cmd = ['curl', '--version']
++    with open(os.path.devnull, 'wb') as devnull:
++        try:
++            subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
++        except Exception:
++            return False
++    return True
++
++download_file_curl.viable = has_curl
++
++def download_file_wget(url, target):
++    cmd = ['wget', url, '--quiet', '--output-document', target]
++    _clean_check(cmd, target)
++
++def has_wget():
++    cmd = ['wget', '--version']
++    with open(os.path.devnull, 'wb') as devnull:
++        try:
++            subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
++        except Exception:
++            return False
++    return True
++
++download_file_wget.viable = has_wget
++
++def download_file_insecure(url, target):
++    """
++    Use Python to download the file, even though it cannot authenticate the
++    connection.
++    """
++    src = urlopen(url)
++    try:
++        # Read all the data in one block.
++        data = src.read()
++    finally:
++        src.close()
++
++    # Write all the data in one block to avoid creating a partial file.
++    with open(target, "wb") as dst:
++        dst.write(data)
++
++download_file_insecure.viable = lambda: True
++
++def get_best_downloader():
++    downloaders = (
++        download_file_powershell,
++        download_file_curl,
++        download_file_wget,
++        download_file_insecure,
++    )
++    viable_downloaders = (dl for dl in downloaders if dl.viable())
++    return next(viable_downloaders, None)
++
++def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
++        to_dir=os.curdir, delay=15, downloader_factory=get_best_downloader):
++    """
++    Download setuptools from a specified location and return its filename
++    `version` should be a valid setuptools version number that is available
++    as an sdist 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.
++    ``downloader_factory`` should be a function taking no arguments and
++    returning a function for downloading a URL to a target.
++    """
++    # making sure we use the absolute path
++    to_dir = os.path.abspath(to_dir)
++    zip_name = "setuptools-%s.zip" % version
++    url = download_base + zip_name
++    saveto = os.path.join(to_dir, zip_name)
++    if not os.path.exists(saveto):  # Avoid repeated downloads
++        log.warn("Downloading %s", url)
++        downloader = downloader_factory()
++        downloader(url, saveto)
++    return os.path.realpath(saveto)
++
++def _build_install_args(options):
++    """
++    Build the arguments to 'python setup.py install' on the setuptools package
++    """
++    return ['--user'] if options.user_install else []
++
++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')
++    parser.add_option(
++        '--insecure', dest='downloader_factory', action='store_const',
++        const=lambda: download_file_insecure, default=get_best_downloader,
++        help='Use internal, non-validating downloader'
++    )
++    parser.add_option(
++        '--version', help="Specify which version to download",
++        default=DEFAULT_VERSION,
++    )
++    options, args = parser.parse_args()
++    # positional arguments are ignored
++    return options
++
++def main():
++    """Install or upgrade setuptools and EasyInstall"""
++    options = _parse_args()
++    archive = download_setuptools(
++        version=options.version,
++        download_base=options.download_base,
++        downloader_factory=options.downloader_factory,
++    )
++    return _install(archive, _build_install_args(options))
++
++if __name__ == '__main__':
++    sys.exit(main())

http://git-wip-us.apache.org/repos/asf/climate/blob/3d5afe86/setup.cfg
----------------------------------------------------------------------
diff --cc setup.cfg
index 3725441,0000000..f65f18a
mode 100644,000000..100644
--- a/setup.cfg
+++ b/setup.cfg
@@@ -1,17 -1,0 +1,21 @@@
 +# Licensed to the Apache Software Foundation (ASF) under one or more
 +# contributor license agreements.  See the NOTICE.txt file distributed with
 +# this work for additional information regarding copyright ownership.  The ASF
 +# licenses this file to you under the Apache License, Version 2.0 (the
 +# "License"); you may not use this file except in compliance with the License.
 +# You may obtain a copy of the License at
 +#
 +#     http://www.apache.org/licenses/LICENSE-2.0
 +#
 +# Unless required by applicable law or agreed to in writing, software
 +# distributed under the License is distributed on an "AS IS" BASIS, 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.
 +
 +[metadata]
 +description-file = README.md
++
++[egg_info]
++tag_build = .dev
++tag_svn_revision = 1

http://git-wip-us.apache.org/repos/asf/climate/blob/3d5afe86/setup.py
----------------------------------------------------------------------
diff --cc setup.py
index 0384612,d94cf0f..2fa0733
--- a/setup.py
+++ b/setup.py
@@@ -15,73 -15,15 +15,69 @@@
  # specific language governing permissions and limitations
  # under the License.
  
 -from setuptools import setup
 +import os.path
 +from setuptools import find_packages, setup
 +
 +# Package data
 +# ------------
- 
- _name         = 'ocw'
- _version      = '0.5'
- _description  = 'Apache Open Climate Workbench'
- _url          = 'http://climate.apache.org/'
- _downloadURL  = 'http://pypi.python.org/pypi/ocw/'
 +_author       = 'Apache Open Climate Workbench'
 +_authorEmail  = 'dev@climate.apache.org'
- _license      = 'Apache License, Version 2.0'
- _namespaces   = []
- _testSuite    = 'ocw.tests'
- _zipSafe      = True
- _keywords     = ['climate analysis', 'workbench', 'rebinning', 'metrics', 'computation', 'visualization']
- _requirements = []
 +_classifiers  = [
 +    'Environment :: Console',
-     'Environment :: No Input/Output (Daemon)',
 +    'Intended Audience :: Developers',
 +    'Intended Audience :: Information Technology',
 +    'Intended Audience :: Science/Research',
-     'Topic :: Database :: Front-Ends',
-     'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
-     'Topic :: Internet :: WWW/HTTP :: HTTP Servers',
 +    'Topic :: Scientific/Engineering',
 +    'Development Status :: 5 - Production/Stable',
-     'Environment :: Web Environment',
 +    'License :: OSI Approved :: Apache Software License',
 +    'Operating System :: OS Independent',
 +    'Programming Language :: Python',
 +    'Topic :: Internet :: WWW/HTTP',
 +    'Topic :: Software Development :: Libraries :: Python Modules',
 +]
++_description  = 'Apache Open Climate Workbench'
++_downloadURL  = 'http://pypi.python.org/pypi/ocw/'
++_requirements = []
++_keywords     = ['climate analysis', 'workbench', 'rebinning', 'metrics', 'computation', 'visualization']
++_license      = 'Apache License, Version 2.0'
++_long_description    = 'The Apache Open Climate Workbench provides tools for the evaluation and analysis of climate models.'
++_name         = 'ocw'
++_namespaces   = []
++_testSuite    = 'ocw.tests'
++_url          = 'http://climate.apache.org/'
++_version      = '1.0.0'
++_zipSafe      = True
 +
 +# Setup Metadata
 +# --------------
 +
 +def _read(*rnames):
 +    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
 +
 +_header = '*' * len(_name) + '\n' + _name + '\n' + '*' * len(_name)
 +_longDescription = '\n\n'.join([
 +    _header,
 +    _read('README.md')
 +])
 +open('doc.txt', 'w').write(_longDescription)
  
  setup(
 -    name='Apache Open Climate Workbench',
 -    version='1.0.0',
 -    url='http://climate.apache.org/index.html',
 -    author='Apache Open Climate Workbench',
 -    author_email='dev@climate.apache.org',
 -    packages=['ocw', 'ocw.data_source', 'ocw.tests', 'ocw.esgf'],
 -    license='Apache License, Version 2.0',
 -    long_description='The Apache Open Climate Workbench provides tools for the evaluation and analysis of climate models.'
 +    author=_author,
 +    author_email=_authorEmail,
 +    classifiers=_classifiers,
 +    description=_description,
 +    download_url=_downloadURL,
 +    include_package_data=True,
 +    install_requires=_requirements,
 +    keywords=_keywords,
 +    license=_license,
 +    long_description=_longDescription,
 +    name=_name,
 +    namespace_packages=_namespaces,
 +    packages=find_packages(),
++    #_packages     = ['ocw', 'ocw.data_source', 'ocw.tests', 'ocw.esgf']
 +    test_suite=_testSuite,
 +    url=_url,
 +    version=_version,
 +    zip_safe=_zipSafe,
  )