Hello community,

here is the log from the commit of package python-heatclient for 
openSUSE:Factory checked in at 2013-08-18 22:40:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-heatclient (Old)
 and      /work/SRC/openSUSE:Factory/.python-heatclient.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-heatclient"

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-heatclient/python-heatclient.changes      
2013-07-18 18:08:31.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-heatclient.new/python-heatclient.changes 
2013-08-18 22:40:06.000000000 +0200
@@ -0,0 +1,53 @@
+-------------------------------------------------------------------
+Wed Aug 14 00:07:28 UTC 2013 - [email protected]
+
+- Update to version 0.2.4.4:
+  + Generate a template from a resource
+
+-------------------------------------------------------------------
+Sat Aug 10 11:08:17 UTC 2013 - [email protected]
+
+- Update to version 0.2.4.2:
+  + Fix heat event list sorted order incorrect
+
+-------------------------------------------------------------------
+Thu Aug  8 14:40:37 UTC 2013 - [email protected]
+
+- Update to version 0.2.4.1:
+  + Updated from global requirements
+
+-------------------------------------------------------------------
+Wed Aug  7 23:49:59 UTC 2013 - [email protected]
+
+- Update to version 0.2.3.15.g2c05c73:
+  + Add mock as a test requirement
+  + Fix Stack instance delete method
+  + Custom Stack get method to avoid lookup redirects
+  + Do not paginate stack list unless page_size is set
+  + Remove unused Stack data method
+
+-------------------------------------------------------------------
+Tue Aug  6 23:52:13 UTC 2013 - [email protected]
+
+- Update to version 0.2.3.10.g9104cb0:
+  + Sync with global requirements
+
+--------------------------------------------------------------------
+Mon Aug  5 21:15:56 UTC 2013 - [email protected]
+
+- Update to version 0.2.3.9.g529d429:
+  + Implement Stack status and action properties
+
+--------------------------------------------------------------------
+Tue Jul 30 14:52:28 UTC 2013 - [email protected]
+
+- Update to version 0.2.3.8.gcae2c0f:
+  + Parse error object (in json format) returned by heat-api
+
+--------------------------------------------------------------------
+Mon Jul 22 23:46:33 UTC 2013 - [email protected]
+
+- Update to version 0.2.3.6.ge5d68a4:
+  + Validate heat url is supplied for --os-no-client-auth.
+  + Set credentials headers if there is no auth token.
+

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-heatclient.spec ++++++
--- /var/tmp/diff_new_pack.5IJlTD/_old  2013-08-18 22:40:06.000000000 +0200
+++ /var/tmp/diff_new_pack.5IJlTD/_new  2013-08-18 22:40:06.000000000 +0200
@@ -19,7 +19,7 @@
 %define component heatclient
 
 Name:           python-%{component}
-Version:        0.2.3.2.ga49cf4c
+Version:        0.2.4.4
 Release:        0
 Summary:        Openstack Orchestration (Heat) API Client
 License:        Apache-2.0
@@ -85,14 +85,14 @@
 This package contains testsuite files for %{name}.
 
 %prep
-%setup -q -n python-heatclient-0.2.3.2.ga49cf4c
+%setup -q -n python-heatclient-0.2.4.4.gc0457ff
 %openstack_cleanup_prep
 echo %{version} > heatclient/versioninfo
 
 %build
 python setup.py build
 python setup.py build_sphinx
-rm -rf doc/build/html/{.buildinfo,.doctrees}
+rm doc/build/html/.buildinfo
 
 %install
 python setup.py install --prefix=%{_prefix} --root=%{buildroot} 
--install-data=%{python_sitelib}

++++++ _service ++++++
--- /var/tmp/diff_new_pack.5IJlTD/_old  2013-08-18 22:40:06.000000000 +0200
+++ /var/tmp/diff_new_pack.5IJlTD/_new  2013-08-18 22:40:06.000000000 +0200
@@ -2,6 +2,7 @@
   <service name="git_tarballs" mode="disabled">
     <param 
name="url">http://tarballs.openstack.org/python-heatclient/python-heatclient-master.tar.gz</param>
     <param name="email">[email protected]</param>
+    <param name="version-regexp">.*-([^-]+)\.g[a-zA-Z0-9]{7}</param>
     <param name="plain-version">True</param>
   </service>
 </services>

++++++ python-heatclient-master.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/.gitignore 
new/python-heatclient-0.2.4.4.gc0457ff/.gitignore
--- old/python-heatclient-0.2.3.2.ga49cf4c/.gitignore   2013-07-17 
01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/.gitignore   1970-01-01 
01:00:00.000000000 +0100
@@ -1,20 +0,0 @@
-.coverage
-.venv
-*,cover
-cover
-*.pyc
-.idea
-*.swp
-*~
-AUTHORS
-build
-dist
-ChangeLog
-run_tests.err.log
-.tox
-doc/source/api
-*.egg
-heatclient/versioninfo
-python_heatclient.egg-info
-*.log
-.testrepository
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/.gitreview 
new/python-heatclient-0.2.4.4.gc0457ff/.gitreview
--- old/python-heatclient-0.2.3.2.ga49cf4c/.gitreview   2013-07-17 
01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/.gitreview   1970-01-01 
01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-[gerrit]
-host=review.openstack.org
-port=29418
-project=openstack/python-heatclient.git
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/AUTHORS 
new/python-heatclient-0.2.4.4.gc0457ff/AUTHORS
--- old/python-heatclient-0.2.3.2.ga49cf4c/AUTHORS      2013-07-17 
01:46:10.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/AUTHORS      2013-08-13 
22:57:53.000000000 +0200
@@ -1,14 +1,16 @@
+Andrew Plunk <[email protected]>
 Angus Salkeld <[email protected]>
 Bryan D. Payne <[email protected]>
 Dan Radez <[email protected]>
 Dirk Mueller <[email protected]>
 Ian Main <[email protected]>
