aboutsummaryrefslogtreecommitdiffstats
path: root/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr
diff options
context:
space:
mode:
Diffstat (limited to 'jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr')
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/__init__.py0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/builddoc.py230
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/cmd/__init__.py0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/cmd/main.py110
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/core.py154
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/extra_files.py35
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/find_package.py29
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/git.py294
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/__init__.py28
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/backwards.py33
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/base.py34
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/commands.py66
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/files.py103
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/metadata.py32
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/options.py53
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/packaging.py677
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/pbr_json.py34
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/testr_command.py156
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/__init__.py0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/base.py218
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_commands.py66
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_core.py147
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_files.py78
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_hooks.py100
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_integration.py122
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_packaging.py520
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_setup.py430
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_util.py80
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_version.py298
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_wsgi.py171
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/CHANGES.txt86
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/LICENSE.txt29
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/MANIFEST.in2
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/README.txt148
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/a.txt0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/b.txt0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/c.rst0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/extra-file.txt0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/git-extra-file.txt0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/__init__.py3
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/_setup_hooks.py65
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/cmd.py26
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/extra.py0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/package_data/1.txt0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/package_data/2.txt0
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/wsgi.py31
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/setup.cfg57
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/setup.py22
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/src/testext.c28
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/test-requirements.txt1
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/util.py74
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/util.py682
-rw-r--r--jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/version.py473
53 files changed, 6025 insertions, 0 deletions
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/__init__.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/__init__.py
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/builddoc.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/builddoc.py
new file mode 100644
index 0000000..a91dda9
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/builddoc.py
@@ -0,0 +1,230 @@
+# Copyright 2011 OpenStack LLC.
+# Copyright 2012-2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+from distutils import log
+import fnmatch
+import os
+import pkg_resources
+import sys
+import warnings
+
+try:
+ import cStringIO
+except ImportError:
+ import io as cStringIO
+
+try:
+ from sphinx import apidoc
+ from sphinx import application
+ from sphinx import config
+ from sphinx import setup_command
+except Exception as e:
+ # NOTE(dhellmann): During the installation of docutils, setuptools
+ # tries to import pbr code to find the egg_info.writer hooks. That
+ # imports this module, which imports sphinx, which imports
+ # docutils, which is being installed. Because docutils uses 2to3
+ # to convert its code during installation under python 3, the
+ # import fails, but it fails with an error other than ImportError
+ # (today it's a NameError on StandardError, an exception base
+ # class). Convert the exception type here so it can be caught in
+ # packaging.py where we try to determine if we can import and use
+ # sphinx by importing this module. See bug #1403510 for details.
+ raise ImportError(str(e))
+from pbr import git
+from pbr import options
+
+
+_rst_template = """%(heading)s
+%(underline)s
+
+.. automodule:: %(module)s
+ :members:
+ :undoc-members:
+ :show-inheritance:
+"""
+
+
+def _find_modules(arg, dirname, files):
+ for filename in files:
+ if filename.endswith('.py') and filename != '__init__.py':
+ arg["%s.%s" % (dirname.replace('/', '.'),
+ filename[:-3])] = True
+
+
+class LocalBuildDoc(setup_command.BuildDoc):
+
+ command_name = 'build_sphinx'
+ builders = ['html', 'man']
+
+ def _get_source_dir(self):
+ option_dict = self.distribution.get_option_dict('build_sphinx')
+ if 'source_dir' in option_dict:
+ source_dir = os.path.join(option_dict['source_dir'][1], 'api')
+ else:
+ source_dir = 'doc/source/api'
+ if not os.path.exists(source_dir):
+ os.makedirs(source_dir)
+ return source_dir
+
+ def generate_autoindex(self, excluded_modules=None):
+ log.info("[pbr] Autodocumenting from %s"
+ % os.path.abspath(os.curdir))
+ modules = {}
+ source_dir = self._get_source_dir()
+ for pkg in self.distribution.packages:
+ if '.' not in pkg:
+ for dirpath, dirnames, files in os.walk(pkg):
+ _find_modules(modules, dirpath, files)
+
+ def include(module):
+ return not any(fnmatch.fnmatch(module, pat)
+ for pat in excluded_modules)
+
+ module_list = sorted(mod for mod in modules.keys() if include(mod))
+ autoindex_filename = os.path.join(source_dir, 'autoindex.rst')
+ with open(autoindex_filename, 'w') as autoindex:
+ autoindex.write(""".. toctree::
+ :maxdepth: 1
+
+""")
+ for module in module_list:
+ output_filename = os.path.join(source_dir,
+ "%s.rst" % module)
+ heading = "The :mod:`%s` Module" % module
+ underline = "=" * len(heading)
+ values = dict(module=module, heading=heading,
+ underline=underline)
+
+ log.info("[pbr] Generating %s"
+ % output_filename)
+ with open(output_filename, 'w') as output_file:
+ output_file.write(_rst_template % values)
+ autoindex.write(" %s.rst\n" % module)
+
+ def _sphinx_tree(self):
+ source_dir = self._get_source_dir()
+ cmd = ['apidoc', '.', '-H', 'Modules', '-o', source_dir]
+ apidoc.main(cmd + self.autodoc_tree_excludes)
+
+ def _sphinx_run(self):
+ if not self.verbose:
+ status_stream = cStringIO.StringIO()
+ else:
+ status_stream = sys.stdout
+ confoverrides = {}
+ if self.version:
+ confoverrides['version'] = self.version
+ if self.release:
+ confoverrides['release'] = self.release
+ if self.today:
+ confoverrides['today'] = self.today
+ sphinx_config = config.Config(self.config_dir, 'conf.py', {}, [])
+ sphinx_ver = pkg_resources.get_distribution("sphinx").version
+ if pkg_resources.parse_version(sphinx_ver) >= \
+ pkg_resources.parse_version('1.3.1'):
+ sphinx_config.init_values(warnings.warn)
+ else:
+ sphinx_config.init_values()
+ if self.builder == 'man' and len(sphinx_config.man_pages) == 0:
+ return
+ app = application.Sphinx(
+ self.source_dir, self.config_dir,
+ self.builder_target_dir, self.doctree_dir,
+ self.builder, confoverrides, status_stream,
+ freshenv=self.fresh_env, warningiserror=False)
+
+ try:
+ app.build(force_all=self.all_files)
+ except Exception as err:
+ from docutils import utils
+ if isinstance(err, utils.SystemMessage):
+ sys.stder.write('reST markup error:\n')
+ sys.stderr.write(err.args[0].encode('ascii',
+ 'backslashreplace'))
+ sys.stderr.write('\n')
+ else:
+ raise
+
+ if self.link_index:
+ src = app.config.master_doc + app.builder.out_suffix
+ dst = app.builder.get_outfilename('index')
+ os.symlink(src, dst)
+
+ def run(self):
+ option_dict = self.distribution.get_option_dict('pbr')
+ if git._git_is_installed():
+ git.write_git_changelog(option_dict=option_dict)
+ git.generate_authors(option_dict=option_dict)
+ tree_index = options.get_boolean_option(option_dict,
+ 'autodoc_tree_index_modules',
+ 'AUTODOC_TREE_INDEX_MODULES')
+ auto_index = options.get_boolean_option(option_dict,
+ 'autodoc_index_modules',
+ 'AUTODOC_INDEX_MODULES')
+ if not os.getenv('SPHINX_DEBUG'):
+ # NOTE(afazekas): These options can be used together,
+ # but they do a very similar thing in a different way
+ if tree_index:
+ self._sphinx_tree()
+ if auto_index:
+ self.generate_autoindex(
+ set(option_dict.get(
+ "autodoc_exclude_modules",
+ [None, ""])[1].split()))
+
+ for builder in self.builders:
+ self.builder = builder
+ self.finalize_options()
+ self.project = self.distribution.get_name()
+ self.version = self.distribution.get_version()
+ self.release = self.distribution.get_version()
+ if options.get_boolean_option(option_dict,
+ 'warnerrors', 'WARNERRORS'):
+ self._sphinx_run()
+ else:
+ setup_command.BuildDoc.run(self)
+
+ def initialize_options(self):
+ # Not a new style class, super keyword does not work.
+ setup_command.BuildDoc.initialize_options(self)
+
+ # NOTE(dstanek): exclude setup.py from the autodoc tree index
+ # builds because all projects will have an issue with it
+ self.autodoc_tree_excludes = ['setup.py']
+
+ def finalize_options(self):
+ # Not a new style class, super keyword does not work.
+ setup_command.BuildDoc.finalize_options(self)
+ # Handle builder option from command line - override cfg
+ option_dict = self.distribution.get_option_dict('build_sphinx')
+ if 'command line' in option_dict.get('builder', [[]])[0]:
+ self.builders = option_dict['builder'][1]
+ # Allow builders to be configurable - as a comma separated list.
+ if not isinstance(self.builders, list) and self.builders:
+ self.builders = self.builders.split(',')
+
+ # NOTE(dstanek): check for autodoc tree exclusion overrides
+ # in the setup.cfg
+ opt = 'autodoc_tree_excludes'
+ option_dict = self.distribution.get_option_dict('pbr')
+ if opt in option_dict:
+ self.autodoc_tree_excludes = option_dict[opt][1]
+ self.ensure_string_list(opt)
+
+
+class LocalBuildLatex(LocalBuildDoc):
+ builders = ['latex']
+ command_name = 'build_sphinx_latex'
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/cmd/__init__.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/cmd/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/cmd/__init__.py
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/cmd/main.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/cmd/main.py
new file mode 100644
index 0000000..de189c4
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/cmd/main.py
@@ -0,0 +1,110 @@
+# Copyright 2014 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+import argparse
+import json
+import sys
+
+import pkg_resources
+
+import pbr.version
+
+
+def _get_metadata(package_name):
+ try:
+ return json.loads(
+ pkg_resources.get_distribution(
+ package_name).get_metadata('pbr.json'))
+ except pkg_resources.DistributionNotFound:
+ raise Exception('Package {0} not installed'.format(package_name))
+ except Exception:
+ return None
+
+
+def get_sha(args):
+ sha = _get_info(args.name)['sha']
+ if sha:
+ print(sha)
+
+
+def get_info(args):
+ print("{name}\t{version}\t{released}\t{sha}".format(
+ **_get_info(args.name)))
+
+
+def _get_info(name):
+ metadata = _get_metadata(name)
+ version = pkg_resources.get_distribution(name).version
+ if metadata:
+ if metadata['is_release']:
+ released = 'released'
+ else:
+ released = 'pre-release'
+ sha = metadata['git_version']
+ else:
+ version_parts = version.split('.')
+ if version_parts[-1].startswith('g'):
+ sha = version_parts[-1][1:]
+ released = 'pre-release'
+ else:
+ sha = ""
+ released = "released"
+ for part in version_parts:
+ if not part.isdigit():
+ released = "pre-release"
+ return dict(name=name, version=version, sha=sha, released=released)
+
+
+def freeze(args):
+ for dist in pkg_resources.working_set:
+ info = _get_info(dist.project_name)
+ output = "{name}=={version}".format(**info)
+ if info['sha']:
+ output += " # git sha {sha}".format(**info)
+ print(output)
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description='pbr: Python Build Reasonableness')
+ parser.add_argument(
+ '-v', '--version', action='version',
+ version=str(pbr.version.VersionInfo('pbr')))
+
+ subparsers = parser.add_subparsers(
+ title='commands', description='valid commands', help='additional help')
+
+ cmd_sha = subparsers.add_parser('sha', help='print sha of package')
+ cmd_sha.set_defaults(func=get_sha)
+ cmd_sha.add_argument('name', help='package to print sha of')
+
+ cmd_sha = subparsers.add_parser(
+ 'info', help='print version info for package')
+ cmd_sha.set_defaults(func=get_info)
+ cmd_sha.add_argument('name', help='package to print info of')
+
+ cmd_sha = subparsers.add_parser(
+ 'freeze', help='print version info for all installed packages')
+ cmd_sha.set_defaults(func=freeze)
+
+ args = parser.parse_args()
+ try:
+ args.func(args)
+ except Exception as e:
+ print(e)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/core.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/core.py
new file mode 100644
index 0000000..ef6a546
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/core.py
@@ -0,0 +1,154 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+#
+# Copyright (C) 2013 Association of Universities for Research in Astronomy
+# (AURA)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# 3. The name of AURA and its representatives may not be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+
+from distutils import core
+from distutils import errors
+import logging
+import os
+import sys
+import warnings
+
+from setuptools import dist
+
+from pbr import util
+
+
+_saved_core_distribution = core.Distribution
+
+
+def _monkeypatch_distribution():
+ core.Distribution = dist._get_unpatched(core.Distribution)
+
+
+def _restore_distribution_monkeypatch():
+ core.Distribution = _saved_core_distribution
+
+
+if sys.version_info[0] == 3:
+ string_type = str
+ integer_types = (int,)
+else:
+ string_type = basestring
+ integer_types = (int, long)
+
+
+def pbr(dist, attr, value):
+ """Implements the actual pbr setup() keyword. When used, this should be
+ the only keyword in your setup() aside from `setup_requires`.
+
+ If given as a string, the value of pbr is assumed to be the relative path
+ to the setup.cfg file to use. Otherwise, if it evaluates to true, it
+ simply assumes that pbr should be used, and the default 'setup.cfg' is
+ used.
+
+ This works by reading the setup.cfg file, parsing out the supported
+ metadata and command options, and using them to rebuild the
+ `DistributionMetadata` object and set the newly added command options.
+
+ The reason for doing things this way is that a custom `Distribution` class
+ will not play nicely with setup_requires; however, this implementation may
+ not work well with distributions that do use a `Distribution` subclass.
+ """
+
+ try:
+ _monkeypatch_distribution()
+ if not value:
+ return
+ if isinstance(value, string_type):
+ path = os.path.abspath(value)
+ else:
+ path = os.path.abspath('setup.cfg')
+ if not os.path.exists(path):
+ raise errors.DistutilsFileError(
+ 'The setup.cfg file %s does not exist.' % path)
+
+ # Converts the setup.cfg file to setup() arguments
+ try:
+ attrs = util.cfg_to_args(path)
+ except Exception:
+ e = sys.exc_info()[1]
+ # NB: This will output to the console if no explicit logging has
+ # been setup - but thats fine, this is a fatal distutils error, so
+ # being pretty isn't the #1 goal.. being diagnosable is.
+ logging.exception('Error parsing')
+ raise errors.DistutilsSetupError(
+ 'Error parsing %s: %s: %s' % (path, e.__class__.__name__, e))
+
+ # Repeat some of the Distribution initialization code with the newly
+ # provided attrs
+ if attrs:
+ # Skips 'options' and 'licence' support which are rarely used; may
+ # add back in later if demanded
+ for key, val in attrs.items():
+ if hasattr(dist.metadata, 'set_' + key):
+ getattr(dist.metadata, 'set_' + key)(val)
+ elif hasattr(dist.metadata, key):
+ setattr(dist.metadata, key, val)
+ elif hasattr(dist, key):
+ setattr(dist, key, val)
+ else:
+ msg = 'Unknown distribution option: %s' % repr(key)
+ warnings.warn(msg)
+
+ # Re-finalize the underlying Distribution
+ core.Distribution.finalize_options(dist)
+
+ # This bit comes out of distribute/setuptools
+ if isinstance(dist.metadata.version, integer_types + (float,)):
+ # Some people apparently take "version number" too literally :)
+ dist.metadata.version = str(dist.metadata.version)
+
+ # This bit of hackery is necessary so that the Distribution will ignore
+ # normally unsupport command options (namely pre-hooks and post-hooks).
+ # dist.command_options is normally a dict mapping command names to
+ # dicts of their options. Now it will be a defaultdict that returns
+ # IgnoreDicts for the each command's options so we can pass through the
+ # unsupported options
+ ignore = ['pre_hook.*', 'post_hook.*']
+ dist.command_options = util.DefaultGetDict(
+ lambda: util.IgnoreDict(ignore)
+ )
+ finally:
+ _restore_distribution_monkeypatch()
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/extra_files.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/extra_files.py
new file mode 100644
index 0000000..a72db0c
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/extra_files.py
@@ -0,0 +1,35 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+
+from distutils import errors
+import os
+
+_extra_files = []
+
+
+def get_extra_files():
+ global _extra_files
+ return _extra_files
+
+
+def set_extra_files(extra_files):
+ # Let's do a sanity check
+ for filename in extra_files:
+ if not os.path.exists(filename):
+ raise errors.DistutilsFileError(
+ '%s from the extra_files option in setup.cfg does not '
+ 'exist' % filename)
+ global _extra_files
+ _extra_files[:] = extra_files[:]
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/find_package.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/find_package.py
new file mode 100644
index 0000000..717e93d
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/find_package.py
@@ -0,0 +1,29 @@
+# Copyright 2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+import os
+
+import setuptools
+
+
+def smart_find_packages(package_list):
+ """Run find_packages the way we intend."""
+ packages = []
+ for pkg in package_list.strip().split("\n"):
+ pkg_path = pkg.replace('.', os.path.sep)
+ packages.append(pkg)
+ packages.extend(['%s.%s' % (pkg, f)
+ for f in setuptools.find_packages(pkg_path)])
+ return "\n".join(set(packages))
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/git.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/git.py
new file mode 100644
index 0000000..34cb1c1
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/git.py
@@ -0,0 +1,294 @@
+# Copyright 2011 OpenStack LLC.
+# Copyright 2012-2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+from __future__ import unicode_literals
+
+import distutils.errors
+from distutils import log
+import errno
+import io
+import os
+import re
+import subprocess
+import time
+
+import pkg_resources
+
+from pbr import options
+
+
+def _run_shell_command(cmd, throw_on_error=False, buffer=True, env=None):
+ if buffer:
+ out_location = subprocess.PIPE
+ err_location = subprocess.PIPE
+ else:
+ out_location = None
+ err_location = None
+
+ newenv = os.environ.copy()
+ if env:
+ newenv.update(env)
+
+ output = subprocess.Popen(cmd,
+ stdout=out_location,
+ stderr=err_location,
+ env=newenv)
+ out = output.communicate()
+ if output.returncode and throw_on_error:
+ raise distutils.errors.DistutilsError(
+ "%s returned %d" % (cmd, output.returncode))
+ if len(out) == 0 or not out[0] or not out[0].strip():
+ return ''
+ # Since we don't control the history, and forcing users to rebase arbitrary
+ # history to fix utf8 issues is harsh, decode with replace.
+ return out[0].strip().decode('utf-8', 'replace')
+
+
+def _run_git_command(cmd, git_dir, **kwargs):
+ if not isinstance(cmd, (list, tuple)):
+ cmd = [cmd]
+ return _run_shell_command(
+ ['git', '--git-dir=%s' % git_dir] + cmd, **kwargs)
+
+
+def _get_git_directory():
+ try:
+ return _run_shell_command(['git', 'rev-parse', '--git-dir'])
+ except OSError as e:
+ if e.errno == errno.ENOENT:
+ # git not installed.
+ return ''
+ raise
+
+
+def _git_is_installed():
+ try:
+ # We cannot use 'which git' as it may not be available
+ # in some distributions, So just try 'git --version'
+ # to see if we run into trouble
+ _run_shell_command(['git', '--version'])
+ except OSError:
+ return False
+ return True
+
+
+def _get_highest_tag(tags):
+ """Find the highest tag from a list.
+
+ Pass in a list of tag strings and this will return the highest
+ (latest) as sorted by the pkg_resources version parser.
+ """
+ return max(tags, key=pkg_resources.parse_version)
+
+
+def _find_git_files(dirname='', git_dir=None):
+ """Behave like a file finder entrypoint plugin.
+
+ We don't actually use the entrypoints system for this because it runs
+ at absurd times. We only want to do this when we are building an sdist.
+ """
+ file_list = []
+ if git_dir is None:
+ git_dir = _run_git_functions()
+ if git_dir:
+ log.info("[pbr] In git context, generating filelist from git")
+ file_list = _run_git_command(['ls-files', '-z'], git_dir)
+ # Users can fix utf8 issues locally with a single commit, so we are
+ # strict here.
+ file_list = file_list.split(b'\x00'.decode('utf-8'))
+ return [f for f in file_list if f]
+
+
+def _get_raw_tag_info(git_dir):
+ describe = _run_git_command(['describe', '--always'], git_dir)
+ if "-" in describe:
+ return describe.rsplit("-", 2)[-2]
+ if "." in describe:
+ return 0
+ return None
+
+
+def get_is_release(git_dir):
+ return _get_raw_tag_info(git_dir) == 0
+
+
+def _run_git_functions():
+ git_dir = None
+ if _git_is_installed():
+ git_dir = _get_git_directory()
+ return git_dir or None
+
+
+def get_git_short_sha(git_dir=None):
+ """Return the short sha for this repo, if it exists."""
+ if not git_dir:
+ git_dir = _run_git_functions()
+ if git_dir:
+ return _run_git_command(
+ ['log', '-n1', '--pretty=format:%h'], git_dir)
+ return None
+
+
+def _iter_changelog(changelog):
+ """Convert a oneline log iterator to formatted strings.
+
+ :param changelog: An iterator of one line log entries like
+ that given by _iter_log_oneline.
+ :return: An iterator over (release, formatted changelog) tuples.
+ """
+ first_line = True
+ current_release = None
+ yield current_release, "CHANGES\n=======\n\n"
+ for hash, tags, msg in changelog:
+ if tags:
+ current_release = _get_highest_tag(tags)
+ underline = len(current_release) * '-'
+ if not first_line:
+ yield current_release, '\n'
+ yield current_release, (
+ "%(tag)s\n%(underline)s\n\n" %
+ dict(tag=current_release, underline=underline))
+
+ if not msg.startswith("Merge "):
+ if msg.endswith("."):
+ msg = msg[:-1]
+ yield current_release, "* %(msg)s\n" % dict(msg=msg)
+ first_line = False
+
+
+def _iter_log_oneline(git_dir=None):
+ """Iterate over --oneline log entries if possible.
+
+ This parses the output into a structured form but does not apply
+ presentation logic to the output - making it suitable for different
+ uses.
+
+ :return: An iterator of (hash, tags_set, 1st_line) tuples, or None if
+ changelog generation is disabled / not available.
+ """
+ if git_dir is None:
+ git_dir = _get_git_directory()
+ if not git_dir:
+ return []
+ return _iter_log_inner(git_dir)
+
+
+def _iter_log_inner(git_dir):
+ """Iterate over --oneline log entries.
+
+ This parses the output intro a structured form but does not apply
+ presentation logic to the output - making it suitable for different
+ uses.
+
+ :return: An iterator of (hash, tags_set, 1st_line) tuples.
+ """
+ log.info('[pbr] Generating ChangeLog')
+ log_cmd = ['log', '--oneline', '--decorate']
+ changelog = _run_git_command(log_cmd, git_dir)
+ for line in changelog.split('\n'):
+ line_parts = line.split()
+ if len(line_parts) < 2:
+ continue
+ # Tags are in a list contained in ()'s. If a commit
+ # subject that is tagged happens to have ()'s in it
+ # this will fail
+ if line_parts[1].startswith('(') and ')' in line:
+ msg = line.split(')')[1].strip()
+ else:
+ msg = " ".join(line_parts[1:])
+
+ if "tag:" in line:
+ tags = set([
+ tag.split(",")[0]
+ for tag in line.split(")")[0].split("tag: ")[1:]])
+ else:
+ tags = set()
+
+ yield line_parts[0], tags, msg
+
+
+def write_git_changelog(git_dir=None, dest_dir=os.path.curdir,
+ option_dict=None, changelog=None):
+ """Write a changelog based on the git changelog."""
+ start = time.time()
+ if not option_dict:
+ option_dict = {}
+ should_skip = options.get_boolean_option(option_dict, 'skip_changelog',
+ 'SKIP_WRITE_GIT_CHANGELOG')
+ if should_skip:
+ return
+ if not changelog:
+ changelog = _iter_log_oneline(git_dir=git_dir)
+ if changelog:
+ changelog = _iter_changelog(changelog)
+ if not changelog:
+ return
+ log.info('[pbr] Writing ChangeLog')
+ new_changelog = os.path.join(dest_dir, 'ChangeLog')
+ # If there's already a ChangeLog and it's not writable, just use it
+ if (os.path.exists(new_changelog)
+ and not os.access(new_changelog, os.W_OK)):
+ return
+ with io.open(new_changelog, "w", encoding="utf-8") as changelog_file:
+ for release, content in changelog:
+ changelog_file.write(content)
+ stop = time.time()
+ log.info('[pbr] ChangeLog complete (%0.1fs)' % (stop - start))
+
+
+def generate_authors(git_dir=None, dest_dir='.', option_dict=dict()):
+ """Create AUTHORS file using git commits."""
+ should_skip = options.get_boolean_option(option_dict, 'skip_authors',
+ 'SKIP_GENERATE_AUTHORS')
+ if should_skip:
+ return
+ start = time.time()
+ old_authors = os.path.join(dest_dir, 'AUTHORS.in')
+ new_authors = os.path.join(dest_dir, 'AUTHORS')
+ # If there's already an AUTHORS file and it's not writable, just use it
+ if (os.path.exists(new_authors)
+ and not os.access(new_authors, os.W_OK)):
+ return
+ log.info('[pbr] Generating AUTHORS')
+ ignore_emails = '(jenkins@review|infra@lists|jenkins@openstack)'
+ if git_dir is None:
+ git_dir = _get_git_directory()
+ if git_dir:
+ authors = []
+
+ # don't include jenkins email address in AUTHORS file
+ git_log_cmd = ['log', '--format=%aN <%aE>']
+ authors += _run_git_command(git_log_cmd, git_dir).split('\n')
+ authors = [a for a in authors if not re.search(ignore_emails, a)]
+
+ # get all co-authors from commit messages
+ co_authors_out = _run_git_command('log', git_dir)
+ co_authors = re.findall('Co-authored-by:.+', co_authors_out,
+ re.MULTILINE)
+ co_authors = [signed.split(":", 1)[1].strip()
+ for signed in co_authors if signed]
+
+ authors += co_authors
+ authors = sorted(set(authors))
+
+ with open(new_authors, 'wb') as new_authors_fh:
+ if os.path.exists(old_authors):
+ with open(old_authors, "rb") as old_authors_fh:
+ new_authors_fh.write(old_authors_fh.read())
+ new_authors_fh.write(('\n'.join(authors) + '\n')
+ .encode('utf-8'))
+ stop = time.time()
+ log.info('[pbr] AUTHORS complete (%0.1fs)' % (stop - start))
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/__init__.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/__init__.py
new file mode 100644
index 0000000..f0056c0
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/__init__.py
@@ -0,0 +1,28 @@
+# Copyright 2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+from pbr.hooks import backwards
+from pbr.hooks import commands
+from pbr.hooks import files
+from pbr.hooks import metadata
+
+
+def setup_hook(config):
+ """Filter config parsed from a setup.cfg to inject our defaults."""
+ metadata_config = metadata.MetadataConfig(config)
+ metadata_config.run()
+ backwards.BackwardsCompatConfig(config).run()
+ commands.CommandsConfig(config).run()
+ files.FilesConfig(config, metadata_config.get_name()).run()
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/backwards.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/backwards.py
new file mode 100644
index 0000000..01f07ab
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/backwards.py
@@ -0,0 +1,33 @@
+# Copyright 2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+from pbr.hooks import base
+from pbr import packaging
+
+
+class BackwardsCompatConfig(base.BaseConfig):
+
+ section = 'backwards_compat'
+
+ def hook(self):
+ self.config['include_package_data'] = 'True'
+ packaging.append_text_list(
+ self.config, 'dependency_links',
+ packaging.parse_dependency_links())
+ packaging.append_text_list(
+ self.config, 'tests_require',
+ packaging.parse_requirements(
+ packaging.TEST_REQUIREMENTS_FILES,
+ strip_markers=True))
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/base.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/base.py
new file mode 100644
index 0000000..6672a36
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/base.py
@@ -0,0 +1,34 @@
+# Copyright 2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+
+class BaseConfig(object):
+
+ section = None
+
+ def __init__(self, config):
+ self._global_config = config
+ self.config = self._global_config.get(self.section, dict())
+ self.pbr_config = config.get('pbr', dict())
+
+ def run(self):
+ self.hook()
+ self.save()
+
+ def hook(self):
+ pass
+
+ def save(self):
+ self._global_config[self.section] = self.config
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/commands.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/commands.py
new file mode 100644
index 0000000..fd757e4
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/commands.py
@@ -0,0 +1,66 @@
+# Copyright 2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+import os
+
+from setuptools.command import easy_install
+
+from pbr.hooks import base
+from pbr import options
+from pbr import packaging
+
+
+class CommandsConfig(base.BaseConfig):
+
+ section = 'global'
+
+ def __init__(self, config):
+ super(CommandsConfig, self).__init__(config)
+ self.commands = self.config.get('commands', "")
+
+ def save(self):
+ self.config['commands'] = self.commands
+ super(CommandsConfig, self).save()
+
+ def add_command(self, command):
+ self.commands = "%s\n%s" % (self.commands, command)
+
+ def hook(self):
+ self.add_command('pbr.packaging.LocalEggInfo')
+ self.add_command('pbr.packaging.LocalSDist')
+ self.add_command('pbr.packaging.LocalInstallScripts')
+ self.add_command('pbr.packaging.LocalDevelop')
+ self.add_command('pbr.packaging.LocalRPMVersion')
+ if os.name != 'nt':
+ easy_install.get_script_args = packaging.override_get_script_args
+
+ if packaging.have_sphinx():
+ self.add_command('pbr.builddoc.LocalBuildDoc')
+ self.add_command('pbr.builddoc.LocalBuildLatex')
+
+ if os.path.exists('.testr.conf') and packaging.have_testr():
+ # There is a .testr.conf file. We want to use it.
+ self.add_command('pbr.packaging.TestrTest')
+ elif self.config.get('nosetests', False) and packaging.have_nose():
+ # We seem to still have nose configured
+ self.add_command('pbr.packaging.NoseTest')
+
+ use_egg = options.get_boolean_option(
+ self.pbr_config, 'use-egg', 'PBR_USE_EGG')
+ # We always want non-egg install unless explicitly requested
+ if 'manpages' in self.pbr_config or not use_egg:
+ self.add_command('pbr.packaging.LocalInstall')
+ else:
+ self.add_command('pbr.packaging.InstallWithGit')
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/files.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/files.py
new file mode 100644
index 0000000..48bf9e3
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/files.py
@@ -0,0 +1,103 @@
+# Copyright 2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+import os
+import sys
+
+from pbr import find_package
+from pbr.hooks import base
+
+
+def get_manpath():
+ manpath = 'share/man'
+ if os.path.exists(os.path.join(sys.prefix, 'man')):
+ # This works around a bug with install where it expects every node
+ # in the relative data directory to be an actual directory, since at
+ # least Debian derivatives (and probably other platforms as well)
+ # like to symlink Unixish /usr/local/man to /usr/local/share/man.
+ manpath = 'man'
+ return manpath
+
+
+def get_man_section(section):
+ return os.path.join(get_manpath(), 'man%s' % section)
+
+
+class FilesConfig(base.BaseConfig):
+
+ section = 'files'
+
+ def __init__(self, config, name):
+ super(FilesConfig, self).__init__(config)
+ self.name = name
+ self.data_files = self.config.get('data_files', '')
+
+ def save(self):
+ self.config['data_files'] = self.data_files
+ super(FilesConfig, self).save()
+
+ def expand_globs(self):
+ finished = []
+ for line in self.data_files.split("\n"):
+ if line.rstrip().endswith('*') and '=' in line:
+ (target, source_glob) = line.split('=')
+ source_prefix = source_glob.strip()[:-1]
+ target = target.strip()
+ if not target.endswith(os.path.sep):
+ target += os.path.sep
+ for (dirpath, dirnames, fnames) in os.walk(source_prefix):
+ finished.append(
+ "%s = " % dirpath.replace(source_prefix, target))
+ finished.extend(
+ [" %s" % os.path.join(dirpath, f) for f in fnames])
+ else:
+ finished.append(line)
+
+ self.data_files = "\n".join(finished)
+
+ def add_man_path(self, man_path):
+ self.data_files = "%s\n%s =" % (self.data_files, man_path)
+
+ def add_man_page(self, man_page):
+ self.data_files = "%s\n %s" % (self.data_files, man_page)
+
+ def get_man_sections(self):
+ man_sections = dict()
+ manpages = self.pbr_config['manpages']
+ for manpage in manpages.split():
+ section_number = manpage.strip()[-1]
+ section = man_sections.get(section_number, list())
+ section.append(manpage.strip())
+ man_sections[section_number] = section
+ return man_sections
+
+ def hook(self):
+ packages = self.config.get('packages', self.name).strip()
+ expanded = []
+ for pkg in packages.split("\n"):
+ if os.path.isdir(pkg.strip()):
+ expanded.append(find_package.smart_find_packages(pkg.strip()))
+
+ self.config['packages'] = "\n".join(expanded)
+
+ self.expand_globs()
+
+ if 'manpages' in self.pbr_config:
+ man_sections = self.get_man_sections()
+ for (section, pages) in man_sections.items():
+ manpath = get_man_section(section)
+ self.add_man_path(manpath)
+ for page in pages:
+ self.add_man_page(page)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/metadata.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/metadata.py
new file mode 100644
index 0000000..3f65b6d
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/hooks/metadata.py
@@ -0,0 +1,32 @@
+# Copyright 2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+from pbr.hooks import base
+from pbr import packaging
+
+
+class MetadataConfig(base.BaseConfig):
+
+ section = 'metadata'
+
+ def hook(self):
+ self.config['version'] = packaging.get_version(
+ self.config['name'], self.config.get('version', None))
+ packaging.append_text_list(
+ self.config, 'requires_dist',
+ packaging.parse_requirements())
+
+ def get_name(self):
+ return self.config['name']
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/options.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/options.py
new file mode 100644
index 0000000..105b200
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/options.py
@@ -0,0 +1,53 @@
+# Licensed 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.
+#
+# Copyright (C) 2013 Association of Universities for Research in Astronomy
+# (AURA)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# 3. The name of AURA and its representatives may not be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+
+import os
+
+
+TRUE_VALUES = ('true', '1', 'yes')
+
+
+def get_boolean_option(option_dict, option_name, env_name):
+ return ((option_name in option_dict
+ and option_dict[option_name][1].lower() in TRUE_VALUES) or
+ str(os.getenv(env_name)).lower() in TRUE_VALUES)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/packaging.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/packaging.py
new file mode 100644
index 0000000..f920374
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/packaging.py
@@ -0,0 +1,677 @@
+# Copyright 2011 OpenStack LLC.
+# Copyright 2012-2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+"""
+Utilities with minimum-depends for use in setup.py
+"""
+
+from __future__ import unicode_literals
+
+from distutils.command import install as du_install
+from distutils import log
+import email
+import os
+import re
+import sys
+
+import pkg_resources
+import setuptools
+from setuptools.command import develop
+from setuptools.command import easy_install
+from setuptools.command import egg_info
+from setuptools.command import install
+from setuptools.command import install_scripts
+from setuptools.command import sdist
+
+from pbr import extra_files
+from pbr import git
+from pbr import options
+import pbr.pbr_json
+from pbr import testr_command
+from pbr import version
+
+REQUIREMENTS_FILES = ('requirements.txt', 'tools/pip-requires')
+TEST_REQUIREMENTS_FILES = ('test-requirements.txt', 'tools/test-requires')
+
+
+def get_requirements_files():
+ files = os.environ.get("PBR_REQUIREMENTS_FILES")
+ if files:
+ return tuple(f.strip() for f in files.split(','))
+ # Returns a list composed of:
+ # - REQUIREMENTS_FILES with -py2 or -py3 in the name
+ # (e.g. requirements-py3.txt)
+ # - REQUIREMENTS_FILES
+ return (list(map(('-py' + str(sys.version_info[0])).join,
+ map(os.path.splitext, REQUIREMENTS_FILES)))
+ + list(REQUIREMENTS_FILES))
+
+
+def append_text_list(config, key, text_list):
+ """Append a \n separated list to possibly existing value."""
+ new_value = []
+ current_value = config.get(key, "")
+ if current_value:
+ new_value.append(current_value)
+ new_value.extend(text_list)
+ config[key] = '\n'.join(new_value)
+
+
+def _any_existing(file_list):
+ return [f for f in file_list if os.path.exists(f)]
+
+
+# Get requirements from the first file that exists
+def get_reqs_from_files(requirements_files):
+ for requirements_file in _any_existing(requirements_files):
+ with open(requirements_file, 'r') as fil:
+ return fil.read().split('\n')
+ return []
+
+
+def parse_requirements(requirements_files=None, strip_markers=False):
+
+ if requirements_files is None:
+ requirements_files = get_requirements_files()
+
+ def egg_fragment(match):
+ # take a versioned egg fragment and return a
+ # versioned package requirement e.g.
+ # nova-1.2.3 becomes nova>=1.2.3
+ return re.sub(r'([\w.]+)-([\w.-]+)',
+ r'\1>=\2',
+ match.group(1))
+
+ requirements = []
+ for line in get_reqs_from_files(requirements_files):
+ # Ignore comments
+ if (not line.strip()) or line.startswith('#'):
+ continue
+
+ # Handle nested requirements files such as:
+ # -r other-requirements.txt
+ if line.startswith('-r'):
+ req_file = line.partition(' ')[2]
+ requirements += parse_requirements(
+ [req_file], strip_markers=strip_markers)
+ continue
+
+ try:
+ project_name = pkg_resources.Requirement.parse(line).project_name
+ except ValueError:
+ project_name = None
+
+ # For the requirements list, we need to inject only the portion
+ # after egg= so that distutils knows the package it's looking for
+ # such as:
+ # -e git://github.com/openstack/nova/master#egg=nova
+ # -e git://github.com/openstack/nova/master#egg=nova-1.2.3
+ if re.match(r'\s*-e\s+', line):
+ line = re.sub(r'\s*-e\s+.*#egg=(.*)$', egg_fragment, line)
+ # such as:
+ # http://github.com/openstack/nova/zipball/master#egg=nova
+ # http://github.com/openstack/nova/zipball/master#egg=nova-1.2.3
+ elif re.match(r'\s*https?:', line):
+ line = re.sub(r'\s*https?:.*#egg=(.*)$', egg_fragment, line)
+ # -f lines are for index locations, and don't get used here
+ elif re.match(r'\s*-f\s+', line):
+ line = None
+ reason = 'Index Location'
+
+ if line is not None:
+ line = re.sub('#.*$', '', line)
+ if strip_markers:
+ semi_pos = line.find(';')
+ if semi_pos < 0:
+ semi_pos = None
+ line = line[:semi_pos]
+ requirements.append(line)
+ else:
+ log.info(
+ '[pbr] Excluding %s: %s' % (project_name, reason))
+
+ return requirements
+
+
+def parse_dependency_links(requirements_files=None):
+ if requirements_files is None:
+ requirements_files = get_requirements_files()
+ dependency_links = []
+ # dependency_links inject alternate locations to find packages listed
+ # in requirements
+ for line in get_reqs_from_files(requirements_files):
+ # skip comments and blank lines
+ if re.match(r'(\s*#)|(\s*$)', line):
+ continue
+ # lines with -e or -f need the whole line, minus the flag
+ if re.match(r'\s*-[ef]\s+', line):
+ dependency_links.append(re.sub(r'\s*-[ef]\s+', '', line))
+ # lines that are only urls can go in unmolested
+ elif re.match(r'\s*https?:', line):
+ dependency_links.append(line)
+ return dependency_links
+
+
+class InstallWithGit(install.install):
+ """Extracts ChangeLog and AUTHORS from git then installs.
+
+ This is useful for e.g. readthedocs where the package is
+ installed and then docs built.
+ """
+
+ command_name = 'install'
+
+ def run(self):
+ _from_git(self.distribution)
+ return install.install.run(self)
+
+
+class LocalInstall(install.install):
+ """Runs python setup.py install in a sensible manner.
+
+ Force a non-egg installed in the manner of
+ single-version-externally-managed, which allows us to install manpages
+ and config files.
+ """
+
+ command_name = 'install'
+
+ def run(self):
+ _from_git(self.distribution)
+ return du_install.install.run(self)
+
+
+class TestrTest(testr_command.Testr):
+ """Make setup.py test do the right thing."""
+
+ command_name = 'test'
+
+ def run(self):
+ # Can't use super - base class old-style class
+ testr_command.Testr.run(self)
+
+
+class LocalRPMVersion(setuptools.Command):
+ __doc__ = """Output the rpm *compatible* version string of this package"""
+ description = __doc__
+
+ user_options = []
+ command_name = "rpm_version"
+
+ def run(self):
+ log.info("[pbr] Extracting rpm version")
+ name = self.distribution.get_name()
+ print(version.VersionInfo(name).semantic_version().rpm_string())
+
+ def initialize_options(self):
+ pass
+
+ def finalize_options(self):
+ pass
+
+
+def have_testr():
+ return testr_command.have_testr
+
+
+try:
+ from nose import commands
+
+ class NoseTest(commands.nosetests):
+ """Fallback test runner if testr is a no-go."""
+
+ command_name = 'test'
+
+ def run(self):
+ # Can't use super - base class old-style class
+ commands.nosetests.run(self)
+
+ _have_nose = True
+
+except ImportError:
+ _have_nose = False
+
+
+def have_nose():
+ return _have_nose
+
+_wsgi_text = """#PBR Generated from %(group)r
+
+import threading
+
+from %(module_name)s import %(import_target)s
+
+if __name__ == "__main__":
+ import argparse
+ import socket
+ import wsgiref.simple_server as wss
+
+ my_ip = socket.gethostbyname(socket.gethostname())
+ parser = argparse.ArgumentParser(
+ description=%(import_target)s.__doc__,
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+ parser.add_argument('--port', '-p', type=int, default=8000,
+ help='TCP port to listen on')
+ args = parser.parse_args()
+ server = wss.make_server('', args.port, %(invoke_target)s())
+
+ print("*" * 80)
+ print("STARTING test server %(module_name)s.%(invoke_target)s")
+ url = "http://%%s:%%d/" %% (my_ip, server.server_port)
+ print("Available at %%s" %% url)
+ print("DANGER! For testing only, do not use in production")
+ print("*" * 80)
+
+ server.serve_forever()
+else:
+ application = None
+ app_lock = threading.Lock()
+
+ with app_lock:
+ if application is None:
+ application = %(invoke_target)s()
+
+"""
+
+_script_text = """# PBR Generated from %(group)r
+
+import sys
+
+from %(module_name)s import %(import_target)s
+
+
+if __name__ == "__main__":
+ sys.exit(%(invoke_target)s())
+"""
+
+
+# the following allows us to specify different templates per entry
+# point group when generating pbr scripts.
+ENTRY_POINTS_MAP = {
+ 'console_scripts': _script_text,
+ 'gui_scripts': _script_text,
+ 'wsgi_scripts': _wsgi_text
+}
+
+
+def override_get_script_args(
+ dist, executable=os.path.normpath(sys.executable), is_wininst=False):
+ """Override entrypoints console_script."""
+ header = easy_install.get_script_header("", executable, is_wininst)
+ for group, template in ENTRY_POINTS_MAP.items():
+ for name, ep in dist.get_entry_map(group).items():
+ if not ep.attrs or len(ep.attrs) > 2:
+ raise ValueError("Script targets must be of the form "
+ "'func' or 'Class.class_method'.")
+ script_text = template % dict(
+ group=group,
+ module_name=ep.module_name,
+ import_target=ep.attrs[0],
+ invoke_target='.'.join(ep.attrs),
+ )
+ yield (name, header + script_text)
+
+
+class LocalDevelop(develop.develop):
+
+ command_name = 'develop'
+
+ def install_wrapper_scripts(self, dist):
+ if sys.platform == 'win32':
+ return develop.develop.install_wrapper_scripts(self, dist)
+ if not self.exclude_scripts:
+ for args in override_get_script_args(dist):
+ self.write_script(*args)
+
+
+class LocalInstallScripts(install_scripts.install_scripts):
+ """Intercepts console scripts entry_points."""
+ command_name = 'install_scripts'
+
+ def run(self):
+ import distutils.command.install_scripts
+
+ self.run_command("egg_info")
+ if self.distribution.scripts:
+ # run first to set up self.outfiles
+ distutils.command.install_scripts.install_scripts.run(self)
+ else:
+ self.outfiles = []
+ if self.no_ep:
+ # don't install entry point scripts into .egg file!
+ return
+
+ ei_cmd = self.get_finalized_command("egg_info")
+ dist = pkg_resources.Distribution(
+ ei_cmd.egg_base,
+ pkg_resources.PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info),
+ ei_cmd.egg_name, ei_cmd.egg_version,
+ )
+ bs_cmd = self.get_finalized_command('build_scripts')
+ executable = getattr(
+ bs_cmd, 'executable', easy_install.sys_executable)
+ is_wininst = getattr(
+ self.get_finalized_command("bdist_wininst"), '_is_running', False
+ )
+
+ if os.name != 'nt':
+ get_script_args = override_get_script_args
+ else:
+ get_script_args = easy_install.get_script_args
+ executable = '"%s"' % executable
+
+ for args in get_script_args(dist, executable, is_wininst):
+ self.write_script(*args)
+
+
+class LocalManifestMaker(egg_info.manifest_maker):
+ """Add any files that are in git and some standard sensible files."""
+
+ def _add_pbr_defaults(self):
+ for template_line in [
+ 'include AUTHORS',
+ 'include ChangeLog',
+ 'exclude .gitignore',
+ 'exclude .gitreview',
+ 'global-exclude *.pyc'
+ ]:
+ self.filelist.process_template_line(template_line)
+
+ def add_defaults(self):
+ option_dict = self.distribution.get_option_dict('pbr')
+
+ sdist.sdist.add_defaults(self)
+ self.filelist.append(self.template)
+ self.filelist.append(self.manifest)
+ self.filelist.extend(extra_files.get_extra_files())
+ should_skip = options.get_boolean_option(option_dict, 'skip_git_sdist',
+ 'SKIP_GIT_SDIST')
+ if not should_skip:
+ rcfiles = git._find_git_files()
+ if rcfiles:
+ self.filelist.extend(rcfiles)
+ elif os.path.exists(self.manifest):
+ self.read_manifest()
+ ei_cmd = self.get_finalized_command('egg_info')
+ self._add_pbr_defaults()
+ self.filelist.include_pattern("*", prefix=ei_cmd.egg_info)
+
+
+class LocalEggInfo(egg_info.egg_info):
+ """Override the egg_info command to regenerate SOURCES.txt sensibly."""
+
+ command_name = 'egg_info'
+
+ def find_sources(self):
+ """Generate SOURCES.txt only if there isn't one already.
+
+ If we are in an sdist command, then we always want to update
+ SOURCES.txt. If we are not in an sdist command, then it doesn't
+ matter one flip, and is actually destructive.
+ However, if we're in a git context, it's always the right thing to do
+ to recreate SOURCES.txt
+ """
+ manifest_filename = os.path.join(self.egg_info, "SOURCES.txt")
+ if (not os.path.exists(manifest_filename) or
+ os.path.exists('.git') or
+ 'sdist' in sys.argv):
+ log.info("[pbr] Processing SOURCES.txt")
+ mm = LocalManifestMaker(self.distribution)
+ mm.manifest = manifest_filename
+ mm.run()
+ self.filelist = mm.filelist
+ else:
+ log.info("[pbr] Reusing existing SOURCES.txt")
+ self.filelist = egg_info.FileList()
+ for entry in open(manifest_filename, 'r').read().split('\n'):
+ self.filelist.append(entry)
+
+
+def _from_git(distribution):
+ option_dict = distribution.get_option_dict('pbr')
+ changelog = git._iter_log_oneline()
+ if changelog:
+ changelog = git._iter_changelog(changelog)
+ git.write_git_changelog(option_dict=option_dict, changelog=changelog)
+ git.generate_authors(option_dict=option_dict)
+
+
+class LocalSDist(sdist.sdist):
+ """Builds the ChangeLog and Authors files from VC first."""
+
+ command_name = 'sdist'
+
+ def run(self):
+ _from_git(self.distribution)
+ # sdist.sdist is an old style class, can't use super()
+ sdist.sdist.run(self)
+
+try:
+ from pbr import builddoc
+ _have_sphinx = True
+ # Import the symbols from their new home so the package API stays
+ # compatible.
+ LocalBuildDoc = builddoc.LocalBuildDoc
+ LocalBuildLatex = builddoc.LocalBuildLatex
+except ImportError:
+ _have_sphinx = False
+ LocalBuildDoc = None
+ LocalBuildLatex = None
+
+
+def have_sphinx():
+ return _have_sphinx
+
+
+def _get_increment_kwargs(git_dir, tag):
+ """Calculate the sort of semver increment needed from git history.
+
+ Every commit from HEAD to tag is consider for Sem-Ver metadata lines.
+ See the pbr docs for their syntax.
+
+ :return: a dict of kwargs for passing into SemanticVersion.increment.
+ """
+ result = {}
+ if tag:
+ version_spec = tag + "..HEAD"
+ else:
+ version_spec = "HEAD"
+ changelog = git._run_git_command(['log', version_spec], git_dir)
+ header_len = len(' sem-ver:')
+ commands = [line[header_len:].strip() for line in changelog.split('\n')
+ if line.lower().startswith(' sem-ver:')]
+ symbols = set()
+ for command in commands:
+ symbols.update([symbol.strip() for symbol in command.split(',')])
+
+ def _handle_symbol(symbol, symbols, impact):
+ if symbol in symbols:
+ result[impact] = True
+ symbols.discard(symbol)
+ _handle_symbol('bugfix', symbols, 'patch')
+ _handle_symbol('feature', symbols, 'minor')
+ _handle_symbol('deprecation', symbols, 'minor')
+ _handle_symbol('api-break', symbols, 'major')
+ for symbol in symbols:
+ log.info('[pbr] Unknown Sem-Ver symbol %r' % symbol)
+ # We don't want patch in the kwargs since it is not a keyword argument -
+ # its the default minimum increment.
+ result.pop('patch', None)
+ return result
+
+
+def _get_revno_and_last_tag(git_dir):
+ """Return the commit data about the most recent tag.
+
+ We use git-describe to find this out, but if there are no
+ tags then we fall back to counting commits since the beginning
+ of time.
+ """
+ changelog = git._iter_log_oneline(git_dir=git_dir)
+ row_count = 0
+ for row_count, (ignored, tag_set, ignored) in enumerate(changelog):
+ version_tags = set()
+ for tag in list(tag_set):
+ try:
+ version_tags.add(version.SemanticVersion.from_pip_string(tag))
+ except Exception:
+ pass
+ if version_tags:
+ return max(version_tags).release_string(), row_count
+ return "", row_count
+
+
+def _get_version_from_git_target(git_dir, target_version):
+ """Calculate a version from a target version in git_dir.
+
+ This is used for untagged versions only. A new version is calculated as
+ necessary based on git metadata - distance to tags, current hash, contents
+ of commit messages.
+
+ :param git_dir: The git directory we're working from.
+ :param target_version: If None, the last tagged version (or 0 if there are
+ no tags yet) is incremented as needed to produce an appropriate target
+ version following semver rules. Otherwise target_version is used as a
+ constraint - if semver rules would result in a newer version then an
+ exception is raised.
+ :return: A semver version object.
+ """
+ tag, distance = _get_revno_and_last_tag(git_dir)
+ last_semver = version.SemanticVersion.from_pip_string(tag or '0')
+ if distance == 0:
+ new_version = last_semver
+ else:
+ new_version = last_semver.increment(
+ **_get_increment_kwargs(git_dir, tag))
+ if target_version is not None and new_version > target_version:
+ raise ValueError(
+ "git history requires a target version of %(new)s, but target "
+ "version is %(target)s" %
+ dict(new=new_version, target=target_version))
+ if distance == 0:
+ return last_semver
+ new_dev = new_version.to_dev(distance)
+ if target_version is not None:
+ target_dev = target_version.to_dev(distance)
+ if target_dev > new_dev:
+ return target_dev
+ return new_dev
+
+
+def _get_version_from_git(pre_version=None):
+ """Calculate a version string from git.
+
+ If the revision is tagged, return that. Otherwise calculate a semantic
+ version description of the tree.
+
+ The number of revisions since the last tag is included in the dev counter
+ in the version for untagged versions.
+
+ :param pre_version: If supplied use this as the target version rather than
+ inferring one from the last tag + commit messages.
+ """
+ git_dir = git._run_git_functions()
+ if git_dir:
+ try:
+ tagged = git._run_git_command(
+ ['describe', '--exact-match'], git_dir,
+ throw_on_error=True).replace('-', '.')
+ target_version = version.SemanticVersion.from_pip_string(tagged)
+ except Exception:
+ if pre_version:
+ # not released yet - use pre_version as the target
+ target_version = version.SemanticVersion.from_pip_string(
+ pre_version)
+ else:
+ # not released yet - just calculate from git history
+ target_version = None
+ result = _get_version_from_git_target(git_dir, target_version)
+ return result.release_string()
+ # If we don't know the version, return an empty string so at least
+ # the downstream users of the value always have the same type of
+ # object to work with.
+ try:
+ return unicode()
+ except NameError:
+ return ''
+
+
+def _get_version_from_pkg_metadata(package_name):
+ """Get the version from package metadata if present.
+
+ This looks for PKG-INFO if present (for sdists), and if not looks
+ for METADATA (for wheels) and failing that will return None.
+ """
+ pkg_metadata_filenames = ['PKG-INFO', 'METADATA']
+ pkg_metadata = {}
+ for filename in pkg_metadata_filenames:
+ try:
+ pkg_metadata_file = open(filename, 'r')
+ except (IOError, OSError):
+ continue
+ try:
+ pkg_metadata = email.message_from_file(pkg_metadata_file)
+ except email.MessageError:
+ continue
+
+ # Check to make sure we're in our own dir
+ if pkg_metadata.get('Name', None) != package_name:
+ return None
+ return pkg_metadata.get('Version', None)
+
+
+def get_version(package_name, pre_version=None):
+ """Get the version of the project. First, try getting it from PKG-INFO or
+ METADATA, if it exists. If it does, that means we're in a distribution
+ tarball or that install has happened. Otherwise, if there is no PKG-INFO
+ or METADATA file, pull the version from git.
+
+ We do not support setup.py version sanity in git archive tarballs, nor do
+ we support packagers directly sucking our git repo into theirs. We expect
+ that a source tarball be made from our git repo - or that if someone wants
+ to make a source tarball from a fork of our repo with additional tags in it
+ that they understand and desire the results of doing that.
+
+ :param pre_version: The version field from setup.cfg - if set then this
+ version will be the next release.
+ """
+ version = os.environ.get(
+ "PBR_VERSION",
+ os.environ.get("OSLO_PACKAGE_VERSION", None))
+ if version:
+ return version
+ version = _get_version_from_pkg_metadata(package_name)
+ if version:
+ return version
+ version = _get_version_from_git(pre_version)
+ # Handle http://bugs.python.org/issue11638
+ # version will either be an empty unicode string or a valid
+ # unicode version string, but either way it's unicode and needs to
+ # be encoded.
+ if sys.version_info[0] == 2:
+ version = version.encode('utf-8')
+ if version:
+ return version
+ raise Exception("Versioning for this project requires either an sdist"
+ " tarball, or access to an upstream git repository."
+ " Are you sure that git is installed?")
+
+
+# This is added because pbr uses pbr to install itself. That means that
+# any changes to the egg info writer entrypoints must be forward and
+# backward compatible. This maintains the pbr.packaging.write_pbr_json
+# path.
+write_pbr_json = pbr.pbr_json.write_pbr_json
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/pbr_json.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/pbr_json.py
new file mode 100644
index 0000000..beaa076
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/pbr_json.py
@@ -0,0 +1,34 @@
+# Copyright 2011 OpenStack LLC.
+# Copyright 2012-2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+import json
+
+from pbr import git
+
+
+def write_pbr_json(cmd, basename, filename):
+ if not cmd.distribution.pbr:
+ return
+ git_dir = git._run_git_functions()
+ if not git_dir:
+ return
+ values = dict()
+ git_version = git.get_git_short_sha(git_dir)
+ is_release = git.get_is_release(git_dir)
+ if git_version is not None:
+ values['git_version'] = git_version
+ values['is_release'] = is_release
+ cmd.write_file('pbr', filename, json.dumps(values))
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/testr_command.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/testr_command.py
new file mode 100644
index 0000000..141d715
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/testr_command.py
@@ -0,0 +1,156 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+#
+# Copyright (c) 2013 Testrepository Contributors
+#
+# Licensed under either the Apache License, Version 2.0 or the BSD 3-clause
+# license at the users choice. A copy of both licenses are available in the
+# project source as Apache-2.0 and BSD. You may not use this file except in
+# compliance with one of these two licences.
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under these licenses is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# license you chose for the specific language governing permissions and
+# limitations under that license.
+
+"""setuptools/distutils commands to run testr via setup.py
+
+Currently provides 'testr' which runs tests using testr. You can pass
+--coverage which will also export PYTHON='coverage run --source <your package>'
+and automatically combine the coverage from each testr backend test runner
+after the run completes.
+
+To use, just use setuptools/distribute and depend on testr, and it should be
+picked up automatically (as the commands are exported in the testrepository
+package metadata.
+"""
+
+from distutils import cmd
+import distutils.errors
+import logging
+import os
+import sys
+
+logger = logging.getLogger(__name__)
+
+
+class TestrReal(cmd.Command):
+
+ description = "Run unit tests using testr"
+
+ user_options = [
+ ('coverage', None, "Replace PYTHON with coverage and merge coverage "
+ "from each testr worker."),
+ ('testr-args=', 't', "Run 'testr' with these args"),
+ ('omit=', 'o', "Files to omit from coverage calculations"),
+ ('coverage-package-name=', None, "Use this name for coverage package"),
+ ('slowest', None, "Show slowest test times after tests complete."),
+ ('no-parallel', None, "Run testr serially"),
+ ('log-level=', 'l', "Log level (default: info)"),
+ ]
+
+ boolean_options = ['coverage', 'slowest', 'no_parallel']
+
+ def _run_testr(self, *args):
+ logger.debug("_run_testr called with args = %r", args)
+ return commands.run_argv([sys.argv[0]] + list(args),
+ sys.stdin, sys.stdout, sys.stderr)
+
+ def initialize_options(self):
+ self.testr_args = None
+ self.coverage = None
+ self.omit = ""
+ self.slowest = None
+ self.coverage_package_name = None
+ self.no_parallel = None
+ self.log_level = 'info'
+
+ def finalize_options(self):
+ self.log_level = getattr(
+ logging,
+ self.log_level.upper(),
+ logging.INFO)
+ logging.basicConfig(level=self.log_level)
+ logger.debug("finalize_options called")
+ if self.testr_args is None:
+ self.testr_args = []
+ else:
+ self.testr_args = self.testr_args.split()
+ if self.omit:
+ self.omit = "--omit=%s" % self.omit
+ logger.debug("finalize_options: self.__dict__ = %r", self.__dict__)
+
+ def run(self):
+ """Set up testr repo, then run testr."""
+ logger.debug("run called")
+ if not os.path.isdir(".testrepository"):
+ self._run_testr("init")
+
+ if self.coverage:
+ self._coverage_before()
+ if not self.no_parallel:
+ testr_ret = self._run_testr("run", "--parallel", *self.testr_args)
+ else:
+ testr_ret = self._run_testr("run", *self.testr_args)
+ if testr_ret:
+ raise distutils.errors.DistutilsError(
+ "testr failed (%d)" % testr_ret)
+ if self.slowest:
+ print("Slowest Tests")
+ self._run_testr("slowest")
+ if self.coverage:
+ self._coverage_after()
+
+ def _coverage_before(self):
+ logger.debug("_coverage_before called")
+ package = self.distribution.get_name()
+ if package.startswith('python-'):
+ package = package[7:]
+
+ # Use this as coverage package name
+ if self.coverage_package_name:
+ package = self.coverage_package_name
+ options = "--source %s --parallel-mode" % package
+ os.environ['PYTHON'] = ("coverage run %s" % options)
+ logger.debug("os.environ['PYTHON'] = %r", os.environ['PYTHON'])
+
+ def _coverage_after(self):
+ logger.debug("_coverage_after called")
+ os.system("coverage combine")
+ os.system("coverage html -d ./cover %s" % self.omit)
+
+
+class TestrFake(cmd.Command):
+ description = "Run unit tests using testr"
+ user_options = []
+
+ def initialize_options(self):
+ pass
+
+ def finalize_options(self):
+ pass
+
+ def run(self):
+ print("Install testrepository to run 'testr' command properly.")
+
+
+try:
+ from testrepository import commands
+ have_testr = True
+ Testr = TestrReal
+except ImportError:
+ have_testr = False
+ Testr = TestrFake
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/__init__.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/__init__.py
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/base.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/base.py
new file mode 100644
index 0000000..e017b06
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/base.py
@@ -0,0 +1,218 @@
+# Copyright 2010-2011 OpenStack Foundation
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+# Copyright (C) 2013 Association of Universities for Research in Astronomy
+# (AURA)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# 3. The name of AURA and its representatives may not be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+
+"""Common utilities used in testing"""
+
+import os
+import shutil
+import subprocess
+import sys
+
+import fixtures
+import testresources
+import testtools
+from testtools import content
+
+from pbr import options
+
+
+class DiveDir(fixtures.Fixture):
+ """Dive into given directory and return back on cleanup.
+
+ :ivar path: The target directory.
+ """
+
+ def __init__(self, path):
+ self.path = path
+
+ def setUp(self):
+ super(DiveDir, self).setUp()
+ self.addCleanup(os.chdir, os.getcwd())
+ os.chdir(self.path)
+
+
+class BaseTestCase(testtools.TestCase, testresources.ResourcedTestCase):
+
+ def setUp(self):
+ super(BaseTestCase, self).setUp()
+ test_timeout = os.environ.get('OS_TEST_TIMEOUT', 30)
+ try:
+ test_timeout = int(test_timeout)
+ except ValueError:
+ # If timeout value is invalid, fail hard.
+ print("OS_TEST_TIMEOUT set to invalid value"
+ " defaulting to no timeout")
+ test_timeout = 0
+ if test_timeout > 0:
+ self.useFixture(fixtures.Timeout(test_timeout, gentle=True))
+
+ if os.environ.get('OS_STDOUT_CAPTURE') in options.TRUE_VALUES:
+ stdout = self.useFixture(fixtures.StringStream('stdout')).stream
+ self.useFixture(fixtures.MonkeyPatch('sys.stdout', stdout))
+ if os.environ.get('OS_STDERR_CAPTURE') in options.TRUE_VALUES:
+ stderr = self.useFixture(fixtures.StringStream('stderr')).stream
+ self.useFixture(fixtures.MonkeyPatch('sys.stderr', stderr))
+ self.log_fixture = self.useFixture(
+ fixtures.FakeLogger('pbr'))
+
+ # Older git does not have config --local, so create a temporary home
+ # directory to permit using git config --global without stepping on
+ # developer configuration.
+ self.useFixture(fixtures.TempHomeDir())
+ self.useFixture(fixtures.NestedTempfile())
+ self.useFixture(fixtures.FakeLogger())
+ # TODO(lifeless) we should remove PBR_VERSION from the environment.
+ # rather than setting it, because thats not representative - we need to
+ # test non-preversioned codepaths too!
+ self.useFixture(fixtures.EnvironmentVariable('PBR_VERSION', '0.0'))
+
+ self.temp_dir = self.useFixture(fixtures.TempDir()).path
+ self.package_dir = os.path.join(self.temp_dir, 'testpackage')
+ shutil.copytree(os.path.join(os.path.dirname(__file__), 'testpackage'),
+ self.package_dir)
+ self.addCleanup(os.chdir, os.getcwd())
+ os.chdir(self.package_dir)
+ self.addCleanup(self._discard_testpackage)
+ # Tests can opt into non-PBR_VERSION by setting preversioned=False as
+ # an attribute.
+ if not getattr(self, 'preversioned', True):
+ self.useFixture(fixtures.EnvironmentVariable('PBR_VERSION'))
+ setup_cfg_path = os.path.join(self.package_dir, 'setup.cfg')
+ with open(setup_cfg_path, 'rt') as cfg:
+ content = cfg.read()
+ content = content.replace(u'version = 0.1.dev', u'')
+ with open(setup_cfg_path, 'wt') as cfg:
+ cfg.write(content)
+
+ def _discard_testpackage(self):
+ # Remove pbr.testpackage from sys.modules so that it can be freshly
+ # re-imported by the next test
+ for k in list(sys.modules):
+ if (k == 'pbr_testpackage' or
+ k.startswith('pbr_testpackage.')):
+ del sys.modules[k]
+
+ def run_setup(self, *args, **kwargs):
+ return self._run_cmd(sys.executable, ('setup.py',) + args, **kwargs)
+
+ def _run_cmd(self, cmd, args=[], allow_fail=True, cwd=None):
+ """Run a command in the root of the test working copy.
+
+ Runs a command, with the given argument list, in the root of the test
+ working copy--returns the stdout and stderr streams and the exit code
+ from the subprocess.
+
+ :param cwd: If falsy run within the test package dir, otherwise run
+ within the named path.
+ """
+ cwd = cwd or self.package_dir
+ result = _run_cmd([cmd] + list(args), cwd=cwd)
+ if result[2] and not allow_fail:
+ raise Exception("Command failed retcode=%s" % result[2])
+ return result
+
+
+class CapturedSubprocess(fixtures.Fixture):
+ """Run a process and capture its output.
+
+ :attr stdout: The output (a string).
+ :attr stderr: The standard error (a string).
+ :attr returncode: The return code of the process.
+
+ Note that stdout and stderr are decoded from the bytestrings subprocess
+ returns using error=replace.
+ """
+
+ def __init__(self, label, *args, **kwargs):
+ """Create a CapturedSubprocess.
+
+ :param label: A label for the subprocess in the test log. E.g. 'foo'.
+ :param *args: The *args to pass to Popen.
+ :param **kwargs: The **kwargs to pass to Popen.
+ """
+ super(CapturedSubprocess, self).__init__()
+ self.label = label
+ self.args = args
+ self.kwargs = kwargs
+ self.kwargs['stderr'] = subprocess.PIPE
+ self.kwargs['stdin'] = subprocess.PIPE
+ self.kwargs['stdout'] = subprocess.PIPE
+
+ def setUp(self):
+ super(CapturedSubprocess, self).setUp()
+ proc = subprocess.Popen(*self.args, **self.kwargs)
+ out, err = proc.communicate()
+ self.out = out.decode('utf-8', 'replace')
+ self.err = err.decode('utf-8', 'replace')
+ self.addDetail(self.label + '-stdout', content.text_content(self.out))
+ self.addDetail(self.label + '-stderr', content.text_content(self.err))
+ self.returncode = proc.returncode
+ if proc.returncode:
+ raise AssertionError('Failed process %s' % proc.returncode)
+ self.addCleanup(delattr, self, 'out')
+ self.addCleanup(delattr, self, 'err')
+ self.addCleanup(delattr, self, 'returncode')
+
+
+def _run_cmd(args, cwd):
+ """Run the command args in cwd.
+
+ :param args: The command to run e.g. ['git', 'status']
+ :param cwd: The directory to run the comamnd in.
+ :return: ((stdout, stderr), returncode)
+ """
+ p = subprocess.Popen(
+ args, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE, cwd=cwd)
+ streams = tuple(s.decode('latin1').strip() for s in p.communicate())
+ for stream_content in streams:
+ print(stream_content)
+ return (streams) + (p.returncode,)
+
+
+def _config_git():
+ _run_cmd(
+ ['git', 'config', '--global', 'user.email', 'example@example.com'],
+ None)
+ _run_cmd(
+ ['git', 'config', '--global', 'user.name', 'OpenStack Developer'],
+ None)
+ _run_cmd(
+ ['git', 'config', '--global', 'user.signingkey',
+ 'example@example.com'], None)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_commands.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_commands.py
new file mode 100644
index 0000000..74f50df
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_commands.py
@@ -0,0 +1,66 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+#
+# Copyright (C) 2013 Association of Universities for Research in Astronomy
+# (AURA)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# 3. The name of AURA and its representatives may not be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+
+from testtools import content
+
+from pbr.tests import base
+
+
+class TestCommands(base.BaseTestCase):
+ def test_custom_build_py_command(self):
+ """Test custom build_py command.
+
+ Test that a custom subclass of the build_py command runs when listed in
+ the commands [global] option, rather than the normal build command.
+ """
+
+ stdout, stderr, return_code = self.run_setup('build_py')
+ self.addDetail('stdout', content.text_content(stdout))
+ self.addDetail('stderr', content.text_content(stderr))
+ self.assertIn('Running custom build_py command.', stdout)
+ self.assertEqual(return_code, 0)
+
+ def test_custom_rpm_version_py_command(self):
+ """Test custom rpm_version command."""
+ stdout, stderr, return_code = self.run_setup('rpm_version')
+ self.addDetail('stdout', content.text_content(stdout))
+ self.addDetail('stderr', content.text_content(stderr))
+ self.assertIn('Extracting rpm version', stdout)
+ self.assertEqual(return_code, 0)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_core.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_core.py
new file mode 100644
index 0000000..1d1272a
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_core.py
@@ -0,0 +1,147 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+#
+# Copyright (C) 2013 Association of Universities for Research in Astronomy
+# (AURA)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# 3. The name of AURA and its representatives may not be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+
+import glob
+import os
+import tarfile
+
+import fixtures
+
+from pbr.tests import base
+
+
+class TestCore(base.BaseTestCase):
+
+ cmd_names = ('pbr_test_cmd', 'pbr_test_cmd_with_class')
+
+ def check_script_install(self, install_stdout):
+ for cmd_name in self.cmd_names:
+ install_txt = 'Installing %s script to %s' % (cmd_name,
+ self.temp_dir)
+ self.assertIn(install_txt, install_stdout)
+
+ cmd_filename = os.path.join(self.temp_dir, cmd_name)
+
+ script_txt = open(cmd_filename, 'r').read()
+ self.assertNotIn('pkg_resources', script_txt)
+
+ stdout, _, return_code = self._run_cmd(cmd_filename)
+ self.assertIn("PBR", stdout)
+
+ def test_setup_py_keywords(self):
+ """setup.py --keywords.
+
+ Test that the `./setup.py --keywords` command returns the correct
+ value without balking.
+ """
+
+ self.run_setup('egg_info')
+ stdout, _, _ = self.run_setup('--keywords')
+ assert stdout == 'packaging,distutils,setuptools'
+
+ def test_sdist_extra_files(self):
+ """Test that the extra files are correctly added."""
+
+ stdout, _, return_code = self.run_setup('sdist', '--formats=gztar')
+
+ # There can be only one
+ try:
+ tf_path = glob.glob(os.path.join('dist', '*.tar.gz'))[0]
+ except IndexError:
+ assert False, 'source dist not found'
+
+ tf = tarfile.open(tf_path)
+ names = ['/'.join(p.split('/')[1:]) for p in tf.getnames()]
+
+ self.assertIn('extra-file.txt', names)
+
+ def test_console_script_install(self):
+ """Test that we install a non-pkg-resources console script."""
+
+ if os.name == 'nt':
+ self.skipTest('Windows support is passthrough')
+
+ stdout, _, return_code = self.run_setup(
+ 'install_scripts', '--install-dir=%s' % self.temp_dir)
+
+ self.useFixture(
+ fixtures.EnvironmentVariable('PYTHONPATH', '.'))
+
+ self.check_script_install(stdout)
+
+ def test_console_script_develop(self):
+ """Test that we develop a non-pkg-resources console script."""
+
+ if os.name == 'nt':
+ self.skipTest('Windows support is passthrough')
+
+ self.useFixture(
+ fixtures.EnvironmentVariable(
+ 'PYTHONPATH', ".:%s" % self.temp_dir))
+
+ stdout, _, return_code = self.run_setup(
+ 'develop', '--install-dir=%s' % self.temp_dir)
+
+ self.check_script_install(stdout)
+
+
+class TestGitSDist(base.BaseTestCase):
+
+ def setUp(self):
+ super(TestGitSDist, self).setUp()
+
+ stdout, _, return_code = self._run_cmd('git', ('init',))
+ if return_code:
+ self.skipTest("git not installed")
+
+ stdout, _, return_code = self._run_cmd('git', ('add', '.'))
+ stdout, _, return_code = self._run_cmd(
+ 'git', ('commit', '-m', 'Turn this into a git repo'))
+
+ stdout, _, return_code = self.run_setup('sdist', '--formats=gztar')
+
+ def test_sdist_git_extra_files(self):
+ """Test that extra files found in git are correctly added."""
+ # There can be only one
+ tf_path = glob.glob(os.path.join('dist', '*.tar.gz'))[0]
+ tf = tarfile.open(tf_path)
+ names = ['/'.join(p.split('/')[1:]) for p in tf.getnames()]
+
+ self.assertIn('git-extra-file.txt', names)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_files.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_files.py
new file mode 100644
index 0000000..e60b6ca
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_files.py
@@ -0,0 +1,78 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+from __future__ import print_function
+
+import os
+
+import fixtures
+
+from pbr.hooks import files
+from pbr.tests import base
+
+
+class FilesConfigTest(base.BaseTestCase):
+
+ def setUp(self):
+ super(FilesConfigTest, self).setUp()
+
+ pkg_fixture = fixtures.PythonPackage(
+ "fake_package", [
+ ("fake_module.py", b""),
+ ("other_fake_module.py", b""),
+ ])
+ self.useFixture(pkg_fixture)
+ pkg_etc = os.path.join(pkg_fixture.base, 'etc')
+ pkg_sub = os.path.join(pkg_etc, 'sub')
+ subpackage = os.path.join(
+ pkg_fixture.base, 'fake_package', 'subpackage')
+ os.makedirs(pkg_sub)
+ os.makedirs(subpackage)
+ with open(os.path.join(pkg_etc, "foo"), 'w') as foo_file:
+ foo_file.write("Foo Data")
+ with open(os.path.join(pkg_sub, "bar"), 'w') as foo_file:
+ foo_file.write("Bar Data")
+ with open(os.path.join(subpackage, "__init__.py"), 'w') as foo_file:
+ foo_file.write("# empty")
+
+ self.useFixture(base.DiveDir(pkg_fixture.base))
+
+ def test_implicit_auto_package(self):
+ config = dict(
+ files=dict(
+ )
+ )
+ files.FilesConfig(config, 'fake_package').run()
+ self.assertIn('subpackage', config['files']['packages'])
+
+ def test_auto_package(self):
+ config = dict(
+ files=dict(
+ packages='fake_package',
+ )
+ )
+ files.FilesConfig(config, 'fake_package').run()
+ self.assertIn('subpackage', config['files']['packages'])
+
+ def test_data_files_globbing(self):
+ config = dict(
+ files=dict(
+ data_files="\n etc/pbr = etc/*"
+ )
+ )
+ files.FilesConfig(config, 'fake_package').run()
+ self.assertIn(
+ '\netc/pbr/ = \n etc/foo\netc/pbr/sub = \n etc/sub/bar',
+ config['files']['data_files'])
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_hooks.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_hooks.py
new file mode 100644
index 0000000..e355408
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_hooks.py
@@ -0,0 +1,100 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+#
+# Copyright (C) 2013 Association of Universities for Research in Astronomy
+# (AURA)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# 3. The name of AURA and its representatives may not be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+
+import os
+import textwrap
+
+from testtools.content import text_content
+from testtools.matchers import Contains, EndsWith
+
+from pbr.tests import base
+from pbr.tests import util
+
+
+class TestHooks(base.BaseTestCase):
+ def setUp(self):
+ super(TestHooks, self).setUp()
+ with util.open_config(
+ os.path.join(self.package_dir, 'setup.cfg')) as cfg:
+ cfg.set('global', 'setup-hooks',
+ 'pbr_testpackage._setup_hooks.test_hook_1\n'
+ 'pbr_testpackage._setup_hooks.test_hook_2')
+ cfg.set('build_ext', 'pre-hook.test_pre_hook',
+ 'pbr_testpackage._setup_hooks.test_pre_hook')
+ cfg.set('build_ext', 'post-hook.test_post_hook',
+ 'pbr_testpackage._setup_hooks.test_post_hook')
+
+ def test_global_setup_hooks(self):
+ """Test setup_hooks.
+
+ Test that setup_hooks listed in the [global] section of setup.cfg are
+ executed in order.
+ """
+
+ stdout, _, return_code = self.run_setup('egg_info')
+ assert 'test_hook_1\ntest_hook_2' in stdout
+ assert return_code == 0
+
+ def test_command_hooks(self):
+ """Test command hooks.
+
+ Simple test that the appropriate command hooks run at the
+ beginning/end of the appropriate command.
+ """
+
+ stdout, _, return_code = self.run_setup('egg_info')
+ assert 'build_ext pre-hook' not in stdout
+ assert 'build_ext post-hook' not in stdout
+ assert return_code == 0
+
+ stdout, stderr, return_code = self.run_setup('build_ext')
+ self.addDetailUniqueName('stderr', text_content(stderr))
+ assert textwrap.dedent("""
+ running build_ext
+ running pre_hook pbr_testpackage._setup_hooks.test_pre_hook for command build_ext
+ build_ext pre-hook
+ """) in stdout # flake8: noqa
+ self.expectThat(stdout, EndsWith('build_ext post-hook'))
+ assert return_code == 0
+
+ def test_custom_commands_known(self):
+ stdout, _, return_code = self.run_setup('--help-commands')
+ self.assertFalse(return_code)
+ self.assertThat(stdout, Contains(" testr "))
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_integration.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_integration.py
new file mode 100644
index 0000000..e3adce3
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_integration.py
@@ -0,0 +1,122 @@
+# Licensed 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.
+
+import os.path
+import shlex
+
+import fixtures
+import testscenarios
+import testtools
+import virtualenv
+
+from pbr.tests import base
+
+PIPFLAGS = shlex.split(os.environ.get('PIPFLAGS', ''))
+PIPVERSION = os.environ.get('PIPVERSION', 'pip')
+PBRVERSION = os.environ.get('PBRVERSION', 'pbr')
+REPODIR = os.environ.get('REPODIR', '')
+WHEELHOUSE = os.environ.get('WHEELHOUSE', '')
+PIP_CMD = ['-m', 'pip'] + PIPFLAGS + ['install', '-f', WHEELHOUSE]
+PROJECTS = shlex.split(os.environ.get('PROJECTS', ''))
+
+
+def all_projects():
+ if not REPODIR:
+ return
+ # Future: make this path parameterisable.
+ excludes = set(['pypi-mirror', 'jeepyb', 'tempest', 'requirements'])
+ for name in PROJECTS:
+ name = name.strip()
+ short_name = name.split('/')[-1]
+ try:
+ with open(os.path.join(
+ REPODIR, short_name, 'setup.py'), 'rt') as f:
+ if 'pbr' not in f.read():
+ continue
+ except IOError:
+ continue
+ if short_name in excludes:
+ continue
+ yield (short_name, dict(name=name, short_name=short_name))
+
+
+class TestIntegration(base.BaseTestCase):
+
+ scenarios = list(all_projects())
+
+ def setUp(self):
+ # Integration tests need a higher default - big repos can be slow to
+ # clone, particularly under guest load.
+ os.environ['OS_TEST_TIMEOUT'] = os.environ.get('OS_TEST_TIMEOUT',
+ '600')
+ super(TestIntegration, self).setUp()
+ base._config_git()
+
+ def venv(self, reason):
+ path = self.useFixture(fixtures.TempDir()).path
+ virtualenv.create_environment(path, clear=True)
+ python = os.path.join(path, 'bin', 'python')
+ self.useFixture(base.CapturedSubprocess(
+ 'mkvenv-' + reason, [python] + PIP_CMD + [
+ '-U', PIPVERSION, 'wheel', PBRVERSION]))
+ return path, python
+
+ @testtools.skipUnless(
+ os.environ.get('PBR_INTEGRATION', None) == '1',
+ 'integration tests not enabled')
+ def test_integration(self):
+ # Test that we can:
+ # - run sdist from the repo in a venv
+ # - install the resulting tarball in a new venv
+ # - pip install the repo
+ # - pip install -e the repo
+ # We don't break these into separate tests because we'd need separate
+ # source dirs to isolate from side effects of running pip, and the
+ # overheads of setup would start to beat the benefits of parallelism.
+ self.useFixture(base.CapturedSubprocess(
+ 'sync-req',
+ ['python', 'update.py', os.path.join(REPODIR, self.short_name)],
+ cwd=os.path.join(REPODIR, 'requirements')))
+ self.useFixture(base.CapturedSubprocess(
+ 'commit-requirements',
+ 'git diff --quiet || git commit -amrequirements',
+ cwd=os.path.join(REPODIR, self.short_name), shell=True))
+ path = os.path.join(
+ self.useFixture(fixtures.TempDir()).path, 'project')
+ self.useFixture(base.CapturedSubprocess(
+ 'clone',
+ ['git', 'clone', os.path.join(REPODIR, self.short_name), path]))
+ _, python = self.venv('sdist')
+ self.useFixture(base.CapturedSubprocess(
+ 'sdist', [python, 'setup.py', 'sdist'], cwd=path))
+ _, python = self.venv('tarball')
+ filename = os.path.join(
+ path, 'dist', os.listdir(os.path.join(path, 'dist'))[0])
+ self.useFixture(base.CapturedSubprocess(
+ 'tarball', [python] + PIP_CMD + [filename]))
+ root, python = self.venv('install-git')
+ self.useFixture(base.CapturedSubprocess(
+ 'install-git', [python] + PIP_CMD + ['git+file://' + path]))
+ if self.short_name == 'nova':
+ found = False
+ for _, _, filenames in os.walk(root):
+ if 'migrate.cfg' in filenames:
+ found = True
+ self.assertTrue(found)
+ _, python = self.venv('install-e')
+ self.useFixture(base.CapturedSubprocess(
+ 'install-e', [python] + PIP_CMD + ['-e', path]))
+
+
+def load_tests(loader, in_tests, pattern):
+ return testscenarios.load_tests_apply_scenarios(loader, in_tests, pattern)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_packaging.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_packaging.py
new file mode 100644
index 0000000..9e56fd8
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_packaging.py
@@ -0,0 +1,520 @@
+# Copyright (c) 2013 New Dream Network, LLC (DreamHost)
+#
+# Licensed 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.
+#
+# Copyright (C) 2013 Association of Universities for Research in Astronomy
+# (AURA)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# 3. The name of AURA and its representatives may not be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+
+import os
+import re
+import sys
+import tempfile
+import textwrap
+
+import fixtures
+import mock
+import pkg_resources
+import six
+import testscenarios
+from testtools import matchers
+
+from pbr import git
+from pbr import packaging
+from pbr.tests import base
+
+
+class TestRepo(fixtures.Fixture):
+ """A git repo for testing with.
+
+ Use of TempHomeDir with this fixture is strongly recommended as due to the
+ lack of config --local in older gits, it will write to the users global
+ configuration without TempHomeDir.
+ """
+
+ def __init__(self, basedir):
+ super(TestRepo, self).__init__()
+ self._basedir = basedir
+
+ def setUp(self):
+ super(TestRepo, self).setUp()
+ base._run_cmd(['git', 'init', '.'], self._basedir)
+ base._config_git()
+ base._run_cmd(['git', 'add', '.'], self._basedir)
+
+ def commit(self, message_content='test commit'):
+ files = len(os.listdir(self._basedir))
+ path = self._basedir + '/%d' % files
+ open(path, 'wt').close()
+ base._run_cmd(['git', 'add', path], self._basedir)
+ base._run_cmd(['git', 'commit', '-m', message_content], self._basedir)
+
+ def uncommit(self):
+ base._run_cmd(['git', 'reset', '--hard', 'HEAD^'], self._basedir)
+
+ def tag(self, version):
+ base._run_cmd(
+ ['git', 'tag', '-sm', 'test tag', version], self._basedir)
+
+
+class GPGKeyFixture(fixtures.Fixture):
+ """Creates a GPG key for testing.
+
+ It's recommended that this be used in concert with a unique home
+ directory.
+ """
+
+ def setUp(self):
+ super(GPGKeyFixture, self).setUp()
+ tempdir = self.useFixture(fixtures.TempDir())
+ gnupg_version_re = re.compile('^gpg\s.*\s([\d+])\.([\d+])\.([\d+])')
+ gnupg_version = base._run_cmd(['gpg', '--version'], tempdir.path)
+ for line in gnupg_version[0].split('\n'):
+ gnupg_version = gnupg_version_re.match(line)
+ if gnupg_version:
+ gnupg_version = (int(gnupg_version.group(1)),
+ int(gnupg_version.group(2)),
+ int(gnupg_version.group(3)))
+ break
+ else:
+ if gnupg_version is None:
+ gnupg_version = (0, 0, 0)
+ config_file = tempdir.path + '/key-config'
+ f = open(config_file, 'wt')
+ try:
+ if gnupg_version[0] == 2 and gnupg_version[1] >= 1:
+ f.write("""
+ %no-protection
+ %transient-key
+ """)
+ f.write("""
+ %no-ask-passphrase
+ Key-Type: RSA
+ Name-Real: Example Key
+ Name-Comment: N/A
+ Name-Email: example@example.com
+ Expire-Date: 2d
+ Preferences: (setpref)
+ %commit
+ """)
+ finally:
+ f.close()
+ # Note that --quick-random (--debug-quick-random in GnuPG 2.x)
+ # does not have a corresponding preferences file setting and
+ # must be passed explicitly on the command line instead
+ if gnupg_version[0] == 1:
+ gnupg_random = '--quick-random'
+ elif gnupg_version[0] >= 2:
+ gnupg_random = '--debug-quick-random'
+ else:
+ gnupg_random = ''
+ base._run_cmd(
+ ['gpg', '--gen-key', '--batch', gnupg_random, config_file],
+ tempdir.path)
+
+
+class TestPackagingInGitRepoWithCommit(base.BaseTestCase):
+
+ scenarios = [
+ ('preversioned', dict(preversioned=True)),
+ ('postversioned', dict(preversioned=False)),
+ ]
+
+ def setUp(self):
+ super(TestPackagingInGitRepoWithCommit, self).setUp()
+ repo = self.useFixture(TestRepo(self.package_dir))
+ repo.commit()
+
+ def test_authors(self):
+ self.run_setup('sdist', allow_fail=False)
+ # One commit, something should be in the authors list
+ with open(os.path.join(self.package_dir, 'AUTHORS'), 'r') as f:
+ body = f.read()
+ self.assertNotEqual(body, '')
+
+ def test_changelog(self):
+ self.run_setup('sdist', allow_fail=False)
+ with open(os.path.join(self.package_dir, 'ChangeLog'), 'r') as f:
+ body = f.read()
+ # One commit, something should be in the ChangeLog list
+ self.assertNotEqual(body, '')
+
+ def test_manifest_exclude_honoured(self):
+ self.run_setup('sdist', allow_fail=False)
+ with open(os.path.join(
+ self.package_dir,
+ 'pbr_testpackage.egg-info/SOURCES.txt'), 'r') as f:
+ body = f.read()
+ self.assertThat(
+ body, matchers.Not(matchers.Contains('pbr_testpackage/extra.py')))
+ self.assertThat(body, matchers.Contains('pbr_testpackage/__init__.py'))
+
+ def test_install_writes_changelog(self):
+ stdout, _, _ = self.run_setup(
+ 'install', '--root', self.temp_dir + 'installed',
+ allow_fail=False)
+ self.expectThat(stdout, matchers.Contains('Generating ChangeLog'))
+
+
+class TestPackagingInGitRepoWithoutCommit(base.BaseTestCase):
+
+ def setUp(self):
+ super(TestPackagingInGitRepoWithoutCommit, self).setUp()
+ self.useFixture(TestRepo(self.package_dir))
+ self.run_setup('sdist', allow_fail=False)
+
+ def test_authors(self):
+ # No commits, no authors in list
+ with open(os.path.join(self.package_dir, 'AUTHORS'), 'r') as f:
+ body = f.read()
+ self.assertEqual(body, '\n')
+
+ def test_changelog(self):
+ # No commits, nothing should be in the ChangeLog list
+ with open(os.path.join(self.package_dir, 'ChangeLog'), 'r') as f:
+ body = f.read()
+ self.assertEqual(body, 'CHANGES\n=======\n\n')
+
+
+class TestPackagingInPlainDirectory(base.BaseTestCase):
+
+ def setUp(self):
+ super(TestPackagingInPlainDirectory, self).setUp()
+
+ def test_authors(self):
+ self.run_setup('sdist', allow_fail=False)
+ # Not a git repo, no AUTHORS file created
+ filename = os.path.join(self.package_dir, 'AUTHORS')
+ self.assertFalse(os.path.exists(filename))
+
+ def test_changelog(self):
+ self.run_setup('sdist', allow_fail=False)
+ # Not a git repo, no ChangeLog created
+ filename = os.path.join(self.package_dir, 'ChangeLog')
+ self.assertFalse(os.path.exists(filename))
+
+ def test_install_no_ChangeLog(self):
+ stdout, _, _ = self.run_setup(
+ 'install', '--root', self.temp_dir + 'installed',
+ allow_fail=False)
+ self.expectThat(
+ stdout, matchers.Not(matchers.Contains('Generating ChangeLog')))
+
+
+class TestPresenceOfGit(base.BaseTestCase):
+
+ def testGitIsInstalled(self):
+ with mock.patch.object(git,
+ '_run_shell_command') as _command:
+ _command.return_value = 'git version 1.8.4.1'
+ self.assertEqual(True, git._git_is_installed())
+
+ def testGitIsNotInstalled(self):
+ with mock.patch.object(git,
+ '_run_shell_command') as _command:
+ _command.side_effect = OSError
+ self.assertEqual(False, git._git_is_installed())
+
+
+class TestNestedRequirements(base.BaseTestCase):
+
+ def test_nested_requirement(self):
+ tempdir = tempfile.mkdtemp()
+ requirements = os.path.join(tempdir, 'requirements.txt')
+ nested = os.path.join(tempdir, 'nested.txt')
+ with open(requirements, 'w') as f:
+ f.write('-r ' + nested)
+ with open(nested, 'w') as f:
+ f.write('pbr')
+ result = packaging.parse_requirements([requirements])
+ self.assertEqual(result, ['pbr'])
+
+
+class TestVersions(base.BaseTestCase):
+
+ scenarios = [
+ ('preversioned', dict(preversioned=True)),
+ ('postversioned', dict(preversioned=False)),
+ ]
+
+ def setUp(self):
+ super(TestVersions, self).setUp()
+ self.repo = self.useFixture(TestRepo(self.package_dir))
+ self.useFixture(GPGKeyFixture())
+ self.useFixture(base.DiveDir(self.package_dir))
+
+ def test_capitalized_headers(self):
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ self.repo.commit('Sem-Ver: api-break')
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('2.0.0.dev1'))
+
+ def test_capitalized_headers_partial(self):
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ self.repo.commit('Sem-ver: api-break')
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('2.0.0.dev1'))
+
+ def test_tagged_version_has_tag_version(self):
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ version = packaging._get_version_from_git('1.2.3')
+ self.assertEqual('1.2.3', version)
+
+ def test_untagged_version_has_dev_version_postversion(self):
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ self.repo.commit()
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('1.2.4.dev1'))
+
+ def test_untagged_pre_release_has_pre_dev_version_postversion(self):
+ self.repo.commit()
+ self.repo.tag('1.2.3.0a1')
+ self.repo.commit()
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('1.2.3.0a2.dev1'))
+
+ def test_untagged_version_minor_bump(self):
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ self.repo.commit('sem-ver: deprecation')
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('1.3.0.dev1'))
+
+ def test_untagged_version_major_bump(self):
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ self.repo.commit('sem-ver: api-break')
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('2.0.0.dev1'))
+
+ def test_untagged_version_has_dev_version_preversion(self):
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ self.repo.commit()
+ version = packaging._get_version_from_git('1.2.5')
+ self.assertThat(version, matchers.StartsWith('1.2.5.dev1'))
+
+ def test_untagged_version_after_pre_has_dev_version_preversion(self):
+ self.repo.commit()
+ self.repo.tag('1.2.3.0a1')
+ self.repo.commit()
+ version = packaging._get_version_from_git('1.2.5')
+ self.assertThat(version, matchers.StartsWith('1.2.5.dev1'))
+
+ def test_untagged_version_after_rc_has_dev_version_preversion(self):
+ self.repo.commit()
+ self.repo.tag('1.2.3.0a1')
+ self.repo.commit()
+ version = packaging._get_version_from_git('1.2.3')
+ self.assertThat(version, matchers.StartsWith('1.2.3.0a2.dev1'))
+
+ def test_preversion_too_low_simple(self):
+ # That is, the target version is either already released or not high
+ # enough for the semver requirements given api breaks etc.
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ self.repo.commit()
+ # Note that we can't target 1.2.3 anymore - with 1.2.3 released we
+ # need to be working on 1.2.4.
+ err = self.assertRaises(
+ ValueError, packaging._get_version_from_git, '1.2.3')
+ self.assertThat(err.args[0], matchers.StartsWith('git history'))
+
+ def test_preversion_too_low_semver_headers(self):
+ # That is, the target version is either already released or not high
+ # enough for the semver requirements given api breaks etc.
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ self.repo.commit('sem-ver: feature')
+ # Note that we can't target 1.2.4, the feature header means we need
+ # to be working on 1.3.0 or above.
+ err = self.assertRaises(
+ ValueError, packaging._get_version_from_git, '1.2.4')
+ self.assertThat(err.args[0], matchers.StartsWith('git history'))
+
+ def test_get_kwargs_corner_cases(self):
+ # No tags:
+ git_dir = self.repo._basedir + '/.git'
+ get_kwargs = lambda tag: packaging._get_increment_kwargs(git_dir, tag)
+
+ def _check_combinations(tag):
+ self.repo.commit()
+ self.assertEqual(dict(), get_kwargs(tag))
+ self.repo.commit('sem-ver: bugfix')
+ self.assertEqual(dict(), get_kwargs(tag))
+ self.repo.commit('sem-ver: feature')
+ self.assertEqual(dict(minor=True), get_kwargs(tag))
+ self.repo.uncommit()
+ self.repo.commit('sem-ver: deprecation')
+ self.assertEqual(dict(minor=True), get_kwargs(tag))
+ self.repo.uncommit()
+ self.repo.commit('sem-ver: api-break')
+ self.assertEqual(dict(major=True), get_kwargs(tag))
+ self.repo.commit('sem-ver: deprecation')
+ self.assertEqual(dict(major=True, minor=True), get_kwargs(tag))
+ _check_combinations('')
+ self.repo.tag('1.2.3')
+ _check_combinations('1.2.3')
+
+ def test_invalid_tag_ignored(self):
+ # Fix for bug 1356784 - we treated any tag as a version, not just those
+ # that are valid versions.
+ self.repo.commit()
+ self.repo.tag('1')
+ self.repo.commit()
+ # when the tree is tagged and its wrong:
+ self.repo.tag('badver')
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('1.0.1.dev1'))
+ # When the tree isn't tagged, we also fall through.
+ self.repo.commit()
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('1.0.1.dev2'))
+ # We don't fall through x.y versions
+ self.repo.commit()
+ self.repo.tag('1.2')
+ self.repo.commit()
+ self.repo.tag('badver2')
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('1.2.1.dev1'))
+ # Or x.y.z versions
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ self.repo.commit()
+ self.repo.tag('badver3')
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('1.2.4.dev1'))
+ # Or alpha/beta/pre versions
+ self.repo.commit()
+ self.repo.tag('1.2.4.0a1')
+ self.repo.commit()
+ self.repo.tag('badver4')
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('1.2.4.0a2.dev1'))
+ # Non-release related tags are ignored.
+ self.repo.commit()
+ self.repo.tag('2')
+ self.repo.commit()
+ self.repo.tag('non-release-tag/2014.12.16-1')
+ version = packaging._get_version_from_git()
+ self.assertThat(version, matchers.StartsWith('2.0.1.dev1'))
+
+ def test_valid_tag_honoured(self):
+ # Fix for bug 1370608 - we converted any target into a 'dev version'
+ # even if there was a distance of 0 - indicating that we were on the
+ # tag itself.
+ self.repo.commit()
+ self.repo.tag('1.3.0.0a1')
+ version = packaging._get_version_from_git()
+ self.assertEqual('1.3.0.0a1', version)
+
+ def test_skip_write_git_changelog(self):
+ # Fix for bug 1467440
+ self.repo.commit()
+ self.repo.tag('1.2.3')
+ os.environ['SKIP_WRITE_GIT_CHANGELOG'] = '1'
+ version = packaging._get_version_from_git('1.2.3')
+ self.assertEqual('1.2.3', version)
+
+ def tearDown(self):
+ super(TestVersions, self).tearDown()
+ os.environ.pop('SKIP_WRITE_GIT_CHANGELOG', None)
+
+
+class TestRequirementParsing(base.BaseTestCase):
+
+ def test_requirement_parsing(self):
+ tempdir = self.useFixture(fixtures.TempDir()).path
+ requirements = os.path.join(tempdir, 'requirements.txt')
+ with open(requirements, 'wt') as f:
+ f.write(textwrap.dedent(six.u("""\
+ bar
+ quux<1.0; python_version=='2.6'
+ requests-aws>=0.1.4 # BSD License (3 clause)
+ Routes>=1.12.3,!=2.0,!=2.1;python_version=='2.7'
+ requests-kerberos>=0.6;python_version=='2.7' # MIT
+ """)))
+ setup_cfg = os.path.join(tempdir, 'setup.cfg')
+ with open(setup_cfg, 'wt') as f:
+ f.write(textwrap.dedent(six.u("""\
+ [metadata]
+ name = test_reqparse
+
+ [extras]
+ test =
+ foo
+ baz>3.2 :python_version=='2.7' # MIT
+ bar>3.3 :python_version=='2.7' # MIT # Apache
+ """)))
+ # pkg_resources.split_sections uses None as the title of an
+ # anonymous section instead of the empty string. Weird.
+ expected_requirements = {
+ None: ['bar', 'requests-aws>=0.1.4'],
+ ":(python_version=='2.6')": ['quux<1.0'],
+ ":(python_version=='2.7')": ['Routes>=1.12.3,!=2.0,!=2.1',
+ 'requests-kerberos>=0.6'],
+ 'test': ['foo'],
+ "test:(python_version=='2.7')": ['baz>3.2', 'bar>3.3']
+ }
+
+ setup_py = os.path.join(tempdir, 'setup.py')
+ with open(setup_py, 'wt') as f:
+ f.write(textwrap.dedent(six.u("""\
+ #!/usr/bin/env python
+ import setuptools
+ setuptools.setup(
+ setup_requires=['pbr'],
+ pbr=True,
+ )
+ """)))
+
+ self._run_cmd(sys.executable, (setup_py, 'egg_info'),
+ allow_fail=False, cwd=tempdir)
+ egg_info = os.path.join(tempdir, 'test_reqparse.egg-info')
+
+ requires_txt = os.path.join(egg_info, 'requires.txt')
+ with open(requires_txt, 'rt') as requires:
+ generated_requirements = dict(
+ pkg_resources.split_sections(requires))
+
+ self.assertEqual(expected_requirements, generated_requirements)
+
+
+def load_tests(loader, in_tests, pattern):
+ return testscenarios.load_tests_apply_scenarios(loader, in_tests, pattern)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_setup.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_setup.py
new file mode 100644
index 0000000..3aec296
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_setup.py
@@ -0,0 +1,430 @@
+# Copyright (c) 2011 OpenStack Foundation
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# Licensed 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.
+
+from __future__ import print_function
+
+import os
+import sys
+import tempfile
+
+try:
+ import cStringIO as io
+ BytesIO = io.StringIO
+except ImportError:
+ import io
+ BytesIO = io.BytesIO
+
+import fixtures
+import testscenarios
+
+from pbr import git
+from pbr import options
+from pbr import packaging
+from pbr.tests import base
+
+
+class SkipFileWrites(base.BaseTestCase):
+
+ scenarios = [
+ ('changelog_option_true',
+ dict(option_key='skip_changelog', option_value='True',
+ env_key='SKIP_WRITE_GIT_CHANGELOG', env_value=None,
+ pkg_func=git.write_git_changelog, filename='ChangeLog')),
+ ('changelog_option_false',
+ dict(option_key='skip_changelog', option_value='False',
+ env_key='SKIP_WRITE_GIT_CHANGELOG', env_value=None,
+ pkg_func=git.write_git_changelog, filename='ChangeLog')),
+ ('changelog_env_true',
+ dict(option_key='skip_changelog', option_value='False',
+ env_key='SKIP_WRITE_GIT_CHANGELOG', env_value='True',
+ pkg_func=git.write_git_changelog, filename='ChangeLog')),
+ ('changelog_both_true',
+ dict(option_key='skip_changelog', option_value='True',
+ env_key='SKIP_WRITE_GIT_CHANGELOG', env_value='True',
+ pkg_func=git.write_git_changelog, filename='ChangeLog')),
+ ('authors_option_true',
+ dict(option_key='skip_authors', option_value='True',
+ env_key='SKIP_GENERATE_AUTHORS', env_value=None,
+ pkg_func=git.generate_authors, filename='AUTHORS')),
+ ('authors_option_false',
+ dict(option_key='skip_authors', option_value='False',
+ env_key='SKIP_GENERATE_AUTHORS', env_value=None,
+ pkg_func=git.generate_authors, filename='AUTHORS')),
+ ('authors_env_true',
+ dict(option_key='skip_authors', option_value='False',
+ env_key='SKIP_GENERATE_AUTHORS', env_value='True',
+ pkg_func=git.generate_authors, filename='AUTHORS')),
+ ('authors_both_true',
+ dict(option_key='skip_authors', option_value='True',
+ env_key='SKIP_GENERATE_AUTHORS', env_value='True',
+ pkg_func=git.generate_authors, filename='AUTHORS')),
+ ]
+
+ def setUp(self):
+ super(SkipFileWrites, self).setUp()
+ self.temp_path = self.useFixture(fixtures.TempDir()).path
+ self.root_dir = os.path.abspath(os.path.curdir)
+ self.git_dir = os.path.join(self.root_dir, ".git")
+ if not os.path.exists(self.git_dir):
+ self.skipTest("%s is missing; skipping git-related checks"
+ % self.git_dir)
+ return
+ self.filename = os.path.join(self.temp_path, self.filename)
+ self.option_dict = dict()
+ if self.option_key is not None:
+ self.option_dict[self.option_key] = ('setup.cfg',
+ self.option_value)
+ self.useFixture(
+ fixtures.EnvironmentVariable(self.env_key, self.env_value))
+
+ def test_skip(self):
+ self.pkg_func(git_dir=self.git_dir,
+ dest_dir=self.temp_path,
+ option_dict=self.option_dict)
+ self.assertEqual(
+ not os.path.exists(self.filename),
+ (self.option_value.lower() in options.TRUE_VALUES
+ or self.env_value is not None))
+
+_changelog_content = """04316fe (review/monty_taylor/27519) Make python
+378261a Add an integration test script.
+3c373ac (HEAD, tag: 2013.2.rc2, tag: 2013.2, milestone-proposed) Merge "Lib
+182feb3 (tag: 0.5.17) Fix pip invocation for old versions of pip.
+fa4f46e (tag: 0.5.16) Remove explicit depend on distribute.
+d1c53dd Use pip instead of easy_install for installation.
+a793ea1 Merge "Skip git-checkout related tests when .git is missing"
+6c27ce7 Skip git-checkout related tests when .git is missing
+04984a5 Refactor hooks file.
+a65e8ee (tag: 0.5.14, tag: 0.5.13) Remove jinja pin.
+"""
+
+
+class GitLogsTest(base.BaseTestCase):
+
+ def setUp(self):
+ super(GitLogsTest, self).setUp()
+ self.temp_path = self.useFixture(fixtures.TempDir()).path
+ self.root_dir = os.path.abspath(os.path.curdir)
+ self.git_dir = os.path.join(self.root_dir, ".git")
+ self.useFixture(
+ fixtures.EnvironmentVariable('SKIP_GENERATE_AUTHORS'))
+ self.useFixture(
+ fixtures.EnvironmentVariable('SKIP_WRITE_GIT_CHANGELOG'))
+
+ def test_write_git_changelog(self):
+ self.useFixture(fixtures.FakePopen(lambda _: {
+ "stdout": BytesIO(_changelog_content.encode('utf-8'))
+ }))
+
+ git.write_git_changelog(git_dir=self.git_dir,
+ dest_dir=self.temp_path)
+
+ with open(os.path.join(self.temp_path, "ChangeLog"), "r") as ch_fh:
+ changelog_contents = ch_fh.read()
+ self.assertIn("2013.2", changelog_contents)
+ self.assertIn("0.5.17", changelog_contents)
+ self.assertIn("------", changelog_contents)
+ self.assertIn("Refactor hooks file", changelog_contents)
+ self.assertNotIn("Refactor hooks file.", changelog_contents)
+ self.assertNotIn("182feb3", changelog_contents)
+ self.assertNotIn("review/monty_taylor/27519", changelog_contents)
+ self.assertNotIn("0.5.13", changelog_contents)
+ self.assertNotIn('Merge "', changelog_contents)
+
+ def test_generate_authors(self):
+ author_old = u"Foo Foo <email@foo.com>"
+ author_new = u"Bar Bar <email@bar.com>"
+ co_author = u"Foo Bar <foo@bar.com>"
+ co_author_by = u"Co-authored-by: " + co_author
+
+ git_log_cmd = (
+ "git --git-dir=%s log --format=%%aN <%%aE>"
+ % self.git_dir)
+ git_co_log_cmd = ("git --git-dir=%s log" % self.git_dir)
+ git_top_level = "git rev-parse --show-toplevel"
+ cmd_map = {
+ git_log_cmd: author_new,
+ git_co_log_cmd: co_author_by,
+ git_top_level: self.root_dir,
+ }
+
+ exist_files = [self.git_dir,
+ os.path.join(self.temp_path, "AUTHORS.in")]
+ self.useFixture(fixtures.MonkeyPatch(
+ "os.path.exists",
+ lambda path: os.path.abspath(path) in exist_files))
+
+ def _fake_run_shell_command(cmd, **kwargs):
+ return cmd_map[" ".join(cmd)]
+
+ self.useFixture(fixtures.MonkeyPatch(
+ "pbr.git._run_shell_command",
+ _fake_run_shell_command))
+
+ with open(os.path.join(self.temp_path, "AUTHORS.in"), "w") as auth_fh:
+ auth_fh.write("%s\n" % author_old)
+
+ git.generate_authors(git_dir=self.git_dir,
+ dest_dir=self.temp_path)
+
+ with open(os.path.join(self.temp_path, "AUTHORS"), "r") as auth_fh:
+ authors = auth_fh.read()
+ self.assertTrue(author_old in authors)
+ self.assertTrue(author_new in authors)
+ self.assertTrue(co_author in authors)
+
+
+class BuildSphinxTest(base.BaseTestCase):
+
+ scenarios = [
+ ('true_autodoc_caps',
+ dict(has_opt=True, autodoc='True', has_autodoc=True)),
+ ('true_autodoc_caps_with_excludes',
+ dict(has_opt=True, autodoc='True', has_autodoc=True,
+ excludes="fake_package.fake_private_module\n"
+ "fake_package.another_fake_*\n"
+ "fake_package.unknown_module")),
+ ('true_autodoc_lower',
+ dict(has_opt=True, autodoc='true', has_autodoc=True)),
+ ('false_autodoc',
+ dict(has_opt=True, autodoc='False', has_autodoc=False)),
+ ('no_autodoc',
+ dict(has_opt=False, autodoc='False', has_autodoc=False)),
+ ]
+
+ def setUp(self):
+ super(BuildSphinxTest, self).setUp()
+
+ self.useFixture(fixtures.MonkeyPatch(
+ "sphinx.setup_command.BuildDoc.run", lambda self: None))
+ from distutils import dist
+ self.distr = dist.Distribution()
+ self.distr.packages = ("fake_package",)
+ self.distr.command_options["build_sphinx"] = {
+ "source_dir": ["a", "."]}
+ pkg_fixture = fixtures.PythonPackage(
+ "fake_package", [("fake_module.py", b""),
+ ("another_fake_module_for_testing.py", b""),
+ ("fake_private_module.py", b"")])
+ self.useFixture(pkg_fixture)
+ self.useFixture(base.DiveDir(pkg_fixture.base))
+ self.distr.command_options["pbr"] = {}
+ if hasattr(self, "excludes"):
+ self.distr.command_options["pbr"]["autodoc_exclude_modules"] = (
+ 'setup.cfg',
+ "fake_package.fake_private_module\n"
+ "fake_package.another_fake_*\n"
+ "fake_package.unknown_module")
+ if self.has_opt:
+ options = self.distr.command_options["pbr"]
+ options["autodoc_index_modules"] = ('setup.cfg', self.autodoc)
+
+ def test_build_doc(self):
+ build_doc = packaging.LocalBuildDoc(self.distr)
+ build_doc.run()
+
+ self.assertTrue(
+ os.path.exists("api/autoindex.rst") == self.has_autodoc)
+ self.assertTrue(
+ os.path.exists(
+ "api/fake_package.fake_module.rst") == self.has_autodoc)
+ if not self.has_autodoc or hasattr(self, "excludes"):
+ assertion = self.assertFalse
+ else:
+ assertion = self.assertTrue
+ assertion(
+ os.path.exists(
+ "api/fake_package.fake_private_module.rst"))
+ assertion(
+ os.path.exists(
+ "api/fake_package.another_fake_module_for_testing.rst"))
+
+ def test_builders_config(self):
+ build_doc = packaging.LocalBuildDoc(self.distr)
+ build_doc.finalize_options()
+
+ self.assertEqual(2, len(build_doc.builders))
+ self.assertIn('html', build_doc.builders)
+ self.assertIn('man', build_doc.builders)
+
+ build_doc = packaging.LocalBuildDoc(self.distr)
+ build_doc.builders = ''
+ build_doc.finalize_options()
+
+ self.assertEqual('', build_doc.builders)
+
+ build_doc = packaging.LocalBuildDoc(self.distr)
+ build_doc.builders = 'man'
+ build_doc.finalize_options()
+
+ self.assertEqual(1, len(build_doc.builders))
+ self.assertIn('man', build_doc.builders)
+
+ build_doc = packaging.LocalBuildDoc(self.distr)
+ build_doc.builders = 'html,man,doctest'
+ build_doc.finalize_options()
+
+ self.assertIn('html', build_doc.builders)
+ self.assertIn('man', build_doc.builders)
+ self.assertIn('doctest', build_doc.builders)
+
+ def test_cmd_builder_override(self):
+
+ if self.has_opt:
+ self.distr.command_options["pbr"] = {
+ "autodoc_index_modules": ('setup.cfg', self.autodoc)
+ }
+
+ self.distr.command_options["build_sphinx"]["builder"] = (
+ "command line", "non-existing-builder")
+
+ build_doc = packaging.LocalBuildDoc(self.distr)
+ self.assertNotIn('non-existing-builder', build_doc.builders)
+ self.assertIn('html', build_doc.builders)
+
+ # process command line options which should override config
+ build_doc.finalize_options()
+
+ self.assertIn('non-existing-builder', build_doc.builders)
+ self.assertNotIn('html', build_doc.builders)
+
+ def test_cmd_builder_override_multiple_builders(self):
+
+ if self.has_opt:
+ self.distr.command_options["pbr"] = {
+ "autodoc_index_modules": ('setup.cfg', self.autodoc)
+ }
+
+ self.distr.command_options["build_sphinx"]["builder"] = (
+ "command line", "builder1,builder2")
+
+ build_doc = packaging.LocalBuildDoc(self.distr)
+ build_doc.finalize_options()
+
+ self.assertEqual(["builder1", "builder2"], build_doc.builders)
+
+
+class ParseRequirementsTest(base.BaseTestCase):
+
+ def setUp(self):
+ super(ParseRequirementsTest, self).setUp()
+ (fd, self.tmp_file) = tempfile.mkstemp(prefix='openstack',
+ suffix='.setup')
+
+ def test_parse_requirements_normal(self):
+ with open(self.tmp_file, 'w') as fh:
+ fh.write("foo\nbar")
+ self.assertEqual(['foo', 'bar'],
+ packaging.parse_requirements([self.tmp_file]))
+
+ def test_parse_requirements_with_git_egg_url(self):
+ with open(self.tmp_file, 'w') as fh:
+ fh.write("-e git://foo.com/zipball#egg=bar")
+ self.assertEqual(['bar'],
+ packaging.parse_requirements([self.tmp_file]))
+
+ def test_parse_requirements_with_versioned_git_egg_url(self):
+ with open(self.tmp_file, 'w') as fh:
+ fh.write("-e git://foo.com/zipball#egg=bar-1.2.4")
+ self.assertEqual(['bar>=1.2.4'],
+ packaging.parse_requirements([self.tmp_file]))
+
+ def test_parse_requirements_with_http_egg_url(self):
+ with open(self.tmp_file, 'w') as fh:
+ fh.write("https://foo.com/zipball#egg=bar")
+ self.assertEqual(['bar'],
+ packaging.parse_requirements([self.tmp_file]))
+
+ def test_parse_requirements_with_versioned_http_egg_url(self):
+ with open(self.tmp_file, 'w') as fh:
+ fh.write("https://foo.com/zipball#egg=bar-4.2.1")
+ self.assertEqual(['bar>=4.2.1'],
+ packaging.parse_requirements([self.tmp_file]))
+
+ def test_parse_requirements_removes_index_lines(self):
+ with open(self.tmp_file, 'w') as fh:
+ fh.write("-f foobar")
+ self.assertEqual([], packaging.parse_requirements([self.tmp_file]))
+
+ def test_parse_requirements_override_with_env(self):
+ with open(self.tmp_file, 'w') as fh:
+ fh.write("foo\nbar")
+ self.useFixture(
+ fixtures.EnvironmentVariable('PBR_REQUIREMENTS_FILES',
+ self.tmp_file))
+ self.assertEqual(['foo', 'bar'],
+ packaging.parse_requirements())
+
+ def test_parse_requirements_override_with_env_multiple_files(self):
+ with open(self.tmp_file, 'w') as fh:
+ fh.write("foo\nbar")
+ self.useFixture(
+ fixtures.EnvironmentVariable('PBR_REQUIREMENTS_FILES',
+ "no-such-file," + self.tmp_file))
+ self.assertEqual(['foo', 'bar'],
+ packaging.parse_requirements())
+
+ def test_get_requirement_from_file_empty(self):
+ actual = packaging.get_reqs_from_files([])
+ self.assertEqual([], actual)
+
+ def test_parse_requirements_with_comments(self):
+ with open(self.tmp_file, 'w') as fh:
+ fh.write("# this is a comment\nfoobar\n# and another one\nfoobaz")
+ self.assertEqual(['foobar', 'foobaz'],
+ packaging.parse_requirements([self.tmp_file]))
+
+ def test_parse_requirements_python_version(self):
+ with open("requirements-py%d.txt" % sys.version_info[0],
+ "w") as fh:
+ fh.write("# this is a comment\nfoobar\n# and another one\nfoobaz")
+ self.assertEqual(['foobar', 'foobaz'],
+ packaging.parse_requirements())
+
+ def test_parse_requirements_right_python_version(self):
+ with open("requirements-py1.txt", "w") as fh:
+ fh.write("thisisatrap")
+ with open("requirements-py%d.txt" % sys.version_info[0],
+ "w") as fh:
+ fh.write("# this is a comment\nfoobar\n# and another one\nfoobaz")
+ self.assertEqual(['foobar', 'foobaz'],
+ packaging.parse_requirements())
+
+
+class ParseDependencyLinksTest(base.BaseTestCase):
+
+ def setUp(self):
+ super(ParseDependencyLinksTest, self).setUp()
+ (fd, self.tmp_file) = tempfile.mkstemp(prefix="openstack",
+ suffix=".setup")
+
+ def test_parse_dependency_normal(self):
+ with open(self.tmp_file, "w") as fh:
+ fh.write("http://test.com\n")
+ self.assertEqual(
+ ["http://test.com"],
+ packaging.parse_dependency_links([self.tmp_file]))
+
+ def test_parse_dependency_with_git_egg_url(self):
+ with open(self.tmp_file, "w") as fh:
+ fh.write("-e git://foo.com/zipball#egg=bar")
+ self.assertEqual(
+ ["git://foo.com/zipball#egg=bar"],
+ packaging.parse_dependency_links([self.tmp_file]))
+
+
+def load_tests(loader, in_tests, pattern):
+ return testscenarios.load_tests_apply_scenarios(loader, in_tests, pattern)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_util.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_util.py
new file mode 100644
index 0000000..5999b17
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_util.py
@@ -0,0 +1,80 @@
+# Copyright (c) 2015 Hewlett-Packard Development Company, L.P. (HP)
+#
+# Licensed 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.
+
+import io
+import textwrap
+
+import six
+from six.moves import configparser
+import testscenarios
+
+from pbr.tests import base
+from pbr import util
+
+
+class TestExtrasRequireParsingScenarios(base.BaseTestCase):
+
+ scenarios = [
+ ('simple_extras', {
+ 'config_text': """
+ [extras]
+ first =
+ foo
+ bar==1.0
+ second =
+ baz>=3.2
+ foo
+ """,
+ 'expected_extra_requires': {'first': ['foo', 'bar==1.0'],
+ 'second': ['baz>=3.2', 'foo']}
+ }),
+ ('with_markers', {
+ 'config_text': """
+ [extras]
+ test =
+ foo:python_version=='2.6'
+ bar
+ baz<1.6 :python_version=='2.6'
+ """,
+ 'expected_extra_requires': {
+ "test:(python_version=='2.6')": ['foo', 'baz<1.6'],
+ "test": ['bar']}}),
+ ('no_extras', {
+ 'config_text': """
+ [metadata]
+ long_description = foo
+ """,
+ 'expected_extra_requires':
+ {}
+ })]
+
+ def config_from_ini(self, ini):
+ config = {}
+ parser = configparser.SafeConfigParser()
+ ini = textwrap.dedent(six.u(ini))
+ parser.readfp(io.StringIO(ini))
+ for section in parser.sections():
+ config[section] = dict(parser.items(section))
+ return config
+
+ def test_extras_parsing(self):
+ config = self.config_from_ini(self.config_text)
+ kwargs = util.setup_cfg_to_setup_kwargs(config)
+
+ self.assertEqual(self.expected_extra_requires,
+ kwargs['extras_require'])
+
+
+def load_tests(loader, in_tests, pattern):
+ return testscenarios.load_tests_apply_scenarios(loader, in_tests, pattern)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_version.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_version.py
new file mode 100644
index 0000000..14c8d17
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_version.py
@@ -0,0 +1,298 @@
+# Copyright 2012 Red Hat, Inc.
+# Copyright 2012-2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+
+import itertools
+
+from testtools import matchers
+
+from pbr.tests import base
+from pbr import version
+
+
+from_pip_string = version.SemanticVersion.from_pip_string
+
+
+class TestSemanticVersion(base.BaseTestCase):
+
+ def test_ordering(self):
+ ordered_versions = [
+ "1.2.3.dev6",
+ "1.2.3.dev7",
+ "1.2.3.a4.dev12",
+ "1.2.3.a4.dev13",
+ "1.2.3.a4",
+ "1.2.3.a5.dev1",
+ "1.2.3.a5",
+ "1.2.3.b3.dev1",
+ "1.2.3.b3",
+ "1.2.3.rc2.dev1",
+ "1.2.3.rc2",
+ "1.2.3.rc3.dev1",
+ "1.2.3",
+ "1.2.4",
+ "1.3.3",
+ "2.2.3",
+ ]
+ for v in ordered_versions:
+ sv = version.SemanticVersion.from_pip_string(v)
+ self.expectThat(sv, matchers.Equals(sv))
+ for left, right in itertools.combinations(ordered_versions, 2):
+ l_pos = ordered_versions.index(left)
+ r_pos = ordered_versions.index(right)
+ if l_pos < r_pos:
+ m1 = matchers.LessThan
+ m2 = matchers.GreaterThan
+ else:
+ m1 = matchers.GreaterThan
+ m2 = matchers.LessThan
+ left_sv = version.SemanticVersion.from_pip_string(left)
+ right_sv = version.SemanticVersion.from_pip_string(right)
+ self.expectThat(left_sv, m1(right_sv))
+ self.expectThat(right_sv, m2(left_sv))
+
+ def test_from_pip_string_legacy_alpha(self):
+ expected = version.SemanticVersion(
+ 1, 2, 0, prerelease_type='rc', prerelease=1)
+ parsed = from_pip_string('1.2.0rc1')
+ self.assertEqual(expected, parsed)
+
+ def test_from_pip_string_legacy_postN(self):
+ # When pbr trunk was incompatible with PEP-440, a stable release was
+ # made that used postN versions to represent developer builds. As
+ # we expect only to be parsing versions of our own, we map those
+ # into dev builds of the next version.
+ expected = version.SemanticVersion(1, 2, 4, dev_count=5)
+ parsed = from_pip_string('1.2.3.post5')
+ self.expectThat(expected, matchers.Equals(parsed))
+ expected = version.SemanticVersion(1, 2, 3, 'a', 5, dev_count=6)
+ parsed = from_pip_string('1.2.3.0a4.post6')
+ self.expectThat(expected, matchers.Equals(parsed))
+ # We can't define a mapping for .postN.devM, so it should raise.
+ self.expectThat(
+ lambda: from_pip_string('1.2.3.post5.dev6'),
+ matchers.raises(ValueError))
+
+ def test_from_pip_string_legacy_nonzero_lead_in(self):
+ # reported in bug 1361251
+ expected = version.SemanticVersion(
+ 0, 0, 1, prerelease_type='a', prerelease=2)
+ parsed = from_pip_string('0.0.1a2')
+ self.assertEqual(expected, parsed)
+
+ def test_from_pip_string_legacy_short_nonzero_lead_in(self):
+ expected = version.SemanticVersion(
+ 0, 1, 0, prerelease_type='a', prerelease=2)
+ parsed = from_pip_string('0.1a2')
+ self.assertEqual(expected, parsed)
+
+ def test_from_pip_string_legacy_no_0_prerelease(self):
+ expected = version.SemanticVersion(
+ 2, 1, 0, prerelease_type='rc', prerelease=1)
+ parsed = from_pip_string('2.1.0.rc1')
+ self.assertEqual(expected, parsed)
+
+ def test_from_pip_string_legacy_no_0_prerelease_2(self):
+ expected = version.SemanticVersion(
+ 2, 0, 0, prerelease_type='rc', prerelease=1)
+ parsed = from_pip_string('2.0.0.rc1')
+ self.assertEqual(expected, parsed)
+
+ def test_from_pip_string_legacy_non_440_beta(self):
+ expected = version.SemanticVersion(
+ 2014, 2, prerelease_type='b', prerelease=2)
+ parsed = from_pip_string('2014.2.b2')
+ self.assertEqual(expected, parsed)
+
+ def test_from_pip_string_pure_git_hash(self):
+ self.assertRaises(ValueError, from_pip_string, '6eed5ae')
+
+ def test_from_pip_string_non_digit_start(self):
+ self.assertRaises(ValueError, from_pip_string,
+ 'non-release-tag/2014.12.16-1')
+
+ def test_final_version(self):
+ semver = version.SemanticVersion(1, 2, 3)
+ self.assertEqual((1, 2, 3, 'final', 0), semver.version_tuple())
+ self.assertEqual("1.2.3", semver.brief_string())
+ self.assertEqual("1.2.3", semver.debian_string())
+ self.assertEqual("1.2.3", semver.release_string())
+ self.assertEqual("1.2.3", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.3"))
+
+ def test_parsing_short_forms(self):
+ semver = version.SemanticVersion(1, 0, 0)
+ self.assertEqual(semver, from_pip_string("1"))
+ self.assertEqual(semver, from_pip_string("1.0"))
+ self.assertEqual(semver, from_pip_string("1.0.0"))
+
+ def test_dev_version(self):
+ semver = version.SemanticVersion(1, 2, 4, dev_count=5)
+ self.assertEqual((1, 2, 4, 'dev', 4), semver.version_tuple())
+ self.assertEqual("1.2.4", semver.brief_string())
+ self.assertEqual("1.2.4~dev5", semver.debian_string())
+ self.assertEqual("1.2.4.dev5", semver.release_string())
+ self.assertEqual("1.2.3.dev5", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.4.dev5"))
+
+ def test_dev_no_git_version(self):
+ semver = version.SemanticVersion(1, 2, 4, dev_count=5)
+ self.assertEqual((1, 2, 4, 'dev', 4), semver.version_tuple())
+ self.assertEqual("1.2.4", semver.brief_string())
+ self.assertEqual("1.2.4~dev5", semver.debian_string())
+ self.assertEqual("1.2.4.dev5", semver.release_string())
+ self.assertEqual("1.2.3.dev5", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.4.dev5"))
+
+ def test_dev_zero_version(self):
+ semver = version.SemanticVersion(1, 2, 0, dev_count=5)
+ self.assertEqual((1, 2, 0, 'dev', 4), semver.version_tuple())
+ self.assertEqual("1.2.0", semver.brief_string())
+ self.assertEqual("1.2.0~dev5", semver.debian_string())
+ self.assertEqual("1.2.0.dev5", semver.release_string())
+ self.assertEqual("1.1.9999.dev5", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.0.dev5"))
+
+ def test_alpha_dev_version(self):
+ semver = version.SemanticVersion(1, 2, 4, 'a', 1, 12)
+ self.assertEqual((1, 2, 4, 'alphadev', 12), semver.version_tuple())
+ self.assertEqual("1.2.4", semver.brief_string())
+ self.assertEqual("1.2.4~a1.dev12", semver.debian_string())
+ self.assertEqual("1.2.4.0a1.dev12", semver.release_string())
+ self.assertEqual("1.2.3.a1.dev12", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.4.0a1.dev12"))
+
+ def test_alpha_version(self):
+ semver = version.SemanticVersion(1, 2, 4, 'a', 1)
+ self.assertEqual((1, 2, 4, 'alpha', 1), semver.version_tuple())
+ self.assertEqual("1.2.4", semver.brief_string())
+ self.assertEqual("1.2.4~a1", semver.debian_string())
+ self.assertEqual("1.2.4.0a1", semver.release_string())
+ self.assertEqual("1.2.3.a1", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.4.0a1"))
+
+ def test_alpha_zero_version(self):
+ semver = version.SemanticVersion(1, 2, 0, 'a', 1)
+ self.assertEqual((1, 2, 0, 'alpha', 1), semver.version_tuple())
+ self.assertEqual("1.2.0", semver.brief_string())
+ self.assertEqual("1.2.0~a1", semver.debian_string())
+ self.assertEqual("1.2.0.0a1", semver.release_string())
+ self.assertEqual("1.1.9999.a1", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.0.0a1"))
+
+ def test_alpha_major_zero_version(self):
+ semver = version.SemanticVersion(1, 0, 0, 'a', 1)
+ self.assertEqual((1, 0, 0, 'alpha', 1), semver.version_tuple())
+ self.assertEqual("1.0.0", semver.brief_string())
+ self.assertEqual("1.0.0~a1", semver.debian_string())
+ self.assertEqual("1.0.0.0a1", semver.release_string())
+ self.assertEqual("0.9999.9999.a1", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.0.0.0a1"))
+
+ def test_alpha_default_version(self):
+ semver = version.SemanticVersion(1, 2, 4, 'a')
+ self.assertEqual((1, 2, 4, 'alpha', 0), semver.version_tuple())
+ self.assertEqual("1.2.4", semver.brief_string())
+ self.assertEqual("1.2.4~a0", semver.debian_string())
+ self.assertEqual("1.2.4.0a0", semver.release_string())
+ self.assertEqual("1.2.3.a0", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.4.0a0"))
+
+ def test_beta_dev_version(self):
+ semver = version.SemanticVersion(1, 2, 4, 'b', 1, 12)
+ self.assertEqual((1, 2, 4, 'betadev', 12), semver.version_tuple())
+ self.assertEqual("1.2.4", semver.brief_string())
+ self.assertEqual("1.2.4~b1.dev12", semver.debian_string())
+ self.assertEqual("1.2.4.0b1.dev12", semver.release_string())
+ self.assertEqual("1.2.3.b1.dev12", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.4.0b1.dev12"))
+
+ def test_beta_version(self):
+ semver = version.SemanticVersion(1, 2, 4, 'b', 1)
+ self.assertEqual((1, 2, 4, 'beta', 1), semver.version_tuple())
+ self.assertEqual("1.2.4", semver.brief_string())
+ self.assertEqual("1.2.4~b1", semver.debian_string())
+ self.assertEqual("1.2.4.0b1", semver.release_string())
+ self.assertEqual("1.2.3.b1", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.4.0b1"))
+
+ def test_decrement_nonrelease(self):
+ # The prior version of any non-release is a release
+ semver = version.SemanticVersion(1, 2, 4, 'b', 1)
+ self.assertEqual(
+ version.SemanticVersion(1, 2, 3), semver.decrement())
+
+ def test_decrement_nonrelease_zero(self):
+ # We set an arbitrary max version of 9999 when decrementing versions
+ # - this is part of handling rpm support.
+ semver = version.SemanticVersion(1, 0, 0)
+ self.assertEqual(
+ version.SemanticVersion(0, 9999, 9999), semver.decrement())
+
+ def test_decrement_release(self):
+ # The next patch version of a release version requires a change to the
+ # patch level.
+ semver = version.SemanticVersion(2, 2, 5)
+ self.assertEqual(
+ version.SemanticVersion(2, 2, 4), semver.decrement())
+
+ def test_increment_nonrelease(self):
+ # The next patch version of a non-release version is another
+ # non-release version as the next release doesn't need to be
+ # incremented.
+ semver = version.SemanticVersion(1, 2, 4, 'b', 1)
+ self.assertEqual(
+ version.SemanticVersion(1, 2, 4, 'b', 2), semver.increment())
+ # Major and minor increments however need to bump things.
+ self.assertEqual(
+ version.SemanticVersion(1, 3, 0), semver.increment(minor=True))
+ self.assertEqual(
+ version.SemanticVersion(2, 0, 0), semver.increment(major=True))
+
+ def test_increment_release(self):
+ # The next patch version of a release version requires a change to the
+ # patch level.
+ semver = version.SemanticVersion(1, 2, 5)
+ self.assertEqual(
+ version.SemanticVersion(1, 2, 6), semver.increment())
+ self.assertEqual(
+ version.SemanticVersion(1, 3, 0), semver.increment(minor=True))
+ self.assertEqual(
+ version.SemanticVersion(2, 0, 0), semver.increment(major=True))
+
+ def test_rc_dev_version(self):
+ semver = version.SemanticVersion(1, 2, 4, 'rc', 1, 12)
+ self.assertEqual((1, 2, 4, 'candidatedev', 12), semver.version_tuple())
+ self.assertEqual("1.2.4", semver.brief_string())
+ self.assertEqual("1.2.4~rc1.dev12", semver.debian_string())
+ self.assertEqual("1.2.4.0rc1.dev12", semver.release_string())
+ self.assertEqual("1.2.3.rc1.dev12", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.4.0rc1.dev12"))
+
+ def test_rc_version(self):
+ semver = version.SemanticVersion(1, 2, 4, 'rc', 1)
+ self.assertEqual((1, 2, 4, 'candidate', 1), semver.version_tuple())
+ self.assertEqual("1.2.4", semver.brief_string())
+ self.assertEqual("1.2.4~rc1", semver.debian_string())
+ self.assertEqual("1.2.4.0rc1", semver.release_string())
+ self.assertEqual("1.2.3.rc1", semver.rpm_string())
+ self.assertEqual(semver, from_pip_string("1.2.4.0rc1"))
+
+ def test_to_dev(self):
+ self.assertEqual(
+ version.SemanticVersion(1, 2, 3, dev_count=1),
+ version.SemanticVersion(1, 2, 3).to_dev(1))
+ self.assertEqual(
+ version.SemanticVersion(1, 2, 3, 'rc', 1, dev_count=1),
+ version.SemanticVersion(1, 2, 3, 'rc', 1).to_dev(1))
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_wsgi.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_wsgi.py
new file mode 100644
index 0000000..ea65fed
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/test_wsgi.py
@@ -0,0 +1,171 @@
+# Copyright (c) 2015 Hewlett-Packard Development Company, L.P. (HP)
+#
+# Licensed 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.
+
+import os
+import re
+import subprocess
+import sys
+import tempfile
+import time
+try:
+ # python 2
+ from urllib2 import urlopen
+except ImportError:
+ # python 3
+ from urllib.request import urlopen
+
+import fixtures
+
+from pbr.tests import base
+
+
+class TestWsgiScripts(base.BaseTestCase):
+
+ cmd_names = ('pbr_test_wsgi', 'pbr_test_wsgi_with_class')
+
+ def test_wsgi_script_install(self):
+ """Test that we install a non-pkg-resources wsgi script."""
+ if os.name == 'nt':
+ self.skipTest('Windows support is passthrough')
+
+ stdout, _, return_code = self.run_setup(
+ 'install', '--prefix=%s' % self.temp_dir)
+
+ self.useFixture(
+ fixtures.EnvironmentVariable(
+ 'PYTHONPATH', ".:%s/lib/python%s.%s/site-packages" % (
+ self.temp_dir,
+ sys.version_info[0],
+ sys.version_info[1])))
+
+ self._check_wsgi_install_content(stdout)
+
+ def test_wsgi_script_run(self):
+ """Test that we install a runnable wsgi script.
+
+ This test actually attempts to start and interact with the
+ wsgi script in question to demonstrate that it's a working
+ wsgi script using simple server. It's a bit hokey because of
+ process management that has to be done.
+
+ """
+ self.skipTest("Test skipped until we can determine a reliable "
+ "way to capture subprocess stdout without blocking")
+
+ if os.name == 'nt':
+ self.skipTest('Windows support is passthrough')
+
+ stdout, _, return_code = self.run_setup(
+ 'install', '--prefix=%s' % self.temp_dir)
+
+ self.useFixture(
+ fixtures.EnvironmentVariable(
+ 'PYTHONPATH', ".:%s/lib/python%s.%s/site-packages" % (
+ self.temp_dir,
+ sys.version_info[0],
+ sys.version_info[1])))
+ # NOTE(sdague): making python unbuffered is critical to
+ # getting output out of the subprocess.
+ self.useFixture(
+ fixtures.EnvironmentVariable(
+ 'PYTHONUNBUFFERED', '1'))
+
+ self._check_wsgi_install_content(stdout)
+
+ # Live test run the scripts and see that they respond to wsgi
+ # requests.
+ self._test_wsgi()
+
+ def _test_wsgi(self):
+ for cmd_name in self.cmd_names:
+ cmd = os.path.join(self.temp_dir, 'bin', cmd_name)
+ stdout = tempfile.NamedTemporaryFile()
+ print("Running %s > %s" % (cmd, stdout.name))
+ # NOTE(sdague): ok, this looks a little janky, and it
+ # is. However getting python to not hang with
+ # popen.communicate is beyond me.
+ #
+ # We're opening with a random port (so no conflicts), and
+ # redirecting all stdout and stderr to files. We can then
+ # safely read these files and not deadlock later in the
+ # test. This requires shell expansion.
+ p = subprocess.Popen(
+ "%s -p 0 > %s 2>&1" % (cmd, stdout.name),
+ shell=True,
+ close_fds=True,
+ cwd=self.temp_dir)
+
+ self.addCleanup(p.kill)
+
+ # the sleep is important to force a context switch to the
+ # subprocess
+ time.sleep(0.1)
+
+ stdoutdata = stdout.read()
+ self.assertIn(
+ "STARTING test server pbr_testpackage.wsgi",
+ stdoutdata)
+ self.assertIn(
+ "DANGER! For testing only, do not use in production",
+ stdoutdata)
+
+ m = re.search('(http://[^:]+:\d+)/', stdoutdata)
+ self.assertIsNotNone(m, "Regex failed to match on %s" % stdoutdata)
+
+ f = urlopen(m.group(1))
+ self.assertEqual("Hello World", f.read())
+
+ # the sleep is important to force a context switch to the
+ # subprocess
+ time.sleep(0.1)
+
+ # Kill off the child, it should force a flush of the stdout.
+ p.kill()
+ time.sleep(0.1)
+
+ stdoutdata = stdout.read()
+ # we should have logged an HTTP request, return code 200, that
+ # returned 11 bytes
+ self.assertIn('"GET / HTTP/1.1" 200 11', stdoutdata)
+
+ def _check_wsgi_install_content(self, install_stdout):
+ for cmd_name in self.cmd_names:
+ install_txt = 'Installing %s script to %s' % (cmd_name,
+ self.temp_dir)
+ self.assertIn(install_txt, install_stdout)
+
+ cmd_filename = os.path.join(self.temp_dir, 'bin', cmd_name)
+
+ script_txt = open(cmd_filename, 'r').read()
+ self.assertNotIn('pkg_resources', script_txt)
+
+ main_block = """if __name__ == "__main__":
+ import argparse
+ import socket
+ import wsgiref.simple_server as wss"""
+
+ if cmd_name == 'pbr_test_wsgi':
+ app_name = "main"
+ else:
+ app_name = "WSGI.app"
+
+ starting_block = ("STARTING test server pbr_testpackage.wsgi."
+ "%s" % app_name)
+
+ else_block = """else:
+ application = None"""
+
+ self.assertIn(main_block, script_txt)
+ self.assertIn(starting_block, script_txt)
+ self.assertIn(else_block, script_txt)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/CHANGES.txt b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/CHANGES.txt
new file mode 100644
index 0000000..709b9d4
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/CHANGES.txt
@@ -0,0 +1,86 @@
+Changelog
+===========
+
+0.3 (unreleased)
+------------------
+
+- The ``glob_data_files`` hook became a pre-command hook for the install_data
+ command instead of being a setup-hook. This is to support the additional
+ functionality of requiring data_files with relative destination paths to be
+ install relative to the package's install path (i.e. site-packages).
+
+- Dropped support for and deprecated the easier_install custom command.
+ Although it should still work, it probably won't be used anymore for
+ stsci_python packages.
+
+- Added support for the ``build_optional_ext`` command, which replaces/extends
+ the default ``build_ext`` command. See the README for more details.
+
+- Added the ``tag_svn_revision`` setup_hook as a replacement for the
+ setuptools-specific tag_svn_revision option to the egg_info command. This
+ new hook is easier to use than the old tag_svn_revision option: It's
+ automatically enabled by the presence of ``.dev`` in the version string, and
+ disabled otherwise.
+
+- The ``svn_info_pre_hook`` and ``svn_info_post_hook`` have been replaced with
+ ``version_pre_command_hook`` and ``version_post_command_hook`` respectively.
+ However, a new ``version_setup_hook``, which has the same purpose, has been
+ added. It is generally easier to use and will give more consistent results
+ in that it will run every time setup.py is run, regardless of which command
+ is used. ``stsci.distutils`` itself uses this hook--see the `setup.cfg` file
+ and `stsci/distutils/__init__.py` for example usage.
+
+- Instead of creating an `svninfo.py` module, the new ``version_`` hooks create
+ a file called `version.py`. In addition to the SVN info that was included
+ in `svninfo.py`, it includes a ``__version__`` variable to be used by the
+ package's `__init__.py`. This allows there to be a hard-coded
+ ``__version__`` variable included in the source code, rather than using
+ pkg_resources to get the version.
+
+- In `version.py`, the variables previously named ``__svn_version__`` and
+ ``__full_svn_info__`` are now named ``__svn_revision__`` and
+ ``__svn_full_info__``.
+
+- Fixed a bug when using stsci.distutils in the installation of other packages
+ in the ``stsci.*`` namespace package. If stsci.distutils was not already
+ installed, and was downloaded automatically by distribute through the
+ setup_requires option, then ``stsci.distutils`` would fail to import. This
+ is because the way the namespace package (nspkg) mechanism currently works,
+ all packages belonging to the nspkg *must* be on the import path at initial
+ import time.
+
+ So when installing stsci.tools, for example, if ``stsci.tools`` is imported
+ from within the source code at install time, but before ``stsci.distutils``
+ is downloaded and added to the path, the ``stsci`` package is already
+ imported and can't be extended to include the path of ``stsci.distutils``
+ after the fact. The easiest way of dealing with this, it seems, is to
+ delete ``stsci`` from ``sys.modules``, which forces it to be reimported, now
+ the its ``__path__`` extended to include ``stsci.distutil``'s path.
+
+
+0.2.2 (2011-11-09)
+------------------
+
+- Fixed check for the issue205 bug on actual setuptools installs; before it
+ only worked on distribute. setuptools has the issue205 bug prior to version
+ 0.6c10.
+
+- Improved the fix for the issue205 bug, especially on setuptools.
+ setuptools, prior to 0.6c10, did not back of sys.modules either before
+ sandboxing, which causes serious problems. In fact, it's so bad that it's
+ not enough to add a sys.modules backup to the current sandbox: It's in fact
+ necessary to monkeypatch setuptools.sandbox.run_setup so that any subsequent
+ calls to it also back up sys.modules.
+
+
+0.2.1 (2011-09-02)
+------------------
+
+- Fixed the dependencies so that setuptools is requirement but 'distribute'
+ specifically. Previously installation could fail if users had plain
+ setuptools installed and not distribute
+
+0.2 (2011-08-23)
+------------------
+
+- Initial public release
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/LICENSE.txt b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/LICENSE.txt
new file mode 100644
index 0000000..7e8019a
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/LICENSE.txt
@@ -0,0 +1,29 @@
+Copyright (C) 2005 Association of Universities for Research in Astronomy (AURA)
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ 3. The name of AURA and its representatives may not be used to
+ endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/MANIFEST.in b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/MANIFEST.in
new file mode 100644
index 0000000..2e35f3e
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/MANIFEST.in
@@ -0,0 +1,2 @@
+include data_files/*
+exclude pbr_testpackage/extra.py
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/README.txt b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/README.txt
new file mode 100644
index 0000000..b6d84a7
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/README.txt
@@ -0,0 +1,148 @@
+Introduction
+============
+This package contains utilities used to package some of STScI's Python
+projects; specifically those projects that comprise stsci_python_ and
+Astrolib_.
+
+It currently consists mostly of some setup_hook scripts meant for use with
+`distutils2/packaging`_ and/or pbr_, and a customized easy_install command
+meant for use with distribute_.
+
+This package is not meant for general consumption, though it might be worth
+looking at for examples of how to do certain things with your own packages, but
+YMMV.
+
+Features
+========
+
+Hook Scripts
+------------
+Currently the main features of this package are a couple of setup_hook scripts.
+In distutils2, a setup_hook is a script that runs at the beginning of any
+pysetup command, and can modify the package configuration read from setup.cfg.
+There are also pre- and post-command hooks that only run before/after a
+specific setup command (eg. build_ext, install) is run.
+
+stsci.distutils.hooks.use_packages_root
+'''''''''''''''''''''''''''''''''''''''
+If using the ``packages_root`` option under the ``[files]`` section of
+setup.cfg, this hook will add that path to ``sys.path`` so that modules in your
+package can be imported and used in setup. This can be used even if
+``packages_root`` is not specified--in this case it adds ``''`` to
+``sys.path``.
+
+stsci.distutils.hooks.version_setup_hook
+''''''''''''''''''''''''''''''''''''''''
+Creates a Python module called version.py which currently contains four
+variables:
+
+* ``__version__`` (the release version)
+* ``__svn_revision__`` (the SVN revision info as returned by the ``svnversion``
+ command)
+* ``__svn_full_info__`` (as returned by the ``svn info`` command)
+* ``__setup_datetime__`` (the date and time that setup.py was last run).
+
+These variables can be imported in the package's `__init__.py` for degugging
+purposes. The version.py module will *only* be created in a package that
+imports from the version module in its `__init__.py`. It should be noted that
+this is generally preferable to writing these variables directly into
+`__init__.py`, since this provides more control and is less likely to
+unexpectedly break things in `__init__.py`.
+
+stsci.distutils.hooks.version_pre_command_hook
+''''''''''''''''''''''''''''''''''''''''''''''
+Identical to version_setup_hook, but designed to be used as a pre-command
+hook.
+
+stsci.distutils.hooks.version_post_command_hook
+'''''''''''''''''''''''''''''''''''''''''''''''
+The complement to version_pre_command_hook. This will delete any version.py
+files created during a build in order to prevent them from cluttering an SVN
+working copy (note, however, that version.py is *not* deleted from the build/
+directory, so a copy of it is still preserved). It will also not be deleted
+if the current directory is not an SVN working copy. For example, if source
+code extracted from a source tarball it will be preserved.
+
+stsci.distutils.hooks.tag_svn_revision
+''''''''''''''''''''''''''''''''''''''
+A setup_hook to add the SVN revision of the current working copy path to the
+package version string, but only if the version ends in .dev.
+
+For example, ``mypackage-1.0.dev`` becomes ``mypackage-1.0.dev1234``. This is
+in accordance with the version string format standardized by PEP 386.
+
+This should be used as a replacement for the ``tag_svn_revision`` option to
+the egg_info command. This hook is more compatible with packaging/distutils2,
+which does not include any VCS support. This hook is also more flexible in
+that it turns the revision number on/off depending on the presence of ``.dev``
+in the version string, so that it's not automatically added to the version in
+final releases.
+
+This hook does require the ``svnversion`` command to be available in order to
+work. It does not examine the working copy metadata directly.
+
+stsci.distutils.hooks.numpy_extension_hook
+''''''''''''''''''''''''''''''''''''''''''
+This is a pre-command hook for the build_ext command. To use it, add a
+``[build_ext]`` section to your setup.cfg, and add to it::
+
+ pre-hook.numpy-extension-hook = stsci.distutils.hooks.numpy_extension_hook
+
+This hook must be used to build extension modules that use Numpy. The primary
+side-effect of this hook is to add the correct numpy include directories to
+`include_dirs`. To use it, add 'numpy' to the 'include-dirs' option of each
+extension module that requires numpy to build. The value 'numpy' will be
+replaced with the actual path to the numpy includes.
+
+stsci.distutils.hooks.is_display_option
+'''''''''''''''''''''''''''''''''''''''
+This is not actually a hook, but is a useful utility function that can be used
+in writing other hooks. Basically, it returns ``True`` if setup.py was run
+with a "display option" such as --version or --help. This can be used to
+prevent your hook from running in such cases.
+
+stsci.distutils.hooks.glob_data_files
+'''''''''''''''''''''''''''''''''''''
+A pre-command hook for the install_data command. Allows filename wildcards as
+understood by ``glob.glob()`` to be used in the data_files option. This hook
+must be used in order to have this functionality since it does not normally
+exist in distutils.
+
+This hook also ensures that data files are installed relative to the package
+path. data_files shouldn't normally be installed this way, but the
+functionality is required for a few special cases.
+
+
+Commands
+--------
+build_optional_ext
+''''''''''''''''''
+This serves as an optional replacement for the default built_ext command,
+which compiles C extension modules. Its purpose is to allow extension modules
+to be *optional*, so that if their build fails the rest of the package is
+still allowed to be built and installed. This can be used when an extension
+module is not definitely required to use the package.
+
+To use this custom command, add::
+
+ commands = stsci.distutils.command.build_optional_ext.build_optional_ext
+
+under the ``[global]`` section of your package's setup.cfg. Then, to mark
+an individual extension module as optional, under the setup.cfg section for
+that extension add::
+
+ optional = True
+
+Optionally, you may also add a custom failure message by adding::
+
+ fail_message = The foobar extension module failed to compile.
+ This could be because you lack such and such headers.
+ This package will still work, but such and such features
+ will be disabled.
+
+
+.. _stsci_python: http://www.stsci.edu/resources/software_hardware/pyraf/stsci_python
+.. _Astrolib: http://www.scipy.org/AstroLib/
+.. _distutils2/packaging: http://distutils2.notmyidea.org/
+.. _d2to1: http://pypi.python.org/pypi/d2to1
+.. _distribute: http://pypi.python.org/pypi/distribute
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/a.txt b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/a.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/a.txt
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/b.txt b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/b.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/b.txt
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/c.rst b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/c.rst
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/data_files/c.rst
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/extra-file.txt b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/extra-file.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/extra-file.txt
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/git-extra-file.txt b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/git-extra-file.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/git-extra-file.txt
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/__init__.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/__init__.py
new file mode 100644
index 0000000..aa56dc6
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/__init__.py
@@ -0,0 +1,3 @@
+import pbr.version
+
+__version__ = pbr.version.VersionInfo('pbr_testpackage').version_string()
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/_setup_hooks.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/_setup_hooks.py
new file mode 100644
index 0000000..f8b3087
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/_setup_hooks.py
@@ -0,0 +1,65 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+#
+# Copyright (C) 2013 Association of Universities for Research in Astronomy
+# (AURA)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# 3. The name of AURA and its representatives may not be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+
+from distutils.command import build_py
+
+
+def test_hook_1(config):
+ print('test_hook_1')
+
+
+def test_hook_2(config):
+ print('test_hook_2')
+
+
+class test_command(build_py.build_py):
+ command_name = 'build_py'
+
+ def run(self):
+ print('Running custom build_py command.')
+ return build_py.build_py.run(self)
+
+
+def test_pre_hook(cmdobj):
+ print('build_ext pre-hook')
+
+
+def test_post_hook(cmdobj):
+ print('build_ext post-hook')
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/cmd.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/cmd.py
new file mode 100644
index 0000000..4cc4522
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/cmd.py
@@ -0,0 +1,26 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+from __future__ import print_function
+
+
+def main():
+ print("PBR Test Command")
+
+
+class Foo(object):
+
+ @classmethod
+ def bar(self):
+ print("PBR Test Command - with class!")
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/extra.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/extra.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/extra.py
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/package_data/1.txt b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/package_data/1.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/package_data/1.txt
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/package_data/2.txt b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/package_data/2.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/package_data/2.txt
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/wsgi.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/wsgi.py
new file mode 100644
index 0000000..7b96e66
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/pbr_testpackage/wsgi.py
@@ -0,0 +1,31 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+from __future__ import print_function
+
+
+def application(env, start_response):
+ start_response('200 OK', [('Content-Type', 'text/html')])
+ return ["Hello World"]
+
+
+def main():
+ return application
+
+
+class WSGI(object):
+
+ @classmethod
+ def app(self):
+ return application
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/setup.cfg b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/setup.cfg
new file mode 100644
index 0000000..7ba209f
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/setup.cfg
@@ -0,0 +1,57 @@
+[metadata]
+name = pbr_testpackage
+# TODO(lifeless) we should inject this as needed otherwise we're not truely
+# testing postversioned codepaths.
+version = 0.1.dev
+author = OpenStack
+author-email = openstack-dev@lists.openstack.org
+home-page = http://pypi.python.org/pypi/pbr
+summary = Test package for testing pbr
+description-file =
+ README.txt
+ CHANGES.txt
+requires-python = >=2.5
+
+requires-dist =
+ setuptools
+
+classifier =
+ Development Status :: 3 - Alpha
+ Intended Audience :: Developers
+ License :: OSI Approved :: BSD License
+ Programming Language :: Python
+ Topic :: Scientific/Engineering
+ Topic :: Software Development :: Build Tools
+ Topic :: Software Development :: Libraries :: Python Modules
+ Topic :: System :: Archiving :: Packaging
+
+keywords = packaging, distutils, setuptools
+
+[files]
+packages = pbr_testpackage
+package-data = testpackage = package_data/*.txt
+data-files = testpackage/data_files = data_files/*.txt
+extra-files = extra-file.txt
+
+[entry_points]
+console_scripts =
+ pbr_test_cmd = pbr_testpackage.cmd:main
+ pbr_test_cmd_with_class = pbr_testpackage.cmd:Foo.bar
+
+wsgi_scripts =
+ pbr_test_wsgi = pbr_testpackage.wsgi:main
+ pbr_test_wsgi_with_class = pbr_testpackage.wsgi:WSGI.app
+
+[extension=pbr_testpackage.testext]
+sources = src/testext.c
+optional = True
+
+[global]
+#setup-hooks =
+# pbr_testpackage._setup_hooks.test_hook_1
+# pbr_testpackage._setup_hooks.test_hook_2
+commands = pbr_testpackage._setup_hooks.test_command
+
+[build_ext]
+#pre-hook.test_pre_hook = pbr_testpackage._setup_hooks.test_pre_hook
+#post-hook.test_post_hook = pbr_testpackage._setup_hooks.test_post_hook
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/setup.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/setup.py
new file mode 100644
index 0000000..8866691
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/setup.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+
+import setuptools
+
+setuptools.setup(
+ setup_requires=['pbr'],
+ pbr=True,
+)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/src/testext.c b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/src/testext.c
new file mode 100644
index 0000000..872d43c
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/src/testext.c
@@ -0,0 +1,28 @@
+#include <Python.h>
+
+
+static PyMethodDef TestextMethods[] = {
+ {NULL, NULL, 0, NULL}
+};
+
+
+#if PY_MAJOR_VERSION >=3
+static struct PyModuleDef testextmodule = {
+ PyModuleDef_HEAD_INIT,
+ "testext",
+ -1,
+ TestextMethods
+};
+
+PyObject*
+PyInit_testext(void)
+{
+ return PyModule_Create(&testextmodule);
+}
+#else
+PyMODINIT_FUNC
+inittestext(void)
+{
+ Py_InitModule("testext", TestextMethods);
+}
+#endif
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/test-requirements.txt b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/test-requirements.txt
new file mode 100644
index 0000000..f283aff
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/testpackage/test-requirements.txt
@@ -0,0 +1 @@
+ordereddict;python_version=='2.6'
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/util.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/util.py
new file mode 100644
index 0000000..e847746
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/tests/util.py
@@ -0,0 +1,74 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+#
+# Copyright (C) 2013 Association of Universities for Research in Astronomy
+# (AURA)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# 3. The name of AURA and its representatives may not be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+
+import contextlib
+import os
+import shutil
+import stat
+
+try:
+ import ConfigParser as configparser
+except ImportError:
+ import configparser
+
+
+@contextlib.contextmanager
+def open_config(filename):
+ cfg = configparser.SafeConfigParser()
+ cfg.read(filename)
+ yield cfg
+ with open(filename, 'w') as fp:
+ cfg.write(fp)
+
+
+def rmtree(path):
+ """shutil.rmtree() with error handler.
+
+ Handle 'access denied' from trying to delete read-only files.
+ """
+
+ def onerror(func, path, exc_info):
+ if not os.access(path, os.W_OK):
+ os.chmod(path, stat.S_IWUSR)
+ func(path)
+ else:
+ raise
+
+ return shutil.rmtree(path, onerror=onerror)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/util.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/util.py
new file mode 100644
index 0000000..fffd733
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/util.py
@@ -0,0 +1,682 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+#
+# Copyright (C) 2013 Association of Universities for Research in Astronomy
+# (AURA)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+#
+# 3. The name of AURA and its representatives may not be used to
+# endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY AURA ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL AURA BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+
+"""The code in this module is mostly copy/pasted out of the distutils2 source
+code, as recommended by Tarek Ziade. As such, it may be subject to some change
+as distutils2 development continues, and will have to be kept up to date.
+
+I didn't want to use it directly from distutils2 itself, since I do not want it
+to be an installation dependency for our packages yet--it is still too unstable
+(the latest version on PyPI doesn't even install).
+"""
+
+# These first two imports are not used, but are needed to get around an
+# irritating Python bug that can crop up when using ./setup.py test.
+# See: http://www.eby-sarna.com/pipermail/peak/2010-May/003355.html
+try:
+ import multiprocessing # flake8: noqa
+except ImportError:
+ pass
+import logging # flake8: noqa
+
+import os
+import re
+import sys
+import traceback
+
+from collections import defaultdict
+
+import distutils.ccompiler
+
+from distutils import log
+from distutils.errors import (DistutilsOptionError, DistutilsModuleError,
+ DistutilsFileError)
+from setuptools.command.egg_info import manifest_maker
+from setuptools.dist import Distribution
+from setuptools.extension import Extension
+
+try:
+ import ConfigParser as configparser
+except ImportError:
+ import configparser
+
+from pbr import extra_files
+import pbr.hooks
+
+# A simplified RE for this; just checks that the line ends with version
+# predicates in ()
+_VERSION_SPEC_RE = re.compile(r'\s*(.*?)\s*\((.*)\)\s*$')
+
+
+# Mappings from setup() keyword arguments to setup.cfg options;
+# The values are (section, option) tuples, or simply (section,) tuples if
+# the option has the same name as the setup() argument
+D1_D2_SETUP_ARGS = {
+ "name": ("metadata",),
+ "version": ("metadata",),
+ "author": ("metadata",),
+ "author_email": ("metadata",),
+ "maintainer": ("metadata",),
+ "maintainer_email": ("metadata",),
+ "url": ("metadata", "home_page"),
+ "description": ("metadata", "summary"),
+ "keywords": ("metadata",),
+ "long_description": ("metadata", "description"),
+ "download-url": ("metadata",),
+ "classifiers": ("metadata", "classifier"),
+ "platforms": ("metadata", "platform"), # **
+ "license": ("metadata",),
+ # Use setuptools install_requires, not
+ # broken distutils requires
+ "install_requires": ("metadata", "requires_dist"),
+ "setup_requires": ("metadata", "setup_requires_dist"),
+ "provides": ("metadata", "provides_dist"), # **
+ "obsoletes": ("metadata", "obsoletes_dist"), # **
+ "package_dir": ("files", 'packages_root'),
+ "packages": ("files",),
+ "package_data": ("files",),
+ "namespace_packages": ("files",),
+ "data_files": ("files",),
+ "scripts": ("files",),
+ "py_modules": ("files", "modules"), # **
+ "cmdclass": ("global", "commands"),
+ # Not supported in distutils2, but provided for
+ # backwards compatibility with setuptools
+ "use_2to3": ("backwards_compat", "use_2to3"),
+ "zip_safe": ("backwards_compat", "zip_safe"),
+ "tests_require": ("backwards_compat", "tests_require"),
+ "dependency_links": ("backwards_compat",),
+ "include_package_data": ("backwards_compat",),
+}
+
+# setup() arguments that can have multiple values in setup.cfg
+MULTI_FIELDS = ("classifiers",
+ "platforms",
+ "install_requires",
+ "provides",
+ "obsoletes",
+ "namespace_packages",
+ "packages",
+ "package_data",
+ "data_files",
+ "scripts",
+ "py_modules",
+ "dependency_links",
+ "setup_requires",
+ "tests_require",
+ "cmdclass")
+
+# setup() arguments that contain boolean values
+BOOL_FIELDS = ("use_2to3", "zip_safe", "include_package_data")
+
+
+CSV_FIELDS = ("keywords",)
+
+
+def resolve_name(name):
+ """Resolve a name like ``module.object`` to an object and return it.
+
+ Raise ImportError if the module or name is not found.
+ """
+
+ parts = name.split('.')
+ cursor = len(parts) - 1
+ module_name = parts[:cursor]
+ attr_name = parts[-1]
+
+ while cursor > 0:
+ try:
+ ret = __import__('.'.join(module_name), fromlist=[attr_name])
+ break
+ except ImportError:
+ if cursor == 0:
+ raise
+ cursor -= 1
+ module_name = parts[:cursor]
+ attr_name = parts[cursor]
+ ret = ''
+
+ for part in parts[cursor:]:
+ try:
+ ret = getattr(ret, part)
+ except AttributeError:
+ raise ImportError(name)
+
+ return ret
+
+
+def cfg_to_args(path='setup.cfg'):
+ """ Distutils2 to distutils1 compatibility util.
+
+ This method uses an existing setup.cfg to generate a dictionary of
+ keywords that can be used by distutils.core.setup(kwargs**).
+
+ :param file:
+ The setup.cfg path.
+ :raises DistutilsFileError:
+ When the setup.cfg file is not found.
+
+ """
+
+ # The method source code really starts here.
+ parser = configparser.SafeConfigParser()
+ if not os.path.exists(path):
+ raise DistutilsFileError("file '%s' does not exist" %
+ os.path.abspath(path))
+ parser.read(path)
+ config = {}
+ for section in parser.sections():
+ config[section] = dict(parser.items(section))
+
+ # Run setup_hooks, if configured
+ setup_hooks = has_get_option(config, 'global', 'setup_hooks')
+ package_dir = has_get_option(config, 'files', 'packages_root')
+
+ # Add the source package directory to sys.path in case it contains
+ # additional hooks, and to make sure it's on the path before any existing
+ # installations of the package
+ if package_dir:
+ package_dir = os.path.abspath(package_dir)
+ sys.path.insert(0, package_dir)
+
+ try:
+ if setup_hooks:
+ setup_hooks = [
+ hook for hook in split_multiline(setup_hooks)
+ if hook != 'pbr.hooks.setup_hook']
+ for hook in setup_hooks:
+ hook_fn = resolve_name(hook)
+ try :
+ hook_fn(config)
+ except SystemExit:
+ log.error('setup hook %s terminated the installation')
+ except:
+ e = sys.exc_info()[1]
+ log.error('setup hook %s raised exception: %s\n' %
+ (hook, e))
+ log.error(traceback.format_exc())
+ sys.exit(1)
+
+ # Run the pbr hook
+ pbr.hooks.setup_hook(config)
+
+ kwargs = setup_cfg_to_setup_kwargs(config)
+
+ # Set default config overrides
+ kwargs['include_package_data'] = True
+ kwargs['zip_safe'] = False
+
+ register_custom_compilers(config)
+
+ ext_modules = get_extension_modules(config)
+ if ext_modules:
+ kwargs['ext_modules'] = ext_modules
+
+ entry_points = get_entry_points(config)
+ if entry_points:
+ kwargs['entry_points'] = entry_points
+
+ wrap_commands(kwargs)
+
+ # Handle the [files]/extra_files option
+ files_extra_files = has_get_option(config, 'files', 'extra_files')
+ if files_extra_files:
+ extra_files.set_extra_files(split_multiline(files_extra_files))
+
+ finally:
+ # Perform cleanup if any paths were added to sys.path
+ if package_dir:
+ sys.path.pop(0)
+
+ return kwargs
+
+
+def setup_cfg_to_setup_kwargs(config):
+ """Processes the setup.cfg options and converts them to arguments accepted
+ by setuptools' setup() function.
+ """
+
+ kwargs = {}
+
+ # Temporarily holds install_reqires and extra_requires while we
+ # parse env_markers.
+ all_requirements = {}
+
+ for arg in D1_D2_SETUP_ARGS:
+ if len(D1_D2_SETUP_ARGS[arg]) == 2:
+ # The distutils field name is different than distutils2's.
+ section, option = D1_D2_SETUP_ARGS[arg]
+
+ elif len(D1_D2_SETUP_ARGS[arg]) == 1:
+ # The distutils field name is the same thant distutils2's.
+ section = D1_D2_SETUP_ARGS[arg][0]
+ option = arg
+
+ in_cfg_value = has_get_option(config, section, option)
+ if not in_cfg_value:
+ # There is no such option in the setup.cfg
+ if arg == "long_description":
+ in_cfg_value = has_get_option(config, section,
+ "description_file")
+ if in_cfg_value:
+ in_cfg_value = split_multiline(in_cfg_value)
+ value = ''
+ for filename in in_cfg_value:
+ description_file = open(filename)
+ try:
+ value += description_file.read().strip() + '\n\n'
+ finally:
+ description_file.close()
+ in_cfg_value = value
+ else:
+ continue
+
+ if arg in CSV_FIELDS:
+ in_cfg_value = split_csv(in_cfg_value)
+ if arg in MULTI_FIELDS:
+ in_cfg_value = split_multiline(in_cfg_value)
+ elif arg in BOOL_FIELDS:
+ # Provide some flexibility here...
+ if in_cfg_value.lower() in ('true', 't', '1', 'yes', 'y'):
+ in_cfg_value = True
+ else:
+ in_cfg_value = False
+
+ if in_cfg_value:
+ if arg in ('install_requires', 'tests_require'):
+ # Replaces PEP345-style version specs with the sort expected by
+ # setuptools
+ in_cfg_value = [_VERSION_SPEC_RE.sub(r'\1\2', pred)
+ for pred in in_cfg_value]
+ if arg == 'install_requires':
+ # Split install_requires into package,env_marker tuples
+ # These will be re-assembled later
+ install_requires = []
+ requirement_pattern = '(?P<package>[^;]*);?(?P<env_marker>[^#]*?)(?:\s*#.*)?$'
+ for requirement in in_cfg_value:
+ m = re.match(requirement_pattern, requirement)
+ requirement_package = m.group('package').strip()
+ env_marker = m.group('env_marker').strip()
+ install_requires.append((requirement_package,env_marker))
+ all_requirements[''] = install_requires
+ elif arg == 'package_dir':
+ in_cfg_value = {'': in_cfg_value}
+ elif arg in ('package_data', 'data_files'):
+ data_files = {}
+ firstline = True
+ prev = None
+ for line in in_cfg_value:
+ if '=' in line:
+ key, value = line.split('=', 1)
+ key, value = (key.strip(), value.strip())
+ if key in data_files:
+ # Multiple duplicates of the same package name;
+ # this is for backwards compatibility of the old
+ # format prior to d2to1 0.2.6.
+ prev = data_files[key]
+ prev.extend(value.split())
+ else:
+ prev = data_files[key.strip()] = value.split()
+ elif firstline:
+ raise DistutilsOptionError(
+ 'malformed package_data first line %r (misses '
+ '"=")' % line)
+ else:
+ prev.extend(line.strip().split())
+ firstline = False
+ if arg == 'data_files':
+ # the data_files value is a pointlessly different structure
+ # from the package_data value
+ data_files = data_files.items()
+ in_cfg_value = data_files
+ elif arg == 'cmdclass':
+ cmdclass = {}
+ dist = Distribution()
+ for cls_name in in_cfg_value:
+ cls = resolve_name(cls_name)
+ cmd = cls(dist)
+ cmdclass[cmd.get_command_name()] = cls
+ in_cfg_value = cmdclass
+
+ kwargs[arg] = in_cfg_value
+
+ # Transform requirements with embedded environment markers to
+ # setuptools' supported marker-per-requirement format.
+ #
+ # install_requires are treated as a special case of extras, before
+ # being put back in the expected place
+ #
+ # fred =
+ # foo:marker
+ # bar
+ # -> {'fred': ['bar'], 'fred:marker':['foo']}
+
+ if 'extras' in config:
+ requirement_pattern = '(?P<package>[^:]*):?(?P<env_marker>[^#]*?)(?:\s*#.*)?$'
+ extras = config['extras']
+ for extra in extras:
+ extra_requirements = []
+ requirements = split_multiline(extras[extra])
+ for requirement in requirements:
+ m = re.match(requirement_pattern, requirement)
+ extras_value = m.group('package').strip()
+ env_marker = m.group('env_marker')
+ extra_requirements.append((extras_value,env_marker))
+ all_requirements[extra] = extra_requirements
+
+ # Transform the full list of requirements into:
+ # - install_requires, for those that have no extra and no
+ # env_marker
+ # - named extras, for those with an extra name (which may include
+ # an env_marker)
+ # - and as a special case, install_requires with an env_marker are
+ # treated as named extras where the name is the empty string
+
+ extras_require = {}
+ for req_group in all_requirements:
+ for requirement, env_marker in all_requirements[req_group]:
+ if env_marker:
+ extras_key = '%s:(%s)' % (req_group, env_marker)
+ else:
+ extras_key = req_group
+ extras_require.setdefault(extras_key, []).append(requirement)
+
+ kwargs['install_requires'] = extras_require.pop('', [])
+ kwargs['extras_require'] = extras_require
+
+ return kwargs
+
+
+def register_custom_compilers(config):
+ """Handle custom compilers; this has no real equivalent in distutils, where
+ additional compilers could only be added programmatically, so we have to
+ hack it in somehow.
+ """
+
+ compilers = has_get_option(config, 'global', 'compilers')
+ if compilers:
+ compilers = split_multiline(compilers)
+ for compiler in compilers:
+ compiler = resolve_name(compiler)
+
+ # In distutils2 compilers these class attributes exist; for
+ # distutils1 we just have to make something up
+ if hasattr(compiler, 'name'):
+ name = compiler.name
+ else:
+ name = compiler.__name__
+ if hasattr(compiler, 'description'):
+ desc = compiler.description
+ else:
+ desc = 'custom compiler %s' % name
+
+ module_name = compiler.__module__
+ # Note; this *will* override built in compilers with the same name
+ # TODO: Maybe display a warning about this?
+ cc = distutils.ccompiler.compiler_class
+ cc[name] = (module_name, compiler.__name__, desc)
+
+ # HACK!!!! Distutils assumes all compiler modules are in the
+ # distutils package
+ sys.modules['distutils.' + module_name] = sys.modules[module_name]
+
+
+def get_extension_modules(config):
+ """Handle extension modules"""
+
+ EXTENSION_FIELDS = ("sources",
+ "include_dirs",
+ "define_macros",
+ "undef_macros",
+ "library_dirs",
+ "libraries",
+ "runtime_library_dirs",
+ "extra_objects",
+ "extra_compile_args",
+ "extra_link_args",
+ "export_symbols",
+ "swig_opts",
+ "depends")
+
+ ext_modules = []
+ for section in config:
+ if ':' in section:
+ labels = section.split(':', 1)
+ else:
+ # Backwards compatibility for old syntax; don't use this though
+ labels = section.split('=', 1)
+ labels = [l.strip() for l in labels]
+ if (len(labels) == 2) and (labels[0] == 'extension'):
+ ext_args = {}
+ for field in EXTENSION_FIELDS:
+ value = has_get_option(config, section, field)
+ # All extension module options besides name can have multiple
+ # values
+ if not value:
+ continue
+ value = split_multiline(value)
+ if field == 'define_macros':
+ macros = []
+ for macro in value:
+ macro = macro.split('=', 1)
+ if len(macro) == 1:
+ macro = (macro[0].strip(), None)
+ else:
+ macro = (macro[0].strip(), macro[1].strip())
+ macros.append(macro)
+ value = macros
+ ext_args[field] = value
+ if ext_args:
+ if 'name' not in ext_args:
+ ext_args['name'] = labels[1]
+ ext_modules.append(Extension(ext_args.pop('name'),
+ **ext_args))
+ return ext_modules
+
+
+def get_entry_points(config):
+ """Process the [entry_points] section of setup.cfg to handle setuptools
+ entry points. This is, of course, not a standard feature of
+ distutils2/packaging, but as there is not currently a standard alternative
+ in packaging, we provide support for them.
+ """
+
+ if not 'entry_points' in config:
+ return {}
+
+ return dict((option, split_multiline(value))
+ for option, value in config['entry_points'].items())
+
+
+def wrap_commands(kwargs):
+ dist = Distribution()
+
+ # This should suffice to get the same config values and command classes
+ # that the actual Distribution will see (not counting cmdclass, which is
+ # handled below)
+ dist.parse_config_files()
+
+ for cmd, _ in dist.get_command_list():
+ hooks = {}
+ for opt, val in dist.get_option_dict(cmd).items():
+ val = val[1]
+ if opt.startswith('pre_hook.') or opt.startswith('post_hook.'):
+ hook_type, alias = opt.split('.', 1)
+ hook_dict = hooks.setdefault(hook_type, {})
+ hook_dict[alias] = val
+ if not hooks:
+ continue
+
+ if 'cmdclass' in kwargs and cmd in kwargs['cmdclass']:
+ cmdclass = kwargs['cmdclass'][cmd]
+ else:
+ cmdclass = dist.get_command_class(cmd)
+
+ new_cmdclass = wrap_command(cmd, cmdclass, hooks)
+ kwargs.setdefault('cmdclass', {})[cmd] = new_cmdclass
+
+
+def wrap_command(cmd, cmdclass, hooks):
+ def run(self, cmdclass=cmdclass):
+ self.run_command_hooks('pre_hook')
+ cmdclass.run(self)
+ self.run_command_hooks('post_hook')
+
+ return type(cmd, (cmdclass, object),
+ {'run': run, 'run_command_hooks': run_command_hooks,
+ 'pre_hook': hooks.get('pre_hook'),
+ 'post_hook': hooks.get('post_hook')})
+
+
+def run_command_hooks(cmd_obj, hook_kind):
+ """Run hooks registered for that command and phase.
+
+ *cmd_obj* is a finalized command object; *hook_kind* is either
+ 'pre_hook' or 'post_hook'.
+ """
+
+ if hook_kind not in ('pre_hook', 'post_hook'):
+ raise ValueError('invalid hook kind: %r' % hook_kind)
+
+ hooks = getattr(cmd_obj, hook_kind, None)
+
+ if hooks is None:
+ return
+
+ for hook in hooks.values():
+ if isinstance(hook, str):
+ try:
+ hook_obj = resolve_name(hook)
+ except ImportError:
+ err = sys.exc_info()[1] # For py3k
+ raise DistutilsModuleError('cannot find hook %s: %s' %
+ (hook,err))
+ else:
+ hook_obj = hook
+
+ if not hasattr(hook_obj, '__call__'):
+ raise DistutilsOptionError('hook %r is not callable' % hook)
+
+ log.info('running %s %s for command %s',
+ hook_kind, hook, cmd_obj.get_command_name())
+
+ try :
+ hook_obj(cmd_obj)
+ except:
+ e = sys.exc_info()[1]
+ log.error('hook %s raised exception: %s\n' % (hook, e))
+ log.error(traceback.format_exc())
+ sys.exit(1)
+
+
+def has_get_option(config, section, option):
+ if section in config and option in config[section]:
+ return config[section][option]
+ elif section in config and option.replace('_', '-') in config[section]:
+ return config[section][option.replace('_', '-')]
+ else:
+ return False
+
+
+def split_multiline(value):
+ """Special behaviour when we have a multi line options"""
+
+ value = [element for element in
+ (line.strip() for line in value.split('\n'))
+ if element]
+ return value
+
+
+def split_csv(value):
+ """Special behaviour when we have a comma separated options"""
+
+ value = [element for element in
+ (chunk.strip() for chunk in value.split(','))
+ if element]
+ return value
+
+
+def monkeypatch_method(cls):
+ """A function decorator to monkey-patch a method of the same name on the
+ given class.
+ """
+
+ def wrapper(func):
+ orig = getattr(cls, func.__name__, None)
+ if orig and not hasattr(orig, '_orig'): # Already patched
+ setattr(func, '_orig', orig)
+ setattr(cls, func.__name__, func)
+ return func
+
+ return wrapper
+
+
+# The following classes are used to hack Distribution.command_options a bit
+class DefaultGetDict(defaultdict):
+ """Like defaultdict, but the get() method also sets and returns the default
+ value.
+ """
+
+ def get(self, key, default=None):
+ if default is None:
+ default = self.default_factory()
+ return super(DefaultGetDict, self).setdefault(key, default)
+
+
+class IgnoreDict(dict):
+ """A dictionary that ignores any insertions in which the key is a string
+ matching any string in `ignore`. The ignore list can also contain wildcard
+ patterns using '*'.
+ """
+
+ def __init__(self, ignore):
+ self.__ignore = re.compile(r'(%s)' % ('|'.join(
+ [pat.replace('*', '.*')
+ for pat in ignore])))
+
+ def __setitem__(self, key, val):
+ if self.__ignore.match(key):
+ return
+ super(IgnoreDict, self).__setitem__(key, val)
diff --git a/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/version.py b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/version.py
new file mode 100644
index 0000000..d3fe401
--- /dev/null
+++ b/jython-tosca-parser/src/main/resources/Lib/site-packages/pbr-1.8.0-py2.7.egg/pbr/version.py
@@ -0,0 +1,473 @@
+
+# Copyright 2012 OpenStack Foundation
+# Copyright 2012-2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed 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.
+
+"""
+Utilities for consuming the version from pkg_resources.
+"""
+
+import itertools
+import operator
+import sys
+
+import pkg_resources
+
+
+def _is_int(string):
+ try:
+ int(string)
+ return True
+ except ValueError:
+ return False
+
+
+class SemanticVersion(object):
+ """A pure semantic version independent of serialisation.
+
+ See the pbr doc 'semver' for details on the semantics.
+ """
+
+ def __init__(
+ self, major, minor=0, patch=0, prerelease_type=None,
+ prerelease=None, dev_count=None):
+ """Create a SemanticVersion.
+
+ :param major: Major component of the version.
+ :param minor: Minor component of the version. Defaults to 0.
+ :param patch: Patch level component. Defaults to 0.
+ :param prerelease_type: What sort of prerelease version this is -
+ one of a(alpha), b(beta) or rc(release candidate).
+ :param prerelease: For prerelease versions, what number prerelease.
+ Defaults to 0.
+ :param dev_count: How many commits since the last release.
+ """
+ self._major = major
+ self._minor = minor
+ self._patch = patch
+ self._prerelease_type = prerelease_type
+ self._prerelease = prerelease
+ if self._prerelease_type and not self._prerelease:
+ self._prerelease = 0
+ self._dev_count = dev_count or 0 # Normalise 0 to None.
+
+ def __eq__(self, other):
+ if not isinstance(other, SemanticVersion):
+ return False
+ return self.__dict__ == other.__dict__
+
+ def __hash__(self):
+ return sum(map(hash, self.__dict__.values()))
+
+ def _sort_key(self):
+ """Return a key for sorting SemanticVersion's on."""
+ # key things:
+ # - final is after rc's, so we make that a/b/rc/z
+ # - dev==None is after all other devs, so we use sys.maxsize there.
+ # - unqualified dev releases come before any pre-releases.
+ # So we do:
+ # (major, minor, patch) - gets the major grouping.
+ # (0|1) unqualified dev flag
+ # (a/b/rc/z) - release segment grouping
+ # pre-release level
+ # dev count, maxsize for releases.
+ rc_lookup = {'a': 'a', 'b': 'b', 'rc': 'rc', None: 'z'}
+ if self._dev_count and not self._prerelease_type:
+ uq_dev = 0
+ else:
+ uq_dev = 1
+ return (
+ self._major, self._minor, self._patch,
+ uq_dev,
+ rc_lookup[self._prerelease_type], self._prerelease,
+ self._dev_count or sys.maxsize)
+
+ def __lt__(self, other):
+ """Compare self and other, another Semantic Version."""
+ # NB(lifeless) this could perhaps be rewritten as
+ # lt (tuple_of_one, tuple_of_other) with a single check for
+ # the typeerror corner cases - that would likely be faster
+ # if this ever becomes performance sensitive.
+ if not isinstance(other, SemanticVersion):
+ raise TypeError("ordering to non-SemanticVersion is undefined")
+ return self._sort_key() < other._sort_key()
+
+ def __le__(self, other):
+ return self == other or self < other
+
+ def __ge__(self, other):
+ return not self < other
+
+ def __gt__(self, other):
+ return not self <= other
+
+ def __ne__(self, other):
+ return not self == other
+
+ def __repr__(self):
+ return "pbr.version.SemanticVersion(%s)" % self.release_string()
+
+ @classmethod
+ def from_pip_string(klass, version_string):
+ """Create a SemanticVersion from a pip version string.
+
+ This method will parse a version like 1.3.0 into a SemanticVersion.
+
+ This method is responsible for accepting any version string that any
+ older version of pbr ever created.
+
+ Therefore: versions like 1.3.0a1 versions are handled, parsed into a
+ canonical form and then output - resulting in 1.3.0.0a1.
+ Pre pbr-semver dev versions like 0.10.1.3.g83bef74 will be parsed but
+ output as 0.10.1.dev3.g83bef74.
+
+ :raises ValueError: Never tagged versions sdisted by old pbr result in
+ just the git hash, e.g. '1234567' which poses a substantial problem
+ since they collide with the semver versions when all the digits are
+ numerals. Such versions will result in a ValueError being thrown if
+ any non-numeric digits are present. They are an exception to the
+ general case of accepting anything we ever output, since they were
+ never intended and would permanently mess up versions on PyPI if
+ ever released - we're treating that as a critical bug that we ever
+ made them and have stopped doing that.
+ """
+ # Versions need to start numerically, ignore if not
+ if not version_string[:1].isdigit():
+ raise ValueError("Invalid version %r" % version_string)
+ input_components = version_string.split('.')
+ # decimals first (keep pre-release and dev/hashes to the right)
+ components = [c for c in input_components if c.isdigit()]
+ digit_len = len(components)
+ if digit_len == 0:
+ raise ValueError("Invalid version %r" % version_string)
+ elif digit_len < 3:
+ if (digit_len < len(input_components) and
+ input_components[digit_len][0].isdigit()):
+ # Handle X.YaZ - Y is a digit not a leadin to pre-release.
+ mixed_component = input_components[digit_len]
+ last_component = ''.join(itertools.takewhile(
+ lambda x: x.isdigit(), mixed_component))
+ components.append(last_component)
+ input_components[digit_len:digit_len + 1] = [
+ last_component, mixed_component[len(last_component):]]
+ digit_len += 1
+ components.extend([0] * (3 - digit_len))
+ components.extend(input_components[digit_len:])
+ major = int(components[0])
+ minor = int(components[1])
+ dev_count = None
+ post_count = None
+ prerelease_type = None
+ prerelease = None
+
+ def _parse_type(segment):
+ # Discard leading digits (the 0 in 0a1)
+ isdigit = operator.methodcaller('isdigit')
+ segment = ''.join(itertools.dropwhile(isdigit, segment))
+ isalpha = operator.methodcaller('isalpha')
+ prerelease_type = ''.join(itertools.takewhile(isalpha, segment))
+ prerelease = segment[len(prerelease_type)::]
+ return prerelease_type, int(prerelease)
+ if _is_int(components[2]):
+ patch = int(components[2])
+ else:
+ # legacy version e.g. 1.2.0a1 (canonical is 1.2.0.0a1)
+ # or 1.2.dev4.g1234 or 1.2.b4
+ patch = 0
+ components[2:2] = [0]
+ remainder = components[3:]
+ remainder_starts_with_int = False
+ try:
+ if remainder and int(remainder[0]):
+ remainder_starts_with_int = True
+ except ValueError:
+ pass
+ if remainder_starts_with_int:
+ # old dev format - 0.1.2.3.g1234
+ dev_count = int(remainder[0])
+ else:
+ if remainder and (remainder[0][0] == '0' or
+ remainder[0][0] in ('a', 'b', 'r')):
+ # Current RC/beta layout
+ prerelease_type, prerelease = _parse_type(remainder[0])
+ remainder = remainder[1:]
+ while remainder:
+ component = remainder[0]
+ if component.startswith('dev'):
+ dev_count = int(component[3:])
+ elif component.startswith('post'):
+ dev_count = None
+ post_count = int(component[4:])
+ else:
+ raise ValueError(
+ 'Unknown remainder %r in %r'
+ % (remainder, version_string))
+ remainder = remainder[1:]
+ result = SemanticVersion(
+ major, minor, patch, prerelease_type=prerelease_type,
+ prerelease=prerelease, dev_count=dev_count)
+ if post_count:
+ if dev_count:
+ raise ValueError(
+ 'Cannot combine postN and devN - no mapping in %r'
+ % (version_string,))
+ result = result.increment().to_dev(post_count)
+ return result
+
+ def brief_string(self):
+ """Return the short version minus any alpha/beta tags."""
+ return "%s.%s.%s" % (self._major, self._minor, self._patch)
+
+ def debian_string(self):
+ """Return the version number to use when building a debian package.
+
+ This translates the PEP440/semver precedence rules into Debian version
+ sorting operators.
+ """
+ return self._long_version("~")
+
+ def decrement(self):
+ """Return a decremented SemanticVersion.
+
+ Decrementing versions doesn't make a lot of sense - this method only
+ exists to support rendering of pre-release versions strings into
+ serialisations (such as rpm) with no sort-before operator.
+
+ The 9999 magic version component is from the spec on this - pbr-semver.
+
+ :return: A new SemanticVersion object.
+ """
+ if self._patch:
+ new_patch = self._patch - 1
+ new_minor = self._minor
+ new_major = self._major
+ else:
+ new_patch = 9999
+ if self._minor:
+ new_minor = self._minor - 1
+ new_major = self._major
+ else:
+ new_minor = 9999
+ if self._major:
+ new_major = self._major - 1
+ else:
+ new_major = 0
+ return SemanticVersion(
+ new_major, new_minor, new_patch)
+
+ def increment(self, minor=False, major=False):
+ """Return an incremented SemanticVersion.
+
+ The default behaviour is to perform a patch level increment. When
+ incrementing a prerelease version, the patch level is not changed
+ - the prerelease serial is changed (e.g. beta 0 -> beta 1).
+
+ Incrementing non-pre-release versions will not introduce pre-release
+ versions - except when doing a patch incremental to a pre-release
+ version the new version will only consist of major/minor/patch.
+
+ :param minor: Increment the minor version.
+ :param major: Increment the major version.
+ :return: A new SemanticVersion object.
+ """
+ if self._prerelease_type:
+ new_prerelease_type = self._prerelease_type
+ new_prerelease = self._prerelease + 1
+ new_patch = self._patch
+ else:
+ new_prerelease_type = None
+ new_prerelease = None
+ new_patch = self._patch + 1
+ if minor:
+ new_minor = self._minor + 1
+ new_patch = 0
+ new_prerelease_type = None
+ new_prerelease = None
+ else:
+ new_minor = self._minor
+ if major:
+ new_major = self._major + 1
+ new_minor = 0
+ new_patch = 0
+ new_prerelease_type = None
+ new_prerelease = None
+ else:
+ new_major = self._major
+ return SemanticVersion(
+ new_major, new_minor, new_patch,
+ new_prerelease_type, new_prerelease)
+
+ def _long_version(self, pre_separator, rc_marker=""):
+ """Construct a long string version of this semver.
+
+ :param pre_separator: What separator to use between components
+ that sort before rather than after. If None, use . and lower the
+ version number of the component to preserve sorting. (Used for
+ rpm support)
+ """
+ if ((self._prerelease_type or self._dev_count)
+ and pre_separator is None):
+ segments = [self.decrement().brief_string()]
+ pre_separator = "."
+ else:
+ segments = [self.brief_string()]
+ if self._prerelease_type:
+ segments.append(
+ "%s%s%s%s" % (pre_separator, rc_marker, self._prerelease_type,
+ self._prerelease))
+ if self._dev_count:
+ if not self._prerelease_type:
+ segments.append(pre_separator)
+ else:
+ segments.append('.')
+ segments.append('dev')
+ segments.append(self._dev_count)
+ return "".join(str(s) for s in segments)
+
+ def release_string(self):
+ """Return the full version of the package.
+
+ This including suffixes indicating VCS status.
+ """
+ return self._long_version(".", "0")
+
+ def rpm_string(self):
+ """Return the version number to use when building an RPM package.
+
+ This translates the PEP440/semver precedence rules into RPM version
+ sorting operators. Because RPM has no sort-before operator (such as the
+ ~ operator in dpkg), we show all prerelease versions as being versions
+ of the release before.
+ """
+ return self._long_version(None)
+
+ def to_dev(self, dev_count):
+ """Return a development version of this semver.
+
+ :param dev_count: The number of commits since the last release.
+ """
+ return SemanticVersion(
+ self._major, self._minor, self._patch, self._prerelease_type,
+ self._prerelease, dev_count=dev_count)
+
+ def version_tuple(self):
+ """Present the version as a version_info tuple.
+
+ For documentation on version_info tuples see the Python
+ documentation for sys.version_info.
+
+ Since semver and PEP-440 represent overlapping but not subsets of
+ versions, we have to have some heuristic / mapping rules, and have
+ extended the releaselevel field to have alphadev, betadev and
+ candidatedev values. When they are present the dev count is used
+ to provide the serial.
+ - a/b/rc take precedence.
+ - if there is no pre-release version the dev version is used.
+ - serial is taken from the dev/a/b/c component.
+ - final non-dev versions never get serials.
+ """
+ segments = [self._major, self._minor, self._patch]
+ if self._prerelease_type:
+ type_map = {('a', False): 'alpha',
+ ('b', False): 'beta',
+ ('rc', False): 'candidate',
+ ('a', True): 'alphadev',
+ ('b', True): 'betadev',
+ ('rc', True): 'candidatedev',
+ }
+ segments.append(
+ type_map[(self._prerelease_type, bool(self._dev_count))])
+ segments.append(self._dev_count or self._prerelease)
+ elif self._dev_count:
+ segments.append('dev')
+ segments.append(self._dev_count - 1)
+ else:
+ segments.append('final')
+ segments.append(0)
+ return tuple(segments)
+
+
+class VersionInfo(object):
+
+ def __init__(self, package):
+ """Object that understands versioning for a package
+
+ :param package: name of the python package, such as glance, or
+ python-glanceclient
+ """
+ self.package = package
+ self.version = None
+ self._cached_version = None
+ self._semantic = None
+
+ def __str__(self):
+ """Make the VersionInfo object behave like a string."""
+ return self.version_string()
+
+ def __repr__(self):
+ """Include the name."""
+ return "pbr.version.VersionInfo(%s:%s)" % (
+ self.package, self.version_string())
+
+ def _get_version_from_pkg_resources(self):
+ """Obtain a version from pkg_resources or setup-time logic if missing.
+
+ This will try to get the version of the package from the pkg_resources
+ record associated with the package, and if there is no such record
+ falls back to the logic sdist would use.
+ """
+ try:
+ requirement = pkg_resources.Requirement.parse(self.package)
+ provider = pkg_resources.get_provider(requirement)
+ result_string = provider.version
+ except pkg_resources.DistributionNotFound:
+ # The most likely cause for this is running tests in a tree
+ # produced from a tarball where the package itself has not been
+ # installed into anything. Revert to setup-time logic.
+ from pbr import packaging
+ result_string = packaging.get_version(self.package)
+ return SemanticVersion.from_pip_string(result_string)
+
+ def release_string(self):
+ """Return the full version of the package.
+
+ This including suffixes indicating VCS status.
+ """
+ return self.semantic_version().release_string()
+
+ def semantic_version(self):
+ """Return the SemanticVersion object for this version."""
+ if self._semantic is None:
+ self._semantic = self._get_version_from_pkg_resources()
+ return self._semantic
+
+ def version_string(self):
+ """Return the short version minus any alpha/beta tags."""
+ return self.semantic_version().brief_string()
+
+ # Compatibility functions
+ canonical_version_string = version_string
+ version_string_with_vcs = release_string
+
+ def cached_version_string(self, prefix=""):
+ """Return a cached version string.
+
+ This will return a cached version string if one is already cached,
+ irrespective of prefix. If none is cached, one will be created with
+ prefix and then cached and returned.
+ """
+ if not self._cached_version:
+ self._cached_version = "%s%s" % (prefix,
+ self.version_string())
+ return self._cached_version