)]}'
{"oslo_versionedobjects/base.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ea66b2ca8997a79fbb26a49c054d7d49adc0bbe0","unresolved":false,"context_lines":[{"line_number":725,"context_line":"        \"\"\"List index of value.\"\"\""},{"line_number":726,"context_line":"        return self.objects.index(value)"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"    def sort(self, cmp\u003dNone, key\u003dNone, reverse\u003dFalse):"},{"line_number":729,"context_line":"        self.objects.sort(cmp\u003dcmp, key\u003dkey, reverse\u003dreverse)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_50c9f077","side":"PARENT","line":728,"range":{"start_line":728,"start_character":19,"end_line":728,"end_character":27},"updated":"2015-02-10 17:20:11.000000000","message":"If we remove this, aren\u0027t we losing compatibility with py27?","commit_id":"e6fcb23439422bb34c8d28c0958cc9a6f88ad5f7"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"3e76785892cd9e29af86a7c83421790b21691fb5","unresolved":false,"context_lines":[{"line_number":725,"context_line":"        \"\"\"List index of value.\"\"\""},{"line_number":726,"context_line":"        return self.objects.index(value)"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"    def sort(self, cmp\u003dNone, key\u003dNone, reverse\u003dFalse):"},{"line_number":729,"context_line":"        self.objects.sort(cmp\u003dcmp, key\u003dkey, reverse\u003dreverse)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_1c077319","side":"PARENT","line":728,"in_reply_to":"da86d52c_137cdd1f","updated":"2015-02-11 10:34:03.000000000","message":"Python3 doesn\u0027t support the \"cmp\" argument.","commit_id":"e6fcb23439422bb34c8d28c0958cc9a6f88ad5f7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ab0285a108a263702b900aa3593776624f10b9ca","unresolved":false,"context_lines":[{"line_number":725,"context_line":"        \"\"\"List index of value.\"\"\""},{"line_number":726,"context_line":"        return self.objects.index(value)"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"    def sort(self, cmp\u003dNone, key\u003dNone, reverse\u003dFalse):"},{"line_number":729,"context_line":"        self.objects.sort(cmp\u003dcmp, key\u003dkey, reverse\u003dreverse)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_137cdd1f","side":"PARENT","line":728,"in_reply_to":"da86d52c_3dc9b079","updated":"2015-02-10 19:07:35.000000000","message":"Right, but we have it in nova. Not sure if it\u0027s used, so might not matter. My question is just: what is the point/need of removing it?","commit_id":"e6fcb23439422bb34c8d28c0958cc9a6f88ad5f7"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"95c8d645a02ac32dc8b165d4a9eff2521c97c798","unresolved":false,"context_lines":[{"line_number":725,"context_line":"        \"\"\"List index of value.\"\"\""},{"line_number":726,"context_line":"        return self.objects.index(value)"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"    def sort(self, cmp\u003dNone, key\u003dNone, reverse\u003dFalse):"},{"line_number":729,"context_line":"        self.objects.sort(cmp\u003dcmp, key\u003dkey, reverse\u003dreverse)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_3dc9b079","side":"PARENT","line":728,"in_reply_to":"da86d52c_50c9f077","updated":"2015-02-10 18:24:15.000000000","message":"It depends on how this object is used. I mean, as a temporary mixin (see the docstring) this class doesn\u0027t promise full compatibility with a dict, there are many methods missing, like setdefault etc.","commit_id":"e6fcb23439422bb34c8d28c0958cc9a6f88ad5f7"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":725,"context_line":"        \"\"\"List index of value.\"\"\""},{"line_number":726,"context_line":"        return self.objects.index(value)"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"    def sort(self, cmp\u003dNone, key\u003dNone, reverse\u003dFalse):"},{"line_number":729,"context_line":"        self.objects.sort(cmp\u003dcmp, key\u003dkey, reverse\u003dreverse)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_7c114f51","side":"PARENT","line":728,"updated":"2015-02-11 10:33:59.000000000","message":"Is it ok to break compatibility? If you really need cmp on Python 3, you can use:\nhttps://docs.python.org/dev/library/functools.html#functools.cmp_to_key","commit_id":"c64e9d752bb5d41c4e7d16b88d541f005ef43f65"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":725,"context_line":"        \"\"\"List index of value.\"\"\""},{"line_number":726,"context_line":"        return self.objects.index(value)"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"    def sort(self, cmp\u003dNone, key\u003dNone, reverse\u003dFalse):"},{"line_number":729,"context_line":"        self.objects.sort(cmp\u003dcmp, key\u003dkey, reverse\u003dreverse)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_1f1920d7","side":"PARENT","line":728,"in_reply_to":"da86d52c_7c114f51","updated":"2015-02-11 13:56:05.000000000","message":"I think it\u0027s ok, nobody should use it anyway.","commit_id":"c64e9d752bb5d41c4e7d16b88d541f005ef43f65"}],"oslo_versionedobjects/exception.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ea66b2ca8997a79fbb26a49c054d7d49adc0bbe0","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                    LOG.error(\"%s: %s\" % (name, value))    # noqa"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"                if CONF.fatal_exception_format_errors:"},{"line_number":129,"context_line":"                    raise exc_info[0](exc_info[1], exc_info[2])"},{"line_number":130,"context_line":"                else:"},{"line_number":131,"context_line":"                    # at least get the core message out if something happened"},{"line_number":132,"context_line":"                    message \u003d self.msg_fmt"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_5077303b","line":129,"updated":"2015-02-10 17:20:11.000000000","message":"This wasn\u0027t my code to begin with -- I assume this works on py27 as well?","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"95c8d645a02ac32dc8b165d4a9eff2521c97c798","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                    LOG.error(\"%s: %s\" % (name, value))    # noqa"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"                if CONF.fatal_exception_format_errors:"},{"line_number":129,"context_line":"                    raise exc_info[0](exc_info[1], exc_info[2])"},{"line_number":130,"context_line":"                else:"},{"line_number":131,"context_line":"                    # at least get the core message out if something happened"},{"line_number":132,"context_line":"                    message \u003d self.msg_fmt"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_9d4d3c75","line":129,"in_reply_to":"da86d52c_5077303b","updated":"2015-02-10 18:24:15.000000000","message":"Yes.","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                    LOG.error(\"%s: %s\" % (name, value))    # noqa"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"                if CONF.fatal_exception_format_errors:"},{"line_number":129,"context_line":"                    raise exc_info[0](exc_info[1], exc_info[2])"},{"line_number":130,"context_line":"                else:"},{"line_number":131,"context_line":"                    # at least get the core message out if something happened"},{"line_number":132,"context_line":"                    message \u003d self.msg_fmt"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_5c3babd0","line":129,"updated":"2015-02-11 10:33:59.000000000","message":"This is wrong. Please use six.reraise() instead.","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                    LOG.error(\"%s: %s\" % (name, value))    # noqa"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"                if CONF.fatal_exception_format_errors:"},{"line_number":129,"context_line":"                    raise exc_info[0](exc_info[1], exc_info[2])"},{"line_number":130,"context_line":"                else:"},{"line_number":131,"context_line":"                    # at least get the core message out if something happened"},{"line_number":132,"context_line":"                    message \u003d self.msg_fmt"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_75dcfde4","line":129,"in_reply_to":"da86d52c_5c3babd0","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"}],"oslo_versionedobjects/fields.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import abc"},{"line_number":16,"context_line":"import datetime"},{"line_number":17,"context_line":"import numbers"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import iso8601"},{"line_number":20,"context_line":"import netaddr"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_9cb6033d","line":17,"updated":"2015-02-11 10:33:59.000000000","message":"This module doesn\u0027t look to be part of global requirements.","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import abc"},{"line_number":16,"context_line":"import datetime"},{"line_number":17,"context_line":"import numbers"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import iso8601"},{"line_number":20,"context_line":"import netaddr"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_3a58b289","line":17,"in_reply_to":"da86d52c_9cb6033d","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            (\u0027default\u0027, self._default),"},{"line_number":140,"context_line":"        ]"},{"line_number":141,"context_line":"        return \u0027%s(%s)\u0027 % (self._type.__class__.__name__,"},{"line_number":142,"context_line":"                           \u0027,\u0027.join([\u0027%s\u003d%s\u0027 % a for a in args]))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    @property"},{"line_number":145,"context_line":"    def nullable(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_9c5fe30e","line":142,"updated":"2015-02-11 10:33:59.000000000","message":"The args dict/list is not really useful. The code can be simplified:\n\nreturn \u0027%s(nullable\u003d%s, default\u003d%s)\u0027 % (self._type.__class__.__name__,\tself._nullable, self._default)","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            (\u0027default\u0027, self._default),"},{"line_number":140,"context_line":"        ]"},{"line_number":141,"context_line":"        return \u0027%s(%s)\u0027 % (self._type.__class__.__name__,"},{"line_number":142,"context_line":"                           \u0027,\u0027.join([\u0027%s\u003d%s\u0027 % a for a in args]))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    @property"},{"line_number":145,"context_line":"    def nullable(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_75cf9d7f","line":142,"in_reply_to":"da86d52c_9c5fe30e","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    @staticmethod"},{"line_number":240,"context_line":"    def coerce(obj, attr, value):"},{"line_number":241,"context_line":"        # FIXME(danms): We should really try to avoid the need to do this"},{"line_number":242,"context_line":"        if isinstance(value, (six.string_types, numbers.Number,"},{"line_number":243,"context_line":"                              datetime.datetime)):"},{"line_number":244,"context_line":"            return six.text_type(value)"},{"line_number":245,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_7cc22f86","line":242,"updated":"2015-02-11 10:33:59.000000000","message":"You can use: \nisinstance(value, (six.string_types, float, datetime.datetime) + six.integer_type)\n\nYou might put the list of accepted list in a (private) constant in the module namespace.","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    @staticmethod"},{"line_number":240,"context_line":"    def coerce(obj, attr, value):"},{"line_number":241,"context_line":"        # FIXME(danms): We should really try to avoid the need to do this"},{"line_number":242,"context_line":"        if isinstance(value, (six.string_types, numbers.Number,"},{"line_number":243,"context_line":"                              datetime.datetime)):"},{"line_number":244,"context_line":"            return six.text_type(value)"},{"line_number":245,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_5f471877","line":242,"in_reply_to":"da86d52c_7cc22f86","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"}],"oslo_versionedobjects/test.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"try:"},{"line_number":25,"context_line":"    import eventlet"},{"line_number":26,"context_line":"    eventlet.monkey_patch(os\u003dFalse)"},{"line_number":27,"context_line":"except ImportError:"},{"line_number":28,"context_line":"    pass"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_5c4c8b42","line":26,"updated":"2015-02-11 10:33:59.000000000","message":"Since eventlet 0.15, eventlet can be imported on Python 3. Since eventlet 0.16, eventlet mostly work with monkey-patching on Python 3.\n\nIf you got issues with eventlet on Python 3, what are these issues? You should explain them in a comment at least. (Or just fix them.)","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"try:"},{"line_number":25,"context_line":"    import eventlet"},{"line_number":26,"context_line":"    eventlet.monkey_patch(os\u003dFalse)"},{"line_number":27,"context_line":"except ImportError:"},{"line_number":28,"context_line":"    pass"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_7f0dbc3d","line":26,"in_reply_to":"da86d52c_5c4c8b42","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"}],"oslo_versionedobjects/tests/test_fields.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ea66b2ca8997a79fbb26a49c054d7d49adc0bbe0","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                                       (long(1), \u00271\u0027), (True, \u0027True\u0027)]"},{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            self.coerce_good_values \u003d [(\u0027foo\u0027, \u0027foo\u0027), (1, \u00271\u0027),"},{"line_number":82,"context_line":"                                       (True, \u0027True\u0027)]"},{"line_number":83,"context_line":"        self.coerce_bad_values \u003d [None]"},{"line_number":84,"context_line":"        self.to_primitive_values \u003d self.coerce_good_values[0:1]"},{"line_number":85,"context_line":"        self.from_primitive_values \u003d self.coerce_good_values[0:1]"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_04457916","line":82,"updated":"2015-02-10 17:20:11.000000000","message":"Why make this change?","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"95c8d645a02ac32dc8b165d4a9eff2521c97c798","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                                       (long(1), \u00271\u0027), (True, \u0027True\u0027)]"},{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            self.coerce_good_values \u003d [(\u0027foo\u0027, \u0027foo\u0027), (1, \u00271\u0027),"},{"line_number":82,"context_line":"                                       (True, \u0027True\u0027)]"},{"line_number":83,"context_line":"        self.coerce_bad_values \u003d [None]"},{"line_number":84,"context_line":"        self.to_primitive_values \u003d self.coerce_good_values[0:1]"},{"line_number":85,"context_line":"        self.from_primitive_values \u003d self.coerce_good_values[0:1]"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_3a9e1655","line":82,"in_reply_to":"da86d52c_04457916","updated":"2015-02-10 18:24:15.000000000","message":"There is no long() type in Python 3.","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ab0285a108a263702b900aa3593776624f10b9ca","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                                       (long(1), \u00271\u0027), (True, \u0027True\u0027)]"},{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            self.coerce_good_values \u003d [(\u0027foo\u0027, \u0027foo\u0027), (1, \u00271\u0027),"},{"line_number":82,"context_line":"                                       (True, \u0027True\u0027)]"},{"line_number":83,"context_line":"        self.coerce_bad_values \u003d [None]"},{"line_number":84,"context_line":"        self.to_primitive_values \u003d self.coerce_good_values[0:1]"},{"line_number":85,"context_line":"        self.from_primitive_values \u003d self.coerce_good_values[0:1]"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_b3b951cd","line":82,"in_reply_to":"da86d52c_3a9e1655","updated":"2015-02-10 19:07:35.000000000","message":"Okay, we should have float() in there too, right? How about we do:\n\n if python2:\n    good_values +\u003d [(long(1), \u00271\u0027)]\n\n?","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"3e76785892cd9e29af86a7c83421790b21691fb5","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                                       (long(1), \u00271\u0027), (True, \u0027True\u0027)]"},{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            self.coerce_good_values \u003d [(\u0027foo\u0027, \u0027foo\u0027), (1, \u00271\u0027),"},{"line_number":82,"context_line":"                                       (True, \u0027True\u0027)]"},{"line_number":83,"context_line":"        self.coerce_bad_values \u003d [None]"},{"line_number":84,"context_line":"        self.to_primitive_values \u003d self.coerce_good_values[0:1]"},{"line_number":85,"context_line":"        self.from_primitive_values \u003d self.coerce_good_values[0:1]"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_1c6cd3cf","line":82,"in_reply_to":"da86d52c_b3b951cd","updated":"2015-02-11 10:34:03.000000000","message":"Done","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def setUp(self):"},{"line_number":75,"context_line":"        super(TestField, self).setUp()"},{"line_number":76,"context_line":"        self.field \u003d fields.StringField()"},{"line_number":77,"context_line":"        if sys.version \u003c \u00273\u0027:"},{"line_number":78,"context_line":"            self.coerce_good_values \u003d [(\u0027foo\u0027, \u0027foo\u0027), (1, \u00271\u0027),"},{"line_number":79,"context_line":"                                       (long(1), \u00271\u0027), (True, \u0027True\u0027)]"},{"line_number":80,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_5cfacbbd","line":77,"updated":"2015-02-11 10:33:59.000000000","message":"If prefer six.PY3 to check for Python \u003e\u003d 3.","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def setUp(self):"},{"line_number":75,"context_line":"        super(TestField, self).setUp()"},{"line_number":76,"context_line":"        self.field \u003d fields.StringField()"},{"line_number":77,"context_line":"        if sys.version \u003c \u00273\u0027:"},{"line_number":78,"context_line":"            self.coerce_good_values \u003d [(\u0027foo\u0027, \u0027foo\u0027), (1, \u00271\u0027),"},{"line_number":79,"context_line":"                                       (long(1), \u00271\u0027), (True, \u0027True\u0027)]"},{"line_number":80,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_3a6c32d0","line":77,"in_reply_to":"da86d52c_5cfacbbd","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.field \u003d fields.StringField()"},{"line_number":77,"context_line":"        if sys.version \u003c \u00273\u0027:"},{"line_number":78,"context_line":"            self.coerce_good_values \u003d [(\u0027foo\u0027, \u0027foo\u0027), (1, \u00271\u0027),"},{"line_number":79,"context_line":"                                       (long(1), \u00271\u0027), (True, \u0027True\u0027)]"},{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            self.coerce_good_values \u003d [(\u0027foo\u0027, \u0027foo\u0027), (1, \u00271\u0027),"},{"line_number":82,"context_line":"                                       (True, \u0027True\u0027)]"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_1cb21306","line":79,"updated":"2015-02-11 10:33:59.000000000","message":"You should not duplicate the whole list, but only add the extra long value on Python 3:\n\nself.coerce_good_values \u003d [...]\nif six.PY2:\n    self.coerce_good_values.append((long(1), \u00271\u0027))","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.field \u003d fields.StringField()"},{"line_number":77,"context_line":"        if sys.version \u003c \u00273\u0027:"},{"line_number":78,"context_line":"            self.coerce_good_values \u003d [(\u0027foo\u0027, \u0027foo\u0027), (1, \u00271\u0027),"},{"line_number":79,"context_line":"                                       (long(1), \u00271\u0027), (True, \u0027True\u0027)]"},{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            self.coerce_good_values \u003d [(\u0027foo\u0027, \u0027foo\u0027), (1, \u00271\u0027),"},{"line_number":82,"context_line":"                                       (True, \u0027True\u0027)]"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_1a7bee8c","line":79,"in_reply_to":"da86d52c_1cb21306","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"}],"oslo_versionedobjects/tests/test_objects.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ea66b2ca8997a79fbb26a49c054d7d49adc0bbe0","unresolved":false,"context_lines":[{"line_number":567,"context_line":"        try:"},{"line_number":568,"context_line":"            base.VersionedObject.obj_class_from_name(\u0027MyObj\u0027, \u00271.25\u0027)"},{"line_number":569,"context_line":"        except exception.IncompatibleObjectVersion as error:"},{"line_number":570,"context_line":"            self.assertEqual(\u00271.6\u0027, error.kwargs[\u0027supported\u0027])"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    def test_with_alternate_context(self):"},{"line_number":573,"context_line":"        ctxt1 \u003d context.RequestContext(None, \u0027foo\u0027, \u0027foo\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_84fec9ac","line":570,"updated":"2015-02-10 17:20:11.000000000","message":"Is this a py3-required change?","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"95c8d645a02ac32dc8b165d4a9eff2521c97c798","unresolved":false,"context_lines":[{"line_number":567,"context_line":"        try:"},{"line_number":568,"context_line":"            base.VersionedObject.obj_class_from_name(\u0027MyObj\u0027, \u00271.25\u0027)"},{"line_number":569,"context_line":"        except exception.IncompatibleObjectVersion as error:"},{"line_number":570,"context_line":"            self.assertEqual(\u00271.6\u0027, error.kwargs[\u0027supported\u0027])"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    def test_with_alternate_context(self):"},{"line_number":573,"context_line":"        ctxt1 \u003d context.RequestContext(None, \u0027foo\u0027, \u0027foo\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_7ae08e96","line":570,"in_reply_to":"da86d52c_84fec9ac","updated":"2015-02-10 18:24:15.000000000","message":"Yes, there is a change in how global/local scopes work - error is always None on line 570 before this change when run under Python 3.","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ea66b2ca8997a79fbb26a49c054d7d49adc0bbe0","unresolved":false,"context_lines":[{"line_number":679,"context_line":"                              got[\u0027versioned_object.changes\u0027])"},{"line_number":680,"context_line":"        del expected[\u0027versioned_object.changes\u0027]"},{"line_number":681,"context_line":"        del got[\u0027versioned_object.changes\u0027]"},{"line_number":682,"context_line":"        self.assertEqual(got, expected)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"    def test_contains(self):"},{"line_number":685,"context_line":"        obj \u003d MyObj()"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_64c8f574","line":682,"updated":"2015-02-10 17:20:11.000000000","message":"What does this have to do with py3 compatibility? This is a pretty fundamental is-it-right check ... why do we need to break out the changes bit?","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"95c8d645a02ac32dc8b165d4a9eff2521c97c798","unresolved":false,"context_lines":[{"line_number":679,"context_line":"                              got[\u0027versioned_object.changes\u0027])"},{"line_number":680,"context_line":"        del expected[\u0027versioned_object.changes\u0027]"},{"line_number":681,"context_line":"        del got[\u0027versioned_object.changes\u0027]"},{"line_number":682,"context_line":"        self.assertEqual(got, expected)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"    def test_contains(self):"},{"line_number":685,"context_line":"        obj \u003d MyObj()"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_bd020007","line":682,"in_reply_to":"da86d52c_64c8f574","updated":"2015-02-10 18:24:15.000000000","message":"I made this change because \u0027versioned_object.changes\u0027 is not sorted after converting from a set (see https://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L489 ). This change makes it work with Python 3 (as well as Python 2, and with random hash seed - I mentioned this in the commit message).","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ab0285a108a263702b900aa3593776624f10b9ca","unresolved":false,"context_lines":[{"line_number":679,"context_line":"                              got[\u0027versioned_object.changes\u0027])"},{"line_number":680,"context_line":"        del expected[\u0027versioned_object.changes\u0027]"},{"line_number":681,"context_line":"        del got[\u0027versioned_object.changes\u0027]"},{"line_number":682,"context_line":"        self.assertEqual(got, expected)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"    def test_contains(self):"},{"line_number":685,"context_line":"        obj \u003d MyObj()"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_f338293f","line":682,"in_reply_to":"da86d52c_bd020007","updated":"2015-02-10 19:07:35.000000000","message":"Okay, but we could just sort the changes and use assertEqual() on the whole thing then, right?\n\nit\u0027s not a huge deal, but the above is less obvious than just comparing the two. If there really is no other easy way, perhaps a comment about  it?","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"3e76785892cd9e29af86a7c83421790b21691fb5","unresolved":false,"context_lines":[{"line_number":679,"context_line":"                              got[\u0027versioned_object.changes\u0027])"},{"line_number":680,"context_line":"        del expected[\u0027versioned_object.changes\u0027]"},{"line_number":681,"context_line":"        del got[\u0027versioned_object.changes\u0027]"},{"line_number":682,"context_line":"        self.assertEqual(got, expected)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"    def test_contains(self):"},{"line_number":685,"context_line":"        obj \u003d MyObj()"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_bc2e678a","line":682,"in_reply_to":"da86d52c_f338293f","updated":"2015-02-11 10:34:03.000000000","message":"Good point, I will make the change.","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ea66b2ca8997a79fbb26a49c054d7d49adc0bbe0","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"        if isinstance(thing, classmethod):"},{"line_number":1167,"context_line":"            return self._find_remotable_method(cls, thing.__get__(None, cls))"},{"line_number":1168,"context_line":"        elif (inspect.ismethod(thing)"},{"line_number":1169,"context_line":"              or inspect.isfunction(thing)) and hasattr(thing, \u0027remotable\u0027):"},{"line_number":1170,"context_line":"            return self._find_remotable_method(cls, thing.original_fn,"},{"line_number":1171,"context_line":"                                               parent_was_remotable\u003dTrue)"},{"line_number":1172,"context_line":"        elif parent_was_remotable:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_849a496c","line":1169,"updated":"2015-02-10 17:20:11.000000000","message":"Is this a py3 compatibility thing? Why?","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"3e76785892cd9e29af86a7c83421790b21691fb5","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"        if isinstance(thing, classmethod):"},{"line_number":1167,"context_line":"            return self._find_remotable_method(cls, thing.__get__(None, cls))"},{"line_number":1168,"context_line":"        elif (inspect.ismethod(thing)"},{"line_number":1169,"context_line":"              or inspect.isfunction(thing)) and hasattr(thing, \u0027remotable\u0027):"},{"line_number":1170,"context_line":"            return self._find_remotable_method(cls, thing.original_fn,"},{"line_number":1171,"context_line":"                                               parent_was_remotable\u003dTrue)"},{"line_number":1172,"context_line":"        elif parent_was_remotable:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_41474477","line":1169,"in_reply_to":"da86d52c_53773502","updated":"2015-02-11 10:34:03.000000000","message":"Yes, it always returns False in Python3.","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"95c8d645a02ac32dc8b165d4a9eff2521c97c798","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"        if isinstance(thing, classmethod):"},{"line_number":1167,"context_line":"            return self._find_remotable_method(cls, thing.__get__(None, cls))"},{"line_number":1168,"context_line":"        elif (inspect.ismethod(thing)"},{"line_number":1169,"context_line":"              or inspect.isfunction(thing)) and hasattr(thing, \u0027remotable\u0027):"},{"line_number":1170,"context_line":"            return self._find_remotable_method(cls, thing.original_fn,"},{"line_number":1171,"context_line":"                                               parent_was_remotable\u003dTrue)"},{"line_number":1172,"context_line":"        elif parent_was_remotable:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_dd20949d","line":1169,"in_reply_to":"da86d52c_849a496c","updated":"2015-02-10 18:24:15.000000000","message":"There is no \"method\" type in Python 3.","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ab0285a108a263702b900aa3593776624f10b9ca","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"        if isinstance(thing, classmethod):"},{"line_number":1167,"context_line":"            return self._find_remotable_method(cls, thing.__get__(None, cls))"},{"line_number":1168,"context_line":"        elif (inspect.ismethod(thing)"},{"line_number":1169,"context_line":"              or inspect.isfunction(thing)) and hasattr(thing, \u0027remotable\u0027):"},{"line_number":1170,"context_line":"            return self._find_remotable_method(cls, thing.original_fn,"},{"line_number":1171,"context_line":"                                               parent_was_remotable\u003dTrue)"},{"line_number":1172,"context_line":"        elif parent_was_remotable:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_53773502","line":1169,"in_reply_to":"da86d52c_dd20949d","updated":"2015-02-10 19:07:35.000000000","message":"Okay, so what does inspect.ismethod() (line 1168) do? Assume it\u0027s there for compat and just returns False or something?","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ea66b2ca8997a79fbb26a49c054d7d49adc0bbe0","unresolved":false,"context_lines":[{"line_number":1185,"context_line":"        for name in dir(obj_class):"},{"line_number":1186,"context_line":"            thing \u003d getattr(obj_class, name)"},{"line_number":1187,"context_line":"            if inspect.ismethod(thing) or inspect.isfunction(thing) \\"},{"line_number":1188,"context_line":"               or isinstance(thing, classmethod):"},{"line_number":1189,"context_line":"                method \u003d self._find_remotable_method(obj_class, thing)"},{"line_number":1190,"context_line":"                if method:"},{"line_number":1191,"context_line":"                    methods.append((name, inspect.getargspec(method)))"}],"source_content_type":"text/x-python","patch_set":2,"id":"da86d52c_c48b611c","line":1188,"updated":"2015-02-10 17:20:11.000000000","message":"(same)","commit_id":"aee707445189d03dd4360cd83dd69d5ecd9aea52"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":664,"context_line":"        got \u003d obj.obj_to_primitive()"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        self.assertItemsEqual(expected[\u0027versioned_object.changes\u0027],"},{"line_number":667,"context_line":"                              got[\u0027versioned_object.changes\u0027])"},{"line_number":668,"context_line":"        del expected[\u0027versioned_object.changes\u0027]"},{"line_number":669,"context_line":"        del got[\u0027versioned_object.changes\u0027]"},{"line_number":670,"context_line":"        self.assertEqual(got, expected)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_fc953f33","line":667,"updated":"2015-02-11 10:33:59.000000000","message":"Is it a problem with random order because of hash randomization?\n\nIf yes, obj_to_primitive() may sort items.\n\nOr the unit can sort items. Example:\ngot[\u0027versioned_object.changes\u0027] \u003d sorted(got[\u0027versioned_object.changes\u0027])","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":664,"context_line":"        got \u003d obj.obj_to_primitive()"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        self.assertItemsEqual(expected[\u0027versioned_object.changes\u0027],"},{"line_number":667,"context_line":"                              got[\u0027versioned_object.changes\u0027])"},{"line_number":668,"context_line":"        del expected[\u0027versioned_object.changes\u0027]"},{"line_number":669,"context_line":"        del got[\u0027versioned_object.changes\u0027]"},{"line_number":670,"context_line":"        self.assertEqual(got, expected)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_3a7a7277","line":667,"in_reply_to":"da86d52c_fc953f33","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"# they come with a corresponding version bump in the affected"},{"line_number":1121,"context_line":"# objects"},{"line_number":1122,"context_line":"object_data \u003d {"},{"line_number":1123,"context_line":"    \u0027MyObj\u0027: \u00271.6-be87d2f10480e3c1b5059560f81795bc\u0027,"},{"line_number":1124,"context_line":"    \u0027MyOwnedObject\u0027: \u00271.0-6781195c0b14e44ee1859318e16eca4c\u0027,"},{"line_number":1125,"context_line":"    \u0027TestSubclassedObject\u0027: \u00271.6-cb9ea23e78100f0c4a98a4defc8ed577\u0027}"},{"line_number":1126,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_3c0fd789","line":1123,"updated":"2015-02-11 10:33:59.000000000","message":"It would be better to not change the fingerprint (see below).","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"# they come with a corresponding version bump in the affected"},{"line_number":1121,"context_line":"# objects"},{"line_number":1122,"context_line":"object_data \u003d {"},{"line_number":1123,"context_line":"    \u0027MyObj\u0027: \u00271.6-be87d2f10480e3c1b5059560f81795bc\u0027,"},{"line_number":1124,"context_line":"    \u0027MyOwnedObject\u0027: \u00271.0-6781195c0b14e44ee1859318e16eca4c\u0027,"},{"line_number":1125,"context_line":"    \u0027TestSubclassedObject\u0027: \u00271.6-cb9ea23e78100f0c4a98a4defc8ed577\u0027}"},{"line_number":1126,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_15a8218c","line":1123,"in_reply_to":"da86d52c_3c0fd789","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"        else:"},{"line_number":1189,"context_line":"            relevant_data \u003d (fields, methods)"},{"line_number":1190,"context_line":"        fingerprint \u003d \u0027%s-%s\u0027 % (obj_class.VERSION, hashlib.md5("},{"line_number":1191,"context_line":"            six.binary_type(repr(relevant_data).encode())).hexdigest())"},{"line_number":1192,"context_line":"        return fingerprint"},{"line_number":1193,"context_line":""},{"line_number":1194,"context_line":"    def test_versions(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_dc2cfb04","line":1191,"updated":"2015-02-11 10:33:59.000000000","message":"This code looks wrong.\n\nUse something like:\n\nhash \u003d str(relevant_data)\nif six.PY3:\n    hash \u003d hash.encode(\u0027utf-8\u0027)\nhash \u003d hashlib.md5(hash).hexdigest()\nfingerprint \u003d ... % (..., hash)\n\nIt should not change the fingerprint.","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"        else:"},{"line_number":1189,"context_line":"            relevant_data \u003d (fields, methods)"},{"line_number":1190,"context_line":"        fingerprint \u003d \u0027%s-%s\u0027 % (obj_class.VERSION, hashlib.md5("},{"line_number":1191,"context_line":"            six.binary_type(repr(relevant_data).encode())).hexdigest())"},{"line_number":1192,"context_line":"        return fingerprint"},{"line_number":1193,"context_line":""},{"line_number":1194,"context_line":"    def test_versions(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_d5ebe9d9","line":1191,"in_reply_to":"da86d52c_dc2cfb04","updated":"2015-02-11 13:56:05.000000000","message":"This actually doesn\u0027t change the fingerprint, the fingerprint was changed because of the ordering of elements in Field.__repr__() (I fixed it)","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":1197,"context_line":"            fingerprints[obj_name] \u003d self._get_fingerprint(obj_name)"},{"line_number":1198,"context_line":""},{"line_number":1199,"context_line":"        if os.getenv(\u0027GENERATE_HASHES\u0027):"},{"line_number":1200,"context_line":"            open(\u0027object_hashes.txt\u0027, \u0027w\u0027).write(pprint.pformat(fingerprints))"},{"line_number":1201,"context_line":"            raise test.TestingException("},{"line_number":1202,"context_line":"                \u0027Generated hashes in object_hashes.txt\u0027)"},{"line_number":1203,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_1c8133c3","line":1200,"updated":"2015-02-11 10:33:59.000000000","message":"You should use :\n\nwith  open(...) as fp:\n  fp.write(...)\n\nOtherwise, you will get a ResourceWarning when using python3 -Wd.","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":1197,"context_line":"            fingerprints[obj_name] \u003d self._get_fingerprint(obj_name)"},{"line_number":1198,"context_line":""},{"line_number":1199,"context_line":"        if os.getenv(\u0027GENERATE_HASHES\u0027):"},{"line_number":1200,"context_line":"            open(\u0027object_hashes.txt\u0027, \u0027w\u0027).write(pprint.pformat(fingerprints))"},{"line_number":1201,"context_line":"            raise test.TestingException("},{"line_number":1202,"context_line":"                \u0027Generated hashes in object_hashes.txt\u0027)"},{"line_number":1203,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_9a1efe0a","line":1200,"in_reply_to":"da86d52c_1c8133c3","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"}],"oslo_versionedobjects/utils.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        if isinstance(version, six.string_types):"},{"line_number":34,"context_line":"            version \u003d convert_version_to_tuple(version)"},{"line_number":35,"context_line":"        if isinstance(version, tuple):"},{"line_number":36,"context_line":"            return functools.reduce(lambda x, y: (x * 1000) + y, version)"},{"line_number":37,"context_line":"    except Exception:"},{"line_number":38,"context_line":"        msg \u003d _(\"Hypervisor version %s is invalid.\") % version"},{"line_number":39,"context_line":"        raise exception.VersionedObjectsException(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_5c03ab41","line":36,"updated":"2015-02-11 10:33:59.000000000","message":"I don\u0027t like reduce(), I prefer an explicit loop:\n\nvernum \u003d 0\nfor item in version:\n    vernum \u003d (vernum * 1000) + item\nreturn vernum\n\nYou may use functools.reduce() if you prefer, it\u0027s up to you.","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"48cf2d3bfcc560459607ef9e0caf5f15f00aca81","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        version_numbers.insert(0, str(version_number))"},{"line_number":48,"context_line":"        version_int \u003d version_int // factor"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    return functools.reduce(lambda x, y: \"%s.%s\" % (x, y), version_numbers)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def convert_version_to_tuple(version_str):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_bc8d87d5","line":50,"updated":"2015-02-11 10:33:59.000000000","message":"Here, reduce() can simply be replaced with:\n\n   return \u0027.\u0027.join(map(str, version_numbers))\n\nIMO it\u0027s easier to understand.","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"dac724f1cfc77569058393b31a4c9e09786d2caa","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        version_numbers.insert(0, str(version_number))"},{"line_number":48,"context_line":"        version_int \u003d version_int // factor"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    return functools.reduce(lambda x, y: \"%s.%s\" % (x, y), version_numbers)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def convert_version_to_tuple(version_str):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_558619dc","line":50,"in_reply_to":"da86d52c_bc8d87d5","updated":"2015-02-11 13:56:05.000000000","message":"Done","commit_id":"c4401c6ebcb05840c1876b5a1e57efdc11f6d659"}]}