-Jeremy Stanley <[email protected]>
 JUN JIE NAN <[email protected]>
+Jeremy Stanley <[email protected]>
+Jianing YANG <[email protected]>
 Lin Hua Cheng <[email protected]>
 Monty Taylor <[email protected]>
 Simon Pasquier <[email protected]>
 Steve Baker <[email protected]>
 Steven Dake <[email protected]>
 Steven Hardy <[email protected]>
-Sulochan Acharya <[email protected]>
\ No newline at end of file
+Sulochan Acharya <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/ChangeLog 
new/python-heatclient-0.2.4.4.gc0457ff/ChangeLog
--- old/python-heatclient-0.2.3.2.ga49cf4c/ChangeLog    2013-07-17 
01:46:10.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/ChangeLog    2013-08-13 
22:57:53.000000000 +0200
@@ -1,3 +1,193 @@
+commit c0457ff0d4f7c603dfd60101a76797e9fae92dc4
+Merge: 2d1592e 68999ba
+Author: Jenkins <[email protected]>
+Date:   Tue Aug 13 20:57:02 2013 +0000
+
+    Merge "Generate a template from a resource"
+
+commit 2d1592e934b4313fb0582dba419fcca27819d7e4
+Author: JUN JIE NAN <[email protected]>
+Date:   Thu Aug 8 14:27:33 2013 +0800
+
+    Fix heat event list sorted order incorrect
+    
+    The order is correct already if python heat client does not recorder
+    it. Add option to make print_list not to reorder possible, and call it
+    in do_event_list.
+    
+    Change-Id: I3f0990aff27df39371c583d5aae3edd106542ad1
+    Fixes: bug #1209506
+
+commit cf4b5c82c4225af3c7439f8a03f928162d54a57f
+Author: Monty Taylor <[email protected]>
+Date:   Wed Aug 7 19:02:44 2013 -0300
+
+    Updated from global requirements
+    
+    Change-Id: I1687d51bddb873549163dcf488fc40cdd9edcb29
+    
+    Change-Id: Ic4a43955526fcde313ad2f2afec8fafeb87f37a6
+    
+    Change-Id: Ic4a43955526fcde313ad2f2afec8fafeb87f37a6
+    
+    Change-Id: Ic4a43955526fcde313ad2f2afec8fafeb87f37a6
+    
+    Change-Id: If137689e5b9008c51cea16d41e648f0df490a247
+
+commit 68999ba81fc622ab9274d26725fddda83a631f53
+Author: Andrew Plunk <[email protected]>
+Date:   Mon Aug 5 10:28:47 2013 -0500
+
+    Generate a template from a resource
+    
+    Setup the command line options and calls for generating
+    a template from an installed resource.
+    
+    blueprint resource-template
+    
+    Change-Id: If533bd90b1ec73bbe2603b55a0a7621879d355ec
+
+commit 2c05c73a6b7137a428111bb52b97087aac1c43a0
+Author: Steve Baker <[email protected]>
+Date:   Mon Aug 5 15:52:09 2013 +1200
+
+    Remove unused Stack data method
+    
+    Change-Id: Ia3fce29a58957b84f2eba33ac1b2ecfb04543939
+
+commit 79dea076dbd5f35c0572b51dfcceeb5112772091
+Author: Steve Baker <[email protected]>
+Date:   Mon Aug 5 15:29:16 2013 +1200
+
+    Do not paginate stack list unless page_size is set
+    
+    Pagination on the server has not yet been implemented, however
+    the client assumes it is, causing infinite recursion when paginate
+    is called.
+    
+    With this change, no pagination is attempted unless page_size is
+    specified. However the 'limit' parameter is still honored, so it
+    is still possible to cap the total number of results returned.
+    
+    heatclient users should not set page_size until pagination has been
+    implemented on the server. The stack list in Horizon currently
+    does not attempt to paginate, so is not affected.
+    
+    Fixes: bug #1207839
+    Change-Id: I4087d3a8af48206d6ebe3edc441469464e4a401a
+
+commit ea0e957978632b55ea48864f216e1b0b7181c6f7
+Author: Steve Baker <[email protected]>
+Date:   Mon Aug 5 09:02:40 2013 +1200
+
+    Custom Stack get method to avoid lookup redirects
+    
+    Change-Id: I15dd4e9168cba6fd05371fed097d52cbf33cb15d
+
+commit 6f7239f67bd189870186c71d6d3f66f6334f6133
+Author: Steve Baker <[email protected]>
+Date:   Mon Aug 5 08:55:52 2013 +1200
+
+    Fix Stack instance delete method
+    
+    The current instance delete method assumes that a Stack
+    instance can be passed to the manager delete method, however
+    the manager delete method only accepts a stack identifier.
+    
+    Change-Id: I87c30be1ea43695b7e13953531ea282fd8d386f8
+
+commit 18e110dbf0ae46730c08ea7d1898a89f14afda85
+Author: Steve Baker <[email protected]>
+Date:   Mon Aug 5 08:19:14 2013 +1200
+
+    Add mock as a test requirement
+    
+    A project-wide concensus is forming that mox should be phased
+    out and mock should be encouraged for writing new tests.
+    
+    This change allow mock to be used for new tests.
+    
+    Change-Id: I3cdf77bbeadd419b811bddcc31f048c1c6ec38bb
+
+commit 9104cb00a1a1e93ff35784a7e64a95d90b04a534
+Author: Monty Taylor <[email protected]>
+Date:   Mon Aug 5 18:03:52 2013 -0300
+
+    Sync with global requirements
+    
+    Change-Id: Iad82b688da07f3aa83a9850b5ea9fe2beb51019e
+
+commit 529d429d49461c9ffa69bf8e90f3d00aded6603c
+Author: Steve Baker <[email protected]>
+Date:   Fri Aug 2 14:20:36 2013 +1200
+
+    Implement Stack status and action properties
+    
+    This splits the stack_status back to an action and status,
+    as it is represented internally in heat-engine.
+    
+    It assumes there will not be an action which contains an _.
+    
+    This change is needed for code (such as tempest) which assumes a
+    convention of all openstack client resources having a status property.
+    
+    Change-Id: If00db5508bf8469b1106cac20b8fc10f7e1a854d
+
+commit cae2c0fd7b526f285b2d59f7321e9084aa9e4337
+Merge: e5d68a4 2b83260
+Author: Jenkins <[email protected]>
+Date:   Tue Jul 30 05:09:12 2013 +0000
+
+    Merge "Parse error object (in json format) returned by heat-api"
+
+commit 2b83260feb910a72bceed93db2f4ebd59c692022
+Author: Jianing YANG <[email protected]>
+Date:   Mon Jul 22 15:15:57 2013 +0800
+
+    Parse error object (in json format) returned by heat-api
+    
+    With this fix, heatclient will display a clear error message when
+    encounter an server-side error. Additionally, the corresponding
+    traceback will be displayed when "--verbose" is set.
+    
+    Change-Id: I99b828465f61478a3c63fcf549d044a62523be1f
+
+commit e5d68a48af1642d7104429a7ca0d3063f5cfdd85
+Merge: 34993c6 78c98ee
+Author: Jenkins <[email protected]>
+Date:   Mon Jul 22 17:23:49 2013 +0000
+
+    Merge "Set credentials headers if there is no auth token."
+
+commit 34993c6b69c197041f6e21a9200758a94624eb9a
+Merge: a49cf4c 0254ad5
+Author: Jenkins <[email protected]>
+Date:   Mon Jul 22 17:22:48 2013 +0000
+
+    Merge "Validate heat url is supplied for --os-no-client-auth."
+
+commit 78c98ee91bf0daac2337fec4474d3300417c0d40
+Author: Steve Baker <[email protected]>
+Date:   Fri Jul 19 14:09:34 2013 +1200
+
+    Set credentials headers if there is no auth token.
+    
+    Credentials will be set instead of a token for all invocations where
+    --os-no-client-auth is specified.
+    
+    Change-Id: I35a81a9518833ce9758228266deb36c8073f9fb8
+
+commit 0254ad50a25816b80c854ea74f6a9b61cdad0e1f
+Author: Steve Baker <[email protected]>
+Date:   Fri Jul 19 13:15:49 2013 +1200
+
+    Validate heat url is supplied for --os-no-client-auth.
+    
+    Currently an obscure error is returned if --heat-url is not
+    specified.
+    
+    Change-Id: Ia9fbb694f38e583a0cf1898f576a894d1007f697
+
 commit a49cf4c148bfcb4cf878afc13325f2ffcf219992
 Merge: e147586 3f1b15c
 Author: Jenkins <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/PKG-INFO 
