diff --git a/.heat-cfntools.metadata b/.heat-cfntools.metadata new file mode 100644 index 0000000..5b4bcc8 --- /dev/null +++ b/.heat-cfntools.metadata @@ -0,0 +1 @@ +3b0443f47f5f2975d10153d6c7d46080107939b0 SOURCES/heat-cfntools-1.4.2.tar.gz diff --git a/SOURCES/0001-Changed-logger-init-and-added-verbose-arg-handling.patch b/SOURCES/0001-Changed-logger-init-and-added-verbose-arg-handling.patch new file mode 100644 index 0000000..aba33e3 --- /dev/null +++ b/SOURCES/0001-Changed-logger-init-and-added-verbose-arg-handling.patch @@ -0,0 +1,45 @@ +From 7a604b2d5cb3468bedcdc91c858a8a29c5bbcd05 Mon Sep 17 00:00:00 2001 +From: twm2016 +Date: Wed, 24 Feb 2016 13:22:43 -0600 +Subject: [PATCH 01/21] Changed logger init and added verbose arg handling + +Initialized logger with default value of NOTSET. + +Added if statement to handle verbose argument and set the logger to +DEBUG. + +Change-Id: I997b8b964dade013db265d088d00ccfdd6ab030e +Closes-Bug: #1269465 +--- + bin/cfn-push-stats | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/bin/cfn-push-stats b/bin/cfn-push-stats +index da0d155..501a366 100755 +--- a/bin/cfn-push-stats ++++ b/bin/cfn-push-stats +@@ -29,8 +29,7 @@ from boto.ec2 import cloudwatch + log_format = '%(levelname)s [%(asctime)s] %(message)s' + log_file_name = "/var/log/cfn-push-stats.log" + logging.basicConfig(filename=log_file_name, +- format=log_format, +- level=logging.DEBUG) ++ format=log_format) + LOG = logging.getLogger('cfntools') + + try: +@@ -108,6 +107,11 @@ credentials = cfn_helper.parse_creds_file(args.credential_file) + namespace = 'system/linux' + data = {} + ++# Logging ++# ======= ++if args.verbose: ++ LOG.setLevel(logging.DEBUG) ++ + # Generic user-specified metric + # ============================= + if args.metric and args.units and args.value: +-- +2.20.1 + diff --git a/SOURCES/0002-Replace-deprecated-LOG.warn-with-LOG.warning.patch b/SOURCES/0002-Replace-deprecated-LOG.warn-with-LOG.warning.patch new file mode 100644 index 0000000..c1c0ef2 --- /dev/null +++ b/SOURCES/0002-Replace-deprecated-LOG.warn-with-LOG.warning.patch @@ -0,0 +1,180 @@ +From 5d62b178c361953d983236ce86e7b6a61e961549 Mon Sep 17 00:00:00 2001 +From: "Swapnil Kulkarni (coolsvap)" +Date: Fri, 11 Mar 2016 13:09:24 +0530 +Subject: [PATCH 02/21] Replace deprecated LOG.warn with LOG.warning + +LOG.warn is deprecated. It still used in a few places. +Updated to non-deprecated LOG.warning. + +Change-Id: I6e8df0e072448fbd4077c4e5d98b2986e9855489 +Closes-Bug:#1508442 +--- + bin/cfn-push-stats | 4 +-- + heat_cfntools/cfntools/cfn_helper.py | 40 +++++++++++++++------------- + 2 files changed, 24 insertions(+), 20 deletions(-) + +diff --git a/bin/cfn-push-stats b/bin/cfn-push-stats +index 501a366..d1171ee 100755 +--- a/bin/cfn-push-stats ++++ b/bin/cfn-push-stats +@@ -35,8 +35,8 @@ LOG = logging.getLogger('cfntools') + try: + import psutil + except ImportError: +- LOG.warn("psutil not available. If you want process and memory " +- "statistics, you need to install it.") ++ LOG.warning("psutil not available. If you want process and memory " ++ "statistics, you need to install it.") + + from heat_cfntools.cfntools import cfn_helper + +diff --git a/heat_cfntools/cfntools/cfn_helper.py b/heat_cfntools/cfntools/cfn_helper.py +index c340bda..19424b0 100644 +--- a/heat_cfntools/cfntools/cfn_helper.py ++++ b/heat_cfntools/cfntools/cfn_helper.py +@@ -401,7 +401,7 @@ class RpmHelper(object): + LOG.info("Installing packages: %s" % cmd) + command = CommandRunner(cmd).run() + if command.status: +- LOG.warn("Failed to install packages: %s" % cmd) ++ LOG.warning("Failed to install packages: %s" % cmd) + + @classmethod + def downgrade(cls, packages, rpms=True, zypper=False, dnf=False): +@@ -429,21 +429,21 @@ class RpmHelper(object): + LOG.info("Downgrading packages: %s", cmd) + command = CommandRunner(cmd).run() + if command.status: +- LOG.warn("Failed to downgrade packages: %s" % cmd) ++ LOG.warning("Failed to downgrade packages: %s" % cmd) + elif dnf: + cmd = ['dnf', '-y', 'downgrade'] + cmd.extend(packages) + LOG.info("Downgrading packages: %s", cmd) + command = CommandRunner(cmd).run() + if command.status: +- LOG.warn("Failed to downgrade packages: %s" % cmd) ++ LOG.warning("Failed to downgrade packages: %s" % cmd) + else: + cmd = ['yum', '-y', 'downgrade'] + cmd.extend(packages) + LOG.info("Downgrading packages: %s" % cmd) + command = CommandRunner(cmd).run() + if command.status: +- LOG.warn("Failed to downgrade packages: %s" % cmd) ++ LOG.warning("Failed to downgrade packages: %s" % cmd) + + + class PackagesHandler(object): +@@ -521,7 +521,8 @@ class PackagesHandler(object): + # FIXME:print non-error, but skipping pkg + pass + elif not RpmHelper.zypper_package_available(pkg): +- LOG.warn("Skipping package '%s' - unavailable via zypper", pkg) ++ LOG.warning( ++ "Skipping package '%s' - unavailable via zypper", pkg) + elif not ver: + installs.append(pkg) + else: +@@ -566,7 +567,8 @@ class PackagesHandler(object): + # FIXME:print non-error, but skipping pkg + pass + elif not RpmHelper.dnf_package_available(pkg): +- LOG.warn("Skipping package '%s'. Not available via yum" % pkg) ++ LOG.warning( ++ "Skipping package '%s'. Not available via yum" % pkg) + elif not ver: + installs.append(pkg) + else: +@@ -622,7 +624,8 @@ class PackagesHandler(object): + # FIXME:print non-error, but skipping pkg + pass + elif not RpmHelper.yum_package_available(pkg): +- LOG.warn("Skipping package '%s'. Not available via yum" % pkg) ++ LOG.warning( ++ "Skipping package '%s'. Not available via yum" % pkg) + elif not ver: + installs.append(pkg) + else: +@@ -702,7 +705,7 @@ class PackagesHandler(object): + for manager, package_entries in packages: + handler = self._package_handler(manager) + if not handler: +- LOG.warn("Skipping invalid package type: %s" % manager) ++ LOG.warning("Skipping invalid package type: %s" % manager) + else: + handler(self, package_entries) + +@@ -934,7 +937,7 @@ class ServicesHandler(object): + command = handler(self, service, "status") + running = command.status == 0 + if ensure_running and not running: +- LOG.warn("Restarting service %s" % service) ++ LOG.warning("Restarting service %s" % service) + start_cmd = handler(self, service, "start") + if start_cmd.status != 0: + LOG.warning('Service %s did not start. STDERR: %s' % +@@ -969,7 +972,7 @@ class ServicesHandler(object): + for manager, service_entries in self._services.items(): + handler = self._service_handler(manager) + if not handler: +- LOG.warn("Skipping invalid service type: %s" % manager) ++ LOG.warning("Skipping invalid service type: %s" % manager) + else: + self._initialize_services(handler, service_entries) + +@@ -980,7 +983,7 @@ class ServicesHandler(object): + for manager, service_entries in self._services.items(): + handler = self._service_handler(manager) + if not handler: +- LOG.warn("Skipping invalid service type: %s" % manager) ++ LOG.warning("Skipping invalid service type: %s" % manager) + else: + self._monitor_services(handler, service_entries) + +@@ -1343,7 +1346,8 @@ class Metadata(object): + try: + self._data = self.remote_metadata() + except MetadataServerConnectionError as ex: +- LOG.warn("Unable to retrieve remote metadata : %s" % str(ex)) ++ LOG.warning( ++ "Unable to retrieve remote metadata : %s" % str(ex)) + + # If reading remote metadata fails, we fall-back on local files + # in order to get the most up-to-date version, we try: +@@ -1360,8 +1364,8 @@ class Metadata(object): + try: + fd = open(filepath) + except IOError: +- LOG.warn("Unable to open local metadata : %s" % +- filepath) ++ LOG.warning("Unable to open local metadata : %s" % ++ filepath) + continue + else: + LOG.info("Opened local metadata %s" % filepath) +@@ -1389,8 +1393,8 @@ class Metadata(object): + pass + lm.close() + except IOError: +- LOG.warn("Unable to open local metadata : %s" % +- metadata_file) ++ LOG.warning("Unable to open local metadata : %s" % ++ metadata_file) + continue + + if self._metadata != last_data: +@@ -1402,8 +1406,8 @@ class Metadata(object): + try: + os.makedirs(cache_dir, mode=0o700) + except IOError as e: +- LOG.warn('could not create metadata cache dir %s [%s]' % +- (cache_dir, e)) ++ LOG.warning('could not create metadata cache dir %s [%s]' % ++ (cache_dir, e)) + return + # save current metadata to file + tmp_dir = os.path.dirname(last_path) +-- +2.20.1 + diff --git a/SOURCES/0003-Fix-typo.patch b/SOURCES/0003-Fix-typo.patch new file mode 100644 index 0000000..af83448 --- /dev/null +++ b/SOURCES/0003-Fix-typo.patch @@ -0,0 +1,80 @@ +From c9f938b9d07211aa4bc259e94450a55f1ba83694 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pablo=20Iranzo=20G=C3=B3mez?= +Date: Wed, 29 Jun 2016 17:41:57 +0200 +Subject: [PATCH 03/21] Fix typo + +Change-Id: I15deb824a85aa561c2f2e7f4ea6b4b1ce96367f9 +--- + heat_cfntools/cfntools/cfn_helper.py | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +diff --git a/heat_cfntools/cfntools/cfn_helper.py b/heat_cfntools/cfntools/cfn_helper.py +index 19424b0..f2b9f90 100644 +--- a/heat_cfntools/cfntools/cfn_helper.py ++++ b/heat_cfntools/cfntools/cfn_helper.py +@@ -1154,19 +1154,19 @@ class GroupsHandler(object): + if command_status == 0: + LOG.info("%s has been successfully created" % group) + elif command_status == 9: +- LOG.error("An error occured creating %s group : " % ++ LOG.error("An error occurred creating %s group : " % + group + "group name not unique") + elif command_status == 4: +- LOG.error("An error occured creating %s group : " % ++ LOG.error("An error occurred creating %s group : " % + group + "GID not unique") + elif command_status == 3: +- LOG.error("An error occured creating %s group : " % ++ LOG.error("An error occurred creating %s group : " % + group + "GID not valid") + elif command_status == 2: +- LOG.error("An error occured creating %s group : " % ++ LOG.error("An error occurred creating %s group : " % + group + "Invalid syntax") + else: +- LOG.error("An error occured creating %s group" % group) ++ LOG.error("An error occurred creating %s group" % group) + + + class UsersHandler(object): +@@ -1209,22 +1209,22 @@ class UsersHandler(object): + if command_status == 0: + LOG.info("%s has been successfully created" % user) + elif command_status == 9: +- LOG.error("An error occured creating %s user : " % ++ LOG.error("An error occurred creating %s user : " % + user + "user name not unique") + elif command_status == 6: +- LOG.error("An error occured creating %s user : " % ++ LOG.error("An error occurred creating %s user : " % + user + "group does not exist") + elif command_status == 4: +- LOG.error("An error occured creating %s user : " % ++ LOG.error("An error occurred creating %s user : " % + user + "UID not unique") + elif command_status == 3: +- LOG.error("An error occured creating %s user : " % ++ LOG.error("An error occurred creating %s user : " % + user + "Invalid argument") + elif command_status == 2: +- LOG.error("An error occured creating %s user : " % ++ LOG.error("An error occurred creating %s user : " % + user + "Invalid syntax") + else: +- LOG.error("An error occured creating %s user" % user) ++ LOG.error("An error occurred creating %s user" % user) + + + class MetadataServerConnectionError(Exception): +@@ -1256,7 +1256,7 @@ class Metadata(object): + self._has_changed = False + + def remote_metadata(self): +- """Connect to the metadata server and retreive the metadata.""" ++ """Connect to the metadata server and retrieve the metadata.""" + + if self.credentials_file: + credentials = parse_creds_file(self.credentials_file) +-- +2.20.1 + diff --git a/SOURCES/0004-Drop-unused-directory-in-tox.patch b/SOURCES/0004-Drop-unused-directory-in-tox.patch new file mode 100644 index 0000000..9d57e53 --- /dev/null +++ b/SOURCES/0004-Drop-unused-directory-in-tox.patch @@ -0,0 +1,28 @@ +From f39434315344be461aae36f96ff8d12fce9ab037 Mon Sep 17 00:00:00 2001 +From: shizhihui +Date: Wed, 10 Aug 2016 14:03:20 +0800 +Subject: [PATCH 04/21] Drop unused directory in tox + +The Oslo team has moved all previously incubated code from the +'openstack/oslo-incubator' repository into separate library +repositories and released those libraries to the Python Package, +so the directory should be removed. + +Change-Id: I0ee30c36e87970bc1b1175230a1bffa27e0b3e09 +--- + tox.ini | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tox.ini b/tox.ini +index cd44833..9e3ea73 100644 +--- a/tox.ini ++++ b/tox.ini +@@ -26,4 +26,4 @@ commands = {posargs} + + [flake8] + show-source = true +-exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,tools ++exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,tools +-- +2.20.1 + diff --git a/SOURCES/0005-Replace-MagicMock-with-Mock.patch b/SOURCES/0005-Replace-MagicMock-with-Mock.patch new file mode 100644 index 0000000..a4784c7 --- /dev/null +++ b/SOURCES/0005-Replace-MagicMock-with-Mock.patch @@ -0,0 +1,36 @@ +From 590b3fb99635157a3963f67995593b872f92a1c1 Mon Sep 17 00:00:00 2001 +From: shizhihui +Date: Fri, 23 Sep 2016 10:57:16 +0800 +Subject: [PATCH 05/21] Replace 'MagicMock' with 'Mock' + +Change-Id: I24e87a1c341f63929f93d7306782e3e9d6b398fb +Partial-Bug: #1475722 +--- + heat_cfntools/tests/test_cfn_helper.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/heat_cfntools/tests/test_cfn_helper.py b/heat_cfntools/tests/test_cfn_helper.py +index d13324a..83bed76 100644 +--- a/heat_cfntools/tests/test_cfn_helper.py ++++ b/heat_cfntools/tests/test_cfn_helper.py +@@ -82,7 +82,7 @@ class TestCommandRunner(testtools.TestCase): + def test_privileges_are_lowered_for_non_root_user(self, mock_geteuid, + mock_seteuid, + mock_getpwnam): +- pw_entry = mock.MagicMock() ++ pw_entry = mock.Mock() + pw_entry.pw_uid = 1001 + mock_getpwnam.return_value = pw_entry + mock_geteuid.return_value = 0 +@@ -114,7 +114,7 @@ class TestCommandRunner(testtools.TestCase): + def test_privileges_are_restored_for_command_failure(self, mock_geteuid, + mock_seteuid, + mock_getpwnam): +- pw_entry = mock.MagicMock() ++ pw_entry = mock.Mock() + pw_entry.pw_uid = 1001 + mock_getpwnam.return_value = pw_entry + mock_geteuid.return_value = 0 +-- +2.20.1 + diff --git a/SOURCES/0006-Show-team-and-repo-badges-on-README.patch b/SOURCES/0006-Show-team-and-repo-badges-on-README.patch new file mode 100644 index 0000000..875be07 --- /dev/null +++ b/SOURCES/0006-Show-team-and-repo-badges-on-README.patch @@ -0,0 +1,42 @@ +From afaf465ac5d9d9f05aa57a0157d889f73917c864 Mon Sep 17 00:00:00 2001 +From: Flavio Percoco +Date: Fri, 25 Nov 2016 10:56:37 +0100 +Subject: [PATCH 06/21] Show team and repo badges on README + +This patch adds the team's and repository's badges to the README file. +The motivation behind this is to communicate the project status and +features at first glance. + +For more information about this effort, please read this email thread: + +http://lists.openstack.org/pipermail/openstack-dev/2016-October/105562.html + +To see an example of how this would look like check: + +https://gist.github.com/d71e2eaf72170035e6d10135f9c04a02 + +Change-Id: Icb4f114e9408cd84e885aa51c3f1a9bfb54d7c52 +--- + README.rst | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/README.rst b/README.rst +index 20d2e2b..dfe9c50 100644 +--- a/README.rst ++++ b/README.rst +@@ -1,3 +1,12 @@ ++======================== ++Team and repository tags ++======================== ++ ++.. image:: http://governance.openstack.org/badges/heat-cfntools.svg ++ :target: http://governance.openstack.org/reference/tags/index.html ++ ++.. Change things from this point on ++ + ========================= + Heat CloudFormation Tools + ========================= +-- +2.20.1 + diff --git a/SOURCES/0007-Remove-white-space-between-print.patch b/SOURCES/0007-Remove-white-space-between-print.patch new file mode 100644 index 0000000..5182ed6 --- /dev/null +++ b/SOURCES/0007-Remove-white-space-between-print.patch @@ -0,0 +1,26 @@ +From 407f8a5b00e1ee8a92a7e05012a3677fa741103b Mon Sep 17 00:00:00 2001 +From: Anh Tran +Date: Tue, 17 Jan 2017 10:24:23 +0700 +Subject: [PATCH 07/21] Remove white space between print () + +Change-Id: I8b95436dfcf3bfd65fa95557e34268c0e5072812 +--- + tools/lintstack.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/lintstack.py b/tools/lintstack.py +index 7f9012d..5754637 100755 +--- a/tools/lintstack.py ++++ b/tools/lintstack.py +@@ -170,7 +170,7 @@ def validate(newmsg=None): + print json.dumps(i) + print "Consider regenerating the exception file if you will." + else: +- print ("Please fix the errors above. If you believe they are false" ++ print("Please fix the errors above. If you believe they are false" + " positives, run 'tools/lintstack.py generate' to overwrite.") + sys.exit(1) + +-- +2.20.1 + diff --git a/SOURCES/0008-Add-OpenStack-doc-support-for-heat-cfntools.patch b/SOURCES/0008-Add-OpenStack-doc-support-for-heat-cfntools.patch new file mode 100644 index 0000000..459f52f --- /dev/null +++ b/SOURCES/0008-Add-OpenStack-doc-support-for-heat-cfntools.patch @@ -0,0 +1,1939 @@ +From 341d07e29882476fde8f8f1e075ada3bbae9611a Mon Sep 17 00:00:00 2001 +From: ricolin +Date: Thu, 20 Jul 2017 13:54:10 +0800 +Subject: [PATCH 08/21] Add OpenStack doc support for heat cfntools + +This allow build docs with new OpenStack doc format. + +Change-Id: I4ed880ee5c03de40793ebdb4662cbaf3eeca12fa +--- + doc/source/_static/basic.css | 416 ------------------ + doc/source/_static/default.css | 230 ---------- + doc/source/_static/header-line.gif | Bin 48 -> 0 bytes + doc/source/_static/header_bg.jpg | Bin 3738 -> 0 bytes + doc/source/_static/jquery.tweet.js | 154 ------- + doc/source/_static/nature.css | 245 ----------- + doc/source/_static/openstack_logo.png | Bin 3670 -> 0 bytes + doc/source/_static/tweaks.css | 94 ---- + doc/source/_theme/layout.html | 83 ---- + doc/source/_theme/theme.conf | 4 - + .../{man => }/cfn-create-aws-symlinks.rst | 0 + doc/source/{man => }/cfn-get-metadata.rst | 0 + doc/source/{man => }/cfn-hup.rst | 0 + doc/source/{man => }/cfn-init.rst | 0 + doc/source/{man => }/cfn-push-stats.rst | 0 + doc/source/{man => }/cfn-signal.rst | 0 + doc/source/conf.py | 270 +++++------- + doc/source/{man => }/index.rst | 2 +- + setup.cfg | 8 + + test-requirements.txt | 2 + + tox.ini | 6 + + 21 files changed, 115 insertions(+), 1399 deletions(-) + delete mode 100644 doc/source/_static/basic.css + delete mode 100644 doc/source/_static/default.css + delete mode 100644 doc/source/_static/header-line.gif + delete mode 100644 doc/source/_static/header_bg.jpg + delete mode 100644 doc/source/_static/jquery.tweet.js + delete mode 100644 doc/source/_static/nature.css + delete mode 100644 doc/source/_static/openstack_logo.png + delete mode 100644 doc/source/_static/tweaks.css + delete mode 100644 doc/source/_theme/layout.html + delete mode 100644 doc/source/_theme/theme.conf + rename doc/source/{man => }/cfn-create-aws-symlinks.rst (100%) + rename doc/source/{man => }/cfn-get-metadata.rst (100%) + rename doc/source/{man => }/cfn-hup.rst (100%) + rename doc/source/{man => }/cfn-init.rst (100%) + rename doc/source/{man => }/cfn-push-stats.rst (100%) + rename doc/source/{man => }/cfn-signal.rst (100%) + rename doc/source/{man => }/index.rst (94%) + +diff --git a/doc/source/_static/basic.css b/doc/source/_static/basic.css +deleted file mode 100644 +index d909ce3..0000000 +--- a/doc/source/_static/basic.css ++++ /dev/null +@@ -1,416 +0,0 @@ +-/** +- * Sphinx stylesheet -- basic theme +- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- */ +- +-/* -- main layout ----------------------------------------------------------- */ +- +-div.clearer { +- clear: both; +-} +- +-/* -- relbar ---------------------------------------------------------------- */ +- +-div.related { +- width: 100%; +- font-size: 90%; +-} +- +-div.related h3 { +- display: none; +-} +- +-div.related ul { +- margin: 0; +- padding: 0 0 0 10px; +- list-style: none; +-} +- +-div.related li { +- display: inline; +-} +- +-div.related li.right { +- float: right; +- margin-right: 5px; +-} +- +-/* -- sidebar --------------------------------------------------------------- */ +- +-div.sphinxsidebarwrapper { +- padding: 10px 5px 0 10px; +-} +- +-div.sphinxsidebar { +- float: left; +- width: 230px; +- margin-left: -100%; +- font-size: 90%; +-} +- +-div.sphinxsidebar ul { +- list-style: none; +-} +- +-div.sphinxsidebar ul ul, +-div.sphinxsidebar ul.want-points { +- margin-left: 20px; +- list-style: square; +-} +- +-div.sphinxsidebar ul ul { +- margin-top: 0; +- margin-bottom: 0; +-} +- +-div.sphinxsidebar form { +- margin-top: 10px; +-} +- +-div.sphinxsidebar input { +- border: 1px solid #98dbcc; +- font-family: sans-serif; +- font-size: 1em; +-} +- +-img { +- border: 0; +-} +- +-/* -- search page ----------------------------------------------------------- */ +- +-ul.search { +- margin: 10px 0 0 20px; +- padding: 0; +-} +- +-ul.search li { +- padding: 5px 0 5px 20px; +- background-image: url(file.png); +- background-repeat: no-repeat; +- background-position: 0 7px; +-} +- +-ul.search li a { +- font-weight: bold; +-} +- +-ul.search li div.context { +- color: #888; +- margin: 2px 0 0 30px; +- text-align: left; +-} +- +-ul.keywordmatches li.goodmatch a { +- font-weight: bold; +-} +- +-/* -- index page ------------------------------------------------------------ */ +- +-table.contentstable { +- width: 90%; +-} +- +-table.contentstable p.biglink { +- line-height: 150%; +-} +- +-a.biglink { +- font-size: 1.3em; +-} +- +-span.linkdescr { +- font-style: italic; +- padding-top: 5px; +- font-size: 90%; +-} +- +-/* -- general index --------------------------------------------------------- */ +- +-table.indextable td { +- text-align: left; +- vertical-align: top; +-} +- +-table.indextable dl, table.indextable dd { +- margin-top: 0; +- margin-bottom: 0; +-} +- +-table.indextable tr.pcap { +- height: 10px; +-} +- +-table.indextable tr.cap { +- margin-top: 10px; +- background-color: #f2f2f2; +-} +- +-img.toggler { +- margin-right: 3px; +- margin-top: 3px; +- cursor: pointer; +-} +- +-/* -- general body styles --------------------------------------------------- */ +- +-a.headerlink { +- visibility: hidden; +-} +- +-h1:hover > a.headerlink, +-h2:hover > a.headerlink, +-h3:hover > a.headerlink, +-h4:hover > a.headerlink, +-h5:hover > a.headerlink, +-h6:hover > a.headerlink, +-dt:hover > a.headerlink { +- visibility: visible; +-} +- +-div.body p.caption { +- text-align: inherit; +-} +- +-div.body td { +- text-align: left; +-} +- +-.field-list ul { +- padding-left: 1em; +-} +- +-.first { +-} +- +-p.rubric { +- margin-top: 30px; +- font-weight: bold; +-} +- +-/* -- sidebars -------------------------------------------------------------- */ +- +-div.sidebar { +- margin: 0 0 0.5em 1em; +- border: 1px solid #ddb; +- padding: 7px 7px 0 7px; +- background-color: #ffe; +- width: 40%; +- float: right; +-} +- +-p.sidebar-title { +- font-weight: bold; +-} +- +-/* -- topics ---------------------------------------------------------------- */ +- +-div.topic { +- border: 1px solid #ccc; +- padding: 7px 7px 0 7px; +- margin: 10px 0 10px 0; +-} +- +-p.topic-title { +- font-size: 1.1em; +- font-weight: bold; +- margin-top: 10px; +-} +- +-/* -- admonitions ----------------------------------------------------------- */ +- +-div.admonition { +- margin-top: 10px; +- margin-bottom: 10px; +- padding: 7px; +-} +- +-div.admonition dt { +- font-weight: bold; +-} +- +-div.admonition dl { +- margin-bottom: 0; +-} +- +-p.admonition-title { +- margin: 0px 10px 5px 0px; +- font-weight: bold; +-} +- +-div.body p.centered { +- text-align: center; +- margin-top: 25px; +-} +- +-/* -- tables ---------------------------------------------------------------- */ +- +-table.docutils { +- border: 0; +- border-collapse: collapse; +-} +- +-table.docutils td, table.docutils th { +- padding: 1px 8px 1px 0; +- border-top: 0; +- border-left: 0; +- border-right: 0; +- border-bottom: 1px solid #aaa; +-} +- +-table.field-list td, table.field-list th { +- border: 0 !important; +-} +- +-table.footnote td, table.footnote th { +- border: 0 !important; +-} +- +-th { +- text-align: left; +- padding-right: 5px; +-} +- +-/* -- other body styles ----------------------------------------------------- */ +- +-dl { +- margin-bottom: 15px; +-} +- +-dd p { +- margin-top: 0px; +-} +- +-dd ul, dd table { +- margin-bottom: 10px; +-} +- +-dd { +- margin-top: 3px; +- margin-bottom: 10px; +- margin-left: 30px; +-} +- +-dt:target, .highlight { +- background-color: #fbe54e; +-} +- +-dl.glossary dt { +- font-weight: bold; +- font-size: 1.1em; +-} +- +-.field-list ul { +- margin: 0; +- padding-left: 1em; +-} +- +-.field-list p { +- margin: 0; +-} +- +-.refcount { +- color: #060; +-} +- +-.optional { +- font-size: 1.3em; +-} +- +-.versionmodified { +- font-style: italic; +-} +- +-.system-message { +- background-color: #fda; +- padding: 5px; +- border: 3px solid red; +-} +- +-.footnote:target { +- background-color: #ffa +-} +- +-.line-block { +- display: block; +- margin-top: 1em; +- margin-bottom: 1em; +-} +- +-.line-block .line-block { +- margin-top: 0; +- margin-bottom: 0; +- margin-left: 1.5em; +-} +- +-/* -- code displays --------------------------------------------------------- */ +- +-pre { +- overflow: auto; +-} +- +-td.linenos pre { +- padding: 5px 0px; +- border: 0; +- background-color: transparent; +- color: #aaa; +-} +- +-table.highlighttable { +- margin-left: 0.5em; +-} +- +-table.highlighttable td { +- padding: 0 0.5em 0 0.5em; +-} +- +-tt.descname { +- background-color: transparent; +- font-weight: bold; +- font-size: 1.2em; +-} +- +-tt.descclassname { +- background-color: transparent; +-} +- +-tt.xref, a tt { +- background-color: transparent; +- font-weight: bold; +-} +- +-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { +- background-color: transparent; +-} +- +-/* -- math display ---------------------------------------------------------- */ +- +-img.math { +- vertical-align: middle; +-} +- +-div.body div.math p { +- text-align: center; +-} +- +-span.eqno { +- float: right; +-} +- +-/* -- printout stylesheet --------------------------------------------------- */ +- +-@media print { +- div.document, +- div.documentwrapper, +- div.bodywrapper { +- margin: 0 !important; +- width: 100%; +- } +- +- div.sphinxsidebar, +- div.related, +- div.footer, +- #top-link { +- display: none; +- } +-} +diff --git a/doc/source/_static/default.css b/doc/source/_static/default.css +deleted file mode 100644 +index c8091ec..0000000 +--- a/doc/source/_static/default.css ++++ /dev/null +@@ -1,230 +0,0 @@ +-/** +- * Sphinx stylesheet -- default theme +- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- */ +- +-@import url("basic.css"); +- +-/* -- page layout ----------------------------------------------------------- */ +- +-body { +- font-family: sans-serif; +- font-size: 100%; +- background-color: #11303d; +- color: #000; +- margin: 0; +- padding: 0; +-} +- +-div.document { +- background-color: #1c4e63; +-} +- +-div.documentwrapper { +- float: left; +- width: 100%; +-} +- +-div.bodywrapper { +- margin: 0 0 0 230px; +-} +- +-div.body { +- background-color: #ffffff; +- color: #000000; +- padding: 0 20px 30px 20px; +-} +- +-div.footer { +- color: #ffffff; +- width: 100%; +- padding: 9px 0 9px 0; +- text-align: center; +- font-size: 75%; +-} +- +-div.footer a { +- color: #ffffff; +- text-decoration: underline; +-} +- +-div.related { +- background-color: #133f52; +- line-height: 30px; +- color: #ffffff; +-} +- +-div.related a { +- color: #ffffff; +-} +- +-div.sphinxsidebar { +-} +- +-div.sphinxsidebar h3 { +- font-family: 'Trebuchet MS', sans-serif; +- color: #ffffff; +- font-size: 1.4em; +- font-weight: normal; +- margin: 0; +- padding: 0; +-} +- +-div.sphinxsidebar h3 a { +- color: #ffffff; +-} +- +-div.sphinxsidebar h4 { +- font-family: 'Trebuchet MS', sans-serif; +- color: #ffffff; +- font-size: 1.3em; +- font-weight: normal; +- margin: 5px 0 0 0; +- padding: 0; +-} +- +-div.sphinxsidebar p { +- color: #ffffff; +-} +- +-div.sphinxsidebar p.topless { +- margin: 5px 10px 10px 10px; +-} +- +-div.sphinxsidebar ul { +- margin: 10px; +- padding: 0; +- color: #ffffff; +-} +- +-div.sphinxsidebar a { +- color: #98dbcc; +-} +- +-div.sphinxsidebar input { +- border: 1px solid #98dbcc; +- font-family: sans-serif; +- font-size: 1em; +-} +- +-/* -- body styles ----------------------------------------------------------- */ +- +-a { +- color: #355f7c; +- text-decoration: none; +-} +- +-a:hover { +- text-decoration: underline; +-} +- +-div.body p, div.body dd, div.body li { +- text-align: left; +- line-height: 130%; +-} +- +-div.body h1, +-div.body h2, +-div.body h3, +-div.body h4, +-div.body h5, +-div.body h6 { +- font-family: 'Trebuchet MS', sans-serif; +- background-color: #f2f2f2; +- font-weight: normal; +- color: #20435c; +- border-bottom: 1px solid #ccc; +- margin: 20px -20px 10px -20px; +- padding: 3px 0 3px 10px; +-} +- +-div.body h1 { margin-top: 0; font-size: 200%; } +-div.body h2 { font-size: 160%; } +-div.body h3 { font-size: 140%; } +-div.body h4 { font-size: 120%; } +-div.body h5 { font-size: 110%; } +-div.body h6 { font-size: 100%; } +- +-a.headerlink { +- color: #c60f0f; +- font-size: 0.8em; +- padding: 0 4px 0 4px; +- text-decoration: none; +-} +- +-a.headerlink:hover { +- background-color: #c60f0f; +- color: white; +-} +- +-div.body p, div.body dd, div.body li { +- text-align: left; +- line-height: 130%; +-} +- +-div.admonition p.admonition-title + p { +- display: inline; +-} +- +-div.admonition p { +- margin-bottom: 5px; +-} +- +-div.admonition pre { +- margin-bottom: 5px; +-} +- +-div.admonition ul, div.admonition ol { +- margin-bottom: 5px; +-} +- +-div.note { +- background-color: #eee; +- border: 1px solid #ccc; +-} +- +-div.seealso { +- background-color: #ffc; +- border: 1px solid #ff6; +-} +- +-div.topic { +- background-color: #eee; +-} +- +-div.warning { +- background-color: #ffe4e4; +- border: 1px solid #f66; +-} +- +-p.admonition-title { +- display: inline; +-} +- +-p.admonition-title:after { +- content: ":"; +-} +- +-pre { +- padding: 5px; +- background-color: #eeffcc; +- color: #333333; +- line-height: 120%; +- border: 1px solid #ac9; +- border-left: none; +- border-right: none; +-} +- +-tt { +- background-color: #ecf0f3; +- padding: 0 1px 0 1px; +- font-size: 0.95em; +-} +- +-.warning tt { +- background: #efc2c2; +-} +- +-.note tt { +- background: #d6d6d6; +-} +diff --git a/doc/source/_static/header-line.gif b/doc/source/_static/header-line.gif +deleted file mode 100644 +index 3601730e03488b7b5f92dc992d23ad753357c167..0000000000000000000000000000000000000000 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 48 +zcmZ?wbhEHbWMg1uXkcVG`smgF|Nj+#vM@3*Ff!;c00Bsbfr-7RpY8O^Kn4bD08FwB +Aga7~l + +diff --git a/doc/source/_static/header_bg.jpg b/doc/source/_static/header_bg.jpg +deleted file mode 100644 +index f788c41c26481728fa4329c17c87bde36001adc1..0000000000000000000000000000000000000000 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 3738 +zcmd5-YdDna8vedHnM0NtYi6>>At7O=uyTsZup5R_40A9)aXQa}U(l^=gSg=J*&3mKp$aM0r>UIFDe9Zy(vs} +zWf)kqO2Y_n0$>ZQ0D&hY4tWjpY?Ii5?V)h*kc0fz?%ZIj3|{;F8E5l%d0)&*Hx~ulvc_*73u8%R +zsVMV~ne!JY);&pWott~QIZYJFTXliYc2};JEU{X7W6;ZPfz;)U;U4#mEuK@K*=SC3BR-m&x9(Nna@>b@%FS34|P^jtsXRb5>z9gtPp;_MI2F3o*k +z>csA-?CX4b;~4P-*L$+Mmb|51F)eD*wCc`Jt(9}C${Zo=!Uin=u_yMC^;`X!x$##4 +z+~}dkT`NF@Uhw0r+6g_)?e!h8IX+OE^C96>UOsv0GPMD6(kr#ljhXRnA=O>Qj@%iT +zqBF7aQ*}BG)h@6r0%#azk!r9yrN6>9dq~>KadV$~cGG?Hjk>~it^5rd#zS4KE*p+4 +z;;B)%oBK8PNTs=A)a-z`n?3zJ%+h{`=>ijk4sYKr*>`eN1H`~Lo|Tm!o6qN{S* +zeNl=NcpGzD55)XnLC|>g)~w={=c#4*x^;mk4Zo_FOFlffP@!?1`c+TogTVR4kp9-q +z`d5cMBzNxk6qjPRK9*WY3uHS=bnm_QJvSMBBS_A#3i=ywsg6^|9rfruW0MhdGwHDO +z?1gJRMQVecKE^gV{%uo(b)zl^Hd&vmnwFh88h*-?FJ;y=Hdqvt!K|s<$>xlzR=G4{ +zZgGOCF43IXS?62B)w*N&dXt%U8X^Bjx}^%Yf>VFpFoKSGP%k?ems;&&J)|Dx(qtQD +zu2tS)<_Qz4#LhBKYkl@Og}G)^5+F4P($Fk>)}{uMVv|;Sz2i4$XJ_WTw*;n>3N805rnXhbC52SC={E3rXRlrs|I6f;o|Cn%eje59{axu9sivy4oYmg=j|fLt3<3 +zFce84aNb8GbK;y>RbBu71YBcYKL3@M3N25yoE%BtG +z^K!`WTQ|fb-Ysa7T)mEw&4_b)PWYgc!)3W)H+neR9o^f|AXdgY1`gN+pvgzbbk`M +z*Ts6${7M`2)9XIPy^MoXTiiP2GTp_OtgWMshnH)M&ZSO0)cet!oWo_0_&hV(0?Qdb +zdo(sw{I#{hI`SWPM`N=U^#+MgN-*rZ#J7Cm7Jj89`5ehd_{z&9->Jc7$F(X4)&|`K +z5rEgd;@dhi-IzJnSVpMd!Gf_G-QW+ +zjVMrIas1)g%)GJ;(=oaK};O^)NYdS1`XR?K_;I7qj +zhii5}x^he{U3M+GF+WpYws#=Pt#S9xB_X5QE7W+_rQdwMhukJnQj}5cnCz_sIJ#r0 +zJa5drkRPI$X(4YdpCswJe#5aN4Jjw3V3Nzt&`lcKBI~#;!>jq7j8y# +zvHrFg_#P376A45^hp-KU*P=R;DVdPK*w7D@Gw+`XsSpm^L-VkCooZF61sPAnnjsT# +zND4C{>G#P10F_&txEoE!rX%Iy*L}Kna=Q%fDLJ_rF*LujRITZ)$g!?UYLkCXOoz-S +z_p`Hny*Rh--l)aYQC&-2dd%;%VKGC1<1DJm_n~`nk4^yS`}&P +zM}5bOypW0hwtvrwnE>}g1Mq+B>09qPp1b$hn6kC_iqF`tX#G-t7D$n}Ky9t}sUqiI +zOe@odQ?JueZ+sg`-zoQ}J4if6vv1c9x{BDme+F6z{8esU^Kio +zK_oPy9}@nlGywSOZy9`^- +zzBg>C9|rgWF{pcCogEV@;d}VHrgeBl=5Dr*th4V!1`Z9Zrz9le1zHC#sM3{j#G2R?WMhl6b_yyoEAxX>Zixl$16`+^d$ihNtuIBUafyiCEv#oksNL<4= +z*oDXsc7-(ww^9-b-6_|bITySG1N2C-7p0L4+V@R%j=4@ygc=89bmSNy38$S=ZiDyP +z0SrqrVA;zi8kYBZ2@Mx(2Lx~-*bc@d1#4R($RJv$9ZTfx_t7Kc|HIHnd&@I386P?& +z?d6Vd(48n${cTNFFCoSIUj#O{mmt%M&xCIFmR9Y3f{2UnF4e9@uFZOaYiY|CLdbDa +z%xS9x4SHi7Fr-1?CnDqRK?)n&$TTBW5J?O&o{TnNCnLw*{QmT7{c}flSbp9&xi*zF +z1TdUn&_!$_WxQbMKGkgsl}B%+N5ZV%Hy6_zJ>dejD89yCBMw9(d}z2fWjYH_nV6!F +zqe_rI2H5Pi0^~S6)jjnu%lqZN*eQq6!||a24+edpSH_{C8Ew^g8dw2qdrH!@*E7K* +z)00Bb8uUsai%v6Oa^L@3E02r|EG%EdV>q;=#2Q9Wjv3l?dAur$4bzyOl3M6 +z1hf%&o*#2R&xnS1z4&R`Uq%`Ut0_P{BOwt;FuDb$1")); +- }); +- return $(returning); +- }, +- linkUser: function() { +- var returning = []; +- var regexp = /[\@]+([A-Za-z0-9-_]+)/gi; +- this.each(function() { +- returning.push(this.replace(regexp,"@$1")); +- }); +- return $(returning); +- }, +- linkHash: function() { +- var returning = []; +- var regexp = / [\#]+([A-Za-z0-9-_]+)/gi; +- this.each(function() { +- returning.push(this.replace(regexp, ' #$1')); +- }); +- return $(returning); +- }, +- capAwesome: function() { +- var returning = []; +- this.each(function() { +- returning.push(this.replace(/\b(awesome)\b/gi, '$1')); +- }); +- return $(returning); +- }, +- capEpic: function() { +- var returning = []; +- this.each(function() { +- returning.push(this.replace(/\b(epic)\b/gi, '$1')); +- }); +- return $(returning); +- }, +- makeHeart: function() { +- var returning = []; +- this.each(function() { +- returning.push(this.replace(/(<)+[3]/gi, "")); +- }); +- return $(returning); +- } +- }); +- +- function relative_time(time_value) { +- var parsed_date = Date.parse(time_value); +- var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); +- var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); +- var pluralize = function (singular, n) { +- return '' + n + ' ' + singular + (n == 1 ? '' : 's'); +- }; +- if(delta < 60) { +- return 'less than a minute ago'; +- } else if(delta < (45*60)) { +- return 'about ' + pluralize("minute", parseInt(delta / 60)) + ' ago'; +- } else if(delta < (24*60*60)) { +- return 'about ' + pluralize("hour", parseInt(delta / 3600)) + ' ago'; +- } else { +- return 'about ' + pluralize("day", parseInt(delta / 86400)) + ' ago'; +- } +- } +- +- function build_url() { +- var proto = ('https:' == document.location.protocol ? 'https:' : 'http:'); +- if (s.list) { +- return proto+"//api.twitter.com/1/"+s.username[0]+"/lists/"+s.list+"/statuses.json?per_page="+s.count+"&callback=?"; +- } else if (s.query == null && s.username.length == 1) { +- return proto+'//twitter.com/status/user_timeline/'+s.username[0]+'.json?count='+s.count+'&callback=?'; +- } else { +- var query = (s.query || 'from:'+s.username.join('%20OR%20from:')); +- return proto+'//search.twitter.com/search.json?&q='+query+'&rpp='+s.count+'&callback=?'; +- } +- } +- +- return this.each(function(){ +- var list = $('
    ').appendTo(this); +- var intro = '

    '+s.intro_text+'

    '; +- var outro = '

    '+s.outro_text+'

    '; +- var loading = $('

    '+s.loading_text+'

    '); +- +- if(typeof(s.username) == "string"){ +- s.username = [s.username]; +- } +- +- if (s.loading_text) $(this).append(loading); +- $.getJSON(build_url(), function(data){ +- if (s.loading_text) loading.remove(); +- if (s.intro_text) list.before(intro); +- $.each((data.results || data), function(i,item){ +- // auto join text based on verb tense and content +- if (s.join_text == "auto") { +- if (item.text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) { +- var join_text = s.auto_join_text_reply; +- } else if (item.text.match(/(^\w+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+) .*/i)) { +- var join_text = s.auto_join_text_url; +- } else if (item.text.match(/^((\w+ed)|just) .*/im)) { +- var join_text = s.auto_join_text_ed; +- } else if (item.text.match(/^(\w*ing) .*/i)) { +- var join_text = s.auto_join_text_ing; +- } else { +- var join_text = s.auto_join_text_default; +- } +- } else { +- var join_text = s.join_text; +- }; +- +- var from_user = item.from_user || item.user.screen_name; +- var profile_image_url = item.profile_image_url || item.user.profile_image_url; +- var join_template = ' '+join_text+' '; +- var join = ((s.join_text) ? join_template : ' '); +- var avatar_template = ''+from_user+'\'s avatar'; +- var avatar = (s.avatar_size ? avatar_template : ''); +- var date = ''+relative_time(item.created_at)+''; +- var text = '' +$([item.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0]+ ''; +- +- // until we create a template option, arrange the items below to alter a tweet's display. +- list.append('
  • ' + avatar + date + join + text + '
  • '); +- +- list.children('li:first').addClass('tweet_first'); +- list.children('li:odd').addClass('tweet_even'); +- list.children('li:even').addClass('tweet_odd'); +- }); +- if (s.outro_text) list.after(outro); +- }); +- +- }); +- }; +-})(jQuery); +\ No newline at end of file +diff --git a/doc/source/_static/nature.css b/doc/source/_static/nature.css +deleted file mode 100644 +index 060ced8..0000000 +--- a/doc/source/_static/nature.css ++++ /dev/null +@@ -1,245 +0,0 @@ +-/* +- * nature.css_t +- * ~~~~~~~~~~~~ +- * +- * Sphinx stylesheet -- nature theme. +- * +- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. +- * :license: BSD, see LICENSE for details. +- * +- */ +- +-@import url("basic.css"); +- +-/* -- page layout ----------------------------------------------------------- */ +- +-body { +- font-family: Arial, sans-serif; +- font-size: 100%; +- background-color: #111; +- color: #555; +- margin: 0; +- padding: 0; +-} +- +-div.documentwrapper { +- float: left; +- width: 100%; +-} +- +-div.bodywrapper { +- margin: 0 0 0 {{ theme_sidebarwidth|toint }}px; +-} +- +-hr { +- border: 1px solid #B1B4B6; +-} +- +-div.document { +- background-color: #eee; +-} +- +-div.body { +- background-color: #ffffff; +- color: #3E4349; +- padding: 0 30px 30px 30px; +- font-size: 0.9em; +-} +- +-div.footer { +- color: #555; +- width: 100%; +- padding: 13px 0; +- text-align: center; +- font-size: 75%; +-} +- +-div.footer a { +- color: #444; +- text-decoration: underline; +-} +- +-div.related { +- background-color: #6BA81E; +- line-height: 32px; +- color: #fff; +- text-shadow: 0px 1px 0 #444; +- font-size: 0.9em; +-} +- +-div.related a { +- color: #E2F3CC; +-} +- +-div.sphinxsidebar { +- font-size: 0.75em; +- line-height: 1.5em; +-} +- +-div.sphinxsidebarwrapper{ +- padding: 20px 0; +-} +- +-div.sphinxsidebar h3, +-div.sphinxsidebar h4 { +- font-family: Arial, sans-serif; +- color: #222; +- font-size: 1.2em; +- font-weight: normal; +- margin: 0; +- padding: 5px 10px; +- background-color: #ddd; +- text-shadow: 1px 1px 0 white +-} +- +-div.sphinxsidebar h4{ +- font-size: 1.1em; +-} +- +-div.sphinxsidebar h3 a { +- color: #444; +-} +- +- +-div.sphinxsidebar p { +- color: #888; +- padding: 5px 20px; +-} +- +-div.sphinxsidebar p.topless { +-} +- +-div.sphinxsidebar ul { +- margin: 10px 20px; +- padding: 0; +- color: #000; +-} +- +-div.sphinxsidebar a { +- color: #444; +-} +- +-div.sphinxsidebar input { +- border: 1px solid #ccc; +- font-family: sans-serif; +- font-size: 1em; +-} +- +-div.sphinxsidebar input[type=text]{ +- margin-left: 20px; +-} +- +-/* -- body styles ----------------------------------------------------------- */ +- +-a { +- color: #005B81; +- text-decoration: none; +-} +- +-a:hover { +- color: #E32E00; +- text-decoration: underline; +-} +- +-div.body h1, +-div.body h2, +-div.body h3, +-div.body h4, +-div.body h5, +-div.body h6 { +- font-family: Arial, sans-serif; +- background-color: #BED4EB; +- font-weight: normal; +- color: #212224; +- margin: 30px 0px 10px 0px; +- padding: 5px 0 5px 10px; +- text-shadow: 0px 1px 0 white +-} +- +-div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; } +-div.body h2 { font-size: 150%; background-color: #C8D5E3; } +-div.body h3 { font-size: 120%; background-color: #D8DEE3; } +-div.body h4 { font-size: 110%; background-color: #D8DEE3; } +-div.body h5 { font-size: 100%; background-color: #D8DEE3; } +-div.body h6 { font-size: 100%; background-color: #D8DEE3; } +- +-a.headerlink { +- color: #c60f0f; +- font-size: 0.8em; +- padding: 0 4px 0 4px; +- text-decoration: none; +-} +- +-a.headerlink:hover { +- background-color: #c60f0f; +- color: white; +-} +- +-div.body p, div.body dd, div.body li { +- line-height: 1.5em; +-} +- +-div.admonition p.admonition-title + p { +- display: inline; +-} +- +-div.highlight{ +- background-color: white; +-} +- +-div.note { +- background-color: #eee; +- border: 1px solid #ccc; +-} +- +-div.seealso { +- background-color: #ffc; +- border: 1px solid #ff6; +-} +- +-div.topic { +- background-color: #eee; +-} +- +-div.warning { +- background-color: #ffe4e4; +- border: 1px solid #f66; +-} +- +-p.admonition-title { +- display: inline; +-} +- +-p.admonition-title:after { +- content: ":"; +-} +- +-pre { +- padding: 10px; +- background-color: White; +- color: #222; +- line-height: 1.2em; +- border: 1px solid #C6C9CB; +- font-size: 1.1em; +- margin: 1.5em 0 1.5em 0; +- -webkit-box-shadow: 1px 1px 1px #d8d8d8; +- -moz-box-shadow: 1px 1px 1px #d8d8d8; +-} +- +-tt { +- background-color: #ecf0f3; +- color: #222; +- /* padding: 1px 2px; */ +- font-size: 1.1em; +- font-family: monospace; +-} +- +-.viewcode-back { +- font-family: Arial, sans-serif; +-} +- +-div.viewcode-block:target { +- background-color: #f4debf; +- border-top: 1px solid #ac9; +- border-bottom: 1px solid #ac9; +-} +diff --git a/doc/source/_static/openstack_logo.png b/doc/source/_static/openstack_logo.png +deleted file mode 100644 +index 146faec5cfe3773824f4caf39e4480e4974d10df..0000000000000000000000000000000000000000 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 3670 +zcmV-c4yo~pP)CW75Qp#l)U;+N6jaIz6Nf$t6dNV>^>ETzcpQ=%tMaf0k|rg72+IW`z$FyfE+D{1@tt$t5DmX)*;QV?c;%+5Z&egAgfXTQJq-mZkC +z>pFAHu}U=Axde_?s!99ZfDg_+9TYzDa6N1R3adhx&2Mb7>9w`KpMNz!>U5t2XQ8lZ +zu+!+H7(PRwF@jAkwvI;|8|=Z_dfzV`Kpi;I!e=|Ql+HAdEag?VZ^Ilw9XJj9N1#1a +z?UFC!)X62`CRIe^9YCLKbJ` +z&O@f0zt{Z1YDF1utg2$F+rzvrncys+g37Xsd8)idSW(=}t#~qF#qBo29*@^ZCs<$W +zpa144=o4g0z63h_ttPfIpH-FyG^MAH+6B~r$(4qw+Uv{2d#h`$lq+i+#Tf%CAzDFUh!pzX(6nW{EASJAQkhm!+}aGpHc +z;(+N`S*@tYmump1T37E}J;!$0#F>^M*mT_X1x~bvnp&qP9IHI#bj-0z8FR+=p+e#*w3ugV#wX``sR-CI1!YiQsfc@Om<;1MBw +zlfqH9z4Q|m*C?URU1OG(`UYn>Q8<|I!mby#FlN5MMFE8;Pyh$skbR?ngFLt?%nWSkS-#W5umy>@^DyAERP~{E&`M%0(qi&((^ahqL}u^jT<2dcf)p< +z%Fxc9J$nh_`>_oNYC?oy`rIDY46Yrw4si3Qn~oXV%dJ}IlUD-40>QipyGa_dV0Z%J +ztcEXm5yxR0gySJ04{nnbm#vP=Hq&GI<8VxcZ34pRjt6m%pE2H|!+HBJQrdBdyKHJR +z2O_}hp!5bXuwniQYTF>yI|=cjT+2l`9T3|H+l4%ryPxWQm(ODW#8Ctj_CplcO=)qj +zD#d~V6BahR9NY1kE5rF)_j<|!Cqnpq0uOKhL%w +z>y8OyeTM1?REXc{0|3b=#WPZneh80PxL=Ljau1~+CgtMgg-vccMDX-L +z9^7An_;!lFAi`#G_1F*OdM|Z$EVQs0m0$?mY}(baOZ%Zpd62#Pyg!3Jd4d +zD^8+lSir&T6Y9-p9L#Wz6$5nXLjdOl?7Lv!TeMr}F14ranauW9=L>ubu*x>Bcrgwp +zjrT@{rL*2Fc}Ilwn07QvdJfMOO2=(1Px)6&ih7lg839!Bx&}lQER~T`^7_x@fXo({ +zCZMeZYt*!VgMTg>PR)PBaIwubzRY%jjE`-s +zG;B}>2!lD=QLOTfQOEZKIEz*;yTJ9(Af0zNv;IDq7#Fr#W{Ap+7Sq1N3TL21X|h2t +z=Dk>^bGSsRX-u+cZ23mMB_Ioc0yNIfcfLWB>$hVU3W3>d&a?IM+bGRGt+t}aiv(eh +z(D6Z9N>U2|Qxle(!UVTeEKE6W))3WI5z48Rs8d5v0GwmyC8iQiUJO8KS?QwHl2abL +zNW+hadDdPc8z%MSOG$l&WR@!!&M{WLmrnS=-0G#&`a)chX>mN9W1>|yqve@lL8a`f +zXRmn$B8P=dLxE!2rIi}a*gh%FI4j?C;b@L=WgypiTRf==n6DKr9mUExo6a@{wLM-I +z9%V9{!;5G!<8fMYikfEbrGXRQN-9*24}kIIpP&dEg@fiLqAY5|jjv}$P3x0avZODU +zdX`c|G>h`1f=3uEu)L9C)H5%frni#HZXcX`TD{iQ-e2qXxj_f%|WW;byDMc%7+uBy}Y?KLC?jp%yyyeBNkqQ-*osw2ex&97Q{#C7%CdSDMNIV +zTdC(LEm?&qPcNOjM)h9Grs|M(gsuhV8@96?m4WkQ>j{bJIs)m^neL%ua!i+N8>Lh+ +zKu#7rF~VOH@hb{zGXYwys!Um4Vkf+H8Hj6?^eI%kT%j+HA0K=6qdQ@nfR57Q`Jm9T +zc)Yg9-`e~BRE!xoKZ +z=mP|0Kihr}V1$5sHw$QekmoL)lQ;~@H$S)}s3xuwypiubB?1%OyBpwC08TH!=?BrQ +zhOp`PTu;%u0}Q=XKGb7d$g8*;de8c1UI|Re2R;;Radh_D!FIZg+JP`oJg>5 +z;&B7eVAomZe>j~hOOIVRO_Q7eSGz37hxmnsG!n%HX`C6gSqFcg(RLmikn%EPR*wel +zrsc;>!vQ<>2ZW`lk`MbNLopFd#_9mh8iKPH;KbjC@xJU${pdxuTF{uO(eG#9t*>XP +z_4Seh`r_#q$^xeiuy(=eSouv66cpS!t3n`|j`6xnmSs1q@;0!I)m<6eYHHGMRdB87 +ziruozT=gn@yp`B9oGxD-b7PqhZum|oJCfLB38&8v51ijj-Pb`qvCr3FtJ0aFms2h3(n0-}3jJ~J$ +zCzep7-MIZFbo$(m8zWm?SoRl__blLE+!fFBVVk1&XLg+vmVNcTk9O2+q?x#F0LZUN +zu6oM~C)(7^0|az4nM}@aZf<@RkH0CR8<-Yn-fZe+Dbr#iJWSt#tnR4^h<@ePXWmeHIO4q^X +zCbiy(=k3R1o1}0E+7x*OOe-qnIXG{#N_rqK*1NH}Qz6aumTR`YTgo5K=q=61;5@b- +zrgUA_Qz=)(TPN!tCZE|{?B0*r9ov5Fcip6xQ2;Yqs*2_o7TFKGp0|~bcP@6+a(rz^ +zXXmmyBfT}ucw_t(6s+f^t_)nc>RKW<-q_&J35vN+RPLsR?VAsQeHLyCR7AWvxFOVc +zAg-xl=j*RipzaKWx3lAf?ei`PoM;bbAL>svH?JqQwjSulb9bghytRt%*5x-no>xlf +zh7qj0LYRXVDU})?Btsy7^71*ujsEP_ACyd)P)*ULWBCXox@PUfwmQ#)Vl&oeIqpQY +zHMgU+xe0EhQ)RmjdB3JHGdrsvJ9?A=WwOrn)J?BH{+D&O_@SKdrj2|8Z{hS1T(k>&Zlt;p=tqw*mVY1aLt=u^eAHkW>8cb#@q& +z4-SLa@ii +zCt7NGrLv)1Scy9ew-sOwwLYn2a6T#KzJgnbacm7Z20q6tcs~C!0DI+r(=$l+x{=W0A}~0&W)ll4*&oF07*qoM6N<$f~n6U7ytkO + +diff --git a/doc/source/_static/tweaks.css b/doc/source/_static/tweaks.css +deleted file mode 100644 +index 3f3fb3f..0000000 +--- a/doc/source/_static/tweaks.css ++++ /dev/null +@@ -1,94 +0,0 @@ +-body { +- background: #fff url(../_static/header_bg.jpg) top left no-repeat; +-} +- +-#header { +- width: 950px; +- margin: 0 auto; +- height: 102px; +-} +- +-#header h1#logo { +- background: url(../_static/openstack_logo.png) top left no-repeat; +- display: block; +- float: left; +- text-indent: -9999px; +- width: 175px; +- height: 55px; +-} +- +-#navigation { +- background: url(../_static/header-line.gif) repeat-x 0 bottom; +- display: block; +- float: left; +- margin: 27px 0 0 25px; +- padding: 0; +-} +- +-#navigation li{ +- float: left; +- display: block; +- margin-right: 25px; +-} +- +-#navigation li a { +- display: block; +- font-weight: normal; +- text-decoration: none; +- background-position: 50% 0; +- padding: 20px 0 5px; +- color: #353535; +- font-size: 14px; +-} +- +-#navigation li a.current, #navigation li a.section { +- border-bottom: 3px solid #cf2f19; +- color: #cf2f19; +-} +- +-div.related { +- background-color: #cde2f8; +- border: 1px solid #b0d3f8; +-} +- +-div.related a { +- color: #4078ba; +- text-shadow: none; +-} +- +-div.sphinxsidebarwrapper { +- padding-top: 0; +-} +- +-pre { +- color: #555; +-} +- +-div.documentwrapper h1, div.documentwrapper h2, div.documentwrapper h3, div.documentwrapper h4, div.documentwrapper h5, div.documentwrapper h6 { +- font-family: 'PT Sans', sans-serif !important; +- color: #264D69; +- border-bottom: 1px dotted #C5E2EA; +- padding: 0; +- background: none; +- padding-bottom: 5px; +-} +- +-div.documentwrapper h3 { +- color: #CF2F19; +-} +- +-a.headerlink { +- color: #fff !important; +- margin-left: 5px; +- background: #CF2F19 !important; +-} +- +-div.body { +- margin-top: -25px; +- margin-left: 230px; +-} +- +-div.document { +- width: 960px; +- margin: 0 auto; +-} +\ No newline at end of file +diff --git a/doc/source/_theme/layout.html b/doc/source/_theme/layout.html +deleted file mode 100644 +index 750b782..0000000 +--- a/doc/source/_theme/layout.html ++++ /dev/null +@@ -1,83 +0,0 @@ +-{% extends "basic/layout.html" %} +-{% set css_files = css_files + ['_static/tweaks.css'] %} +-{% set script_files = script_files + ['_static/jquery.tweet.js'] %} +- +-{%- macro sidebar() %} +- {%- if not embedded %}{% if not theme_nosidebar|tobool %} +-
    +-
    +- {%- block sidebarlogo %} +- {%- if logo %} +- +- {%- endif %} +- {%- endblock %} +- {%- block sidebartoc %} +- {%- if display_toc %} +-

    {{ _('Table Of Contents') }}

    +- {{ toc }} +- {%- endif %} +- {%- endblock %} +- {%- block sidebarrel %} +- {%- if prev %} +-

    {{ _('Previous topic') }}

    +-

    {{ prev.title }}

    +- {%- endif %} +- {%- if next %} +-

    {{ _('Next topic') }}

    +-

    {{ next.title }}

    +- {%- endif %} +- {%- endblock %} +- {%- block sidebarsourcelink %} +- {%- if show_source and has_source and sourcename %} +-

    {{ _('This Page') }}

    +- +- {%- endif %} +- {%- endblock %} +- {%- if customsidebar %} +- {% include customsidebar %} +- {%- endif %} +- {%- block sidebarsearch %} +- {%- if pagename != "search" %} +- +- +- {%- endif %} +- {%- endblock %} +-
    +-
    +- {%- endif %}{% endif %} +-{%- endmacro %} +- +-{% block relbar1 %}{% endblock relbar1 %} +- +-{% block header %} +- +-{% endblock %} +\ No newline at end of file +diff --git a/doc/source/_theme/theme.conf b/doc/source/_theme/theme.conf +deleted file mode 100644 +index 1cc4004..0000000 +--- a/doc/source/_theme/theme.conf ++++ /dev/null +@@ -1,4 +0,0 @@ +-[theme] +-inherit = basic +-stylesheet = nature.css +-pygments_style = tango +diff --git a/doc/source/man/cfn-create-aws-symlinks.rst b/doc/source/cfn-create-aws-symlinks.rst +similarity index 100% +rename from doc/source/man/cfn-create-aws-symlinks.rst +rename to doc/source/cfn-create-aws-symlinks.rst +diff --git a/doc/source/man/cfn-get-metadata.rst b/doc/source/cfn-get-metadata.rst +similarity index 100% +rename from doc/source/man/cfn-get-metadata.rst +rename to doc/source/cfn-get-metadata.rst +diff --git a/doc/source/man/cfn-hup.rst b/doc/source/cfn-hup.rst +similarity index 100% +rename from doc/source/man/cfn-hup.rst +rename to doc/source/cfn-hup.rst +diff --git a/doc/source/man/cfn-init.rst b/doc/source/cfn-init.rst +similarity index 100% +rename from doc/source/man/cfn-init.rst +rename to doc/source/cfn-init.rst +diff --git a/doc/source/man/cfn-push-stats.rst b/doc/source/cfn-push-stats.rst +similarity index 100% +rename from doc/source/man/cfn-push-stats.rst +rename to doc/source/cfn-push-stats.rst +diff --git a/doc/source/man/cfn-signal.rst b/doc/source/cfn-signal.rst +similarity index 100% +rename from doc/source/man/cfn-signal.rst +rename to doc/source/cfn-signal.rst +diff --git a/doc/source/conf.py b/doc/source/conf.py +index 50918d5..567b444 100644 +--- a/doc/source/conf.py ++++ b/doc/source/conf.py +@@ -1,10 +1,21 @@ + # -*- coding: utf-8 -*- ++# 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 + # +-# Heat documentation build configuration file, created by +-# sphinx-quickstart on Thu Dec 13 11:23:35 2012. ++# http://www.apache.org/licenses/LICENSE-2.0 + # +-# This file is execfile()d with the current directory set to its containing +-# dir. ++# 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. ++# ++# heat-cfntools documentation build configuration file, created by ++# sphinx-quickstart on Thu Jul 20 09:19:39 2017. ++# ++# This file is execfile()d with the current directory set to its ++# containing dir. + # + # Note that not all possible configuration values are present in this + # autogenerated file. +@@ -12,256 +23,171 @@ + # All configuration values have a default; values that are commented out + # serve to show the default. + +-import os +-import sys +- + # If extensions (or modules to document with autodoc) are in another directory, + # add these directories to sys.path here. If the directory is relative to the + # documentation root, use os.path.abspath to make it absolute, like shown here. +-sys.path.insert(0, os.path.abspath('../../')) ++# ++# import os ++# import sys ++# sys.path.insert(0, os.path.abspath('.')) ++ + +-# -- General configuration ---------------------------------------------------- ++# -- General configuration ------------------------------------------------ + + # If your documentation needs a minimal Sphinx version, state it here. +-#needs_sphinx = '1.0' ++# ++# needs_sphinx = '1.0' + + # Add any Sphinx extension module names here, as strings. They can be +-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. ++# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ++# ones. + extensions = ['sphinx.ext.autodoc', +- 'sphinx.ext.ifconfig', +- 'sphinx.ext.viewcode'] ++ 'openstackdocstheme'] + + # Add any paths that contain templates here, relative to this directory. +-#templates_path = ['_templates'] ++templates_path = ['_templates'] + +-# The suffix of source filenames. ++# The suffix(es) of source filenames. ++# You can specify multiple suffix as a list of string: ++# ++# source_suffix = ['.rst', '.md'] + source_suffix = '.rst' + +-# The encoding of source files. +-#source_encoding = 'utf-8-sig' +- + # The master toctree document. +-master_doc = 'man/index' ++master_doc = 'index' + + # General information about the project. +-project = u'Heat cfntools' +-copyright = u'2012,2013 Heat Developers' ++project = 'heat-cfntools' ++copyright = 'OpenStack Foundation' + + # The version info for the project you're documenting, acts as replacement for + # |version| and |release|, also used in various other places throughout the + # built documents. +- +-#from heat import version as heat_version ++# ++# The short X.Y version. ++version = '' + # The full version, including alpha/beta/rc tags. +-#release = heat_version.version_info.release_string() +-# The short X.Y version +-#version = heat_version.version_info.version_string() ++release = '' + + # The language for content autogenerated by Sphinx. Refer to documentation + # for a list of supported languages. +-#language = None +- +-# There are two options for replacing |today|: either, you set today to some +-# non-false value, then it is used: +-#today = '' +-# Else, today_fmt is used as the format for a strftime call. +-#today_fmt = '%B %d, %Y' ++# ++# This is also used if you do content translation via gettext catalogs. ++# Usually you set "language" from the command line for these cases. ++language = None + + # List of patterns, relative to source directory, that match files and + # directories to ignore when looking for source files. ++# This patterns also effect to html_static_path and html_extra_path + exclude_patterns = [] + +-# The reST default role (used for this markup: `text`) to use for all +-# documents. +-#default_role = None +- +-# If true, '()' will be appended to :func: etc. cross-reference text. +-#add_function_parentheses = True +- +-# If true, the current module name will be prepended to all description +-# unit titles (such as .. function::). +-#add_module_names = True +- +-# If true, sectionauthor and moduleauthor directives will be shown in the +-# output. They are ignored by default. +-#show_authors = False +- + # The name of the Pygments (syntax highlighting) style to use. + pygments_style = 'sphinx' + +-# A list of ignored prefixes for module index sorting. +-#modindex_common_prefix = [] ++# If true, `todo` and `todoList` produce output, else they produce nothing. ++# todo_include_todos = False + + +-# -- Options for HTML output -------------------------------------------------- ++# -- Options for HTML output ---------------------------------------------- + + # The theme to use for HTML and HTML Help pages. See the documentation for + # a list of builtin themes. +-html_theme_path = ['.'] +-html_theme = '_theme' ++# ++html_theme = 'openstackdocs' + + # Theme options are theme-specific and customize the look and feel of a theme + # further. For a list of options available for each theme, see the + # documentation. +-html_theme_options = { +- "nosidebar": "false" +-} +- +-# Add any paths that contain custom themes here, relative to this directory. +-#html_theme_path = [] +- +-# The name for this set of Sphinx documents. If None, it defaults to +-# " v documentation". +-#html_title = None +- +-# A shorter title for the navigation bar. Default is the same as html_title. +-#html_short_title = None +- +-# The name of an image file (relative to this directory) to place at the top +-# of the sidebar. +-#html_logo = None +- +-# The name of an image file (within the static path) to use as favicon of the +-# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +-# pixels large. +-#html_favicon = None ++# ++# html_theme_options = {} + + # Add any paths that contain custom static files (such as style sheets) here, + # relative to this directory. They are copied after the builtin static files, + # so a file named "default.css" will overwrite the builtin "default.css". +-html_static_path = ['_static'] ++# html_static_path = ['_static'] + +-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +-# using the given strftime format. +-#html_last_updated_fmt = '%b %d, %Y' +- +-# If true, SmartyPants will be used to convert quotes and dashes to +-# typographically correct entities. +-#html_use_smartypants = True +- +-# Custom sidebar templates, maps document names to template names. +-#html_sidebars = {} +- +-# Additional templates that should be rendered to pages, maps page names to +-# template names. +-#html_additional_pages = {} +- +-# If false, no module index is generated. +-#html_domain_indices = True +- +-# If false, no index is generated. +-#html_use_index = True +- +-# If true, the index is split into individual pages for each letter. +-#html_split_index = False +- +-# If true, links to the reST sources are added to the pages. +-#html_show_sourcelink = True +- +-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +-#html_show_sphinx = True +- +-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +-#html_show_copyright = True ++# Custom sidebar templates, must be a dictionary that maps document names ++# to template names. ++# ++# This is required for the alabaster theme ++# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars ++# html_sidebars = {} + +-# If true, an OpenSearch description file will be output, and all pages will +-# contain a tag referring to it. The value of this option must be the +-# base URL from which the finished HTML is served. +-#html_use_opensearch = '' ++# -- Options for openstackdocstheme -------------------------------------- ++repository_name = 'openstack/heat-cfntools' ++bug_project = 'heat-cfntools' ++bug_tag = '' + +-# This is the file name suffix for HTML files (e.g. ".xhtml"). +-#html_file_suffix = None ++# -- Options for HTMLHelp output ------------------------------------------ + + # Output file base name for HTML help builder. +-htmlhelp_basename = 'Heatdoc' ++htmlhelp_basename = 'heat-cfntoolsdoc' + + +-# -- Options for LaTeX output ------------------------------------------------- ++# -- Options for LaTeX output --------------------------------------------- + + latex_elements = { +-# The paper size ('letterpaper' or 'a4paper'). +-#'papersize': 'letterpaper', ++ # The paper size ('letterpaper' or 'a4paper'). ++ # ++ # 'papersize': 'letterpaper', ++ ++ # The font size ('10pt', '11pt' or '12pt'). ++ # ++ # 'pointsize': '10pt', + +-# The font size ('10pt', '11pt' or '12pt'). +-#'pointsize': '10pt', ++ # Additional stuff for the LaTeX preamble. ++ # ++ # 'preamble': '', + +-# Additional stuff for the LaTeX preamble. +-#'preamble': '', ++ # Latex figure (float) alignment ++ # ++ # 'figure_align': 'htbp', + } + + # Grouping the document tree into LaTeX files. List of tuples +-# (source start file, target name, title, author, documentclass [howto/manual]) +-#latex_documents = [ +-# ('index', 'Heat.tex', u'Heat Documentation', +-# u'Heat Developers', 'manual'), +-#] +- +-# The name of an image file (relative to this directory) to place at the top of +-# the title page. +-#latex_logo = None +- +-# For "manual" documents, if this is true, then toplevel headings are parts, +-# not chapters. +-#latex_use_parts = False +- +-# If true, show page references after internal links. +-#latex_show_pagerefs = False +- +-# If true, show URL addresses after external links. +-#latex_show_urls = False +- +-# Documents to append as an appendix to all manuals. +-#latex_appendices = [] +- +-# If false, no module index is generated. +-#latex_domain_indices = True ++# (source start file, target name, title, ++# author, documentclass [howto, manual, or own class]). ++latex_documents = [ ++ (master_doc, 'heat-cfntools.tex', 'heat-cfntools Documentation', ++ 'OpenStack Foundation', 'manual'), ++] + + +-# -- Options for manual page output ------------------------------------------- ++# -- Options for manual page output --------------------------------------- + + # One entry per manual page. List of tuples + # (source start file, name, description, authors, manual section). + man_pages = [ +- ('man/cfn-create-aws-symlinks', 'cfn-create-aws-symlinks', ++ (master_doc, 'heat-cfntools', 'heat-cfntools Documentation', ++ ['Heat Developers'], 1), ++ ('cfn-create-aws-symlinks', 'cfn-create-aws-symlinks', + u'Creates symlinks for the cfn-* scripts in this directory to /opt/aws/bin', + [u'Heat Developers'], 1), +- ('man/cfn-get-metadata', 'cfn-get-metadata', ++ ('cfn-get-metadata', 'cfn-get-metadata', + u'Implements cfn-get-metadata CloudFormation functionality', + [u'Heat Developers'], 1), +- ('man/cfn-hup', 'cfn-hup', ++ ('cfn-hup', 'cfn-hup', + u'Implements cfn-hup CloudFormation functionality', + [u'Heat Developers'], 1), +- ('man/cfn-init', 'cfn-init', ++ ('cfn-init', 'cfn-init', + u'Implements cfn-init CloudFormation functionality', + [u'Heat Developers'], 1), +- ('man/cfn-push-stats', 'cfn-push-stats', ++ ('cfn-push-stats', 'cfn-push-stats', + u'Implements cfn-push-stats CloudFormation functionality', + [u'Heat Developers'], 1), +- ('man/cfn-signal', 'cfn-signal', ++ ('cfn-signal', 'cfn-signal', + u'Implements cfn-signal CloudFormation functionality', + [u'Heat Developers'], 1), + ] + +-# If true, show URL addresses after external links. +-#man_show_urls = False + +- +-# -- Options for Texinfo output ----------------------------------------------- ++# -- Options for Texinfo output ------------------------------------------- + + # Grouping the document tree into Texinfo files. List of tuples + # (source start file, target name, title, author, + # dir menu entry, description, category) +-#texinfo_documents = [ +-# ('index', 'Heat', u'Heat Documentation', +-# u'Heat Developers', 'Heat', 'One line description of project.', +-# 'Miscellaneous'), +-#] +- +-# Documents to append as an appendix to all manuals. +-#texinfo_appendices = [] +- +-# If false, no module index is generated. +-#texinfo_domain_indices = True +- +-# How to display URL addresses: 'footnote', 'no', or 'inline'. +-#texinfo_show_urls = 'footnote' ++texinfo_documents = [ ++ (master_doc, 'heat-cfntools', 'heat-cfntools Documentation', ++ 'Heat Developers', 'heat-cfntools', 'One line description of project.', ++ 'Miscellaneous'), ++] +diff --git a/doc/source/man/index.rst b/doc/source/index.rst +similarity index 94% +rename from doc/source/man/index.rst +rename to doc/source/index.rst +index 45d7165..54479b1 100644 +--- a/doc/source/man/index.rst ++++ b/doc/source/index.rst +@@ -7,7 +7,7 @@ Heat cfntools + ------------- + + .. toctree:: +- :maxdepth: 2 ++ :maxdepth: 1 + + cfn-create-aws-symlinks + cfn-get-metadata +diff --git a/setup.cfg b/setup.cfg +index 23690c3..64195d8 100644 +--- a/setup.cfg ++++ b/setup.cfg +@@ -33,6 +33,14 @@ setup-hooks = + + [wheel] + universal = 1 ++ ++[build_sphinx] ++source-dir = doc/source ++build-dir = doc/build ++all_files = 1 ++ ++[upload_sphinx] ++upload-dir = doc/build/html + + [egg_info] + tag_date = 0 +diff --git a/test-requirements.txt b/test-requirements.txt +index 5d3b372..9a2e1ea 100644 +--- a/test-requirements.txt ++++ b/test-requirements.txt +@@ -3,5 +3,7 @@ hacking>=0.8.0,<0.9 + + mock>=1.0 + discover ++openstackdocstheme>=1.11.0 # Apache-2.0 ++sphinx>=1.6.2 # BSD + testrepository>=0.0.18 + testtools>=0.9.34 +diff --git a/tox.ini b/tox.ini +index 9e3ea73..f974f36 100644 +--- a/tox.ini ++++ b/tox.ini +@@ -27,3 +27,9 @@ commands = {posargs} + [flake8] + show-source = true + exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,tools ++ ++[testenv:docs] ++deps = -r{toxinidir}/requirements.txt ++ -r{toxinidir}/test-requirements.txt ++ sphinxcontrib-httpdomain ++commands = python setup.py build_sphinx +-- +2.20.1 + diff --git a/SOURCES/0009-Remove-discover-from-test-requirements.patch b/SOURCES/0009-Remove-discover-from-test-requirements.patch new file mode 100644 index 0000000..b73b975 --- /dev/null +++ b/SOURCES/0009-Remove-discover-from-test-requirements.patch @@ -0,0 +1,27 @@ +From f88f78b7f45bf982ad166fc02c4fc41b22d700ba Mon Sep 17 00:00:00 2001 +From: Dirk Mueller +Date: Mon, 19 Feb 2018 21:28:31 +0100 +Subject: [PATCH 09/21] Remove discover from test-requirements + +discover is only needed for Python 2.6.x or older. + +Change-Id: Iea418fa2a7c826e157e96e1672d22b737c0669e1 +--- + test-requirements.txt | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/test-requirements.txt b/test-requirements.txt +index 9a2e1ea..412c495 100644 +--- a/test-requirements.txt ++++ b/test-requirements.txt +@@ -2,7 +2,6 @@ + hacking>=0.8.0,<0.9 + + mock>=1.0 +-discover + openstackdocstheme>=1.11.0 # Apache-2.0 + sphinx>=1.6.2 # BSD + testrepository>=0.0.18 +-- +2.20.1 + diff --git a/SOURCES/0010-Update-links-in-README.patch b/SOURCES/0010-Update-links-in-README.patch new file mode 100644 index 0000000..6eba2b5 --- /dev/null +++ b/SOURCES/0010-Update-links-in-README.patch @@ -0,0 +1,30 @@ +From eccdf10a9334069d9c11c323cee25e92090213fd Mon Sep 17 00:00:00 2001 +From: XiaojueGuan +Date: Tue, 12 Jun 2018 16:49:01 +0800 +Subject: [PATCH 10/21] Update links in README + + Change the outdated links to the latest links in README + +Change-Id: I5743757aedc3462575bac5b9c6e9cbd2b6453801 +--- + README.rst | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/README.rst b/README.rst +index dfe9c50..aaf507d 100644 +--- a/README.rst ++++ b/README.rst +@@ -2,8 +2,8 @@ + Team and repository tags + ======================== + +-.. image:: http://governance.openstack.org/badges/heat-cfntools.svg +- :target: http://governance.openstack.org/reference/tags/index.html ++.. image:: https://governance.openstack.org/tc/badges/heat-cfntools.svg ++ :target: https://governance.openstack.org/tc/reference/tags/index.html + + .. Change things from this point on + +-- +2.20.1 + diff --git a/SOURCES/0011-Python3-Don-t-use-cmp-function.patch b/SOURCES/0011-Python3-Don-t-use-cmp-function.patch new file mode 100644 index 0000000..3890c01 --- /dev/null +++ b/SOURCES/0011-Python3-Don-t-use-cmp-function.patch @@ -0,0 +1,40 @@ +From c583cbf9b25a8747b7eb2317c970acaecb9484f3 Mon Sep 17 00:00:00 2001 +From: Zane Bitter +Date: Wed, 18 Jul 2018 16:33:41 -0400 +Subject: [PATCH 11/21] Python3: Don't use cmp() function + +The built-in cmp() function has been removed in Python 3, so don't try to +use it. + +Change-Id: Ic62b7032ec6fd555974fc0d818327879d53a8ff2 +--- + heat_cfntools/cfntools/cfn_helper.py | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/heat_cfntools/cfntools/cfn_helper.py b/heat_cfntools/cfntools/cfn_helper.py +index f2b9f90..e68d8fe 100644 +--- a/heat_cfntools/cfntools/cfn_helper.py ++++ b/heat_cfntools/cfntools/cfn_helper.py +@@ -457,13 +457,17 @@ class PackagesHandler(object): + p1_name = pkg1[0] + p2_name = pkg2[0] + if p1_name in order and p2_name in order: +- return cmp(order.index(p1_name), order.index(p2_name)) ++ i1 = order.index(p1_name) ++ i2 = order.index(p2_name) ++ return (i1 > i2) - (i1 < i2) + elif p1_name in order: + return -1 + elif p2_name in order: + return 1 + else: +- return cmp(p1_name.lower(), p2_name.lower()) ++ n1 = p1_name.lower() ++ n2 = p2_name.lower() ++ return (n1 > n2) - (n1 < n2) + + def __init__(self, packages): + self._packages = packages +-- +2.20.1 + diff --git a/SOURCES/0012-Fix-pep8-errors-with-later-versions-of-hacking.patch b/SOURCES/0012-Fix-pep8-errors-with-later-versions-of-hacking.patch new file mode 100644 index 0000000..1c51202 --- /dev/null +++ b/SOURCES/0012-Fix-pep8-errors-with-later-versions-of-hacking.patch @@ -0,0 +1,296 @@ +From d04bb529dc184470b6de45a1033cd2981838d9f9 Mon Sep 17 00:00:00 2001 +From: Zane Bitter +Date: Wed, 18 Jul 2018 16:35:03 -0400 +Subject: [PATCH 12/21] Fix pep8 errors with later versions of hacking + +We are stuck on a very old version of hacking (0.8). In order to move +forward, we need to fix a bunch of things that flake8 will complain about. + +Change-Id: If40ac29094b90c5bae63e7423061a190655f50a3 +--- + bin/cfn-push-stats | 4 +- + heat_cfntools/cfntools/cfn_helper.py | 66 ++++++++++++++------------ + heat_cfntools/tests/test_cfn_helper.py | 16 +++---- + heat_cfntools/tests/test_cfn_hup.py | 3 +- + 4 files changed, 47 insertions(+), 42 deletions(-) + +diff --git a/bin/cfn-push-stats b/bin/cfn-push-stats +index d1171ee..29f1fab 100755 +--- a/bin/cfn-push-stats ++++ b/bin/cfn-push-stats +@@ -23,7 +23,7 @@ import subprocess + # Override BOTO_CONFIG, which makes boto look only at the specified + # config file, instead of the default locations + os.environ['BOTO_CONFIG'] = '/var/lib/heat-cfntools/cfn-boto-cfg' +-from boto.ec2 import cloudwatch ++from boto.ec2 import cloudwatch # noqa + + + log_format = '%(levelname)s [%(asctime)s] %(message)s' +@@ -38,7 +38,7 @@ except ImportError: + LOG.warning("psutil not available. If you want process and memory " + "statistics, you need to install it.") + +-from heat_cfntools.cfntools import cfn_helper ++from heat_cfntools.cfntools import cfn_helper # noqa + + KILO = 1024 + MEGA = 1048576 +diff --git a/heat_cfntools/cfntools/cfn_helper.py b/heat_cfntools/cfntools/cfn_helper.py +index e68d8fe..4490e6c 100644 +--- a/heat_cfntools/cfntools/cfn_helper.py ++++ b/heat_cfntools/cfntools/cfn_helper.py +@@ -36,16 +36,17 @@ except ImportError: + rpmutils_present = False + import re + import shutil +-import six +-import six.moves.configparser as ConfigParser + import subprocess + import tempfile + ++import six ++import six.moves.configparser as ConfigParser ++ + + # Override BOTO_CONFIG, which makes boto look only at the specified + # config file, instead of the default locations + os.environ['BOTO_CONFIG'] = '/var/lib/heat-cfntools/cfn-boto-cfg' +-from boto import cloudformation ++from boto import cloudformation # noqa + + + LOG = logging.getLogger(__name__) +@@ -72,6 +73,12 @@ def parse_creds_file(path='/etc/cfn/cfn-credentials'): + return creds + + ++class InvalidCredentialsException(Exception): ++ def __init__(self, credential_file): ++ super(Exception, self).__init__("invalid credentials file %s" % ++ credential_file) ++ ++ + class HupConfig(object): + def __init__(self, fp_list): + self.config = ConfigParser.SafeConfigParser() +@@ -98,8 +105,7 @@ class HupConfig(object): + with open(self.credential_file) as f: + self.credentials = f.read() + except Exception: +- raise Exception("invalid credentials file %s" % +- self.credential_file) ++ raise InvalidCredentialsException(self.credential_file) + + # optional values + try: +@@ -113,8 +119,8 @@ class HupConfig(object): + self.interval = 10 + + def __str__(self): +- return '{stack: %s, credential_file: %s, region: %s, interval:%d}' % \ +- (self.stack, self.credential_file, self.region, self.interval) ++ return ('{stack: %s, credential_file: %s, region: %s, interval:%d}' % ++ (self.stack, self.credential_file, self.region, self.interval)) + + def unique_resources_get(self): + resources = [] +@@ -138,20 +144,19 @@ class Hook(object): + return sp[1] + + def event(self, ev_name, ev_object, ev_resource): +- if self.resource_name_get() == ev_resource and \ +- ev_name in self.triggers: ++ if (self.resource_name_get() == ev_resource and ++ ev_name in self.triggers): + CommandRunner(self.action, shell=True).run(user=self.runas) + else: + LOG.debug('event: {%s, %s, %s} did not match %s' % + (ev_name, ev_object, ev_resource, self.__str__())) + + def __str__(self): +- return '{%s, %s, %s, %s, %s}' % \ +- (self.name, +- self.triggers, +- self.path, +- self.runas, +- self.action) ++ return '{%s, %s, %s, %s, %s}' % (self.name, ++ self.triggers, ++ self.path, ++ self.runas, ++ self.action) + + + class ControlledPrivilegesFailureException(Exception): +@@ -656,7 +661,7 @@ class PackagesHandler(object): + * if a different version of the package is installed, overwrite it + * if the package isn't installed, install it + """ +- #FIXME: handle rpm installs ++ # FIXME(asalkeld): handle rpm installs + pass + + def _handle_apt_packages(self, packages): +@@ -738,8 +743,8 @@ class FilesHandler(object): + f.close() + else: + f = open(dest, 'w+') +- f.write(json.dumps(meta['content'], indent=4) +- .encode('UTF-8')) ++ f.write(json.dumps(meta['content'], ++ indent=4).encode('UTF-8')) + f.close() + elif 'source' in meta: + CommandRunner(['curl', '-o', dest, meta['source']]).run() +@@ -843,7 +848,7 @@ class SourcesHandler(object): + + def _apply_source(self, dest, url): + cmd = self._apply_source_cmd(dest, url) +- #FIXME bug 1498298 ++ # FIXME bug 1498298 + if cmd != '': + runner = CommandRunner(cmd, shell=True) + runner.run() +@@ -945,7 +950,7 @@ class ServicesHandler(object): + start_cmd = handler(self, service, "start") + if start_cmd.status != 0: + LOG.warning('Service %s did not start. STDERR: %s' % +- (service, start_cmd.stderr)) ++ (service, start_cmd.stderr)) + for h in self.hooks: + h.event('service.restarted', service, self.resource) + +@@ -1124,8 +1129,8 @@ class CommandsHandler(object): + if command_status == 0: + LOG.info("%s has been successfully executed" % command_label) + else: +- if "ignoreErrors" in properties and \ +- to_boolean(properties["ignoreErrors"]): ++ if ("ignoreErrors" in properties and ++ to_boolean(properties["ignoreErrors"])): + LOG.info("%s has failed (status=%d). Explicit ignoring" + % (command_label, command_status)) + else: +@@ -1202,8 +1207,8 @@ class UsersHandler(object): + groups = ','.join(properties["groups"]) + cmd.extend(['--groups', groups]) + +- #Users are created as non-interactive system users with a shell +- #of /sbin/nologin. This is by design and cannot be modified. ++ # Users are created as non-interactive system users with a shell ++ # of /sbin/nologin. This is by design and cannot be modified. + cmd.extend(['--shell', '/sbin/nologin']) + + command = CommandRunner(cmd) +@@ -1431,9 +1436,10 @@ class Metadata(object): + return json.dumps(self._metadata) + + def display(self, key=None): +- """Print the metadata to the standard output stream. By default the +- full metadata is displayed but the ouptut can be limited to a specific +- with the argument. ++ """Print the metadata to the standard output stream. ++ ++ By default the full metadata is displayed but the ouptut can be limited ++ to a specific with the argument. + + Arguments: + key -- the metadata's key to display, nested keys can be specified +@@ -1475,9 +1481,9 @@ class Metadata(object): + + def _is_valid_metadata(self): + """Should find the AWS::CloudFormation::Init json key.""" +- is_valid = self._metadata and \ +- self._init_key in self._metadata and \ +- self._metadata[self._init_key] ++ is_valid = (self._metadata and ++ self._init_key in self._metadata and ++ self._metadata[self._init_key]) + if is_valid: + self._metadata = self._metadata[self._init_key] + return is_valid +diff --git a/heat_cfntools/tests/test_cfn_helper.py b/heat_cfntools/tests/test_cfn_helper.py +index 83bed76..0255376 100644 +--- a/heat_cfntools/tests/test_cfn_helper.py ++++ b/heat_cfntools/tests/test_cfn_helper.py +@@ -14,12 +14,13 @@ + # License for the specific language governing permissions and limitations + # under the License. + +-import boto.cloudformation as cfn +-import fixtures + import json +-import mock + import os + import tempfile ++ ++import boto.cloudformation as cfn ++import fixtures ++import mock + import testtools + import testtools.matchers as ttm + +@@ -35,7 +36,7 @@ def popen_root_calls(calls, shell=False): + ] + + +-class FakePOpen(): ++class FakePOpen(object): + def __init__(self, stdout='', stderr='', returncode=0): + self.returncode = returncode + self.stdout = stdout +@@ -310,8 +311,6 @@ class TestServicesHandler(testtools.TestCase): + 'mysqld.service']])) + returns.append(FakePOpen()) + +- #calls = popen_root_calls(calls) +- + services = { + "systemd": { + "mysqld": {"enabled": "true", "ensureRunning": "true"}, +@@ -693,7 +692,8 @@ region=region1 + credential-file=%s-invalid + interval=120''' % fcreds.name).encode('UTF-8')) + main_conf.flush() +- e = self.assertRaises(Exception, cfn_helper.HupConfig, ++ e = self.assertRaises(cfn_helper.InvalidCredentialsException, ++ cfn_helper.HupConfig, + [open(main_conf.name)]) + self.assertIn('invalid credentials file', str(e)) + fcreds.close() +@@ -778,7 +778,6 @@ interval=120''' % fcreds.name).encode('UTF-8')) + calls.extend(popen_root_calls(['/bin/hook1'], shell=True)) + calls.extend(popen_root_calls(['/bin/hook2'], shell=True)) + calls.extend(popen_root_calls(['/bin/hook3'], shell=True)) +- #calls = popen_root_calls(calls) + + with mock.patch('subprocess.Popen') as mock_popen: + mock_popen.return_value = FakePOpen('All good') +@@ -1273,7 +1272,6 @@ class TestCfnInit(testtools.TestCase): + returns.append(FakePOpen('Doing something', 'error', -1)) + calls.extend(popen_root_calls(['/bin/command2'], shell=True)) + returns.append(FakePOpen('All good')) +- #calls = popen_root_calls(calls) + + md_data = {"AWS::CloudFormation::Init": {"config": {"commands": { + "00_foo": {"command": "/bin/command1", +diff --git a/heat_cfntools/tests/test_cfn_hup.py b/heat_cfntools/tests/test_cfn_hup.py +index d5cf026..b182f92 100644 +--- a/heat_cfntools/tests/test_cfn_hup.py ++++ b/heat_cfntools/tests/test_cfn_hup.py +@@ -13,9 +13,10 @@ + # License for the specific language governing permissions and limitations + # under the License. + ++import tempfile ++ + import fixtures + import mock +-import tempfile + import testtools + + from heat_cfntools.cfntools import cfn_helper +-- +2.20.1 + diff --git a/SOURCES/0013-Move-Zuul-config-into-repo.patch b/SOURCES/0013-Move-Zuul-config-into-repo.patch new file mode 100644 index 0000000..4a413e7 --- /dev/null +++ b/SOURCES/0013-Move-Zuul-config-into-repo.patch @@ -0,0 +1,27 @@ +From e403f3e67389d21b75eddcb3d0d2759fa02b79d8 Mon Sep 17 00:00:00 2001 +From: Zane Bitter +Date: Wed, 18 Jul 2018 19:56:48 -0400 +Subject: [PATCH 13/21] Move Zuul config into repo + +Change-Id: I21109adbdbf9d90b2145d3829e62dcf73392fb6a +--- + .zuul.yaml | 7 +++++++ + 1 file changed, 7 insertions(+) + create mode 100644 .zuul.yaml + +diff --git a/.zuul.yaml b/.zuul.yaml +new file mode 100644 +index 0000000..5e51b86 +--- /dev/null ++++ b/.zuul.yaml +@@ -0,0 +1,7 @@ ++- project: ++ templates: ++ - check-requirements ++ - publish-openstack-sphinx-docs ++ - openstack-python35-jobs ++ - openstack-python-jobs ++ - publish-to-pypi +-- +2.20.1 + diff --git a/SOURCES/0014-Modernise-requirements.patch b/SOURCES/0014-Modernise-requirements.patch new file mode 100644 index 0000000..af88c14 --- /dev/null +++ b/SOURCES/0014-Modernise-requirements.patch @@ -0,0 +1,134 @@ +From bee7811c80d123bb088a5e3b9683b1ab699e5bf9 Mon Sep 17 00:00:00 2001 +From: Zane Bitter +Date: Wed, 18 Jul 2018 15:53:49 -0400 +Subject: [PATCH 14/21] Modernise requirements + +Conform to the PTI for docs builds, add lower-constraints jobs, and use +upper-constraints instead of synced global requirements constraints. + +Change-Id: Iaf1b54b35d02dbb733c7782b178e4eb774c02ef6 +--- + .zuul.yaml | 8 +++++++- + doc/requirements.txt | 3 +++ + doc/source/index.rst | 4 ++-- + lower-constraints.txt | 8 ++++++++ + requirements.txt | 6 +++--- + test-requirements.txt | 6 +----- + tox.ini | 14 ++++++++++---- + 7 files changed, 34 insertions(+), 15 deletions(-) + create mode 100644 doc/requirements.txt + create mode 100644 lower-constraints.txt + +diff --git a/.zuul.yaml b/.zuul.yaml +index 5e51b86..70cb437 100644 +--- a/.zuul.yaml ++++ b/.zuul.yaml +@@ -1,7 +1,13 @@ + - project: + templates: + - check-requirements +- - publish-openstack-sphinx-docs ++ - publish-openstack-docs-pti + - openstack-python35-jobs + - openstack-python-jobs + - publish-to-pypi ++ check: ++ jobs: ++ - openstack-tox-lower-constraints ++ gate: ++ jobs: ++ - openstack-tox-lower-constraints +diff --git a/doc/requirements.txt b/doc/requirements.txt +new file mode 100644 +index 0000000..6f07765 +--- /dev/null ++++ b/doc/requirements.txt +@@ -0,0 +1,3 @@ ++openstackdocstheme>=1.11.0 # Apache-2.0 ++sphinx>=1.6.2 # BSD ++sphinxcontrib-httpdomain>=1.7.0 +diff --git a/doc/source/index.rst b/doc/source/index.rst +index 54479b1..81b9277 100644 +--- a/doc/source/index.rst ++++ b/doc/source/index.rst +@@ -1,6 +1,6 @@ +-=================================== ++===================================== + Man pages for Heat cfntools utilities +-=================================== ++===================================== + + ------------- + Heat cfntools +diff --git a/lower-constraints.txt b/lower-constraints.txt +new file mode 100644 +index 0000000..d884e51 +--- /dev/null ++++ b/lower-constraints.txt +@@ -0,0 +1,8 @@ ++boto==2.13.3 ++hacking==0.9.0 ++mock==1.0 ++pbr==0.8 ++psutil==1.1.1 ++six==1.9.0 ++testrepository==0.0.18 ++testtools==0.9.34 +diff --git a/requirements.txt b/requirements.txt +index e595465..a2d74fe 100644 +--- a/requirements.txt ++++ b/requirements.txt +@@ -1,4 +1,4 @@ +-pbr>=0.6,!=0.7,<1.0 +-boto>=2.12.0,!=2.13.0 +-psutil>=1.1.1,<2.0.0 ++pbr!=2.1.0,>=0.8 ++boto>=2.13.3 ++psutil>=1.1.1 + six>=1.9.0 +diff --git a/test-requirements.txt b/test-requirements.txt +index 412c495..7a25edc 100644 +--- a/test-requirements.txt ++++ b/test-requirements.txt +@@ -1,8 +1,4 @@ +-# Hacking already pins down pep8, pyflakes and flake8 +-hacking>=0.8.0,<0.9 +- ++hacking>=0.9.0 + mock>=1.0 +-openstackdocstheme>=1.11.0 # Apache-2.0 +-sphinx>=1.6.2 # BSD + testrepository>=0.0.18 + testtools>=0.9.34 +diff --git a/tox.ini b/tox.ini +index f974f36..f93f347 100644 +--- a/tox.ini ++++ b/tox.ini +@@ -3,6 +3,7 @@ envlist = py34,py27,pep8 + + [testenv] + setenv = VIRTUAL_ENV={envdir} ++install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages} + deps = -r{toxinidir}/requirements.txt + -r{toxinidir}/test-requirements.txt + commands = python setup.py testr --slowest --testr-args='{posargs}' +@@ -29,7 +30,12 @@ show-source = true + exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,tools + + [testenv:docs] +-deps = -r{toxinidir}/requirements.txt +- -r{toxinidir}/test-requirements.txt +- sphinxcontrib-httpdomain +-commands = python setup.py build_sphinx ++deps = -r{toxinidir}/doc/requirements.txt ++commands = sphinx-build -W -b html doc/source doc/build/html ++ ++[testenv:lower-constraints] ++basepython = python3 ++deps = ++ -c{toxinidir}/lower-constraints.txt ++ -r{toxinidir}/requirements.txt ++ -r{toxinidir}/test-requirements.txt +-- +2.20.1 + diff --git a/SOURCES/0015-Add-tox-python3-overrides.patch b/SOURCES/0015-Add-tox-python3-overrides.patch new file mode 100644 index 0000000..404e7d9 --- /dev/null +++ b/SOURCES/0015-Add-tox-python3-overrides.patch @@ -0,0 +1,63 @@ +From d6f8cda665221535c537abda3c80223cdef8b536 Mon Sep 17 00:00:00 2001 +From: "huang.zhiping" +Date: Wed, 18 Jul 2018 16:57:32 -0400 +Subject: [PATCH 15/21] Add tox python3 overrides + +We want to default to running all tox environments under python 3, so +set the basepython value in each environment. + +We do not want to specify a minor version number, because we do not +want to have to update the file every time we upgrade python. + +We do not want to set the override once in testenv, because that +breaks the more specific versions used in default environments like +py35 and py36. + +Change-Id: Ic4a3b28cb670c71fb205640a9a9338bbcf9bc9bf +--- + tox.ini | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/tox.ini b/tox.ini +index f93f347..ffe1237 100644 +--- a/tox.ini ++++ b/tox.ini +@@ -1,5 +1,5 @@ + [tox] +-envlist = py34,py27,pep8 ++envlist = py35,py27,pep8 + + [testenv] + setenv = VIRTUAL_ENV={envdir} +@@ -9,6 +9,7 @@ deps = -r{toxinidir}/requirements.txt + commands = python setup.py testr --slowest --testr-args='{posargs}' + + [testenv:pep8] ++basepython = python3 + commands = flake8 + flake8 --filename=cfn-* bin + +@@ -19,10 +20,12 @@ deps = -r{toxinidir}/requirements.txt + commands = bash tools/lintstack.sh + + [testenv:cover] ++basepython = python3 + commands = + python setup.py testr --coverage --testr-args='{posargs}' + + [testenv:venv] ++basepython = python3 + commands = {posargs} + + [flake8] +@@ -30,6 +33,7 @@ show-source = true + exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,tools + + [testenv:docs] ++basepython = python3 + deps = -r{toxinidir}/doc/requirements.txt + commands = sphinx-build -W -b html doc/source doc/build/html + +-- +2.20.1 + diff --git a/SOURCES/0016-Switch-to-use-stestr-for-unit-test.patch b/SOURCES/0016-Switch-to-use-stestr-for-unit-test.patch new file mode 100644 index 0000000..100ead6 --- /dev/null +++ b/SOURCES/0016-Switch-to-use-stestr-for-unit-test.patch @@ -0,0 +1,94 @@ +From 97aec93e2b2c0d2dc6a0d7ddddba962dee007cec Mon Sep 17 00:00:00 2001 +From: Ha Manh Dong +Date: Wed, 18 Jul 2018 20:14:05 -0400 +Subject: [PATCH 16/21] Switch to use stestr for unit test + +According to Openstack summit session [1], +stestr is maintained project to which all Openstack projects should migrate. +So we should switch to stestr. + +[1] https://etherpad.openstack.org/p/YVR-python-pti + +Change-Id: I14ae3879465e622f36fd7bba3f04cb6e0cb7500e +--- + .stestr.conf | 3 +++ + .testr.conf | 4 ---- + lower-constraints.txt | 2 +- + test-requirements.txt | 2 +- + tox.ini | 10 ++++++++-- + 5 files changed, 14 insertions(+), 9 deletions(-) + create mode 100644 .stestr.conf + delete mode 100644 .testr.conf + +diff --git a/.stestr.conf b/.stestr.conf +new file mode 100644 +index 0000000..7458bd2 +--- /dev/null ++++ b/.stestr.conf +@@ -0,0 +1,3 @@ ++[DEFAULT] ++test_path=./heat_cfntools/tests ++top_dir=./ +diff --git a/.testr.conf b/.testr.conf +deleted file mode 100644 +index 8528c86..0000000 +--- a/.testr.conf ++++ /dev/null +@@ -1,4 +0,0 @@ +-[DEFAULT] +-test_command=OS_STDOUT_CAPTURE=1 OS_STDERR_CAPTURE=1 OS_TEST_TIMEOUT=60 ${PYTHON:-python} -m subunit.run discover -t ./ ./heat_cfntools/tests $LISTOPT $IDOPTION +-test_id_option=--load-list $IDFILE +-test_list_option=--list +diff --git a/lower-constraints.txt b/lower-constraints.txt +index d884e51..260b010 100644 +--- a/lower-constraints.txt ++++ b/lower-constraints.txt +@@ -4,5 +4,5 @@ mock==1.0 + pbr==0.8 + psutil==1.1.1 + six==1.9.0 +-testrepository==0.0.18 ++stestr==2.0.0 + testtools==0.9.34 +diff --git a/test-requirements.txt b/test-requirements.txt +index 7a25edc..4550481 100644 +--- a/test-requirements.txt ++++ b/test-requirements.txt +@@ -1,4 +1,4 @@ + hacking>=0.9.0 + mock>=1.0 +-testrepository>=0.0.18 ++stestr>=2.0.0 + testtools>=0.9.34 +diff --git a/tox.ini b/tox.ini +index ffe1237..aa31c5b 100644 +--- a/tox.ini ++++ b/tox.ini +@@ -6,7 +6,7 @@ setenv = VIRTUAL_ENV={envdir} + install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages} + deps = -r{toxinidir}/requirements.txt + -r{toxinidir}/test-requirements.txt +-commands = python setup.py testr --slowest --testr-args='{posargs}' ++commands = stestr run --slowest {posargs} + + [testenv:pep8] + basepython = python3 +@@ -21,8 +21,14 @@ commands = bash tools/lintstack.sh + + [testenv:cover] + basepython = python3 ++setenv = ++ {[testenv]setenv} ++ PYTHON=coverage run --source heat_cfntools --parallel-mode + commands = +- python setup.py testr --coverage --testr-args='{posargs}' ++ stestr run {posargs} ++ coverage combine ++ coverage html -d cover ++ coverage xml -o cover/coverage.xml + + [testenv:venv] + basepython = python3 +-- +2.20.1 + diff --git a/SOURCES/0017-fix-bug-link-in-readme.patch b/SOURCES/0017-fix-bug-link-in-readme.patch new file mode 100644 index 0000000..a25fe17 --- /dev/null +++ b/SOURCES/0017-fix-bug-link-in-readme.patch @@ -0,0 +1,30 @@ +From 4b7978f96518a6dde5b5a23d542510bc28ca2b63 Mon Sep 17 00:00:00 2001 +From: ZhijunWei +Date: Tue, 28 Aug 2018 09:10:08 -0400 +Subject: [PATCH 17/21] fix bug link in readme + +This patch fixes the bug tracker link in the readme. It is set to +depend on a job definition change in project-config so we can use this +patch to test the new release jobs. + +Change-Id: I6dad9b1d6499d615c60d3c23b5cd8c44040abddd +--- + README.rst | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/README.rst b/README.rst +index aaf507d..171d14d 100644 +--- a/README.rst ++++ b/README.rst +@@ -31,7 +31,7 @@ cfn-hup - + + * Free software: Apache license + * Source: http://git.openstack.org/cgit/openstack/heat-cfntools +-* Bugs: http://bugs.launchpad.net/heat-cfntools ++* Bugs: https://storyboard.openstack.org/#!/project/openstack/heat-cfntools + + Related projects + ---------------- +-- +2.20.1 + diff --git a/SOURCES/0018-add-python-3.6-unit-test-job.patch b/SOURCES/0018-add-python-3.6-unit-test-job.patch new file mode 100644 index 0000000..c335f26 --- /dev/null +++ b/SOURCES/0018-add-python-3.6-unit-test-job.patch @@ -0,0 +1,33 @@ +From 8acd0912ea6a989889b3f513e20979ab0882add5 Mon Sep 17 00:00:00 2001 +From: Doug Hellmann +Date: Tue, 28 Aug 2018 17:20:07 -0400 +Subject: [PATCH 18/21] add python 3.6 unit test job + +This is a mechanically generated patch to add a unit test job running +under Python 3.6 as part of the python3-first goal. + +See the python3-first goal document for details: +https://governance.openstack.org/tc/goals/stein/python3-first.html + +Change-Id: I438730a4c37639341c0e7294b28a93e8ede845cc +Story: #2002586 +Task: #24298 +--- + .zuul.yaml | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/.zuul.yaml b/.zuul.yaml +index 70cb437..5e9a724 100644 +--- a/.zuul.yaml ++++ b/.zuul.yaml +@@ -3,6 +3,7 @@ + - check-requirements + - publish-openstack-docs-pti + - openstack-python35-jobs ++ - openstack-python36-jobs + - openstack-python-jobs + - publish-to-pypi + check: +-- +2.20.1 + diff --git a/SOURCES/0019-Migrate-the-link-of-bug-report-button-to-storyboard.patch b/SOURCES/0019-Migrate-the-link-of-bug-report-button-to-storyboard.patch new file mode 100644 index 0000000..2f93bf9 --- /dev/null +++ b/SOURCES/0019-Migrate-the-link-of-bug-report-button-to-storyboard.patch @@ -0,0 +1,28 @@ +From 05a1cc889690a5b11fb21bb82f73ed693d70c7c0 Mon Sep 17 00:00:00 2001 +From: zhulingjie +Date: Thu, 30 Aug 2018 06:59:50 -0400 +Subject: [PATCH 19/21] Migrate the link of bug report button to storyboard + +Change-Id: I5b329f3233ce126fb25bff6c947aa8379b991d50 +--- + doc/source/conf.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/doc/source/conf.py b/doc/source/conf.py +index 567b444..fa24424 100644 +--- a/doc/source/conf.py ++++ b/doc/source/conf.py +@@ -115,8 +115,8 @@ html_theme = 'openstackdocs' + + # -- Options for openstackdocstheme -------------------------------------- + repository_name = 'openstack/heat-cfntools' +-bug_project = 'heat-cfntools' +-bug_tag = '' ++bug_project = '991' ++bug_tag = 'docs' + + # -- Options for HTMLHelp output ------------------------------------------ + +-- +2.20.1 + diff --git a/SOURCES/0020-Use-template-for-lower-constraints.patch b/SOURCES/0020-Use-template-for-lower-constraints.patch new file mode 100644 index 0000000..04b8231 --- /dev/null +++ b/SOURCES/0020-Use-template-for-lower-constraints.patch @@ -0,0 +1,42 @@ +From 21c2c922c2890ca2e07b341c543dd76655dc8fc6 Mon Sep 17 00:00:00 2001 +From: Andreas Jaeger +Date: Thu, 20 Dec 2018 20:59:48 +0100 +Subject: [PATCH 20/21] Use template for lower-constraints + +Small cleanups: + +* Use openstack-lower-constraints-jobs template, remove individual + jobs. +* Sort list of templates + +Change-Id: Ib24ffd7701d8e7e88fb6c6ab9854244a4a656687 +Needed-By: https://review.openstack.org/623229 +--- + .zuul.yaml | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +diff --git a/.zuul.yaml b/.zuul.yaml +index 5e9a724..e18e0f4 100644 +--- a/.zuul.yaml ++++ b/.zuul.yaml +@@ -1,14 +1,9 @@ + - project: + templates: + - check-requirements +- - publish-openstack-docs-pti ++ - openstack-lower-constraints-jobs ++ - openstack-python-jobs + - openstack-python35-jobs + - openstack-python36-jobs +- - openstack-python-jobs ++ - publish-openstack-docs-pti + - publish-to-pypi +- check: +- jobs: +- - openstack-tox-lower-constraints +- gate: +- jobs: +- - openstack-tox-lower-constraints +-- +2.20.1 + diff --git a/SOURCES/0021-Update-the-bugs-link-to-storyboard.patch b/SOURCES/0021-Update-the-bugs-link-to-storyboard.patch new file mode 100644 index 0000000..3355d0c --- /dev/null +++ b/SOURCES/0021-Update-the-bugs-link-to-storyboard.patch @@ -0,0 +1,26 @@ +From 88905697f64734c4ea70a30eb2f373253f04a374 Mon Sep 17 00:00:00 2001 +From: ZhijunWei +Date: Sun, 30 Dec 2018 23:30:22 +0800 +Subject: [PATCH 21/21] Update the bugs link to storyboard + +Change-Id: Ic878d46e4802c79f416f4e157b734a16f8b612b4 +--- + CONTRIBUTING.rst | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst +index 8cc4989..862ffd6 100644 +--- a/CONTRIBUTING.rst ++++ b/CONTRIBUTING.rst +@@ -11,6 +11,6 @@ the workflow documented at: + + Pull requests submitted through GitHub will be ignored. + +-Bugs should be filed on Launchpad, not GitHub: ++Bugs should be filed on Storyboard not GitHub: + +- https://bugs.launchpad.net/heat ++ https://storyboard.openstack.org/#!/project/openstack/heat-cfntools +-- +2.20.1 + diff --git a/SPECS/heat-cfntools.spec b/SPECS/heat-cfntools.spec new file mode 100644 index 0000000..53386e6 --- /dev/null +++ b/SPECS/heat-cfntools.spec @@ -0,0 +1,200 @@ +Name: heat-cfntools +Version: 1.4.2 +Release: 15%{?dist} +Summary: Tools required to be installed on Heat provisioned cloud instances +License: ASL 2.0 +URL: https://launchpad.net/heat-cfntools/ +Source0: https://pypi.python.org/packages/source/h/heat-cfntools/%{name}-%{version}.tar.gz + +# All patches to current git master (d23083a8e93311def2fc78fe7ece2a76fe59287b) +# Fixes issues with requirements, code style, Python 3.6+ compat, +# updates links to openstack.org not launchpad.net +# patches 8 and 16 manually rediffed for differences between 1.4.2 +# tarball and git tag +Patch0001: 0001-Changed-logger-init-and-added-verbose-arg-handling.patch +Patch0002: 0002-Replace-deprecated-LOG.warn-with-LOG.warning.patch +Patch0003: 0003-Fix-typo.patch +Patch0004: 0004-Drop-unused-directory-in-tox.patch +Patch0005: 0005-Replace-MagicMock-with-Mock.patch +Patch0006: 0006-Show-team-and-repo-badges-on-README.patch +Patch0007: 0007-Remove-white-space-between-print.patch +Patch0008: 0008-Add-OpenStack-doc-support-for-heat-cfntools.patch +Patch0009: 0009-Remove-discover-from-test-requirements.patch +Patch0010: 0010-Update-links-in-README.patch +Patch0011: 0011-Python3-Don-t-use-cmp-function.patch +Patch0012: 0012-Fix-pep8-errors-with-later-versions-of-hacking.patch +Patch0013: 0013-Move-Zuul-config-into-repo.patch +Patch0014: 0014-Modernise-requirements.patch +Patch0015: 0015-Add-tox-python3-overrides.patch +Patch0016: 0016-Switch-to-use-stestr-for-unit-test.patch +Patch0017: 0017-fix-bug-link-in-readme.patch +Patch0018: 0018-add-python-3.6-unit-test-job.patch +Patch0019: 0019-Migrate-the-link-of-bug-report-button-to-storyboard.patch +Patch0020: 0020-Use-template-for-lower-constraints.patch +Patch0021: 0021-Update-the-bugs-link-to-storyboard.patch + +BuildArch: noarch +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-testrepository +BuildRequires: python3-boto +BuildRequires: python3-mock +BuildRequires: python3-nose +BuildRequires: python3-pbr >= 0.5.20 +BuildRequires: python3-six + +# imported by cfn_helper +Requires: python3-boto +Requires: python3-psutil +Requires: python3-six >= 1.9.0 + +# external commands +Requires: bzip2 +Requires: coreutils +Requires: curl +Requires: gzip +Requires: python3-setuptools +Requires: shadow-utils +Requires: tar + +%description +Tools required to be installed on Heat provisioned cloud instances + +%prep +%autosetup -p1 -S git + +%build +%{__python3} setup.py build + +%install +%{__python3} setup.py install -O1 --skip-build --root=%{buildroot} +mkdir -p %{buildroot}/%{_sharedstatedir}/%{name} + +%check +nosetests-%{python3_version} + +%files +%doc README.rst CONTRIBUTING.rst AUTHORS ChangeLog +%{!?_licensedir:%global license %%doc} +%license LICENSE +%{_bindir}/cfn-* +%{python3_sitelib}/heat_cfntools* +%dir %{_sharedstatedir}/%{name} + +%changelog +* Tue Jan 26 2021 Fedora Release Engineering - 1.4.2-15 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Jul 28 2020 Fedora Release Engineering - 1.4.2-14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Tue May 26 2020 Miro Hrončok - 1.4.2-13 +- Rebuilt for Python 3.9 + +* Wed Jan 29 2020 Fedora Release Engineering - 1.4.2-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Oct 03 2019 Miro Hrončok - 1.4.2-11 +- Rebuilt for Python 3.8.0rc1 (#1748018) + +* Mon Aug 19 2019 Miro Hrončok - 1.4.2-10 +- Rebuilt for Python 3.8 + +* Thu Jul 25 2019 Fedora Release Engineering - 1.4.2-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Thu Feb 14 2019 Adam Williamson - 1.4.2-8 +- Backport all patches to current git master (#1674322 etc.) + +* Fri Feb 01 2019 Fedora Release Engineering - 1.4.2-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Fri Jul 13 2018 Fedora Release Engineering - 1.4.2-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Tue Jun 19 2018 Miro Hrončok - 1.4.2-5 +- Rebuilt for Python 3.7 + +* Wed Feb 07 2018 Fedora Release Engineering - 1.4.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 1.4.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Feb 10 2017 Fedora Release Engineering - 1.4.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Thu Dec 22 2016 Miro Hrončok - 1.4.2-1 +- Rebuild for Python 3.6 +- Updated + +* Tue Jul 19 2016 Fedora Release Engineering - 1.3.0-8 +- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages + +* Wed Feb 03 2016 Fedora Release Engineering - 1.3.0-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Thu Dec 10 2015 Ryan S Brown - 1.3.0-6 +- Rebuilt for dependency re-resolution + +* Tue Nov 10 2015 Fedora Release Engineering - 1.3.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Changes/python3.5 + +* Mon Jul 13 2015 Miro Hrončok - 1.3.0-4 +- Build with Python 3 + +* Wed Jun 17 2015 Fedora Release Engineering - 1.3.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Mon Jun 15 2015 Haïkel Guémar - 1.3.0-2 +- Enforce python-six >= 1.9.0 (RHBZ #1231908) + +* Fri May 29 2015 Haïkel Guémar - 1.3.0-1 +- Upstream 1.3.0 +- Cleanup spec file + +* Thu Nov 06 2014 Colin Walters - 1.2.8-2 +- Remove yum dependency, as it will not typically be installed on Atomic hosts + +* Thu Aug 28 2014 Jeff Peeler 1.2.8-1 +- rebase to 1.2.8 +- remove wget dependency as it's no longer required +- remove rubygems dependency as it's too big for non-ruby users + +* Tue Aug 19 2014 Jeff Peeler 1.2.7-4 +- fix dependencies to include external commands (rhbz#1130964) + +* Sat Jul 12 2014 Tom Callaway 1.2.7-2 +- fix license handling + +* Tue Jun 24 2014 Jeff Peeler 1.2.7 +- rebase to 1.2.7 + +* Sat Jun 07 2014 Fedora Release Engineering - 1.2.6-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Mon Nov 11 2013 Jeff Peeler 1.2.6-2 +- add /var/lib/heat-cfntools directory (rhbz #1028664) + +* Tue Oct 22 2013 Jeff Peeler 1.2.6-1 +- rebase to 1.2.6 +- added new doc files +- bump boto version requirement +- add python-pbr buildrequire +- fixed previous changelog date + +* Sat Aug 03 2013 Fedora Release Engineering - 1.2.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Thu Apr 11 2013 Jeff Peeler 1.2.3-1 +- rebased to 1.2.3 + +* Fri Mar 22 2013 Jeff Peeler 1.2.1-1 +- Version bump to match upstream +- Added cfn-create-aws-symlinks +- Updated URL, Source +- Added psutil requires +- Changed install location from /opt to /bin + +* Mon Dec 24 2012 Steve Baker 1.0-1 +- initial fork of heat-jeos