)]}'
{"nova/api/openstack/urlmap.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":22,"context_line":"if six.PY3:"},{"line_number":23,"context_line":"    from urllib import request as urllib2"},{"line_number":24,"context_line":"else:"},{"line_number":25,"context_line":"    import urllib2"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from nova.api.openstack import wsgi"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_e47b467a","line":25,"updated":"2015-06-12 11:05:39.000000000","message":"Please run sixer.py urllib on this file to use six.moves.urllib instead.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":22,"context_line":"if six.PY3:"},{"line_number":23,"context_line":"    from urllib import request as urllib2"},{"line_number":24,"context_line":"else:"},{"line_number":25,"context_line":"    import urllib2"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from nova.api.openstack import wsgi"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_e6c004e3","line":25,"in_reply_to":"1af86dd1_e47b467a","updated":"2015-06-22 03:20:38.000000000","message":"Won\u0027t work with parse_http_list. please try it :)","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"3e8cf0f6843f2616f2cc3fff9e85803b7c79909a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"if six.PY3:"},{"line_number":23,"context_line":"    from urllib import request as urllib2"},{"line_number":24,"context_line":"else:"},{"line_number":25,"context_line":"    import urllib2"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from nova.api.openstack import wsgi"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_b55d2f17","line":25,"in_reply_to":"fa32b979_e6c004e3","updated":"2015-06-22 14:45:29.000000000","message":"Oh. For the specific case of parse_http_list, I used the following (ugly) code in Cinder:\n\ntry:\n    from urllib.request import parse_http_list   # pylint: disable\u003dE0611\nexcept ImportError:\n    from urllib2 import parse_http_list   # Python 2\n\nYou may modify your patch to import only parse_http_list, it would avoid confusion, it\u0027s up to up.\n\nurllib2 is only used to get the parse_http_list symbol in this case, so your patch looks good to me.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"af67638812e1a2f59f151ac8a55ff685c3343e7d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"if six.PY3:"},{"line_number":23,"context_line":"    from urllib import request as urllib2"},{"line_number":24,"context_line":"else:"},{"line_number":25,"context_line":"    import urllib2"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from nova.api.openstack import wsgi"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"fa32b979_1bb84c10","line":25,"updated":"2015-06-24 20:19:31.000000000","message":"The above can just be:\n\n from six.moves.urllib import request as urllib2","commit_id":"87b9249e14eb19b5675896406e3535f70935774c"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"ab1eac1f6ed94e9cd1d78fea5a031a03a1a3a61c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"if six.PY3:"},{"line_number":23,"context_line":"    from urllib import request as urllib2"},{"line_number":24,"context_line":"else:"},{"line_number":25,"context_line":"    import urllib2"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from nova.api.openstack import wsgi"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"fa32b979_fbe328a2","line":25,"in_reply_to":"fa32b979_1bb84c10","updated":"2015-06-24 20:25:30.000000000","message":"Jay,\nunfortunately does not work for parse_http_list which is needed below:\nhttp://paste.openstack.org/show/320426/","commit_id":"87b9249e14eb19b5675896406e3535f70935774c"}],"nova/availability_zones.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        for host in aggregate.hosts:"},{"line_number":73,"context_line":"            if hosts and host not in hosts:"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":"            metadata[host].add(six.next(six.itervalues(aggregate.metadata)))"},{"line_number":76,"context_line":"    return metadata"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_24d03e53","line":75,"updated":"2015-06-12 11:05:39.000000000","message":"Does it work on Python 3?\n\n\u003e\u003e\u003e next({1:2}.values())\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nTypeError: \u0027dict_values\u0027 object is not an iterator\n\nI suggest to use instead:\n\nlist(dict.values())[0]","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        for host in aggregate.hosts:"},{"line_number":73,"context_line":"            if hosts and host not in hosts:"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":"            metadata[host].add(six.next(six.itervalues(aggregate.metadata)))"},{"line_number":76,"context_line":"    return metadata"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_e667a423","line":75,"in_reply_to":"1af86dd1_24d03e53","updated":"2015-06-22 03:20:38.000000000","message":"Done","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"65a279b27e1fd284b7156512ff945016f622d686","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import collections"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"import six"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from nova import objects"},{"line_number":24,"context_line":"from nova.openstack.common import memorycache"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa32b979_536ad11b","line":21,"updated":"2015-06-22 06:09:40.000000000","message":"this does not seem to be used","commit_id":"536390fe1da9ddfa151c116070c90c5848995044"}],"nova/compute/flavors.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    # NUMA-related ones that we need to avoid an uglier alternative. This"},{"line_number":353,"context_line":"    # should be replaced by a general split-out of flavor information from"},{"line_number":354,"context_line":"    # system_metadata very soon."},{"line_number":355,"context_line":"    for key in list(metadata.keys()):"},{"line_number":356,"context_line":"        for prefix in prefixes:"},{"line_number":357,"context_line":"            if key.startswith(\u0027%sinstance_type_extra_\u0027 % prefix):"},{"line_number":358,"context_line":"                del metadata[key]"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_64be3601","line":355,"updated":"2015-06-12 11:05:39.000000000","message":"You may add a comment explaining that you need the copy the list of keys because metadata is modified in the loop body?\n\nIs metadata a dictionary? Maybe you can omit the call to the .keys() method:\n\nfor key in list(metadata): ...","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    # NUMA-related ones that we need to avoid an uglier alternative. This"},{"line_number":353,"context_line":"    # should be replaced by a general split-out of flavor information from"},{"line_number":354,"context_line":"    # system_metadata very soon."},{"line_number":355,"context_line":"    for key in list(metadata.keys()):"},{"line_number":356,"context_line":"        for prefix in prefixes:"},{"line_number":357,"context_line":"            if key.startswith(\u0027%sinstance_type_extra_\u0027 % prefix):"},{"line_number":358,"context_line":"                del metadata[key]"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_6674f4ce","line":355,"in_reply_to":"1af86dd1_64be3601","updated":"2015-06-22 03:20:38.000000000","message":"Victor, want to leave the code as much as possible the same. so prefer to leave it this way.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"4c8051d4c4b9a289f006bc836e32e8ebc9a00c18","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    # NUMA-related ones that we need to avoid an uglier alternative. This"},{"line_number":353,"context_line":"    # should be replaced by a general split-out of flavor information from"},{"line_number":354,"context_line":"    # system_metadata very soon."},{"line_number":355,"context_line":"    for key in list(metadata.keys()):"},{"line_number":356,"context_line":"        for prefix in prefixes:"},{"line_number":357,"context_line":"            if key.startswith(\u0027%sinstance_type_extra_\u0027 % prefix):"},{"line_number":358,"context_line":"                del metadata[key]"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_84b9df30","line":355,"updated":"2015-06-22 13:02:20.000000000","message":"should we not use six.iterkeys here?","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"2c3d6e72031de824ef36e1feaf74e051fe975433","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    # NUMA-related ones that we need to avoid an uglier alternative. This"},{"line_number":353,"context_line":"    # should be replaced by a general split-out of flavor information from"},{"line_number":354,"context_line":"    # system_metadata very soon."},{"line_number":355,"context_line":"    for key in list(metadata.keys()):"},{"line_number":356,"context_line":"        for prefix in prefixes:"},{"line_number":357,"context_line":"            if key.startswith(\u0027%sinstance_type_extra_\u0027 % prefix):"},{"line_number":358,"context_line":"                del metadata[key]"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_d5c47393","line":355,"in_reply_to":"fa32b979_84b9df30","updated":"2015-06-22 14:18:38.000000000","message":"\u003e should we not use six.iterkeys here?\n\nI suggested to add a comment to avoid such question in the future :-) My comment on patch set 20:\n\n\"You may add a comment explaining that you need the copy the list of keys because metadata is modified in the loop body?\"","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"2e2dd74699c282c24bcc6d184defa0ed3f9f2317","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    # NUMA-related ones that we need to avoid an uglier alternative. This"},{"line_number":353,"context_line":"    # should be replaced by a general split-out of flavor information from"},{"line_number":354,"context_line":"    # system_metadata very soon."},{"line_number":355,"context_line":"    for key in list(metadata.keys()):"},{"line_number":356,"context_line":"        for prefix in prefixes:"},{"line_number":357,"context_line":"            if key.startswith(\u0027%sinstance_type_extra_\u0027 % prefix):"},{"line_number":358,"context_line":"                del metadata[key]"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_64bdbbd6","line":355,"in_reply_to":"fa32b979_84b9df30","updated":"2015-06-22 13:07:47.000000000","message":"we need to make a copy to prevent py34 failing as we delete stuff below","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"538bdc9582e1f520406ccb2d0a3e99dc8d5fd26a","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    # NUMA-related ones that we need to avoid an uglier alternative. This"},{"line_number":353,"context_line":"    # should be replaced by a general split-out of flavor information from"},{"line_number":354,"context_line":"    # system_metadata very soon."},{"line_number":355,"context_line":"    for key in list(metadata.keys()):"},{"line_number":356,"context_line":"        for prefix in prefixes:"},{"line_number":357,"context_line":"            if key.startswith(\u0027%sinstance_type_extra_\u0027 % prefix):"},{"line_number":358,"context_line":"                del metadata[key]"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_fdc5925b","line":355,"in_reply_to":"fa32b979_d5c47393","updated":"2015-06-23 22:20:21.000000000","message":"This is why we are enabling the tests so folks who want to try will be stopped right in their tracks :)","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self.conditions \u003d conditions"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def apply(self, model, query):"},{"line_number":396,"context_line":"        for key, condition in six.iteritems(self.conditions):"},{"line_number":397,"context_line":"            for clause in condition.clauses(getattr(model, key)):"},{"line_number":398,"context_line":"                query \u003d query.filter(clause)"},{"line_number":399,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_8f3eebb6","line":396,"updated":"2015-06-12 11:05:39.000000000","message":"I\u0027m in favor of using six.iteritems() but most developers are in favor of replacing .iteritems() with .items() (don\u0027t use six).\n\nRead the \"[openstack-dev] [all][python3] use of six.iteritems()\" thread on the openstack-dev mailing list.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self.conditions \u003d conditions"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def apply(self, model, query):"},{"line_number":396,"context_line":"        for key, condition in six.iteritems(self.conditions):"},{"line_number":397,"context_line":"            for clause in condition.clauses(getattr(model, key)):"},{"line_number":398,"context_line":"                query \u003d query.filter(clause)"},{"line_number":399,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_462530c0","line":396,"in_reply_to":"1af86dd1_8f3eebb6","updated":"2015-06-22 03:20:38.000000000","message":"Done","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"cc4ff74ed1ad60f60a1a66fc5bb8e3cfc2033814","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self.conditions \u003d conditions"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def apply(self, model, query):"},{"line_number":396,"context_line":"        for key, condition in six.iteritems(self.conditions):"},{"line_number":397,"context_line":"            for clause in condition.clauses(getattr(model, key)):"},{"line_number":398,"context_line":"                query \u003d query.filter(clause)"},{"line_number":399,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_bd7203e2","line":396,"in_reply_to":"fa32b979_462530c0","updated":"2015-06-22 10:32:11.000000000","message":"See patch 21 CI Jobs. They all break. So this is not a straightforward replacement of items() instead of iteritems(). Switching back to working code.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"3e8cf0f6843f2616f2cc3fff9e85803b7c79909a","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self.conditions \u003d conditions"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def apply(self, model, query):"},{"line_number":396,"context_line":"        for key, condition in six.iteritems(self.conditions):"},{"line_number":397,"context_line":"            for clause in condition.clauses(getattr(model, key)):"},{"line_number":398,"context_line":"                query \u003d query.filter(clause)"},{"line_number":399,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_f5f417d0","line":396,"in_reply_to":"fa32b979_bd7203e2","updated":"2015-06-22 14:45:29.000000000","message":"Oh, there is still the problem of SQLAlchemy (oslo.db?) objects which only have an iteritems() method, but no items() method :-/","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"af67638812e1a2f59f151ac8a55ff685c3343e7d","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self.conditions \u003d conditions"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def apply(self, model, query):"},{"line_number":396,"context_line":"        for key, condition in six.iteritems(self.conditions):"},{"line_number":397,"context_line":"            for clause in condition.clauses(getattr(model, key)):"},{"line_number":398,"context_line":"                query \u003d query.filter(clause)"},{"line_number":399,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":27,"id":"fa32b979_5b701472","line":396,"updated":"2015-06-24 20:19:31.000000000","message":"For all the six.iteritems() changes, how about just changing from iteritems() to just items()?","commit_id":"87b9249e14eb19b5675896406e3535f70935774c"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"ab1eac1f6ed94e9cd1d78fea5a031a03a1a3a61c","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self.conditions \u003d conditions"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def apply(self, model, query):"},{"line_number":396,"context_line":"        for key, condition in six.iteritems(self.conditions):"},{"line_number":397,"context_line":"            for clause in condition.clauses(getattr(model, key)):"},{"line_number":398,"context_line":"                query \u003d query.filter(clause)"},{"line_number":399,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":27,"id":"fa32b979_7b9dd808","line":396,"in_reply_to":"fa32b979_5b701472","updated":"2015-06-24 20:25:30.000000000","message":"We have been debating this, needs an oslo.db change that haypo has already filed. We\u0027ll fix this file again once the oslo.db is released and g-r is updated (See https://review.openstack.org/#/c/195099/)","commit_id":"87b9249e14eb19b5675896406e3535f70935774c"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"f8cfdd07f5702dcaa88387de2a92d8ec2859fcd7","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        self.conditions \u003d conditions"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def apply(self, model, query):"},{"line_number":396,"context_line":"        for key, condition in six.iteritems(self.conditions):"},{"line_number":397,"context_line":"            for clause in condition.clauses(getattr(model, key)):"},{"line_number":398,"context_line":"                query \u003d query.filter(clause)"},{"line_number":399,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":27,"id":"fa32b979_ac41d3aa","line":396,"in_reply_to":"fa32b979_7b9dd808","updated":"2015-06-25 09:36:24.000000000","message":"\u003e We have been debating this, needs an oslo.db change that haypo has already filed.\n\nAre you sure? I wrote a separated patch focus on sqlalchemy, to try to fix nova.tests.unit.db.test_db_api. For this specific line, I replaced conditions.iteritems() with conditions.items():\n\nhttps://review.openstack.org/#/c/194587/2,publish\n\nThe first version of my patch was written for the development version of oslo.db which now has an items() method. But after that, I reworked my patch to work with the development version of oslo.db.\n\nThe ugly part of my patch is the \"isinstance(obj, dict)\" check in ModelsObjectComparatorMixin._dict_from_object() to decide if we should call obj.items() or obj.iteritems() :-/ This check will go away with the new oslo.db supporting the items() method as well.","commit_id":"87b9249e14eb19b5675896406e3535f70935774c"}],"nova/db/sqlalchemy/migrate_repo/versions/216_havana.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def _create_shadow_tables(migrate_engine):"},{"line_number":52,"context_line":"    meta \u003d MetaData(migrate_engine)"},{"line_number":53,"context_line":"    meta.reflect(migrate_engine)"},{"line_number":54,"context_line":"    table_names \u003d list(meta.tables.keys())"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_0f79db93","line":54,"updated":"2015-06-12 11:05:39.000000000","message":"Maybe list(meta.tables) works directly without .keys().","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def _create_shadow_tables(migrate_engine):"},{"line_number":52,"context_line":"    meta \u003d MetaData(migrate_engine)"},{"line_number":53,"context_line":"    meta.reflect(migrate_engine)"},{"line_number":54,"context_line":"    table_names \u003d list(meta.tables.keys())"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_e61c8479","line":54,"in_reply_to":"1af86dd1_0f79db93","updated":"2015-06-22 03:20:38.000000000","message":"want to keep the code as close to what\u0027s was there before.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"4c8051d4c4b9a289f006bc836e32e8ebc9a00c18","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def _create_shadow_tables(migrate_engine):"},{"line_number":52,"context_line":"    meta \u003d MetaData(migrate_engine)"},{"line_number":53,"context_line":"    meta.reflect(migrate_engine)"},{"line_number":54,"context_line":"    table_names \u003d list(meta.tables.keys())"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_4482f753","line":54,"updated":"2015-06-22 13:02:20.000000000","message":"ditto","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"2e2dd74699c282c24bcc6d184defa0ed3f9f2317","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def _create_shadow_tables(migrate_engine):"},{"line_number":52,"context_line":"    meta \u003d MetaData(migrate_engine)"},{"line_number":53,"context_line":"    meta.reflect(migrate_engine)"},{"line_number":54,"context_line":"    table_names \u003d list(meta.tables.keys())"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_64d61b29","line":54,"in_reply_to":"fa32b979_4482f753","updated":"2015-06-22 13:07:47.000000000","message":"i\u0027d like to change the code as little as possible. making a copy prevents a failure in py34.","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"2c3d6e72031de824ef36e1feaf74e051fe975433","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def _create_shadow_tables(migrate_engine):"},{"line_number":52,"context_line":"    meta \u003d MetaData(migrate_engine)"},{"line_number":53,"context_line":"    meta.reflect(migrate_engine)"},{"line_number":54,"context_line":"    table_names \u003d list(meta.tables.keys())"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_d57c7322","line":54,"in_reply_to":"fa32b979_64d61b29","updated":"2015-06-22 14:18:38.000000000","message":"You may explain in a comment that you need to copy the list of table names because meta.tables is modified in the loop body (probably indirectly by the Table constructor).","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"}],"nova/db/sqlalchemy/models.py":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"38ea6dc6a27465f53a69058e11b483925e8bb7f6","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        except TypeError:"},{"line_number":217,"context_line":"            # Support templates like \"uuid-%(uuid)s\", etc."},{"line_number":218,"context_line":"            info \u003d {}"},{"line_number":219,"context_line":"            # NOTE(russellb): Don\u0027t use six.iteritems(self) here, as it will"},{"line_number":220,"context_line":"            # result in infinite recursion on the name property."},{"line_number":221,"context_line":"            for column in iter(orm.object_mapper(self).columns):"},{"line_number":222,"context_line":"                key \u003d column.name"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afb71cf_75da677a","line":219,"updated":"2015-06-05 03:13:28.000000000","message":"did sixer pick this the comment?","commit_id":"ead289a9a749f6219b915c49d3c7ecd8cabaa79d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"5fc3439c92c6db7769397f8ad3b6371842184b39","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        except TypeError:"},{"line_number":217,"context_line":"            # Support templates like \"uuid-%(uuid)s\", etc."},{"line_number":218,"context_line":"            info \u003d {}"},{"line_number":219,"context_line":"            # NOTE(russellb): Don\u0027t use six.iteritems(self) here, as it will"},{"line_number":220,"context_line":"            # result in infinite recursion on the name property."},{"line_number":221,"context_line":"            for column in iter(orm.object_mapper(self).columns):"},{"line_number":222,"context_line":"                key \u003d column.name"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afb71cf_5de9ca19","line":219,"in_reply_to":"3afb71cf_75da677a","updated":"2015-06-05 10:31:23.000000000","message":"Done","commit_id":"ead289a9a749f6219b915c49d3c7ecd8cabaa79d"}],"nova/db/sqlalchemy/utils.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"4c8051d4c4b9a289f006bc836e32e8ebc9a00c18","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    columns \u003d {c.name: c for c in table.columns}"},{"line_number":64,"context_line":"    shadow_columns \u003d {c.name: c for c in shadow_table.columns}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    for name, column in columns.items():"},{"line_number":67,"context_line":"        if name not in shadow_columns:"},{"line_number":68,"context_line":"            raise exception.NovaException("},{"line_number":69,"context_line":"                _(\"Missing column %(table)s.%(column)s in shadow table\")"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_047cef70","line":66,"updated":"2015-06-22 13:02:20.000000000","message":"why not six.iteritems?","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"2e2dd74699c282c24bcc6d184defa0ed3f9f2317","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    columns \u003d {c.name: c for c in table.columns}"},{"line_number":64,"context_line":"    shadow_columns \u003d {c.name: c for c in shadow_table.columns}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    for name, column in columns.items():"},{"line_number":67,"context_line":"        if name not in shadow_columns:"},{"line_number":68,"context_line":"            raise exception.NovaException("},{"line_number":69,"context_line":"                _(\"Missing column %(table)s.%(column)s in shadow table\")"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_245b33f8","line":66,"in_reply_to":"fa32b979_047cef70","updated":"2015-06-22 13:07:47.000000000","message":"Please see the looooong discussion on six.iteritems() vs items() on the mailing list","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"af67638812e1a2f59f151ac8a55ff685c3343e7d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    columns \u003d {c.name: c for c in table.columns}"},{"line_number":64,"context_line":"    shadow_columns \u003d {c.name: c for c in shadow_table.columns}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    for name, column in columns.items():"},{"line_number":67,"context_line":"        if name not in shadow_columns:"},{"line_number":68,"context_line":"            raise exception.NovaException("},{"line_number":69,"context_line":"                _(\"Missing column %(table)s.%(column)s in shadow table\")"}],"source_content_type":"text/x-python","patch_set":27,"id":"fa32b979_dbbbc4c2","line":66,"updated":"2015-06-24 20:19:31.000000000","message":"yay! :)","commit_id":"87b9249e14eb19b5675896406e3535f70935774c"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"ab1eac1f6ed94e9cd1d78fea5a031a03a1a3a61c","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    columns \u003d {c.name: c for c in table.columns}"},{"line_number":64,"context_line":"    shadow_columns \u003d {c.name: c for c in shadow_table.columns}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    for name, column in columns.items():"},{"line_number":67,"context_line":"        if name not in shadow_columns:"},{"line_number":68,"context_line":"            raise exception.NovaException("},{"line_number":69,"context_line":"                _(\"Missing column %(table)s.%(column)s in shadow table\")"}],"source_content_type":"text/x-python","patch_set":27,"id":"fa32b979_3b8c30d9","line":66,"in_reply_to":"fa32b979_dbbbc4c2","updated":"2015-06-24 20:25:30.000000000","message":":)","commit_id":"87b9249e14eb19b5675896406e3535f70935774c"}],"nova/objects/base.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    @property"},{"line_number":623,"context_line":"    def obj_fields(self):"},{"line_number":624,"context_line":"        return list(self.fields.keys()) + self.obj_extra_fields"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    # NOTE(danms): This is nova-specific, so don\u0027t copy this to o.vo"},{"line_number":627,"context_line":"    @contextlib.contextmanager"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_046302b3","line":624,"updated":"2015-06-12 11:05:39.000000000","message":"If self.fields is a dictionary, you can simply write:\n\nlist(self.fields)","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    @property"},{"line_number":623,"context_line":"    def obj_fields(self):"},{"line_number":624,"context_line":"        return list(self.fields.keys()) + self.obj_extra_fields"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    # NOTE(danms): This is nova-specific, so don\u0027t copy this to o.vo"},{"line_number":627,"context_line":"    @contextlib.contextmanager"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_66095431","line":624,"in_reply_to":"1af86dd1_046302b3","updated":"2015-06-22 03:20:38.000000000","message":"want to leave the code as close to what was there before","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"}],"nova/objects/instance.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                    if field in expected_attrs]"},{"line_number":84,"context_line":"    if complex_cols:"},{"line_number":85,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":86,"context_line":"    simple_cols \u003d list(filter(lambda x: x not in _INSTANCE_EXTRA_FIELDS,"},{"line_number":87,"context_line":"                         simple_cols))"},{"line_number":88,"context_line":"    if (any([flavor in expected_attrs"},{"line_number":89,"context_line":"             for flavor in [\u0027flavor\u0027, \u0027old_flavor\u0027, \u0027new_flavor\u0027]]) and"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_c413aa0c","line":86,"updated":"2015-06-12 11:05:39.000000000","message":"I prefer to use a list comprehension:\n\n[col for col in simple_cols if col not in _INSTANCE_EXTRA_FIELDS]\n\nIMO it\u0027s more readable and it avoids to copy the list on Python 2.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                    if field in expected_attrs]"},{"line_number":84,"context_line":"    if complex_cols:"},{"line_number":85,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":86,"context_line":"    simple_cols \u003d list(filter(lambda x: x not in _INSTANCE_EXTRA_FIELDS,"},{"line_number":87,"context_line":"                         simple_cols))"},{"line_number":88,"context_line":"    if (any([flavor in expected_attrs"},{"line_number":89,"context_line":"             for flavor in [\u0027flavor\u0027, \u0027old_flavor\u0027, \u0027new_flavor\u0027]]) and"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_06064820","line":86,"in_reply_to":"1af86dd1_c413aa0c","updated":"2015-06-22 03:20:38.000000000","message":"if we want to do this, we should do it in another review","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"2c3d6e72031de824ef36e1feaf74e051fe975433","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        # ask for it any time flavors are requested."},{"line_number":94,"context_line":"        simple_cols.append(\u0027system_metadata\u0027)"},{"line_number":95,"context_line":"        expected_attrs.append(\u0027system_metadata\u0027)"},{"line_number":96,"context_line":"    return list(simple_cols) + complex_cols"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def compat_instance(instance):"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_952fcba0","line":96,"updated":"2015-06-22 14:18:38.000000000","message":"I don\u0027t understand why you need to copy the simple_cols list here.","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"538bdc9582e1f520406ccb2d0a3e99dc8d5fd26a","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        # ask for it any time flavors are requested."},{"line_number":94,"context_line":"        simple_cols.append(\u0027system_metadata\u0027)"},{"line_number":95,"context_line":"        expected_attrs.append(\u0027system_metadata\u0027)"},{"line_number":96,"context_line":"    return list(simple_cols) + complex_cols"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def compat_instance(instance):"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_80573959","line":96,"in_reply_to":"fa32b979_952fcba0","updated":"2015-06-23 22:20:21.000000000","message":"ack. i think i added this first and then added the list above later. removing this extra list","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"}],"nova/test.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        with contextlib.ExitStack() as stack:"},{"line_number":76,"context_line":"            yield [stack.enter_context(c) for c in contexts]"},{"line_number":77,"context_line":"else:"},{"line_number":78,"context_line":"    nested \u003d contextlib.nested"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"class SampleNetworks(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_c42a8a2c","line":78,"updated":"2015-06-12 11:05:39.000000000","message":"ExitStack is available in contextlib2 which is in global requirements. I used contextlib2 in Ceilometer to use ExitStack on Python 2 and Python 3.\n\nCeilometer:\n\nhttps://github.com/openstack/ceilometer/blob/639a24dc95e57149f21480b4a057d757e837fdbf/ceilometer/tests/compute/virt/libvirt/test_inspector.py#L19\n\nand\n\nhttps://github.com/openstack/ceilometer/blob/639a24dc95e57149f21480b4a057d757e837fdbf/ceilometer/tests/compute/virt/libvirt/test_inspector.py#L54\n\nNote: You added contextlib2 dependency but you don\u0027t use it?","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        with contextlib.ExitStack() as stack:"},{"line_number":76,"context_line":"            yield [stack.enter_context(c) for c in contexts]"},{"line_number":77,"context_line":"else:"},{"line_number":78,"context_line":"    nested \u003d contextlib.nested"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"class SampleNetworks(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_26034c11","line":78,"in_reply_to":"1af86dd1_c42a8a2c","updated":"2015-06-22 03:20:38.000000000","message":"Does not work the same if you use contextlib2 you will see test failures","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":300,"context_line":"                if six.PY3 and isinstance(item, dict):"},{"line_number":301,"context_line":"                    return str(sort(list(six.iterkeys(item)) +"},{"line_number":302,"context_line":"                                         list(six.itervalues(item))))"},{"line_number":303,"context_line":"                return str(item) if six.PY3 else item"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"            return sorted(what, key\u003dget_key)"},{"line_number":306,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_84e4920d","line":303,"updated":"2015-06-12 11:05:39.000000000","message":"Since it\u0027s a test, performances don\u0027t matter. You can also sort keys on Python 2, it would allow to run tests using python2 -R (enable hash randomization).\n\nWhat is the \"sort\" function here? I\u0027m not sure that the exact format matters here, so you may try: str(sorted(item.items())) for dictionaries.\n\nDoes it work if you simplify the code like this?\n\ndef get_key(item):\n   if isinstance(item, dict):\n      return str(sorted(item.items()))\n   else:\n      return str(item)","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":312,"context_line":"                self.assertEqual(expected_keys, observed_keys)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"                for key in list(six.iterkeys(expected)):"},{"line_number":315,"context_line":"                    inner(expected[key], observed[key])"},{"line_number":316,"context_line":"            elif (isinstance(expected, (list, tuple, set)) and"},{"line_number":317,"context_line":"                      isinstance(observed, (list, tuple, set))):"},{"line_number":318,"context_line":"                self.assertEqual(len(expected), len(observed))"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_644996d0","line":315,"updated":"2015-06-12 11:05:39.000000000","message":"I\u0027m not sure that this change is correct. The old code iterates on observed values using observed_keys, the new code uses the expected key to get the observed value.\n\nMaybe zip can be used here to make the code simpler?\n\nexpected_items \u003d sorted(expected.items())\nobserved_items \u003d sorted(observed.items())\nfor expected_item, observed_item  in zip(expected_items, observed_items):\n   inner(expected_item[1], observed_item[1])\n\nI guess that values are comparable.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"885bea70294aadc523c2167056232d2135d7363f","unresolved":false,"context_lines":[{"line_number":309,"context_line":"            if isinstance(expected, dict) and isinstance(observed, dict):"},{"line_number":310,"context_line":"                self.assertEqual(len(expected), len(observed))"},{"line_number":311,"context_line":"                expected_keys \u003d sorted(expected)"},{"line_number":312,"context_line":"                observed_keys \u003d sorted(observed)"},{"line_number":313,"context_line":"                self.assertEqual(expected_keys, observed_keys)"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"                for key in list(six.iterkeys(expected)):"}],"source_content_type":"text/x-python","patch_set":33,"id":"ba3cc151_67d9a821","line":312,"updated":"2015-07-09 13:37:18.000000000","message":"Ugh - good catch on an ugly bug.","commit_id":"9f698dc29639e60254de00ff4e2aa5168b6abb8a"}],"nova/tests/unit/objects/test_block_device.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            self.flags(enable\u003dFalse, group\u003d\u0027cells\u0027)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        fake_bdm \u003d self.fake_bdm()"},{"line_number":54,"context_line":"        with test.nested("},{"line_number":55,"context_line":"            mock.patch.object("},{"line_number":56,"context_line":"                db, \u0027block_device_mapping_update\u0027, return_value\u003dfake_bdm),"},{"line_number":57,"context_line":"            mock.patch.object("}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_cf806349","line":54,"updated":"2015-06-12 11:05:39.000000000","message":"You may use ExitStack directly here.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            self.flags(enable\u003dFalse, group\u003d\u0027cells\u0027)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        fake_bdm \u003d self.fake_bdm()"},{"line_number":54,"context_line":"        with test.nested("},{"line_number":55,"context_line":"            mock.patch.object("},{"line_number":56,"context_line":"                db, \u0027block_device_mapping_update\u0027, return_value\u003dfake_bdm),"},{"line_number":57,"context_line":"            mock.patch.object("}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_e1030e0c","line":54,"in_reply_to":"1af86dd1_cf806349","updated":"2015-06-22 03:20:38.000000000","message":"no it wont work in all the tests, so i am standardizing on test.nested.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"}],"nova/tests/unit/objects/test_instance.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        exp_cols.remove(\u0027pci_requests\u0027)"},{"line_number":132,"context_line":"        exp_cols.remove(\u0027vcpu_model\u0027)"},{"line_number":133,"context_line":"        exp_cols.remove(\u0027ec2_ids\u0027)"},{"line_number":134,"context_line":"        exp_cols \u003d list(filter(lambda x: \u0027flavor\u0027 not in x, exp_cols))"},{"line_number":135,"context_line":"        exp_cols.extend([\u0027extra\u0027, \u0027extra.numa_topology\u0027, \u0027extra.pci_requests\u0027,"},{"line_number":136,"context_line":"                         \u0027extra.flavor\u0027, \u0027extra.vcpu_model\u0027])"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_84237205","line":134,"updated":"2015-06-12 11:05:39.000000000","message":"Ditto. You may use a list comprehension instead.\n\n[col for col in exp_cols if \u0027flavor\u0027 not in col]","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        exp_cols.remove(\u0027pci_requests\u0027)"},{"line_number":132,"context_line":"        exp_cols.remove(\u0027vcpu_model\u0027)"},{"line_number":133,"context_line":"        exp_cols.remove(\u0027ec2_ids\u0027)"},{"line_number":134,"context_line":"        exp_cols \u003d list(filter(lambda x: \u0027flavor\u0027 not in x, exp_cols))"},{"line_number":135,"context_line":"        exp_cols.extend([\u0027extra\u0027, \u0027extra.numa_topology\u0027, \u0027extra.pci_requests\u0027,"},{"line_number":136,"context_line":"                         \u0027extra.flavor\u0027, \u0027extra.vcpu_model\u0027])"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_a10d0639","line":134,"in_reply_to":"1af86dd1_84237205","updated":"2015-06-22 03:20:38.000000000","message":"want to keep the code close to what was there before","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":989,"context_line":"        expected \u003d {}"},{"line_number":990,"context_line":"        for key in unicode_attributes:"},{"line_number":991,"context_line":"            inst[key] \u003d u\u0027\\u2603\u0027"},{"line_number":992,"context_line":"            expected[key] \u003d \u0027?\u0027.encode()"},{"line_number":993,"context_line":"        primitive \u003d inst.obj_to_primitive(target_version\u003d\u00271.6\u0027)"},{"line_number":994,"context_line":"        self.assertJsonEqual(expected, primitive[\u0027nova_object.data\u0027])"},{"line_number":995,"context_line":"        self.assertEqual(\u00271.6\u0027, primitive[\u0027nova_object.version\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_24795efd","line":992,"updated":"2015-06-12 11:05:39.000000000","message":"You can write directly b\u0027?\u0027. str.encode() doesn\u0027t meen anything on Python 2 (but yeah, it works...).","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":1613,"context_line":"        inst_list._context \u003d self.context"},{"line_number":1614,"context_line":"        inst_list.objects \u003d insts"},{"line_number":1615,"context_line":"        faulty \u003d inst_list.fill_faults()"},{"line_number":1616,"context_line":"        self.assertEqual(list(faulty), [\u0027uuid1\u0027])"},{"line_number":1617,"context_line":"        self.assertEqual(inst_list[0].fault.message,"},{"line_number":1618,"context_line":"                         db_faults[\u0027uuid1\u0027][0][\u0027message\u0027])"},{"line_number":1619,"context_line":"        self.assertIsNone(inst_list[1].fault)"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_24603e35","line":1616,"updated":"2015-06-12 11:05:39.000000000","message":"You might call list() on the previous line, on faulty assigment.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"2c3d6e72031de824ef36e1feaf74e051fe975433","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"        expected \u003d {}"},{"line_number":1019,"context_line":"        for key in unicode_attributes:"},{"line_number":1020,"context_line":"            inst[key] \u003d u\u0027\\u2603\u0027"},{"line_number":1021,"context_line":"            expected[key] \u003d \u0027?\u0027.encode()"},{"line_number":1022,"context_line":"        primitive \u003d inst.obj_to_primitive(target_version\u003d\u00271.6\u0027)"},{"line_number":1023,"context_line":"        self.assertJsonEqual(expected, primitive[\u0027nova_object.data\u0027])"},{"line_number":1024,"context_line":"        self.assertEqual(\u00271.6\u0027, primitive[\u0027nova_object.version\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_5074f19a","line":1021,"updated":"2015-06-22 14:18:38.000000000","message":"You can write directly b\u0027?\u0027","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"538bdc9582e1f520406ccb2d0a3e99dc8d5fd26a","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"        expected \u003d {}"},{"line_number":1019,"context_line":"        for key in unicode_attributes:"},{"line_number":1020,"context_line":"            inst[key] \u003d u\u0027\\u2603\u0027"},{"line_number":1021,"context_line":"            expected[key] \u003d \u0027?\u0027.encode()"},{"line_number":1022,"context_line":"        primitive \u003d inst.obj_to_primitive(target_version\u003d\u00271.6\u0027)"},{"line_number":1023,"context_line":"        self.assertJsonEqual(expected, primitive[\u0027nova_object.data\u0027])"},{"line_number":1024,"context_line":"        self.assertEqual(\u00271.6\u0027, primitive[\u0027nova_object.version\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_e09ba516","line":1021,"in_reply_to":"fa32b979_5074f19a","updated":"2015-06-23 22:20:21.000000000","message":"right.","commit_id":"2f786fd35a9b0dd41d7394f97a6ddf9a96851d70"}],"nova/tests/unit/objects/test_instance_numa_topology.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"9ce46802ac89440a20b319aa9e32d48b5bed467c","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        topo \u003d objects.VirtCPUTopology(sockets\u003d1, cores\u003d1, threads\u003d4)"},{"line_number":124,"context_line":"        inst_cell \u003d objects.InstanceNUMACell("},{"line_number":125,"context_line":"                cpuset\u003dset([0, 1, 2, 3]), cpu_topology\u003dtopo)"},{"line_number":126,"context_line":"        self.assertEqual([set([0, 1, 2, 3])], list(inst_cell.siblings))"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def test_pin(self):"},{"line_number":129,"context_line":"        inst_cell \u003d objects.InstanceNUMACell(cpuset\u003dset([0, 1, 2, 3]),"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa32b979_6646b1c1","line":126,"updated":"2015-06-24 13:29:15.000000000","message":"so this is not going to work. Having this return an iterator, but tests converting it to a list actually introduces and masks a bug.\n\nA ton of places that use this expect a list.\n\nWe do things like if cell.siblings and this is always truthy.\n\nI understand that you guys just want tests to pass but that can\u0027t be done by introducing bugs and making tests pass :)","commit_id":"da0c5527fc5d1b7d1e23e6ddfd306591c944681b"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"ad41bfb3fc54c13f960a99ef8954d69df1f221db","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        topo \u003d objects.VirtCPUTopology(sockets\u003d1, cores\u003d1, threads\u003d4)"},{"line_number":124,"context_line":"        inst_cell \u003d objects.InstanceNUMACell("},{"line_number":125,"context_line":"                cpuset\u003dset([0, 1, 2, 3]), cpu_topology\u003dtopo)"},{"line_number":126,"context_line":"        self.assertEqual([set([0, 1, 2, 3])], list(inst_cell.siblings))"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def test_pin(self):"},{"line_number":129,"context_line":"        inst_cell \u003d objects.InstanceNUMACell(cpuset\u003dset([0, 1, 2, 3]),"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa32b979_1b45ac41","line":126,"in_reply_to":"fa32b979_6646b1c1","updated":"2015-06-24 20:00:05.000000000","message":"Done. Fixed in the right spot.","commit_id":"da0c5527fc5d1b7d1e23e6ddfd306591c944681b"}],"nova/tests/unit/objects/test_objects.py":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"38ea6dc6a27465f53a69058e11b483925e8bb7f6","unresolved":false,"context_lines":[{"line_number":1260,"context_line":"        return fingerprint"},{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"    @testtools.skipIf(six.PY3, \u0027version numbers differ in python 3.4\u0027)"},{"line_number":1263,"context_line":"    def test_versions(self):"},{"line_number":1264,"context_line":"        fingerprints \u003d {}"},{"line_number":1265,"context_line":"        for obj_name in base.NovaObject._obj_classes:"},{"line_number":1266,"context_line":"            fingerprints[obj_name] \u003d self._get_fingerprint(obj_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afb71cf_75c14780","line":1263,"updated":"2015-06-05 03:13:28.000000000","message":"I wonder what the implications of differing version numbers are here?","commit_id":"ead289a9a749f6219b915c49d3c7ecd8cabaa79d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"5fc3439c92c6db7769397f8ad3b6371842184b39","unresolved":false,"context_lines":[{"line_number":1260,"context_line":"        return fingerprint"},{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"    @testtools.skipIf(six.PY3, \u0027version numbers differ in python 3.4\u0027)"},{"line_number":1263,"context_line":"    def test_versions(self):"},{"line_number":1264,"context_line":"        fingerprints \u003d {}"},{"line_number":1265,"context_line":"        for obj_name in base.NovaObject._obj_classes:"},{"line_number":1266,"context_line":"            fingerprints[obj_name] \u003d self._get_fingerprint(obj_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afb71cf_3dd5ee42","line":1263,"in_reply_to":"3afb71cf_75c14780","updated":"2015-06-05 10:31:23.000000000","message":"once we switch over to oslo.versionedobjects to generate then it will stay consistent i think","commit_id":"ead289a9a749f6219b915c49d3c7ecd8cabaa79d"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"7c861617127d03c41764dd232118fd2855e1577d","unresolved":false,"context_lines":[{"line_number":1259,"context_line":"            six.binary_type(repr(relevant_data).encode())).hexdigest())"},{"line_number":1260,"context_line":"        return fingerprint"},{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"    @testtools.skipIf(six.PY3, \u0027version numbers differ in python 3.4\u0027)"},{"line_number":1263,"context_line":"    def test_versions(self):"},{"line_number":1264,"context_line":"        fingerprints \u003d {}"},{"line_number":1265,"context_line":"        for obj_name in base.NovaObject._obj_classes:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_e8760bd6","line":1262,"updated":"2015-06-09 09:07:31.000000000","message":"want to double check with Dan before this merges","commit_id":"7592962042277620e50dc02cca4e31a4700dfef3"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"95d32d51a8c0d046406157a96ba266db54b477ee","unresolved":false,"context_lines":[{"line_number":1259,"context_line":"            six.binary_type(repr(relevant_data).encode())).hexdigest())"},{"line_number":1260,"context_line":"        return fingerprint"},{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"    @testtools.skipIf(six.PY3, \u0027version numbers differ in python 3.4\u0027)"},{"line_number":1263,"context_line":"    def test_versions(self):"},{"line_number":1264,"context_line":"        fingerprints \u003d {}"},{"line_number":1265,"context_line":"        for obj_name in base.NovaObject._obj_classes:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_deb78238","line":1262,"in_reply_to":"3afb71cf_1bde4cdd","updated":"2015-06-09 10:35:55.000000000","message":"So if the problem here is that that we get different fingerprints on py2 and py3 I don\u0027t think we can call this module converted. I don\u0027t know enough about what is causing the failures (is it the difference in repr or ordering or something else)\n\nI\u0027m -1 on us calling this fixed just like that by skipping an important test","commit_id":"7592962042277620e50dc02cca4e31a4700dfef3"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"dc56babeb83c311369aeef1e4e050c75062194f9","unresolved":false,"context_lines":[{"line_number":1259,"context_line":"            six.binary_type(repr(relevant_data).encode())).hexdigest())"},{"line_number":1260,"context_line":"        return fingerprint"},{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"    @testtools.skipIf(six.PY3, \u0027version numbers differ in python 3.4\u0027)"},{"line_number":1263,"context_line":"    def test_versions(self):"},{"line_number":1264,"context_line":"        fingerprints \u003d {}"},{"line_number":1265,"context_line":"        for obj_name in base.NovaObject._obj_classes:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_1bde4cdd","line":1262,"in_reply_to":"3afb71cf_e8760bd6","updated":"2015-06-09 10:28:49.000000000","message":"Yep, I\u0027d like to have a bit more info as to why this fails","commit_id":"7592962042277620e50dc02cca4e31a4700dfef3"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":685,"context_line":"        myobj_fields \u003d ([\u0027foo\u0027, \u0027bar\u0027, \u0027missing\u0027,"},{"line_number":686,"context_line":"                         \u0027readonly\u0027, \u0027rel_object\u0027,"},{"line_number":687,"context_line":"                         \u0027rel_objects\u0027, \u0027mutable_default\u0027] +"},{"line_number":688,"context_line":"                        list(base_fields))"},{"line_number":689,"context_line":"        myobj3_fields \u003d [\u0027new_field\u0027]"},{"line_number":690,"context_line":"        self.assertTrue(issubclass(TestSubclassedObject, MyObj))"},{"line_number":691,"context_line":"        self.assertEqual(len(myobj_fields), len(MyObj.fields))"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_c45e0a76","line":688,"updated":"2015-06-12 11:05:39.000000000","message":"You might move list() on the previous line, on base_fields assignement.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":685,"context_line":"        myobj_fields \u003d ([\u0027foo\u0027, \u0027bar\u0027, \u0027missing\u0027,"},{"line_number":686,"context_line":"                         \u0027readonly\u0027, \u0027rel_object\u0027,"},{"line_number":687,"context_line":"                         \u0027rel_objects\u0027, \u0027mutable_default\u0027] +"},{"line_number":688,"context_line":"                        list(base_fields))"},{"line_number":689,"context_line":"        myobj3_fields \u003d [\u0027new_field\u0027]"},{"line_number":690,"context_line":"        self.assertTrue(issubclass(TestSubclassedObject, MyObj))"},{"line_number":691,"context_line":"        self.assertEqual(len(myobj_fields), len(MyObj.fields))"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_61105e4f","line":688,"in_reply_to":"1af86dd1_c45e0a76","updated":"2015-06-22 03:20:38.000000000","message":"don\u0027t want to do that, want to keep the code same as before.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":1207,"context_line":"        # NOTE(dims): In Python3, The concept of \u0027unbound methods\u0027 has"},{"line_number":1208,"context_line":"        # been removed from the language. When referencing a method"},{"line_number":1209,"context_line":"        # as a class attribute, you now get a plain function object."},{"line_number":1210,"context_line":"        # so let\u0027s check for both"},{"line_number":1211,"context_line":"        return inspect.isfunction(thing) or inspect.ismethod(thing)"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"    def _find_remotable_method(self, cls, thing, parent_was_remotable\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_4490daec","line":1210,"updated":"2015-06-12 11:05:39.000000000","message":"Maybe we only need to check if thing is callable using callable()?\n\nYou may only check isfunction() on Python 3:\n\nif inspect.ismethod(thing):\n   return True\nif six.PY3:\n   return inspect.isfunction(thing)\nelse:\n  return False","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":1207,"context_line":"        # NOTE(dims): In Python3, The concept of \u0027unbound methods\u0027 has"},{"line_number":1208,"context_line":"        # been removed from the language. When referencing a method"},{"line_number":1209,"context_line":"        # as a class attribute, you now get a plain function object."},{"line_number":1210,"context_line":"        # so let\u0027s check for both"},{"line_number":1211,"context_line":"        return inspect.isfunction(thing) or inspect.ismethod(thing)"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"    def _find_remotable_method(self, cls, thing, parent_was_remotable\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_413aface","line":1210,"in_reply_to":"1af86dd1_4490daec","updated":"2015-06-22 03:20:38.000000000","message":"i have to do the same as in oslo.versionedobjects\n\nhttps://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/fixture.py#L133\n\nSo going to keep the logic as is. Also tests fail.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"        else:"},{"line_number":1250,"context_line":"            relevant_data \u003d (fields, methods)"},{"line_number":1251,"context_line":"        fingerprint \u003d \u0027%s-%s\u0027 % (obj_class.VERSION, hashlib.md5("},{"line_number":1252,"context_line":"            six.binary_type(repr(relevant_data).encode())).hexdigest())"},{"line_number":1253,"context_line":"        return fingerprint"},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"    def test_find_remotable_method(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1af86dd1_64063622","line":1252,"updated":"2015-06-12 11:05:39.000000000","message":"On Python 2, calling the encode() of a byte string doesn\u0027t make sense (well it works, but ...). I propose:\n\nhash \u003d str(relevant_data)\nif six.PY3:\n    hash \u003d hash.encode(\u0027utf-8\u0027)\nhash \u003d hashlib.md5(hash).hexdigest()\n\nI used \"if six.PY3: ... encode utf-8 ...\" in many other OpenStack projects to compute a hash.","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"        else:"},{"line_number":1250,"context_line":"            relevant_data \u003d (fields, methods)"},{"line_number":1251,"context_line":"        fingerprint \u003d \u0027%s-%s\u0027 % (obj_class.VERSION, hashlib.md5("},{"line_number":1252,"context_line":"            six.binary_type(repr(relevant_data).encode())).hexdigest())"},{"line_number":1253,"context_line":"        return fingerprint"},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"    def test_find_remotable_method(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa32b979_c14cca78","line":1252,"in_reply_to":"1af86dd1_64063622","updated":"2015-06-22 03:20:38.000000000","message":"Keeping code same as in oslo.versionedobjects\nhttps://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/fixture.py#L148","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"9ce46802ac89440a20b319aa9e32d48b5bed467c","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"                return \u0027Hello World!\u0027"},{"line_number":1222,"context_line":"        thing \u003d self._find_remotable_method(MyObject,"},{"line_number":1223,"context_line":"                                            getattr(MyObject, \u0027my_method\u0027))"},{"line_number":1224,"context_line":"        self.assertIsNotNone(thing)"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    def test_versions(self):"},{"line_number":1227,"context_line":"        fingerprints \u003d {}"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa32b979_29908aec","line":1224,"updated":"2015-06-24 13:29:15.000000000","message":"having this test here is kind of weird - we might want to move the fingerprinting functionality to it\u0027s own class or even make it a thing the object itself does?","commit_id":"da0c5527fc5d1b7d1e23e6ddfd306591c944681b"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"ad41bfb3fc54c13f960a99ef8954d69df1f221db","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"                return \u0027Hello World!\u0027"},{"line_number":1222,"context_line":"        thing \u003d self._find_remotable_method(MyObject,"},{"line_number":1223,"context_line":"                                            getattr(MyObject, \u0027my_method\u0027))"},{"line_number":1224,"context_line":"        self.assertIsNotNone(thing)"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    def test_versions(self):"},{"line_number":1227,"context_line":"        fingerprints \u003d {}"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa32b979_20df1bd7","line":1224,"in_reply_to":"fa32b979_29908aec","updated":"2015-06-24 20:00:05.000000000","message":"Nikola, we are going to remove some of these tests when we cut the next oslo.versionedobject release","commit_id":"da0c5527fc5d1b7d1e23e6ddfd306591c944681b"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"01534550ea0b548011f14a99031a313c181488fb","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        else:"},{"line_number":1214,"context_line":"            relevant_data \u003d (fields, methods)"},{"line_number":1215,"context_line":"        fingerprint \u003d \u0027%s-%s\u0027 % (obj_class.VERSION, hashlib.md5("},{"line_number":1216,"context_line":"            six.binary_type(repr(relevant_data).encode())).hexdigest())"},{"line_number":1217,"context_line":"        return fingerprint"},{"line_number":1218,"context_line":""},{"line_number":1219,"context_line":"    def test_find_remotable_method(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba3cc151_e6cbe151","line":1216,"updated":"2015-07-01 09:14:31.000000000","message":"On Python 2, .encode() is not needed: repr() should return a native string, so bytes.\n\nI don\u0027t think that the cast to six.binary_type is still needed if you encode to bytes.\n\nI suggest something like:\n\nrelevant_data \u003d repr(relevant_data)\nif six.PY3:\n    relevant_data \u003d relevant_data.encode(\u0027utf-8\u0027)\nfingerprint \u003d \u0027%s-%s\u0027 % (obj_class.VERSION, hashlib.md5(relevant_data).hexdigest())","commit_id":"0803295d6d51f3a1c75be03d88179b2fdb877774"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"3e8f5f7b4d4da0a00bb91acfcbe9cd55c9eb6b95","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        else:"},{"line_number":1214,"context_line":"            relevant_data \u003d (fields, methods)"},{"line_number":1215,"context_line":"        fingerprint \u003d \u0027%s-%s\u0027 % (obj_class.VERSION, hashlib.md5("},{"line_number":1216,"context_line":"            six.binary_type(repr(relevant_data).encode())).hexdigest())"},{"line_number":1217,"context_line":"        return fingerprint"},{"line_number":1218,"context_line":""},{"line_number":1219,"context_line":"    def test_find_remotable_method(self):"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba3cc151_b27d0fb3","line":1216,"in_reply_to":"ba3cc151_e6cbe151","updated":"2015-07-01 10:35:07.000000000","message":"Done.","commit_id":"0803295d6d51f3a1c75be03d88179b2fdb877774"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"885bea70294aadc523c2167056232d2135d7363f","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"        if six.PY3:"},{"line_number":1244,"context_line":"            relevant_data \u003d relevant_data.encode(\u0027utf-8\u0027)"},{"line_number":1245,"context_line":"        fingerprint \u003d \u0027%s-%s\u0027 % ("},{"line_number":1246,"context_line":"        obj_class.VERSION, hashlib.md5(relevant_data).hexdigest())"},{"line_number":1247,"context_line":"        return fingerprint"},{"line_number":1248,"context_line":""},{"line_number":1249,"context_line":"    def test_find_remotable_method(self):"}],"source_content_type":"text/x-python","patch_set":33,"id":"ba3cc151_87286c98","line":1246,"updated":"2015-07-09 13:37:18.000000000","message":"This line needs to be indented.","commit_id":"9f698dc29639e60254de00ff4e2aa5168b6abb8a"}],"requirements.txt":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"64d806a1815d9b22a7aefe211f7b06135b6465d9","unresolved":false,"context_lines":[{"line_number":47,"context_line":"oslo.middleware\u003e\u003d1.2.0,!\u003d2.0.0                  # Apache-2.0"},{"line_number":48,"context_line":"psutil\u003e\u003d1.1.1,\u003c2.0.0"},{"line_number":49,"context_line":"oslo.versionedobjects\u003e\u003d0.3.0"},{"line_number":50,"context_line":"contextlib2\u003e\u003d0.4.0"}],"source_content_type":"text/plain","patch_set":20,"id":"1af86dd1_0f2b1b84","line":50,"updated":"2015-06-12 11:05:39.000000000","message":"Do you use contextlib2?","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"f0753dbb66acd8ec041b9b8f741626f625cc71ed","unresolved":false,"context_lines":[{"line_number":47,"context_line":"oslo.middleware\u003e\u003d1.2.0,!\u003d2.0.0                  # Apache-2.0"},{"line_number":48,"context_line":"psutil\u003e\u003d1.1.1,\u003c2.0.0"},{"line_number":49,"context_line":"oslo.versionedobjects\u003e\u003d0.3.0"},{"line_number":50,"context_line":"contextlib2\u003e\u003d0.4.0"}],"source_content_type":"text/plain","patch_set":20,"id":"fa32b979_e151ce0f","line":50,"in_reply_to":"1af86dd1_0f2b1b84","updated":"2015-06-22 03:20:38.000000000","message":"removed","commit_id":"50f6846b6616a246da02ea6498f8bb3085b2e63d"}],"tox.ini":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"38ea6dc6a27465f53a69058e11b483925e8bb7f6","unresolved":false,"context_lines":[{"line_number":42,"context_line":"commands \u003d"},{"line_number":43,"context_line":"  find . -type f -name \"*.pyc\" -delete"},{"line_number":44,"context_line":"  python -m testtools.run nova.tests.unit.test_versions \\"},{"line_number":45,"context_line":"    nova.tests.unit.objects.test_agent \\"},{"line_number":46,"context_line":"    nova.tests.unit.objects.test_aggregate \\"},{"line_number":47,"context_line":"    nova.tests.unit.objects.test_bandwidth_usage \\"},{"line_number":48,"context_line":"    nova.tests.unit.objects.test_block_device \\"}],"source_content_type":"text/x-properties","patch_set":8,"id":"3afb71cf_d5f23b06","line":45,"updated":"2015-06-05 03:13:28.000000000","message":"this list is going to get long ...","commit_id":"ead289a9a749f6219b915c49d3c7ecd8cabaa79d"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"5fc3439c92c6db7769397f8ad3b6371842184b39","unresolved":false,"context_lines":[{"line_number":42,"context_line":"commands \u003d"},{"line_number":43,"context_line":"  find . -type f -name \"*.pyc\" -delete"},{"line_number":44,"context_line":"  python -m testtools.run nova.tests.unit.test_versions \\"},{"line_number":45,"context_line":"    nova.tests.unit.objects.test_agent \\"},{"line_number":46,"context_line":"    nova.tests.unit.objects.test_aggregate \\"},{"line_number":47,"context_line":"    nova.tests.unit.objects.test_bandwidth_usage \\"},{"line_number":48,"context_line":"    nova.tests.unit.objects.test_block_device \\"}],"source_content_type":"text/x-properties","patch_set":8,"id":"3afb71cf_7dbb660f","line":45,"in_reply_to":"3afb71cf_d5f23b06","updated":"2015-06-05 10:31:23.000000000","message":"yes. for now. i don\u0027t see a way to specify a list of modules in a file with testtools.run :( (test ids are likely to change so i can\u0027t use them in a file)","commit_id":"ead289a9a749f6219b915c49d3c7ecd8cabaa79d"}]}
