)]}'
{"heat/engine/cfn/functions.py":[{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"979950272b31544eb4b740f9422d8099006c981f","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            raise exception.InvalidTemplateReference(resource\u003dresource_name,"},{"line_number":172,"context_line":"                                                     key\u003dpath)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def dep_attrs(self, resource):"},{"line_number":175,"context_line":"        if resource:"},{"line_number":176,"context_line":"            if resource \u003d\u003d self._resource_name:"},{"line_number":177,"context_line":"                return {self._resource_name: [self._attribute]}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_4a338ff5","line":174,"updated":"2015-03-10 01:40:22.000000000","message":"Should resource have a default value of None here? Also +1 to Zane\u0027s suggestion of changing to resource_name.","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0a9b2f703c487220656cb02db165131bb2550077","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            raise exception.InvalidTemplateReference(resource\u003dresource_name,"},{"line_number":172,"context_line":"                                                     key\u003dpath)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def dep_attrs(self, resource):"},{"line_number":175,"context_line":"        if resource:"},{"line_number":176,"context_line":"            if resource \u003d\u003d self._resource_name:"},{"line_number":177,"context_line":"                return {self._resource_name: [self._attribute]}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_2a3484fa","line":174,"in_reply_to":"9a80dd14_4a338ff5","updated":"2015-03-10 15:00:41.000000000","message":"Done","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"979950272b31544eb4b740f9422d8099006c981f","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                                     key\u003dpath)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def dep_attrs(self, resource):"},{"line_number":175,"context_line":"        if resource:"},{"line_number":176,"context_line":"            if resource \u003d\u003d self._resource_name:"},{"line_number":177,"context_line":"                return {self._resource_name: [self._attribute]}"},{"line_number":178,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_6a2e938d","line":175,"updated":"2015-03-10 01:40:22.000000000","message":"The logic in this function can be simplified a bit:\n\n    def dep_attrs(self, resource\u003dNone):\n        if resource is not None and resource !\u003d self._resource_name:\n            return {}\n        return {self._resource_name: [self._attribute]}","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0a9b2f703c487220656cb02db165131bb2550077","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                                     key\u003dpath)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def dep_attrs(self, resource):"},{"line_number":175,"context_line":"        if resource:"},{"line_number":176,"context_line":"            if resource \u003d\u003d self._resource_name:"},{"line_number":177,"context_line":"                return {self._resource_name: [self._attribute]}"},{"line_number":178,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_6a43dc6b","line":175,"in_reply_to":"9a80dd14_6a2e938d","updated":"2015-03-10 15:00:41.000000000","message":"Done","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"6b80ecf955a9c79ee5829ddaaed20f1ef4e13c3d","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def dep_attrs(self, resource):"},{"line_number":175,"context_line":"        if resource:"},{"line_number":176,"context_line":"            if resource \u003d\u003d self._resource_name:"},{"line_number":177,"context_line":"                return {self._resource_name: [self._attribute]}"},{"line_number":178,"context_line":"            else:"},{"line_number":179,"context_line":"                return {}"},{"line_number":180,"context_line":"        return {self._resource_name: [self._attribute]}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_fb8b3bc0","line":177,"updated":"2015-03-09 23:28:20.000000000","message":"We also need to merge this with the results of calling super(GetAtt, self).dep_attrs(resource). See line 183 below.","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0a9b2f703c487220656cb02db165131bb2550077","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def dep_attrs(self, resource):"},{"line_number":175,"context_line":"        if resource:"},{"line_number":176,"context_line":"            if resource \u003d\u003d self._resource_name:"},{"line_number":177,"context_line":"                return {self._resource_name: [self._attribute]}"},{"line_number":178,"context_line":"            else:"},{"line_number":179,"context_line":"                return {}"},{"line_number":180,"context_line":"        return {self._resource_name: [self._attribute]}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_ca04c31a","line":177,"in_reply_to":"9a80dd14_fb8b3bc0","updated":"2015-03-10 15:00:41.000000000","message":"Done","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"e7ac4176d82753d087856e570db09481a964b968","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            raise exception.InvalidTemplateReference(resource\u003dparam_name,"},{"line_number":93,"context_line":"                                                     key\u003d\u0027unknown\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class ResourceRef(function.Function):"},{"line_number":97,"context_line":"    \u0027\u0027\u0027"},{"line_number":98,"context_line":"    A function for resolving resource references."}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_aa3e58d8","line":95,"updated":"2015-03-12 02:11:42.000000000","message":"Don\u0027t you also need to handle this one?","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"e1cdb0052681e673b5beb1b3b2de6c651b4a2ce0","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            raise exception.InvalidTemplateReference(resource\u003dparam_name,"},{"line_number":93,"context_line":"                                                     key\u003d\u0027unknown\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class ResourceRef(function.Function):"},{"line_number":97,"context_line":"    \u0027\u0027\u0027"},{"line_number":98,"context_line":"    A function for resolving resource references."}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_e6f30d08","line":95,"in_reply_to":"9a80dd14_aa3e58d8","updated":"2015-03-12 16:15:27.000000000","message":"I have no idea which code this comment refers to, but the answer is no in any case.","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"520287f6ff52485ede9cd265857d3962d6056159","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            raise exception.InvalidTemplateReference(resource\u003dparam_name,"},{"line_number":93,"context_line":"                                                     key\u003d\u0027unknown\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class ResourceRef(function.Function):"},{"line_number":97,"context_line":"    \u0027\u0027\u0027"},{"line_number":98,"context_line":"    A function for resolving resource references."}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_3caa92d2","line":95,"in_reply_to":"9a80dd14_e6f30d08","updated":"2015-03-12 16:56:16.000000000","message":"Sorry, I meant if you needed to also track resource references. Based on your explanation I understand that this is not necessary.","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"e7ac4176d82753d087856e570db09481a964b968","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                                     key\u003dpath)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def dep_attrs(self, resource_name):"},{"line_number":175,"context_line":"        resources \u003d {self._resource_name: [self._attribute]}"},{"line_number":176,"context_line":"        if resource_name and resource_name !\u003d self._resource_name:"},{"line_number":177,"context_line":"            resources \u003d {}"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_ea45b015","line":175,"updated":"2015-03-12 02:11:42.000000000","message":"I would rename resources to res_with_attrs, to indicate it is a dict and not a list. Also, put it in an else block in the conditional below, so that it is only calculated when it is needed.","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"e7ac4176d82753d087856e570db09481a964b968","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            resources \u003d {}"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        function.update_attrs_list("},{"line_number":180,"context_line":"            resources, super(GetAtt, self).dep_attrs(resource))"},{"line_number":181,"context_line":"        return resources"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def dependencies(self, path):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_6a92a04c","line":180,"updated":"2015-03-12 02:11:42.000000000","message":"the symbol resource isn\u0027t defined in this function, right? Did you mean self._resource() here?","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"e1cdb0052681e673b5beb1b3b2de6c651b4a2ce0","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            resources \u003d {}"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        function.update_attrs_list("},{"line_number":180,"context_line":"            resources, super(GetAtt, self).dep_attrs(resource))"},{"line_number":181,"context_line":"        return resources"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def dependencies(self, path):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_66ad5d88","line":180,"in_reply_to":"9a80dd14_6a92a04c","updated":"2015-03-12 16:15:27.000000000","message":"Should be resource_name","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def dep_attrs(self, resource_name):"},{"line_number":175,"context_line":"        attributes \u003d []"},{"line_number":176,"context_line":"        if resource_name \u003d\u003d self._resource_name:"},{"line_number":177,"context_line":"            attributes \u003d [self._attribute]"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # remove duplicate attributes"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_87a142f9","line":176,"updated":"2015-03-19 14:40:55.000000000","message":"self._resource name may be a Function object, so you need to resolve it first.","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def dep_attrs(self, resource_name):"},{"line_number":175,"context_line":"        attributes \u003d []"},{"line_number":176,"context_line":"        if resource_name \u003d\u003d self._resource_name:"},{"line_number":177,"context_line":"            attributes \u003d [self._attribute]"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # remove duplicate attributes"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_bc6e3094","line":176,"in_reply_to":"9a80dd14_87a142f9","updated":"2015-03-20 12:12:31.000000000","message":"Done","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def dep_attrs(self, resource_name):"},{"line_number":175,"context_line":"        attributes \u003d []"},{"line_number":176,"context_line":"        if resource_name \u003d\u003d self._resource_name:"},{"line_number":177,"context_line":"            attributes \u003d [self._attribute]"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # remove duplicate attributes"},{"line_number":180,"context_line":"        function.update_attrs_list("}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_a7a6460d","line":177,"updated":"2015-03-19 14:40:55.000000000","message":"Ditto on self._attribute","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def dep_attrs(self, resource_name):"},{"line_number":175,"context_line":"        attributes \u003d []"},{"line_number":176,"context_line":"        if resource_name \u003d\u003d self._resource_name:"},{"line_number":177,"context_line":"            attributes \u003d [self._attribute]"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # remove duplicate attributes"},{"line_number":180,"context_line":"        function.update_attrs_list("}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_fc6428b4","line":177,"in_reply_to":"9a80dd14_a7a6460d","updated":"2015-03-20 12:12:31.000000000","message":"Done","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        # remove duplicate attributes"},{"line_number":180,"context_line":"        function.update_attrs_list("},{"line_number":181,"context_line":"            attributes, super(GetAtt, self).dep_attrs(resource_name))"},{"line_number":182,"context_line":"        return attributes"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def dependencies(self, path):"},{"line_number":185,"context_line":"        return itertools.chain(super(GetAtt, self).dependencies(path),"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_a77d666f","line":182,"updated":"2015-03-19 14:40:55.000000000","message":"Why is this so complicated? It could just be a copy of dependencies():\n\n  if self._resource().name \u003d\u003d resource_name:\n      attrs \u003d [function.resolve(self._attribute)]\n  else:\n      attrs \u003d []\n\n  return itertools.chain(super(GetAtt, self).dep_attrs(resource_name),\n                         attrs)","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        # remove duplicate attributes"},{"line_number":180,"context_line":"        function.update_attrs_list("},{"line_number":181,"context_line":"            attributes, super(GetAtt, self).dep_attrs(resource_name))"},{"line_number":182,"context_line":"        return attributes"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def dependencies(self, path):"},{"line_number":185,"context_line":"        return itertools.chain(super(GetAtt, self).dependencies(path),"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_5c24545f","line":182,"in_reply_to":"9a80dd14_a77d666f","updated":"2015-03-20 12:12:31.000000000","message":"thanks for the explanation ;)","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"}],"heat/engine/function.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c07bf407bb17214835440e2a42301995c158f971","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        return []"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def dep_attrs(snippet, path\u003d\u0027\u0027):"},{"line_number":176,"context_line":"    \"\"\""},{"line_number":177,"context_line":"    Return an iterator over Resource dependencies in a template snippet."},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_fbc30088","line":175,"updated":"2015-03-04 17:10:10.000000000","message":"The path is only for error reporting purposes, so we can probably drop it - if calling dependencies() on the snippet didn\u0027t fail when we started the operation then calling this shouldn\u0027t fail later. So we should probably drop this.\n\nWhat we might want to do though it specify the one resource whose attributes we\u0027re looking for as an argument - that makes it a lot easier, and I believe we only ever need it one resource at a time anyway (so there\u0027s no performance penalty).","commit_id":"47f548641adeb628aa09737406f7e3e865b68f34"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"30ff43c2cc3f5be26186dcc415a010a85bdc6b1d","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        return []"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def dep_attrs(snippet, path\u003d\u0027\u0027):"},{"line_number":176,"context_line":"    \"\"\""},{"line_number":177,"context_line":"    Return an iterator over Resource dependencies in a template snippet."},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_1dd97683","line":175,"in_reply_to":"9a80dd14_fbc30088","updated":"2015-03-05 15:57:50.000000000","message":"Will drop the path parameter.\n\nI will try to add ability search by resource name.","commit_id":"47f548641adeb628aa09737406f7e3e865b68f34"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"979950272b31544eb4b740f9422d8099006c981f","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def update_attrs_list(deps, value, resource\u003dNone):"},{"line_number":176,"context_line":"    resources \u003d dep_attrs(value, resource)"},{"line_number":177,"context_line":"    for key in resources.iterkeys():"},{"line_number":178,"context_line":"        if key in deps:"},{"line_number":179,"context_line":"            new_attrs \u003d set(resources[key])"},{"line_number":180,"context_line":"            old_attrs \u003d set(deps[key])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_8a50270c","line":177,"updated":"2015-03-10 01:40:22.000000000","message":"better to use six.iterkeys(resources) here for Python 3 compatibility.","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0a9b2f703c487220656cb02db165131bb2550077","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def update_attrs_list(deps, value, resource\u003dNone):"},{"line_number":176,"context_line":"    resources \u003d dep_attrs(value, resource)"},{"line_number":177,"context_line":"    for key in resources.iterkeys():"},{"line_number":178,"context_line":"        if key in deps:"},{"line_number":179,"context_line":"            new_attrs \u003d set(resources[key])"},{"line_number":180,"context_line":"            old_attrs \u003d set(deps[key])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_a56a67b0","line":177,"in_reply_to":"9a80dd14_8a50270c","updated":"2015-03-10 15:00:41.000000000","message":"Done","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"979950272b31544eb4b740f9422d8099006c981f","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            new_attrs \u003d set(resources[key])"},{"line_number":180,"context_line":"            old_attrs \u003d set(deps[key])"},{"line_number":181,"context_line":"            old_attrs.update(new_attrs)"},{"line_number":182,"context_line":"            deps[key] \u003d list(old_attrs)"},{"line_number":183,"context_line":"        else:"},{"line_number":184,"context_line":"            deps.update({key: resources[key]})"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_aa532b15","line":182,"updated":"2015-03-10 01:40:22.000000000","message":"for clarity, would you rename old_attrs to just attrs? These are old attributes only until you update the list with the new ones.","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0a9b2f703c487220656cb02db165131bb2550077","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            new_attrs \u003d set(resources[key])"},{"line_number":180,"context_line":"            old_attrs \u003d set(deps[key])"},{"line_number":181,"context_line":"            old_attrs.update(new_attrs)"},{"line_number":182,"context_line":"            deps[key] \u003d list(old_attrs)"},{"line_number":183,"context_line":"        else:"},{"line_number":184,"context_line":"            deps.update({key: resources[key]})"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_254d979a","line":182,"in_reply_to":"9a80dd14_aa532b15","updated":"2015-03-10 15:00:41.000000000","message":"Done","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"6b80ecf955a9c79ee5829ddaaed20f1ef4e13c3d","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            deps.update({key: resources[key]})"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def dep_attrs(snippet, resource\u003dNone):"},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    Return an iterator over Resource dependencies in a template snippet."},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_bbb5437f","line":187,"updated":"2015-03-09 23:28:20.000000000","message":"Can we call the parameter resource_name throughout, just to eliminate any possible confusion?","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0a9b2f703c487220656cb02db165131bb2550077","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            deps.update({key: resources[key]})"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def dep_attrs(snippet, resource\u003dNone):"},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    Return an iterator over Resource dependencies in a template snippet."},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_c51d9b10","line":187,"in_reply_to":"9a80dd14_bbb5437f","updated":"2015-03-10 15:00:41.000000000","message":"Done","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"979950272b31544eb4b740f9422d8099006c981f","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def dep_attrs(snippet, resource\u003dNone):"},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    Return an iterator over Resource dependencies in a template snippet."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    The snippet should be already parsed to insert Function objects where"},{"line_number":192,"context_line":"    appropriate."}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_ca569f05","line":189,"updated":"2015-03-10 01:40:22.000000000","message":"The function returns a dictionary, not an iterator. Maybe you meant iterable here. Can you update the docstring?\n\nAlso, the function name \"dep_attrs()\" is too compressed for a module-level function, in my opinion. Maybe use \"get_dependent_attrs()\"?","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"7f9da38275e117c63147151bfe91282e3483f55d","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def dep_attrs(snippet, resource\u003dNone):"},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    Return an iterator over Resource dependencies in a template snippet."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    The snippet should be already parsed to insert Function objects where"},{"line_number":192,"context_line":"    appropriate."}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_9052fa66","line":189,"in_reply_to":"9a80dd14_4588cb70","updated":"2015-03-10 15:01:09.000000000","message":"s/fox/fix","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0a9b2f703c487220656cb02db165131bb2550077","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def dep_attrs(snippet, resource\u003dNone):"},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    Return an iterator over Resource dependencies in a template snippet."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    The snippet should be already parsed to insert Function objects where"},{"line_number":192,"context_line":"    appropriate."}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_4588cb70","line":189,"in_reply_to":"9a80dd14_ca569f05","updated":"2015-03-10 15:00:41.000000000","message":"I will fox docstring, but I don\u0027t think, that name should be changed, because I purposely choose this compact name to be same on dependencies function.","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"979950272b31544eb4b740f9422d8099006c981f","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        return deps"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    else:"},{"line_number":209,"context_line":"        return {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_ea59a335","line":209,"updated":"2015-03-10 01:40:22.000000000","message":"not a huge deal, but you can remove the two \"return deps\" above and the else block and just return deps here at the bottom.","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0a9b2f703c487220656cb02db165131bb2550077","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        return deps"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    else:"},{"line_number":209,"context_line":"        return {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_47436e6c","line":209,"in_reply_to":"9a80dd14_ea59a335","updated":"2015-03-10 15:00:41.000000000","message":"Done","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"e7ac4176d82753d087856e570db09481a964b968","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    else:"},{"line_number":172,"context_line":"        return []"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def update_attrs_list(deps, resources):"},{"line_number":176,"context_line":"    for key in six.iterkeys(resources):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_0a4924d0","line":173,"updated":"2015-03-12 02:11:42.000000000","message":"Do the update_attrs_list() and dep_attrs() functions belong in this module? I\u0027m thinking dep_attrs() could go as a static method in class ResourceDefinition, and update_attrs_list() as static in class Resource. What do you think?","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"e1cdb0052681e673b5beb1b3b2de6c651b4a2ce0","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    else:"},{"line_number":172,"context_line":"        return []"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def update_attrs_list(deps, resources):"},{"line_number":176,"context_line":"    for key in six.iterkeys(resources):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_a631150d","line":173,"in_reply_to":"9a80dd14_0a4924d0","updated":"2015-03-12 16:15:27.000000000","message":"Disagree","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"e7ac4176d82753d087856e570db09481a964b968","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        return []"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def update_attrs_list(deps, resources):"},{"line_number":176,"context_line":"    for key in six.iterkeys(resources):"},{"line_number":177,"context_line":"        if key in deps:"},{"line_number":178,"context_line":"            new_attrs \u003d set(resources[key])"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_cadc6c77","line":175,"updated":"2015-03-12 02:11:42.000000000","message":"resources should be called res_with_attrs to be consistent with other usages of this data structure.","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"f54e96a5406bdb688c5132c9f1e5a69e8ef87186","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def update_attrs_list(deps, attrs):"},{"line_number":176,"context_line":"    upd_attrs \u003d list(set(attrs) - set(deps))"},{"line_number":177,"context_line":"    deps.extend(upd_attrs)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"def dep_attrs(snippet, resource_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_129ed707","line":177,"updated":"2015-03-17 17:33:34.000000000","message":"Question: How often is this going to be called? Seems expensive to just update a list, I wonder if using a set end-to-end if more appropriate for this?","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0b43b731fdd435e77ff01ed9ae907d543087f71e","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def update_attrs_list(deps, attrs):"},{"line_number":176,"context_line":"    upd_attrs \u003d list(set(attrs) - set(deps))"},{"line_number":177,"context_line":"    deps.extend(upd_attrs)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"def dep_attrs(snippet, resource_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_4322eca3","line":177,"in_reply_to":"9a80dd14_129ed707","updated":"2015-03-19 10:01:58.000000000","message":"It called very often in dep_attrs function. (during recursion calling)","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        return []"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def update_attrs_list(deps, attrs):"},{"line_number":176,"context_line":"    upd_attrs \u003d list(set(attrs) - set(deps))"},{"line_number":177,"context_line":"    deps.extend(upd_attrs)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_27fc16b5","line":175,"updated":"2015-03-19 14:40:55.000000000","message":"This seems gratuitously inefficient. Why not just collect all of the attrs and turn it into a set at the end? I don\u0027t think this function needs to exist.","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        return []"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"def update_attrs_list(deps, attrs):"},{"line_number":176,"context_line":"    upd_attrs \u003d list(set(attrs) - set(deps))"},{"line_number":177,"context_line":"    deps.extend(upd_attrs)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_9c216c4f","line":175,"in_reply_to":"9a80dd14_27fc16b5","updated":"2015-03-20 12:12:31.000000000","message":"Done. I just wanted to return list always from any step of scanning...\nBut it is really expensive to do it always.","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    appropriate."},{"line_number":187,"context_line":"    \"\"\""},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    deps \u003d []"},{"line_number":190,"context_line":"    if isinstance(snippet, Function):"},{"line_number":191,"context_line":"        return snippet.dep_attrs(resource_name)"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_e7911e53","line":189,"updated":"2015-03-19 14:40:55.000000000","message":"misleading variable name, this is attrs, not deps","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    appropriate."},{"line_number":187,"context_line":"    \"\"\""},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    deps \u003d []"},{"line_number":190,"context_line":"    if isinstance(snippet, Function):"},{"line_number":191,"context_line":"        return snippet.dep_attrs(resource_name)"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_dcee84ec","line":189,"in_reply_to":"9a80dd14_e7911e53","updated":"2015-03-20 12:12:31.000000000","message":"Done","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    elif isinstance(snippet, collections.Mapping):"},{"line_number":194,"context_line":"        [update_attrs_list(deps, dep_attrs(value, resource_name))"},{"line_number":195,"context_line":"         for value in snippet.items()]"},{"line_number":196,"context_line":"    elif (not isinstance(snippet, six.string_types) and"},{"line_number":197,"context_line":"          isinstance(snippet, collections.Iterable)):"},{"line_number":198,"context_line":"        [update_attrs_list(deps, dep_attrs(value, resource_name))"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_4712eab4","line":195,"updated":"2015-03-19 14:40:55.000000000","message":"The implementation from dependencies() would be fine here:\n\n  attrs \u003d (dep_attrs(value, resource_name) for value in snippet.items)\n  return itertools.chain.from_iterable(attrs)","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    elif isinstance(snippet, collections.Mapping):"},{"line_number":194,"context_line":"        [update_attrs_list(deps, dep_attrs(value, resource_name))"},{"line_number":195,"context_line":"         for value in snippet.items()]"},{"line_number":196,"context_line":"    elif (not isinstance(snippet, six.string_types) and"},{"line_number":197,"context_line":"          isinstance(snippet, collections.Iterable)):"},{"line_number":198,"context_line":"        [update_attrs_list(deps, dep_attrs(value, resource_name))"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_9c408ca6","line":195,"in_reply_to":"9a80dd14_4712eab4","updated":"2015-03-20 12:12:31.000000000","message":"Done","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":196,"context_line":"    elif (not isinstance(snippet, six.string_types) and"},{"line_number":197,"context_line":"          isinstance(snippet, collections.Iterable)):"},{"line_number":198,"context_line":"        [update_attrs_list(deps, dep_attrs(value, resource_name))"},{"line_number":199,"context_line":"         for value in snippet]"},{"line_number":200,"context_line":"    return deps"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_877f82de","line":199,"updated":"2015-03-19 14:40:55.000000000","message":"Ditto:\n\n  attrs \u003d (dep_attrs(value, resource_name) for value in snippet)\n  return itertools.chain.from_iterable(attrs)","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":196,"context_line":"    elif (not isinstance(snippet, six.string_types) and"},{"line_number":197,"context_line":"          isinstance(snippet, collections.Iterable)):"},{"line_number":198,"context_line":"        [update_attrs_list(deps, dep_attrs(value, resource_name))"},{"line_number":199,"context_line":"         for value in snippet]"},{"line_number":200,"context_line":"    return deps"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_7c367852","line":199,"in_reply_to":"9a80dd14_877f82de","updated":"2015-03-20 12:12:31.000000000","message":"Done","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"}],"heat/engine/resource.py":[{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"979950272b31544eb4b740f9422d8099006c981f","unresolved":false,"context_lines":[{"line_number":376,"context_line":"            text \u003d \u0027%s \"%s\"\u0027 % (self.__class__.__name__, self.name)"},{"line_number":377,"context_line":"        return encodeutils.safe_decode(text)"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def dep_attrs(self, res_with_attrs):"},{"line_number":380,"context_line":"        self.t.dep_attrs(res_with_attrs)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def add_dependencies(self, deps):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_0a3d17c4","line":379,"updated":"2015-03-10 01:40:22.000000000","message":"This function updates the argument res_with_attrs. To make that clear it should be named accordingly. Maybe \"update_dep_attrs()\"?","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0a9b2f703c487220656cb02db165131bb2550077","unresolved":false,"context_lines":[{"line_number":376,"context_line":"            text \u003d \u0027%s \"%s\"\u0027 % (self.__class__.__name__, self.name)"},{"line_number":377,"context_line":"        return encodeutils.safe_decode(text)"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def dep_attrs(self, res_with_attrs):"},{"line_number":380,"context_line":"        self.t.dep_attrs(res_with_attrs)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def add_dependencies(self, deps):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_eae2672e","line":379,"in_reply_to":"9a80dd14_0a3d17c4","updated":"2015-03-10 15:00:41.000000000","message":"I want to make it similar with dependencies method","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"e7ac4176d82753d087856e570db09481a964b968","unresolved":false,"context_lines":[{"line_number":376,"context_line":"            text \u003d \u0027%s \"%s\"\u0027 % (self.__class__.__name__, self.name)"},{"line_number":377,"context_line":"        return encodeutils.safe_decode(text)"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def dep_attrs(self, res_with_attrs):"},{"line_number":380,"context_line":"        self.t.dep_attrs(res_with_attrs)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def add_dependencies(self, deps):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_44bfa4aa","line":379,"updated":"2015-03-12 02:11:42.000000000","message":"the method name should suggest that the res_with_attrs argument is input/output and not only input. For example, \"update_dep_attrs\" or \"add_dep_attrs\".","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"f54e96a5406bdb688c5132c9f1e5a69e8ef87186","unresolved":false,"context_lines":[{"line_number":380,"context_line":"            text \u003d \u0027%s \"%s\"\u0027 % (self.__class__.__name__, self.name)"},{"line_number":381,"context_line":"        return encodeutils.safe_decode(text)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"    def dep_attrs(self, attributes, resource_name):"},{"line_number":384,"context_line":"        self.t.dep_attrs(attributes, resource_name)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def add_dependencies(self, deps):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_724f13bf","line":383,"updated":"2015-03-17 17:33:34.000000000","message":"I would call this \"add_dep_attrs\", consistent with the \"add_dependencies\" below.","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0b43b731fdd435e77ff01ed9ae907d543087f71e","unresolved":false,"context_lines":[{"line_number":380,"context_line":"            text \u003d \u0027%s \"%s\"\u0027 % (self.__class__.__name__, self.name)"},{"line_number":381,"context_line":"        return encodeutils.safe_decode(text)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"    def dep_attrs(self, attributes, resource_name):"},{"line_number":384,"context_line":"        self.t.dep_attrs(attributes, resource_name)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def add_dependencies(self, deps):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_e34da073","line":383,"in_reply_to":"9a80dd14_724f13bf","updated":"2015-03-19 10:01:58.000000000","message":"Done","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"dc3c441d3e6b159d8be96d91d52e1cc11604aedb","unresolved":false,"context_lines":[{"line_number":419,"context_line":"            text \u003d \u0027%s \"%s\"\u0027 % (self.__class__.__name__, self.name)"},{"line_number":420,"context_line":"        return encodeutils.safe_decode(text)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def add_dep_attrs(self, resource_name):"},{"line_number":423,"context_line":"        return self.t.dep_attrs(resource_name)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def add_dependencies(self, deps):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_f8afb4e0","line":422,"updated":"2015-03-21 00:10:49.000000000","message":"Odd name for this method - should just be dep_attrs().","commit_id":"ab2106064e61bddcddd59916112aefa4f533fb71"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"f1f4fbcbef0bb2ca455026ed4e6830903297bf7a","unresolved":false,"context_lines":[{"line_number":419,"context_line":"            text \u003d \u0027%s \"%s\"\u0027 % (self.__class__.__name__, self.name)"},{"line_number":420,"context_line":"        return encodeutils.safe_decode(text)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def add_dep_attrs(self, resource_name):"},{"line_number":423,"context_line":"        return self.t.dep_attrs(resource_name)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def add_dependencies(self, deps):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_22601b35","line":422,"in_reply_to":"1a6ced46_02523fdd","updated":"2015-03-23 00:32:04.000000000","message":"This was a suggestion I made in an earlier review (see patch set #6). But that was when this method received a list of attributes as an argument and added new attributes to it in place, without returning anything.\n\nWith the method coded to return a brand new list I agree with Zane, the \"add\" prefix should be removed.","commit_id":"ab2106064e61bddcddd59916112aefa4f533fb71"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"8179d4e639ceb5d79bcfc6d596d585e7e2f94075","unresolved":false,"context_lines":[{"line_number":419,"context_line":"            text \u003d \u0027%s \"%s\"\u0027 % (self.__class__.__name__, self.name)"},{"line_number":420,"context_line":"        return encodeutils.safe_decode(text)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def add_dep_attrs(self, resource_name):"},{"line_number":423,"context_line":"        return self.t.dep_attrs(resource_name)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def add_dependencies(self, deps):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_b8f8b3e6","line":422,"in_reply_to":"1a6ced46_22601b35","updated":"2015-03-23 08:31:14.000000000","message":"Done. Agree due to changes in function, I will update name.","commit_id":"ab2106064e61bddcddd59916112aefa4f533fb71"},{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"e307c5fcc7abdcc1f74b687a8f5755f83bc108df","unresolved":false,"context_lines":[{"line_number":419,"context_line":"            text \u003d \u0027%s \"%s\"\u0027 % (self.__class__.__name__, self.name)"},{"line_number":420,"context_line":"        return encodeutils.safe_decode(text)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    def add_dep_attrs(self, resource_name):"},{"line_number":423,"context_line":"        return self.t.dep_attrs(resource_name)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def add_dependencies(self, deps):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_02523fdd","line":422,"in_reply_to":"9a80dd14_f8afb4e0","updated":"2015-03-22 23:32:00.000000000","message":"I think he was following the pattern of \"dependencies\" and \"add_dependencies\"","commit_id":"ab2106064e61bddcddd59916112aefa4f533fb71"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"6921912b34ebc61432ee9557bf279d3f13ba19d7","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        self.data_set(hook, \"True\")"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    def clear_hook(self, hook):"},{"line_number":295,"context_line":"        self.data_delete(hook)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def type(self):"},{"line_number":298,"context_line":"        return self.t.resource_type"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6ced46_3fc1ee80","line":295,"updated":"2015-03-23 17:32:53.000000000","message":"This is odd. This chunk of code and a couple more below are from the breakpoints feature that merged recently, must have gotten here by mistake.","commit_id":"401fd430d1df9ec71ed55979db87c0c631ff2290"}],"heat/engine/rsrc_defn.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c07bf407bb17214835440e2a42301995c158f971","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        def path(section):"},{"line_number":149,"context_line":"            return \u0027.\u0027.join([self.name, section])"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        def get_resource(res_name):"},{"line_number":152,"context_line":"            if res_name not in stack:"},{"line_number":153,"context_line":"                raise exception.InvalidTemplateReference(resource\u003dres_name,"},{"line_number":154,"context_line":"                                                         key\u003dself.name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_db463c23","line":151,"updated":"2015-03-04 17:10:10.000000000","message":"This doesn\u0027t appear to be called.","commit_id":"47f548641adeb628aa09737406f7e3e865b68f34"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"30ff43c2cc3f5be26186dcc415a010a85bdc6b1d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        def path(section):"},{"line_number":149,"context_line":"            return \u0027.\u0027.join([self.name, section])"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        def get_resource(res_name):"},{"line_number":152,"context_line":"            if res_name not in stack:"},{"line_number":153,"context_line":"                raise exception.InvalidTemplateReference(resource\u003dres_name,"},{"line_number":154,"context_line":"                                                         key\u003dself.name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_9bed7628","line":151,"in_reply_to":"9a80dd14_db463c23","updated":"2015-03-05 15:57:50.000000000","message":"Done","commit_id":"47f548641adeb628aa09737406f7e3e865b68f34"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"979950272b31544eb4b740f9422d8099006c981f","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            deletion_policy\u003dreparse_snippet(self._deletion_policy),"},{"line_number":142,"context_line":"            update_policy\u003dreparse_snippet(self._update_policy))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def dep_attrs(self, res_with_attrs):"},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        Return the map of Resource objects with their attributes used in"},{"line_number":147,"context_line":"        template."}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_2a381bd2","line":144,"updated":"2015-03-10 01:40:22.000000000","message":"Same comment as Resource.dep_attrs().","commit_id":"cf7b7261d36ff28a825d6006a4f10b61ce173ffd"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"e7ac4176d82753d087856e570db09481a964b968","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            deletion_policy\u003dreparse_snippet(self._deletion_policy),"},{"line_number":142,"context_line":"            update_policy\u003dreparse_snippet(self._update_policy))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def dep_attrs(self, res_with_attrs):"},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        Return the map of Resource objects with their attributes used in"},{"line_number":147,"context_line":"        template."}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_84151c9d","line":144,"updated":"2015-03-12 02:11:42.000000000","message":"change the method name to make it more clear that res_with_attrs is an input/output argument. As in the previous one, \"update_dep_attrs\" or \"add_dep_attrs\" work.","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"f54e96a5406bdb688c5132c9f1e5a69e8ef87186","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    def dep_attrs(self, attributes, resource_name):"},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        Return the map of Resource objects with their attributes used in"},{"line_number":147,"context_line":"        template."},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":"        function.update_attrs_list("},{"line_number":150,"context_line":"            attributes, function.dep_attrs(self._properties, resource_name))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d2d19f30","line":147,"updated":"2015-03-17 17:33:34.000000000","message":"This comment is not accurate anymore, we are using lists now. Also this function does not return anything.\nI also mentioned this in a previous review, would you consider calling this function \"add_dep_attrs\" so that it is clear that it modifies the attribute argument?","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0b43b731fdd435e77ff01ed9ae907d543087f71e","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    def dep_attrs(self, attributes, resource_name):"},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        Return the map of Resource objects with their attributes used in"},{"line_number":147,"context_line":"        template."},{"line_number":148,"context_line":"        \"\"\""},{"line_number":149,"context_line":"        function.update_attrs_list("},{"line_number":150,"context_line":"            attributes, function.dep_attrs(self._properties, resource_name))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_03ef141f","line":147,"in_reply_to":"9a80dd14_d2d19f30","updated":"2015-03-19 10:01:58.000000000","message":"Done","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"}],"heat/engine/stack.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c07bf407bb17214835440e2a42301995c158f971","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @staticmethod"},{"line_number":252,"context_line":"    def _get_dep_attrs(resources):"},{"line_number":253,"context_line":"        \u0027\u0027\u0027Return the dependency graph for a list of resources.\u0027\u0027\u0027"},{"line_number":254,"context_line":"        res_with_attrs \u003d []"},{"line_number":255,"context_line":"        for res in resources:"},{"line_number":256,"context_line":"            res.get_dep_attrs(res_with_attrs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_fbf860c6","line":253,"updated":"2015-03-04 17:10:10.000000000","message":"Copy-paste fail.","commit_id":"47f548641adeb628aa09737406f7e3e865b68f34"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"30ff43c2cc3f5be26186dcc415a010a85bdc6b1d","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @staticmethod"},{"line_number":252,"context_line":"    def _get_dep_attrs(resources):"},{"line_number":253,"context_line":"        \u0027\u0027\u0027Return the dependency graph for a list of resources.\u0027\u0027\u0027"},{"line_number":254,"context_line":"        res_with_attrs \u003d []"},{"line_number":255,"context_line":"        for res in resources:"},{"line_number":256,"context_line":"            res.get_dep_attrs(res_with_attrs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_07dcc9e3","line":253,"in_reply_to":"9a80dd14_fbf860c6","updated":"2015-03-05 15:57:50.000000000","message":"Done","commit_id":"47f548641adeb628aa09737406f7e3e865b68f34"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"e7ac4176d82753d087856e570db09481a964b968","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        for res in resources:"},{"line_number":282,"context_line":"            res.dep_attrs(res_with_attrs)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        for out in outputs.itervalues():"},{"line_number":285,"context_line":"            function.update_attrs_list("},{"line_number":286,"context_line":"                res_with_attrs, function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027)))"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_89d61526","line":284,"updated":"2015-03-12 02:11:42.000000000","message":"for future proofing, use six.itervalues(outputs) here","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"f54e96a5406bdb688c5132c9f1e5a69e8ef87186","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    @staticmethod"},{"line_number":279,"context_line":"    def _get_dep_attrs(resources, outputs, resource_name):"},{"line_number":280,"context_line":"        \u0027\u0027\u0027"},{"line_number":281,"context_line":"        Return the map of resources with a list of their attributes used"},{"line_number":282,"context_line":"        in template."},{"line_number":283,"context_line":"        \u0027\u0027\u0027"},{"line_number":284,"context_line":"        attributes \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_f215c39b","line":281,"updated":"2015-03-17 17:33:34.000000000","message":"the comment is outdated, this function now returns a list.","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0b43b731fdd435e77ff01ed9ae907d543087f71e","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    @staticmethod"},{"line_number":279,"context_line":"    def _get_dep_attrs(resources, outputs, resource_name):"},{"line_number":280,"context_line":"        \u0027\u0027\u0027"},{"line_number":281,"context_line":"        Return the map of resources with a list of their attributes used"},{"line_number":282,"context_line":"        in template."},{"line_number":283,"context_line":"        \u0027\u0027\u0027"},{"line_number":284,"context_line":"        attributes \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_c3eb3ca2","line":281,"in_reply_to":"9a80dd14_f215c39b","updated":"2015-03-19 10:01:58.000000000","message":"Disagree, it\u0027s steel list.","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"f54e96a5406bdb688c5132c9f1e5a69e8ef87186","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        Return the map of resources with a list of their attributes used"},{"line_number":282,"context_line":"        in template."},{"line_number":283,"context_line":"        \u0027\u0027\u0027"},{"line_number":284,"context_line":"        attributes \u003d []"},{"line_number":285,"context_line":"        # collect attrs in properties"},{"line_number":286,"context_line":"        [res.dep_attrs(attributes, resource_name) for res in resources]"},{"line_number":287,"context_line":"        # collect attrs in outputs"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d216ff57","line":284,"updated":"2015-03-17 17:33:34.000000000","message":"I mentioned this in another place, I wanted to discuss the possibility to use a set here, to avoid having to jump through hoops to update the list without introducing duplicates.","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0b43b731fdd435e77ff01ed9ae907d543087f71e","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        Return the map of resources with a list of their attributes used"},{"line_number":282,"context_line":"        in template."},{"line_number":283,"context_line":"        \u0027\u0027\u0027"},{"line_number":284,"context_line":"        attributes \u003d []"},{"line_number":285,"context_line":"        # collect attrs in properties"},{"line_number":286,"context_line":"        [res.dep_attrs(attributes, resource_name) for res in resources]"},{"line_number":287,"context_line":"        # collect attrs in outputs"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_6302903f","line":284,"in_reply_to":"9a80dd14_d216ff57","updated":"2015-03-19 10:01:58.000000000","message":"I think that we want to use list instead of set. Also dep_attrs functions use list too.\nIn update_attr_list I transform it to set for reducing duplicate attrs, after that I transform it back to list.","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"f54e96a5406bdb688c5132c9f1e5a69e8ef87186","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        # collect attrs in outputs"},{"line_number":288,"context_line":"        [function.update_attrs_list("},{"line_number":289,"context_line":"         attributes, function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027), resource_name))"},{"line_number":290,"context_line":"         for out in outputs.itervalues()]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        return attributes"},{"line_number":293,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_523daf2b","line":290,"updated":"2015-03-17 17:33:34.000000000","message":"maybe use six.itervalues here?","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0b43b731fdd435e77ff01ed9ae907d543087f71e","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        # collect attrs in outputs"},{"line_number":288,"context_line":"        [function.update_attrs_list("},{"line_number":289,"context_line":"         attributes, function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027), resource_name))"},{"line_number":290,"context_line":"         for out in outputs.itervalues()]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        return attributes"},{"line_number":293,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_a3f8084b","line":290,"in_reply_to":"9a80dd14_523daf2b","updated":"2015-03-19 10:01:58.000000000","message":"Done","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"88946efcb839903c6f5b7700ab5ff67abd5b3086","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    @staticmethod"},{"line_number":279,"context_line":"    def _get_dep_attrs(resources, outputs, resource_name):"},{"line_number":280,"context_line":"        \u0027\u0027\u0027"},{"line_number":281,"context_line":"        Return the map of resources with a list of their attributes used"},{"line_number":282,"context_line":"        in template."},{"line_number":283,"context_line":"        \u0027\u0027\u0027"},{"line_number":284,"context_line":"        attributes \u003d []"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_ed365de6","line":281,"updated":"2015-03-19 14:43:36.000000000","message":"shardy, you are right. I missed this one.\nThere are a lot of docstrings :)","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    @staticmethod"},{"line_number":279,"context_line":"    def _get_dep_attrs(resources, outputs, resource_name):"},{"line_number":280,"context_line":"        \u0027\u0027\u0027"},{"line_number":281,"context_line":"        Return the map of resources with a list of their attributes used"},{"line_number":282,"context_line":"        in template."},{"line_number":283,"context_line":"        \u0027\u0027\u0027"},{"line_number":284,"context_line":"        attributes \u003d []"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_fc18a8ce","line":281,"in_reply_to":"9a80dd14_ed365de6","updated":"2015-03-20 12:12:31.000000000","message":"Done","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":279,"context_line":"    def _get_dep_attrs(resources, outputs, resource_name):"},{"line_number":280,"context_line":"        \u0027\u0027\u0027"},{"line_number":281,"context_line":"        Return the map of resources with a list of their attributes used"},{"line_number":282,"context_line":"        in template."},{"line_number":283,"context_line":"        \u0027\u0027\u0027"},{"line_number":284,"context_line":"        attributes \u003d []"},{"line_number":285,"context_line":"        # collect attrs in properties"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_e7211eb5","line":282,"updated":"2015-03-19 14:40:55.000000000","message":"Docstring is wrong","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":279,"context_line":"    def _get_dep_attrs(resources, outputs, resource_name):"},{"line_number":280,"context_line":"        \u0027\u0027\u0027"},{"line_number":281,"context_line":"        Return the map of resources with a list of their attributes used"},{"line_number":282,"context_line":"        in template."},{"line_number":283,"context_line":"        \u0027\u0027\u0027"},{"line_number":284,"context_line":"        attributes \u003d []"},{"line_number":285,"context_line":"        # collect attrs in properties"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_1c7bbcf5","line":282,"in_reply_to":"9a80dd14_e7211eb5","updated":"2015-03-20 12:12:31.000000000","message":"Done","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        # collect attrs in outputs"},{"line_number":288,"context_line":"        [function.update_attrs_list("},{"line_number":289,"context_line":"         attributes, function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027), resource_name))"},{"line_number":290,"context_line":"         for out in six.itervalues(outputs)]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        return attributes"},{"line_number":293,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_a2a6340d","line":290,"updated":"2015-03-19 14:40:55.000000000","message":"I would have used itertools.chain to collect these up into one big iterator, but maybe that\u0027s just me ;)","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        # collect attrs in outputs"},{"line_number":288,"context_line":"        [function.update_attrs_list("},{"line_number":289,"context_line":"         attributes, function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027), resource_name))"},{"line_number":290,"context_line":"         for out in six.itervalues(outputs)]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        return attributes"},{"line_number":293,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_3a423b3e","line":290,"in_reply_to":"9a80dd14_a2a6340d","updated":"2015-03-20 12:12:31.000000000","message":"Why do you so like generators and iterators instead of lists ? :)\n\nI re-use them, but could you light me why it\u0027s better or comfortable.","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":289,"context_line":"         attributes, function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027), resource_name))"},{"line_number":290,"context_line":"         for out in six.itervalues(outputs)]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        return attributes"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    @staticmethod"},{"line_number":295,"context_line":"    def _get_dependencies(resources):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_67360e05","line":292,"updated":"2015-03-19 14:40:55.000000000","message":"If you just return set(attributes) here then you can get rid of all the expensive list merging at every previous step.","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":289,"context_line":"         attributes, function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027), resource_name))"},{"line_number":290,"context_line":"         for out in six.itervalues(outputs)]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        return attributes"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    @staticmethod"},{"line_number":295,"context_line":"    def _get_dependencies(resources):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_dc4be4ae","line":292,"in_reply_to":"9a80dd14_67360e05","updated":"2015-03-20 12:12:31.000000000","message":"Done","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"dc3c441d3e6b159d8be96d91d52e1cc11604aedb","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            LOG.warn(_LW(\"Unable to set parameters StackId identifier\"))"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    @staticmethod"},{"line_number":284,"context_line":"    def _get_dep_attrs(resources, outputs, resource_name):"},{"line_number":285,"context_line":"        \u0027\u0027\u0027"},{"line_number":286,"context_line":"        Return the set of dependent attributes for specified resource name by"},{"line_number":287,"context_line":"        inspecting all resources and outputs in template."}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_b83e1c89","line":284,"updated":"2015-03-21 00:10:49.000000000","message":"This one probably shouldn\u0027t start with an underscore, it\u0027s likely to be part of the API that gets called from the worker service.","commit_id":"ab2106064e61bddcddd59916112aefa4f533fb71"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"8179d4e639ceb5d79bcfc6d596d585e7e2f94075","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            LOG.warn(_LW(\"Unable to set parameters StackId identifier\"))"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    @staticmethod"},{"line_number":284,"context_line":"    def _get_dep_attrs(resources, outputs, resource_name):"},{"line_number":285,"context_line":"        \u0027\u0027\u0027"},{"line_number":286,"context_line":"        Return the set of dependent attributes for specified resource name by"},{"line_number":287,"context_line":"        inspecting all resources and outputs in template."}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_f8786b2d","line":284,"in_reply_to":"9a80dd14_b83e1c89","updated":"2015-03-23 08:31:14.000000000","message":"Done","commit_id":"ab2106064e61bddcddd59916112aefa4f533fb71"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"dc3c441d3e6b159d8be96d91d52e1cc11604aedb","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        Return the set of dependent attributes for specified resource name by"},{"line_number":287,"context_line":"        inspecting all resources and outputs in template."},{"line_number":288,"context_line":"        \u0027\u0027\u0027"},{"line_number":289,"context_line":"        attrs \u003d itertools.chain((res.add_dep_attrs(resource_name)"},{"line_number":290,"context_line":"                                 for res in resources),"},{"line_number":291,"context_line":"                                (function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027),"},{"line_number":292,"context_line":"                                                    resource_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_58fe0007","line":289,"updated":"2015-03-21 00:10:49.000000000","message":"This is actually a list of lists (or, rather, an iterable of iterables I guess), which is why you have to do chain.from_iterable again down below. So attr_lists would be a less-confusing name for the variable.","commit_id":"ab2106064e61bddcddd59916112aefa4f533fb71"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"8179d4e639ceb5d79bcfc6d596d585e7e2f94075","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        Return the set of dependent attributes for specified resource name by"},{"line_number":287,"context_line":"        inspecting all resources and outputs in template."},{"line_number":288,"context_line":"        \u0027\u0027\u0027"},{"line_number":289,"context_line":"        attrs \u003d itertools.chain((res.add_dep_attrs(resource_name)"},{"line_number":290,"context_line":"                                 for res in resources),"},{"line_number":291,"context_line":"                                (function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027),"},{"line_number":292,"context_line":"                                                    resource_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_38aa0371","line":289,"in_reply_to":"9a80dd14_58fe0007","updated":"2015-03-23 08:31:14.000000000","message":"Done","commit_id":"ab2106064e61bddcddd59916112aefa4f533fb71"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"dc3c441d3e6b159d8be96d91d52e1cc11604aedb","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                                (function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027),"},{"line_number":292,"context_line":"                                                    resource_name)"},{"line_number":293,"context_line":"                                for out in six.itervalues(outputs)))"},{"line_number":294,"context_line":"        return set([attr for attr in itertools.chain.from_iterable(attrs)])"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    @staticmethod"},{"line_number":297,"context_line":"    def _get_dependencies(resources):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_989f98b3","line":294,"updated":"2015-03-21 00:10:49.000000000","message":"You can build a set from an iterable, you don\u0027t need to expand it into a list first:\n\n  return set(itertools.chain.from_iterable(attrs))","commit_id":"ab2106064e61bddcddd59916112aefa4f533fb71"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"8179d4e639ceb5d79bcfc6d596d585e7e2f94075","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                                (function.dep_attrs(out.get(\u0027Value\u0027, \u0027\u0027),"},{"line_number":292,"context_line":"                                                    resource_name)"},{"line_number":293,"context_line":"                                for out in six.itervalues(outputs)))"},{"line_number":294,"context_line":"        return set([attr for attr in itertools.chain.from_iterable(attrs)])"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    @staticmethod"},{"line_number":297,"context_line":"    def _get_dependencies(resources):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6ced46_38c1232f","line":294,"in_reply_to":"9a80dd14_989f98b3","updated":"2015-03-23 08:31:14.000000000","message":"Done","commit_id":"ab2106064e61bddcddd59916112aefa4f533fb71"}],"heat/tests/test_stack_collect_attributes.py":[{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"e7ac4176d82753d087856e570db09481a964b968","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        parsed_tmpl \u003d template_format.parse(self.tmpl)"},{"line_number":170,"context_line":"        self.stack \u003d parser.Stack(self.ctx, \u0027test_stack\u0027,"},{"line_number":171,"context_line":"                                  template.Template(parsed_tmpl))"},{"line_number":172,"context_line":"        resources \u003d self.stack.resources.itervalues()"},{"line_number":173,"context_line":"        outputs \u003d self.stack.outputs"},{"line_number":174,"context_line":"        result \u003d self.stack._get_dep_attrs(resources, outputs)"},{"line_number":175,"context_line":"        self.assertEqual(self.expected.keys(), result.keys())"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_5b7cdeb5","line":172,"updated":"2015-03-12 02:11:42.000000000","message":"six.itervalues(self.stack.resources)","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"e7ac4176d82753d087856e570db09481a964b968","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        outputs \u003d self.stack.outputs"},{"line_number":174,"context_line":"        result \u003d self.stack._get_dep_attrs(resources, outputs)"},{"line_number":175,"context_line":"        self.assertEqual(self.expected.keys(), result.keys())"},{"line_number":176,"context_line":"        for res, attrs in result.iteritems():"},{"line_number":177,"context_line":"            self.assertEqual(sorted(self.expected[res]), sorted(attrs))"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a80dd14_9b3496fc","line":176,"updated":"2015-03-12 02:11:42.000000000","message":"six.iteritems(result)","commit_id":"4200a03dca1156de226ee523056fda9327cbb461"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"25fba33cd58365a36fc8eb04c70233e756876a7a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from heat.tests import utils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"tmpl1 \u003d \"\"\""},{"line_number":24,"context_line":"heat_template_version: 2013-05-23"},{"line_number":25,"context_line":"resources:"},{"line_number":26,"context_line":"  AResource:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_187f7f18","line":23,"updated":"2015-03-19 09:26:09.000000000","message":"Personally I prefer it if new tests use the current stable HOT version, e.g 2014-10-16","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0b43b731fdd435e77ff01ed9ae907d543087f71e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from heat.tests import utils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"tmpl1 \u003d \"\"\""},{"line_number":24,"context_line":"heat_template_version: 2013-05-23"},{"line_number":25,"context_line":"resources:"},{"line_number":26,"context_line":"  AResource:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_a32ba893","line":23,"in_reply_to":"9a80dd14_187f7f18","updated":"2015-03-19 10:01:58.000000000","message":"Done","commit_id":"a5d0f43d15e9e565ab89d6a817f44be8f148614c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        (\u0027several_res_several_attrs\u0027,"},{"line_number":152,"context_line":"            dict(tmpl\u003dtmpl5,"},{"line_number":153,"context_line":"                 expected\u003d[[\u0027attr_A1\u0027, \u0027attr_A2\u0027, \u0027meta_A1\u0027, \u0027attr_A3\u0027,"},{"line_number":154,"context_line":"                            \u0027attr_A4\u0027], [],"},{"line_number":155,"context_line":"                           [\u0027attr_B1\u0027, \u0027attr_B2\u0027, \u0027meta_B2\u0027, \u0027attr_B3\u0027]]))"},{"line_number":156,"context_line":"    ]"},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_8d1c0168","line":154,"updated":"2015-03-19 14:40:55.000000000","message":"Why do the results for CResource appear between AResource and BResource in the expected output?","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        (\u0027several_res_several_attrs\u0027,"},{"line_number":152,"context_line":"            dict(tmpl\u003dtmpl5,"},{"line_number":153,"context_line":"                 expected\u003d[[\u0027attr_A1\u0027, \u0027attr_A2\u0027, \u0027meta_A1\u0027, \u0027attr_A3\u0027,"},{"line_number":154,"context_line":"                            \u0027attr_A4\u0027], [],"},{"line_number":155,"context_line":"                           [\u0027attr_B1\u0027, \u0027attr_B2\u0027, \u0027meta_B2\u0027, \u0027attr_B3\u0027]]))"},{"line_number":156,"context_line":"    ]"},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_5ccff428","line":154,"in_reply_to":"9a80dd14_8d1c0168","updated":"2015-03-20 12:12:31.000000000","message":"I think, that you already know the answer: I sorted it during check.","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"b1fccd08e9f722dd0aa61274e36fa016d00206d5","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        [result.append(self.stack._get_dep_attrs(resources, outputs, res.name))"},{"line_number":174,"context_line":"         for res in resources]"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        for r_atts, ex_attrs in zip(sorted(result), sorted(self.expected)):"},{"line_number":177,"context_line":"            self.assertEqual(sorted(ex_attrs), sorted(r_atts))"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_e2082c2f","line":176,"updated":"2015-03-19 14:40:55.000000000","message":"Uh, this is kind of a bizarre way to match up the results and expected values, sorted by length of the list? I would have thought that we\u0027d define the expected results as a dict, e.g. for tmpl5:\n\n  expected \u003d {\u0027AResource\u0027: {\u0027attr_A1\u0027, \u0027attr_A2\u0027, \u0027meta_A1\u0027, \u0027attr_A3\u0027, \u0027attr_A4\u0027},\n              \u0027BResource\u0027: {\u0027attr_B1\u0027, \u0027attr_B2\u0027, \u0027meta_B2\u0027, \u0027attr_B3\u0027},\n              \u0027CResource\u0027: {}}\n\nand then:\n\n  for res in resources:\n      self.assertEqual(expected[res.name],\n                       self.stack._get_dep_attrs(resources, outputs, res.name))","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"b12d08fd6c0e3b9e80bc763734a4fba8cb58dac7","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        [result.append(self.stack._get_dep_attrs(resources, outputs, res.name))"},{"line_number":174,"context_line":"         for res in resources]"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        for r_atts, ex_attrs in zip(sorted(result), sorted(self.expected)):"},{"line_number":177,"context_line":"            self.assertEqual(sorted(ex_attrs), sorted(r_atts))"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_9cdc0ce6","line":176,"in_reply_to":"9a80dd14_e2082c2f","updated":"2015-03-20 12:12:31.000000000","message":"Ok, it make sense for me","commit_id":"b6ca86670a276eb7ace68e1e50a3e44486e1697e"}]}