new/python-heatclient-0.2.4.4.gc0457ff/PKG-INFO
--- old/python-heatclient-0.2.3.2.ga49cf4c/PKG-INFO     2013-07-17 
01:46:11.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/PKG-INFO     2013-08-13 
22:57:53.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: python-heatclient
-Version: 0.2.3.2.ga49cf4c
+Version: 0.2.4.4.gc0457ff
 Summary: OpenStack Orchestration API Client Library
 Home-page: http://www.openstack.org/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/common/http.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/common/http.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/common/http.py    
2013-07-17 01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/common/http.py    
2013-08-13 22:57:12.000000000 +0200
@@ -131,6 +131,8 @@
         kwargs['headers'].setdefault('User-Agent', USER_AGENT)
         if self.auth_token:
             kwargs['headers'].setdefault('X-Auth-Token', self.auth_token)
+        else:
+            kwargs['headers'].update(self.credentials_headers())
         if self.auth_url:
             kwargs['headers'].setdefault('X-Auth-Url', self.auth_url)
 
@@ -175,10 +177,12 @@
         return resp, body_str
 
     def credentials_headers(self):
-        return {
-            'X-Auth-User': self.username,
-            'X-Auth-Key': self.password
-        }
+        creds = {}
+        if self.username:
+            creds['X-Auth-User'] = self.username
+        if self.password:
+            creds['X-Auth-Key'] = self.password
+        return creds
 
     def json_request(self, method, url, **kwargs):
         kwargs.setdefault('headers', {})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/common/utils.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/common/utils.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/common/utils.py   
2013-07-17 01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/common/utils.py   
2013-08-13 22:57:12.000000000 +0200
@@ -19,11 +19,16 @@
 import sys
 import textwrap
 import uuid
-
+import yaml
 
 from heatclient import exc
 from heatclient.openstack.common import importutils
 
+supported_formats = {
+    "json": lambda x: json.dumps(x, indent=2),
+    "yaml": yaml.safe_dump
+}
+
 
 # Decorator for cli-args
 def arg(*args, **kwargs):
@@ -51,7 +56,7 @@
     return '\n'.join(r or [])
 
 
-def print_list(objs, fields, field_labels=None, formatters={}, sortby=0):
+def print_list(objs, fields, field_labels=None, formatters={}, sortby=None):
     field_labels = field_labels or fields
     pt = prettytable.PrettyTable([f for f in field_labels],
                                  caching=False, print_empty=False)
@@ -66,7 +71,10 @@
                 data = getattr(o, field, None) or ''
                 row.append(data)
         pt.add_row(row)
-    print pt.get_string(sortby=field_labels[sortby])
+    if sortby is None:
+        print pt.get_string()
+    else:
+        print pt.get_string(sortby=field_labels[sortby])
 
 
 def print_dict(d, formatters={}):
