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 <[email protected]> Authored: Fri Sep 25 23:49:10 2015 -0700 Committer: Lewis John McGibbney <[email protected]> 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) ++ ++ [email protected] ++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 = '[email protected]' - _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='[email protected]', - 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, )