@@ -151,3 +159,13 @@
 
             parameters[n] = v
     return parameters
+
+
+def format_output(output, format='yaml'):
+    """Format the supplied dict as specified."""
+    output_format = format.lower()
+    try:
+        return supported_formats[output_format](output)
+    except KeyError:
+        raise exc.HTTPUnsupported("The format(%s) is unsupported."
+                                  % output_format)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/exc.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/exc.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/exc.py    2013-07-17 
01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/exc.py    2013-08-13 
22:57:12.000000000 +0200
@@ -12,6 +12,13 @@
 
 import sys
 
+verbose = 0
+
+try:
+    import json
+except ImportError:
+    import simplejson as json
+
 
 class BaseException(Exception):
     """An error occurred."""
@@ -38,6 +45,30 @@
     """Base exception for all HTTP-derived exceptions."""
     code = 'N/A'
 
+    def __init__(self, message=None):
+        super(HTTPException, self).__init__(message)
+        try:
+            self.error = json.loads(message)
+            if 'error' not in self.error:
+                raise KeyError('Key "error" not exists')
+        except KeyError:
+            # NOTE(jianingy): If key 'error' happens not exist,
+            # self.message becomes no sense. In this case, we
+            # return doc of current exception class instead.
+            self.error = {'error':
+                          {'message': self.__class__.__doc__}}
+        except Exception:
+            self.error = {'error':
+                          {'message': self.message or self.__class__.__doc__}}
+
+    def __str__(self):
+        message = self.error['error'].get('message', 'Internal Error')
+        if verbose:
+            traceback = self.error['error'].get('traceback', '')
+            return 'ERROR: %s\n%s' % (message, traceback)
+        else:
+            return 'ERROR: %s' % message
+
 
 class HTTPMultipleChoices(HTTPException):
     code = 300
@@ -107,6 +138,10 @@
     pass
 
 
+class HTTPUnsupported(HTTPException):
+    code = 415
+
+
 class HTTPInternalServerError(HTTPException):
     code = 500
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/shell.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/shell.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/shell.py  2013-07-17 
01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/shell.py  2013-08-13 
22:57:12.000000000 +0200
@@ -169,7 +169,7 @@
         parser.add_argument('-t', '--token-only',
                             default=bool(False),
                             action='store_true',
-                            help='DEPRECATED! Has no effect')
+                            help=argparse.SUPPRESS)
 
         return parser
 
@@ -236,11 +236,16 @@
 
             httplib2.debuglevel = 1
 
+    def _setup_verbose(self, verbose):
+        if verbose:
+            exc.verbose = 1
+
     def main(self, argv):
         # Parse args once to find version
         parser = self.get_base_parser()
         (options, args) = parser.parse_known_args(argv)
         self._setup_debugging(options.debug)
+        self._setup_verbose(options.verbose)
 
         # build available subcommands based on version
         api_version = options.heat_api_version
@@ -278,6 +283,11 @@
             raise exc.CommandError("You must provide an auth url via"
                                    " either --os-auth-url or via "
                                    "env[OS_AUTH_URL]")
+        if args.os_no_client_auth and not args.heat_url:
+            raise exc.CommandError("If you specify --os-no-client-auth"
+                                   " you must also specify a Heat API URL "
+                                   "via either --heat-url or "
+                                   "env[HEAT_URL]")
         kwargs = {
             'username': args.os_username,
             'password': args.os_password,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/fakes.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/fakes.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/fakes.py    
2013-07-17 01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/fakes.py    
2013-08-13 22:57:12.000000000 +0200
@@ -1,5 +1,19 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 import json
 
+from heatclient import exc
 from heatclient.v1 import client as v1client
 from keystoneclient.v2_0 import client as ksclient
 
@@ -31,8 +45,35 @@
                             {'content-type': 'application/json'},
                             json.dumps(resp_dict))
     v1client.Client.json_request('GET',
-                                 '/stacks?limit=20').AndReturn((resp,
-                                                                resp_dict))
+                                 '/stacks?').AndReturn((resp, resp_dict))
+
+
+def script_heat_normal_error():
+    resp_dict = {
+        "explanation": "The resource could not be found.",
+        "code": 404,
+        "error": {
+            "message": "The Stack (bad) could not be found.",
+            "type": "StackNotFound",
+            "traceback": "",
+        },
+        "title": "Not Found"
+    }
+    resp = FakeHTTPResponse(400,
+                            'The resource could not be found',
+                            {'content-type': 'application/json'},
+                            json.dumps(resp_dict))
+    v1client.Client.json_request('GET', '/stacks/bad').AndRaise(
+        exc.from_response(resp, json.dumps(resp_dict)))
+
+
+def script_heat_error(resp_string):
+    resp = FakeHTTPResponse(400,
+                            'The resource could not be found',
+                            {'content-type': 'application/json'},
+                            resp_string)
+    v1client.Client.json_request('GET', '/stacks/bad').AndRaise(
+        exc.from_response(resp, resp_string))
 
 
 def fake_headers():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_common_http.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_common_http.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_common_http.py 
2013-07-17 01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_common_http.py 
2013-08-13 22:57:12.000000000 +0200
@@ -1,3 +1,16 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 import mox
 import testtools
 
@@ -37,6 +50,56 @@
         self.assertEqual(''.join([x for x in body]), '')
         self.m.VerifyAll()
 
+    def test_token_or_credentials(self):
+        # Record a 200
+        fake200 = fakes.FakeHTTPResponse(
+            200, 'OK',
+            {'content-type': 'application/octet-stream'},
+            '')
+
+        # no token or credentials
+        mock_conn = http.httplib.HTTPConnection('example.com', 8004,
+                                                timeout=600.0)
+        mock_conn.request('GET', '/',
+                          headers={'Content-Type': 'application/octet-stream',
+                                   'User-Agent': 'python-heatclient'})
+        mock_conn.getresponse().AndReturn(fake200)
+
+        # credentials
+        mock_conn = http.httplib.HTTPConnection('example.com', 8004,
+                                                timeout=600.0)
+        mock_conn.request('GET', '/',
+                          headers={'Content-Type': 'application/octet-stream',
+                                   'User-Agent': 'python-heatclient',
+                                   'X-Auth-Key': 'pass',
+                                   'X-Auth-User': 'user'})
+        mock_conn.getresponse().AndReturn(fake200)
+
+        # token suppresses credentials
+        mock_conn = http.httplib.HTTPConnection('example.com', 8004,
+                                                timeout=600.0)
+        mock_conn.request('GET', '/',
+                          headers={'Content-Type': 'application/octet-stream',
+                                   'User-Agent': 'python-heatclient',
+                                   'X-Auth-Token': 'abcd1234'})
+        mock_conn.getresponse().AndReturn(fake200)
+
+        # Replay, create client, assert
+        self.m.ReplayAll()
+        client = http.HTTPClient('http://example.com:8004')
+        resp, body = client.raw_request('GET', '')
+        self.assertEqual(resp.status, 200)
+
+        client.username = 'user'
+        client.password = 'pass'
+        resp, body = client.raw_request('GET', '')
+        self.assertEqual(resp.status, 200)
+
+        client.auth_token = 'abcd1234'
+        resp, body = client.raw_request('GET', '')
+        self.assertEqual(resp.status, 200)
+        self.m.VerifyAll()
+
     def test_http_json_request(self):
         # Record a 200
         mock_conn = http.httplib.HTTPConnection('example.com', 8004,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_shell.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_shell.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_shell.py       
2013-07-17 01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_shell.py       
2013-08-13 22:57:12.000000000 +0200
@@ -1,3 +1,16 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 import cStringIO
 import httplib2
 import os
@@ -153,7 +166,7 @@
         self.m.StubOutWithMock(v1client.Client, 'json_request')
         fakes.script_keystone_client()
         v1client.Client.json_request(
-            'GET', '/stacks?limit=20').AndRaise(exc.Unauthorized)
+            'GET', '/stacks?').AndRaise(exc.Unauthorized)
 
         self.m.ReplayAll()
         fake_env = {
@@ -272,6 +285,108 @@
         for r in required:
             self.assertRegexpMatches(list_text, r)
 
+    def test_parsable_error(self):
+        message = "The Stack (bad) could not be found."
+        resp_dict = {
+            "explanation": "The resource could not be found.",
+            "code": 404,
+            "error": {
+                "message": message,
+                "type": "StackNotFound",
+                "traceback": "",
+            },
+            "title": "Not Found"
+        }
+
+        fakes.script_keystone_client()
+        fakes.script_heat_error(json.dumps(resp_dict))
+
+        self.m.ReplayAll()
+
+        try:
+            self.shell("stack-show bad")
+        except exc.HTTPException as e:
+            self.assertEqual(str(e), "ERROR: " + message)
+
+    def test_parsable_verbose(self):
+        message = "The Stack (bad) could not be found."
+        resp_dict = {
+            "explanation": "The resource could not be found.",
+            "code": 404,
+            "error": {
+                "message": message,
+                "type": "StackNotFound",
+                "traceback": "<TRACEBACK>",
+            },
+            "title": "Not Found"
+        }
+
+        fakes.script_keystone_client()
+        fakes.script_heat_error(json.dumps(resp_dict))
+
+        self.m.ReplayAll()
+
+        try:
+            exc.verbose = 1
+            self.shell("stack-show bad")
+        except exc.HTTPException as e:
+            expect = 'ERROR: The Stack (bad) could not be found.\n<TRACEBACK>'
+            self.assertEqual(str(e), expect)
+
+    def test_parsable_malformed_error(self):
+        invalid_json = "ERROR: {Invalid JSON Error."
+        fakes.script_keystone_client()
+        fakes.script_heat_error(invalid_json)
+        self.m.ReplayAll()
+
+        try:
+            self.shell("stack-show bad")
+        except exc.HTTPException as e:
+            self.assertEqual(str(e), "ERROR: " + invalid_json)
+
+    def test_parsable_malformed_error_missing_message(self):
+        missing_message = {
+            "explanation": "The resource could not be found.",
+            "code": 404,
+            "error": {
+                "type": "StackNotFound",
+                "traceback": "",
+            },
+            "title": "Not Found"
+        }
+
+        fakes.script_keystone_client()
+        fakes.script_heat_error(json.dumps(missing_message))
+        self.m.ReplayAll()
+
+        try:
+            self.shell("stack-show bad")
+        except exc.HTTPException as e:
+            self.assertEqual(str(e), "ERROR: Internal Error")
+
+    def test_parsable_malformed_error_missing_traceback(self):
+        message = "The Stack (bad) could not be found."
+        resp_dict = {
+            "explanation": "The resource could not be found.",
+            "code": 404,
+            "error": {
+                "message": message,
+                "type": "StackNotFound",
+            },
+            "title": "Not Found"
+        }
+
+        fakes.script_keystone_client()
+        fakes.script_heat_error(json.dumps(resp_dict))
+        self.m.ReplayAll()
+
+        try:
+            exc.verbose = 1
+            self.shell("stack-show bad")
+        except exc.HTTPException as e:
+            self.assertEqual(str(e),
+                             "ERROR: The Stack (bad) could not be found.\n")
+
     def test_describe(self):
         fakes.script_keystone_client()
         resp_dict = {"stack": {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_stacks.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_stacks.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_stacks.py      
1970-01-01 01:00:00.000000000 +0100
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_stacks.py      
2013-08-13 22:57:12.000000000 +0200
@@ -0,0 +1,284 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from heatclient.v1.stacks import Stack
+from heatclient.v1.stacks import StackManager
+
+from mock import MagicMock
+import testscenarios
+from testscenarios.scenarios import multiply_scenarios
+import testtools
+
+load_tests = testscenarios.load_tests_apply_scenarios
+
+
+def mock_stack(manager, stack_name, stack_id):
+    return Stack(manager, {
+        "id": stack_id,
+        "stack_name": stack_name,
+        "links": [{
+            "href": "http://192.0.2.1:8004/v1/1234/stacks/%s/%s"; % (
+                stack_name, stack_id),
+            "rel": "self"}],
+        "description": "No description",
+        "stack_status_reason": "Stack create completed successfully",
+        "creation_time": "2013-08-04T20:57:55Z",
+        "updated_time": "2013-08-04T20:57:55Z",
+        "stack_status": "CREATE_COMPLETE"
+    })
+
+
+class StackStatusActionTest(testtools.TestCase):
+
+    scenarios = multiply_scenarios([
+        ('CREATE', dict(action='CREATE')),
+        ('DELETE', dict(action='DELETE')),
+        ('UPDATE', dict(action='UPDATE')),
+        ('ROLLBACK', dict(action='ROLLBACK')),
+        ('SUSPEND', dict(action='SUSPEND')),
+        ('RESUME', dict(action='RESUME'))
+    ], [
+        ('IN_PROGRESS', dict(status='IN_PROGRESS')),
+        ('FAILED', dict(status='FAILED')),
+        ('COMPLETE', dict(status='COMPLETE'))
+    ])
+
+    def test_status_action(self):
+        stack_status = '%s_%s' % (self.action, self.status)
+        stack = mock_stack(None, 'stack_1', 'abcd1234')
+        stack.stack_status = stack_status
+        self.assertEqual(self.action, stack.action)
+        self.assertEqual(self.status, stack.status)
+
+
+class StackOperationsTest(testtools.TestCase):
+
+    def test_delete_stack(self):
+        manager = MagicMock()
+        stack = mock_stack(manager, None, 'abcd1234')
+        stack.delete()
+        manager.delete.assert_called_once_with('abcd1234')
+
+    def test_get_stack(self):
+        manager = MagicMock()
+        stack = mock_stack(manager, 'the_stack', 'abcd1234')
+        stack.get()
+        manager.get.assert_called_once_with('the_stack/abcd1234')
+
+
+class StackManagerNoPaginationTest(testtools.TestCase):
+
+    scenarios = [
+        ('total_0', dict(total=0)),
+        ('total_1', dict(total=1)),
+        ('total_9', dict(total=9)),
+        ('total_1', dict(total=10)),
+        ('total_11', dict(total=11)),
+        ('total_19', dict(total=19)),
+        ('total_20', dict(total=20)),
+        ('total_21', dict(total=21)),
+        ('total_49', dict(total=49)),
+        ('total_50', dict(total=50)),
+        ('total_51', dict(total=51)),
+        ('total_95', dict(total=95)),
+    ]
+
+    # absolute limit for results returned
+    limit = 50
+
+    def mock_manager(self):
+        manager = StackManager(None)
+        manager._list = MagicMock()
+
+        def mock_list(*args, **kwargs):
+            def results():
+                for i in range(0, self.total):
+                    stack_name = 'stack_%s' % (i + 1)
+                    stack_id = 'abcd1234-%s' % (i + 1)
+                    yield mock_stack(manager, stack_name, stack_id)
+
+            return list(results())
+
+        manager._list.side_effect = mock_list
+        return manager
+
+    def test_stack_list_no_pagination(self):
+        manager = self.mock_manager()
+        results = list(manager.list(limit=self.limit))
+        manager._list.assert_called_once_with(
+            '/stacks?', 'stacks')
+
+        last_result = min(self.limit, self.total)
+        # paginate is not specified, so the total
+        # results (up to the limit) is always returned
+        self.assertEqual(last_result, len(results))
+
+        if last_result > 0:
+            self.assertEqual('stack_1', results[0].stack_name)
+            self.assertEqual('stack_%s' % last_result, results[-1].stack_name)
+
+    def test_stack_list_no_pagination_no_limit(self):
+        manager = self.mock_manager()
+
+        results = list(manager.list())
+        manager._list.assert_called_once_with(
+            '/stacks?', 'stacks')
+
+        # paginate is not specified, so the total
+        # results is always returned
+        self.assertEqual(self.total, len(results))
+
+        if self.total > 0:
+            self.assertEqual('stack_1', results[0].stack_name)
+            self.assertEqual('stack_%s' % self.total, results[-1].stack_name)
+
+
+class StackManagerPaginationTest(testtools.TestCase):
+
+    scenarios = [
+        ('0_offset_0', dict(
+            page_size=10,
+            offset=0,
+            total=0,
+            results=((0, 0),)
+        )),
+        ('1_offset_0', dict(
+            page_size=10,
+            offset=0,
+            total=1,
+            results=((0, 1),)
+        )),
+        ('9_offset_0', dict(
+            page_size=10,
+            offset=0,
+            total=9,
+            results=((0, 9),)
+        )),
+        ('10_offset_0', dict(
+            page_size=10,
+            offset=0,
+            total=10,
+            results=((0, 10), (10, 10))
+        )),
+        ('11_offset_0', dict(
+            page_size=10,
+            offset=0,
+            total=11,
+            results=((0, 10), (10, 11))
+        )),
+        ('11_offset_10', dict(
+            page_size=10,
+            offset=10,
+            total=11,
+            results=((10, 11),)
+        )),
+        ('19_offset_10', dict(
+            page_size=10,
+            offset=10,
+            total=19,
+            results=((10, 19),)
+        )),
+        ('20_offset_10', dict(
+            page_size=10,
+            offset=10,
+            total=20,
+            results=((10, 20), (20, 20))
+        )),
+        ('21_offset_10', dict(
+            page_size=10,
+            offset=10,
+            total=21,
+            results=((10, 20), (20, 21))
+        )),
+        ('21_offset_0', dict(
+            page_size=10,
+            offset=0,
+            total=21,
+            results=((0, 10), (10, 20), (20, 21))
+        )),
+        ('21_offset_20', dict(
+            page_size=10,
+            offset=20,
+            total=21,
+            results=((20, 21),)
+        )),
+        ('95_offset_90', dict(
+            page_size=10,
+            offset=90,
+            total=95,
+            results=((90, 95),)
+        )),
+    ]
+
+    # absolute limit for results returned
+    limit = 50
+
+    def mock_manager(self):
+        manager = StackManager(None)
+        manager._list = MagicMock()
+
+        def mock_list(arg_url, arg_response_key):
+            try:
+                result = self.results[self.result_index]
+            except IndexError:
+                return
+            self.result_index = self.result_index + 1
+
+            offset = result[0]
+            url = '/stacks?'
+            if offset > 0:
+                url += 'marker=abcd1234-%s&' % offset
+            url += 'limit=%s' % self.page_size
+            self.assertEqual(url, arg_url)
+
+            def results():
+
+                for i in range(*result):
+                    stack_name = 'stack_%s' % (i + 1)
+                    stack_id = 'abcd1234-%s' % (i + 1)
+                    yield mock_stack(manager, stack_name, stack_id)
+
+            return list(results())
+
+        manager._list.side_effect = mock_list
+        return manager
+
+    def test_stack_list_pagination(self):
+        manager = self.mock_manager()
+
+        list_params = {
+            'page_size': self.page_size,
+            'limit': self.limit
+        }
+
+        if self.offset > 0:
+            marker = 'abcd1234-%s' % self.offset
+            list_params['marker'] = marker
+
+        self.result_index = 0
+        results = list(manager.list(**list_params))
+
+        # assert that the list method has been called enough times
+        self.assertEqual(len(self.results), self.result_index)
+
+        last_result = min(self.limit, self.total - self.offset)
+        # one or more list calls have been recomposed into a single list
+        self.assertEqual(last_result, len(results))
+
+        if last_result > 0:
+            self.assertEqual('stack_%s' % (self.offset + 1),
+                             results[0].stack_name)
+            self.assertEqual('stack_%s' % (self.offset + last_result),
+                             results[-1].stack_name)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/resources.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/resources.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/resources.py   
2013-07-17 01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/resources.py   
2013-08-13 22:57:12.000000000 +0200
@@ -67,3 +67,9 @@
                                            '/stacks/%s/resources/%s/metadata' %
                                            (stack_id, resource_name))
         return body['metadata']
+
+    def generate_template(self, resource_name):
+        resp, body = self.api.json_request('GET',
+                                           '/resource_types/%s/template' %
+                                           resource_name)
+        return body
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/shell.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/shell.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/shell.py       
2013-07-17 01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/shell.py       
2013-08-13 22:57:12.000000000 +0200
@@ -368,6 +368,24 @@
         utils.print_dict(resource.to_dict(), formatters=formatters)
 
 
[email protected]('resource', metavar='<RESOURCE>',
+           help='Name of the resource to generate a template for.')
[email protected]('-F', '--format', metavar='<FORMAT>',
+           help="The template output format. %s" % utils.supported_formats)
+def do_resource_template(hc, args):
+    '''Generate a template based on a resource.'''
+    fields = {'resource_name': args.resource}
+    try:
+        template = hc.resources.generate_template(**fields)
+    except exc.HTTPNotFound:
+        raise exc.CommandError('Resource %s not found.' % args.resource)
+    else:
+        if args.format:
+            print utils.format_output(template, format=args.format)
+        else:
+            print utils.format_output(template)
+
+
 @utils.arg('id', metavar='<NAME or ID>',
            help='Name or ID of stack to show the resource metadata for.')
 @utils.arg('resource', metavar='<RESOURCE>',
@@ -400,7 +418,7 @@
     else:
         fields = ['logical_resource_id', 'id', 'resource_status_reason',
                   'resource_status', 'event_time']
-        utils.print_list(events, fields, sortby=4)
+        utils.print_list(events, fields)
 
 
 @utils.arg('id', metavar='<NAME or ID>',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/stacks.py 
new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/stacks.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/stacks.py      
2013-07-17 01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/stacks.py      
2013-08-13 22:57:12.000000000 +0200
@@ -17,8 +17,6 @@
 
 from heatclient.common import base
 
-DEFAULT_PAGE_SIZE = 20
-
 
 class Stack(base.Resource):
     def __repr__(self):
@@ -28,10 +26,29 @@
         self.manager.update(self, **fields)
 
     def delete(self):
-        return self.manager.delete(self)
+        return self.manager.delete(self.id)
 
-    def data(self, **kwargs):
-        return self.manager.data(self, **kwargs)
+    def get(self):
+        # set_loaded() first ... so if we have to bail, we know we tried.
+        self.set_loaded(True)
+        if not hasattr(self.manager, 'get'):
+            return
+
+        new = self.manager.get('%s/%s' % (self.stack_name, self.id))
+        if new:
+            self._add_details(new._info)
+
+    @property
+    def action(self):
+        s = self.stack_status
+        # Return everything before the first underscore
+        return s[:s.index('_')]
+
+    @property
+    def status(self):
+        s = self.stack_status
+        # Return everything after the first underscore
+        return s[s.index('_') + 1:]
 
 
 class StackManager(base.Manager):
@@ -64,10 +81,12 @@
             if (page_size and len(stacks) == page_size and
                     (absolute_limit is None or 0 < seen < absolute_limit)):
                 qp['marker'] = stack.id
-                for image in paginate(qp, seen):
-                    yield image
+                for stack in paginate(qp, seen):
+                    yield stack
 
-        params = {'limit': kwargs.get('page_size', DEFAULT_PAGE_SIZE)}
+        params = {}
+        if 'page_size' in kwargs:
+            params['limit'] = kwargs['page_size']
 
         if 'marker' in kwargs:
             params['marker'] = kwargs['marker']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/PKG-INFO 
new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/PKG-INFO
--- old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/PKG-INFO  
2013-07-17 01:46:10.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/PKG-INFO  
2013-08-13 22:57:53.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: python-heatclient
-Version: 0.2.3.2.ga49cf4c
+Version: 0.2.4.4.gc0457ff
 Summary: OpenStack Orchestration API Client Library
 Home-page: http://www.openstack.org/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/SOURCES.txt 
new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/SOURCES.txt
--- 
old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/SOURCES.txt   
    2013-07-17 01:46:11.000000000 +0200
+++ 
new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/SOURCES.txt   
    2013-08-13 22:57:53.000000000 +0200
@@ -1,5 +1,3 @@
-.gitignore
-.gitreview
 .testr.conf
 AUTHORS
 CONTRIBUTING.rst
@@ -31,6 +29,7 @@
 heatclient/tests/fakes.py
 heatclient/tests/test_common_http.py
 heatclient/tests/test_shell.py
+heatclient/tests/test_stacks.py
 heatclient/tests/test_utils.py
 heatclient/tests/v1/__init__.py
 heatclient/tests/var/minimal.template
@@ -45,6 +44,7 @@
 python_heatclient.egg-info/SOURCES.txt
 python_heatclient.egg-info/dependency_links.txt
 python_heatclient.egg-info/entry_points.txt
+python_heatclient.egg-info/not-zip-safe
 python_heatclient.egg-info/requires.txt
 python_heatclient.egg-info/top_level.txt
 tools/with_venv.sh
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/not-zip-safe 
new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/not-zip-safe
--- 
old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/not-zip-safe  
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/not-zip-safe  
    2013-08-13 22:57:14.000000000 +0200
@@ -0,0 +1 @@
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/requires.txt 
new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/requires.txt
--- 
old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/requires.txt  
    2013-07-17 01:46:10.000000000 +0200
+++ 
new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/requires.txt  
    2013-08-13 22:57:53.000000000 +0200
@@ -1,7 +1,6 @@
-d2to1>=0.2.10,<0.3
-pbr>=0.5.16,<0.6
+pbr>=0.5.21,<1.0
 httplib2
 iso8601>=0.1.4
-prettytable>=0.6,<0.8
-python-keystoneclient>=0.2.1
-pyyaml>=3.1.0
\ No newline at end of file
+PrettyTable>=0.6,<0.8
+python-keystoneclient>=0.3.0
+PyYAML>=3.1.0
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/requirements.txt 
new/python-heatclient-0.2.4.4.gc0457ff/requirements.txt
--- old/python-heatclient-0.2.3.2.ga49cf4c/requirements.txt     2013-07-17 
01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/requirements.txt     2013-08-13 
22:57:12.000000000 +0200
@@ -1,8 +1,7 @@
-d2to1>=0.2.10,<0.3
-pbr>=0.5.16,<0.6
+pbr>=0.5.21,<1.0
 argparse
 httplib2
 iso8601>=0.1.4
-prettytable>=0.6,<0.8
-python-keystoneclient>=0.2.1
-pyyaml>=3.1.0
+PrettyTable>=0.6,<0.8
+python-keystoneclient>=0.3.0
+PyYAML>=3.1.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/setup.py 
new/python-heatclient-0.2.4.4.gc0457ff/setup.py
--- old/python-heatclient-0.2.3.2.ga49cf4c/setup.py     2013-07-17 
01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/setup.py     2013-08-13 
22:57:12.000000000 +0200
@@ -14,8 +14,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
 import setuptools
 
 setuptools.setup(
-    setup_requires=['d2to1>=0.2.10,<0.3', 'pbr>=0.5.10,<0.6'],
-    d2to1=True)
+    setup_requires=['pbr>=0.5.21,<1.0'],
+    pbr=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-heatclient-0.2.3.2.ga49cf4c/test-requirements.txt 
new/python-heatclient-0.2.4.4.gc0457ff/test-requirements.txt
--- old/python-heatclient-0.2.3.2.ga49cf4c/test-requirements.txt        
2013-07-17 01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/test-requirements.txt        
2013-08-13 22:57:12.000000000 +0200
@@ -2,12 +2,13 @@
 pep8==1.4.5
 pyflakes==0.7.2
 flake8==2.0
-hacking>=0.5.6,<0.6
+hacking>=0.5.6,<0.7
 coverage>=3.6
 discover
 fixtures>=0.3.12
+mock>=0.8.0
 mox>=0.5.3
 sphinx>=1.1.2
-testscenarios<0.5
-testrepository>=0.0.15
+testscenarios>=0.4,<0.5
+testrepository>=0.0.17
 testtools>=0.9.32
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/tox.ini 
new/python-heatclient-0.2.4.4.gc0457ff/tox.ini
--- old/python-heatclient-0.2.3.2.ga49cf4c/tox.ini      2013-07-17 
01:45:28.000000000 +0200
+++ new/python-heatclient-0.2.4.4.gc0457ff/tox.ini      2013-08-13 
22:57:12.000000000 +0200
@@ -22,6 +22,6 @@
 
 [flake8]
 show-source = True
-ignore = H302
+ignore = H233,H302,H501
 builtins = _
 exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to