)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"5e856ddd50687e7ffda7108183d8070d57820315","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"2) For DB interactions, we need to set the unavailable fields to their"},{"line_number":22,"context_line":"   appropriate values so that these fields are saved in the DB. (If they"},{"line_number":23,"context_line":"   are not set, the VersionedObject magic will not know to save/update"},{"line_number":24,"context_line":"   them to the DB.) remove_unavailable_fields is set to False in this"},{"line_number":25,"context_line":"   case."},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1f1a1f67_6b079c1a","line":23,"range":{"start_line":23,"start_character":56,"end_line":23,"end_character":58},"updated":"2017-07-20 12:07:08.000000000","message":"nit: s/to/how to/","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"657597502f568291c5efae2b07eeae485b56a7dc","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"2) For DB interactions, we need to set the unavailable fields to their"},{"line_number":22,"context_line":"   appropriate values so that these fields are saved in the DB. (If they"},{"line_number":23,"context_line":"   are not set, the VersionedObject magic will not know to save/update"},{"line_number":24,"context_line":"   them to the DB.) remove_unavailable_fields is set to False in this"},{"line_number":25,"context_line":"   case."},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1f1a1f67_8ea9e191","line":23,"range":{"start_line":23,"start_character":56,"end_line":23,"end_character":58},"in_reply_to":"1f1a1f67_01cb6972","updated":"2017-07-20 14:28:31.000000000","message":"if `VersionedObject magic will not save/update them to the DB.`, i think i know your meaning now, just a little confusing to me.","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1f919cb9f01f2f252234c730fb4ba8ab48e4e4d0","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"2) For DB interactions, we need to set the unavailable fields to their"},{"line_number":22,"context_line":"   appropriate values so that these fields are saved in the DB. (If they"},{"line_number":23,"context_line":"   are not set, the VersionedObject magic will not know to save/update"},{"line_number":24,"context_line":"   them to the DB.) remove_unavailable_fields is set to False in this"},{"line_number":25,"context_line":"   case."},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1f1a1f67_01cb6972","line":23,"range":{"start_line":23,"start_character":56,"end_line":23,"end_character":58},"in_reply_to":"1f1a1f67_6b079c1a","updated":"2017-07-20 13:28:28.000000000","message":"I think \u0027to\u0027 is ok here. We\u0027re saying that ovo doesn\u0027t that it needs to, not that it doesn\u0027t know how to.\n\nThis was copied from comments in ironic.objects.base.","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"439a4f41970c035a63222342b6784d2aa5ce2585","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"2) For DB interactions, we need to set the unavailable fields to their"},{"line_number":22,"context_line":"   appropriate values so that these fields are saved in the DB. (If they"},{"line_number":23,"context_line":"   are not set, the VersionedObject magic will not know to save/update"},{"line_number":24,"context_line":"   them to the DB.) remove_unavailable_fields is set to False in this"},{"line_number":25,"context_line":"   case."},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1f1a1f67_19f51984","line":23,"range":{"start_line":23,"start_character":56,"end_line":23,"end_character":58},"in_reply_to":"1f1a1f67_8ea9e191","updated":"2017-07-20 14:41:08.000000000","message":"No problem. It is a slightly uncommon phrasing but I think it\u0027s valid.","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"}],"ironic/objects/base.py":[{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"5e856ddd50687e7ffda7108183d8070d57820315","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            (de)serializing. False to set an unavailable field to appropriate"},{"line_number":114,"context_line":"            values; set this to False for DB interactions."},{"line_number":115,"context_line":"        \"\"\""},{"line_number":116,"context_line":"        if target_version \u003e\u003d min_version:"},{"line_number":117,"context_line":"            # Target version supports this field. Set it to its default value"},{"line_number":118,"context_line":"            # if it is not present."},{"line_number":119,"context_line":"            if not self.obj_attr_is_set(field):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_cb4fd032","line":116,"range":{"start_line":116,"start_character":26,"end_line":116,"end_character":28},"updated":"2017-07-20 12:07:08.000000000","message":"if the target version is same with current version, why we don\u0027t return and do nothing?","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"657597502f568291c5efae2b07eeae485b56a7dc","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            (de)serializing. False to set an unavailable field to appropriate"},{"line_number":114,"context_line":"            values; set this to False for DB interactions."},{"line_number":115,"context_line":"        \"\"\""},{"line_number":116,"context_line":"        if target_version \u003e\u003d min_version:"},{"line_number":117,"context_line":"            # Target version supports this field. Set it to its default value"},{"line_number":118,"context_line":"            # if it is not present."},{"line_number":119,"context_line":"            if not self.obj_attr_is_set(field):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_aee01dce","line":116,"range":{"start_line":116,"start_character":26,"end_line":116,"end_character":28},"in_reply_to":"1f1a1f67_a18dd52b","updated":"2017-07-20 14:28:31.000000000","message":"Ah, my first thought is totally wrong :(","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"439a4f41970c035a63222342b6784d2aa5ce2585","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            (de)serializing. False to set an unavailable field to appropriate"},{"line_number":114,"context_line":"            values; set this to False for DB interactions."},{"line_number":115,"context_line":"        \"\"\""},{"line_number":116,"context_line":"        if target_version \u003e\u003d min_version:"},{"line_number":117,"context_line":"            # Target version supports this field. Set it to its default value"},{"line_number":118,"context_line":"            # if it is not present."},{"line_number":119,"context_line":"            if not self.obj_attr_is_set(field):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_992ec9f8","line":116,"range":{"start_line":116,"start_character":26,"end_line":116,"end_character":28},"in_reply_to":"1f1a1f67_aee01dce","updated":"2017-07-20 14:41:08.000000000","message":"It\u0027s quite confusing with all these versions flying around!","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1f919cb9f01f2f252234c730fb4ba8ab48e4e4d0","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            (de)serializing. False to set an unavailable field to appropriate"},{"line_number":114,"context_line":"            values; set this to False for DB interactions."},{"line_number":115,"context_line":"        \"\"\""},{"line_number":116,"context_line":"        if target_version \u003e\u003d min_version:"},{"line_number":117,"context_line":"            # Target version supports this field. Set it to its default value"},{"line_number":118,"context_line":"            # if it is not present."},{"line_number":119,"context_line":"            if not self.obj_attr_is_set(field):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_a18dd52b","line":116,"range":{"start_line":116,"start_character":26,"end_line":116,"end_character":28},"in_reply_to":"1f1a1f67_cb4fd032","updated":"2017-07-20 13:28:28.000000000","message":"min_version is the minimum version of this object that supports the field, not the current version.\n\nWe don\u0027t need to check the current version of the object, that is done in convert_to_function().","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"}],"ironic/tests/unit/objects/test_objects.py":[{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"5e856ddd50687e7ffda7108183d8070d57820315","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        }"},{"line_number":382,"context_line":"        self._test_get_changes(target_version\u003d\u00271.4\u0027)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def test_convert_field_to_version_supported_not_set(self):"},{"line_number":385,"context_line":"        obj \u003d MyObj(self.context)"},{"line_number":386,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 5), True)"},{"line_number":387,"context_line":"        self.assertEqual(\u0027\u0027, obj.missing)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_8b2e78f8","line":384,"range":{"start_line":384,"start_character":8,"end_line":384,"end_character":55},"updated":"2017-07-20 12:07:08.000000000","message":"if we are in target version, the missing field should have a value, but there is consumption that we may have no such filed in new version, which is not appropriate IMHO.","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"657597502f568291c5efae2b07eeae485b56a7dc","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        }"},{"line_number":382,"context_line":"        self._test_get_changes(target_version\u003d\u00271.4\u0027)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def test_convert_field_to_version_supported_not_set(self):"},{"line_number":385,"context_line":"        obj \u003d MyObj(self.context)"},{"line_number":386,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 5), True)"},{"line_number":387,"context_line":"        self.assertEqual(\u0027\u0027, obj.missing)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_eef8554a","line":384,"range":{"start_line":384,"start_character":8,"end_line":384,"end_character":55},"in_reply_to":"1f1a1f67_05e5b438","updated":"2017-07-20 14:28:31.000000000","message":"the question here is related with that in base.py, so it\u0027s clerar for me now.","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1f919cb9f01f2f252234c730fb4ba8ab48e4e4d0","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        }"},{"line_number":382,"context_line":"        self._test_get_changes(target_version\u003d\u00271.4\u0027)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def test_convert_field_to_version_supported_not_set(self):"},{"line_number":385,"context_line":"        obj \u003d MyObj(self.context)"},{"line_number":386,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 5), True)"},{"line_number":387,"context_line":"        self.assertEqual(\u0027\u0027, obj.missing)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_05e5b438","line":384,"range":{"start_line":384,"start_character":8,"end_line":384,"end_character":55},"in_reply_to":"1f1a1f67_8b2e78f8","updated":"2017-07-20 13:28:28.000000000","message":"I\u0027m not sure I quite understand you here.\n\nAn object doesn\u0027t need to have all fields set. This may be the case before an object has been created in the DB. Object creation will apply default values in the DB model layer, which will later be used to populate objects.\n\nWhat we\u0027re testing here is \u0027convert a field that was introduced in version X, to version Y\u0027. It doesn\u0027t say anything about the actual current version of the object.","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"5e856ddd50687e7ffda7108183d8070d57820315","unresolved":false,"context_lines":[{"line_number":403,"context_line":"    def test_convert_field_to_version_unsupported_set_remove(self):"},{"line_number":404,"context_line":"        obj \u003d MyObj(self.context)"},{"line_number":405,"context_line":"        obj.missing \u003d \u0027something\u0027"},{"line_number":406,"context_line":"        obj.obj_reset_changes()"},{"line_number":407,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 4), True)"},{"line_number":408,"context_line":"        self.assertNotIn(\u0027missing\u0027, obj)"},{"line_number":409,"context_line":"        self.assertEqual({}, obj.obj_get_changes())"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_263f9bb6","line":406,"range":{"start_line":406,"start_character":12,"end_line":406,"end_character":29},"updated":"2017-07-20 12:07:08.000000000","message":"is it deliberately to reset changes? I don\u0027t understand your intention here.","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"ae6eba13bd39b33d68cce678f0d93d1238f221db","unresolved":false,"context_lines":[{"line_number":403,"context_line":"    def test_convert_field_to_version_unsupported_set_remove(self):"},{"line_number":404,"context_line":"        obj \u003d MyObj(self.context)"},{"line_number":405,"context_line":"        obj.missing \u003d \u0027something\u0027"},{"line_number":406,"context_line":"        obj.obj_reset_changes()"},{"line_number":407,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 4), True)"},{"line_number":408,"context_line":"        self.assertNotIn(\u0027missing\u0027, obj)"},{"line_number":409,"context_line":"        self.assertEqual({}, obj.obj_get_changes())"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_7ab4fbf2","line":406,"range":{"start_line":406,"start_character":12,"end_line":406,"end_character":29},"in_reply_to":"1f1a1f67_19ff5935","updated":"2017-07-20 15:42:24.000000000","message":"Okay, if that\u0027s what you want to. I just feel the assignment is not needed if you will reset it.","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1f919cb9f01f2f252234c730fb4ba8ab48e4e4d0","unresolved":false,"context_lines":[{"line_number":403,"context_line":"    def test_convert_field_to_version_unsupported_set_remove(self):"},{"line_number":404,"context_line":"        obj \u003d MyObj(self.context)"},{"line_number":405,"context_line":"        obj.missing \u003d \u0027something\u0027"},{"line_number":406,"context_line":"        obj.obj_reset_changes()"},{"line_number":407,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 4), True)"},{"line_number":408,"context_line":"        self.assertNotIn(\u0027missing\u0027, obj)"},{"line_number":409,"context_line":"        self.assertEqual({}, obj.obj_get_changes())"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_c1ee91b3","line":406,"range":{"start_line":406,"start_character":12,"end_line":406,"end_character":29},"in_reply_to":"1f1a1f67_263f9bb6","updated":"2017-07-20 13:28:28.000000000","message":"Yes, I\u0027m resetting changes so that the \u0027missing\u0027 field doesn\u0027t initially appear in obj.obj_get_changes(). Then I can check changes introduced by convert_field_to_version().","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"439a4f41970c035a63222342b6784d2aa5ce2585","unresolved":false,"context_lines":[{"line_number":403,"context_line":"    def test_convert_field_to_version_unsupported_set_remove(self):"},{"line_number":404,"context_line":"        obj \u003d MyObj(self.context)"},{"line_number":405,"context_line":"        obj.missing \u003d \u0027something\u0027"},{"line_number":406,"context_line":"        obj.obj_reset_changes()"},{"line_number":407,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 4), True)"},{"line_number":408,"context_line":"        self.assertNotIn(\u0027missing\u0027, obj)"},{"line_number":409,"context_line":"        self.assertEqual({}, obj.obj_get_changes())"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_19ff5935","line":406,"range":{"start_line":406,"start_character":12,"end_line":406,"end_character":29},"in_reply_to":"1f1a1f67_8e120162","updated":"2017-07-20 14:41:08.000000000","message":"The oslo versioned objects track the changes that have been made to them since they were last reset. This allows us to efficiently initialise an object from a DB or RPC, reset its changes, then pass to an application handler function. Whatever changes the function makes will be tracked by the object and are available in e.g. obj.obj_what_changed(). If we want to e.g. save the object back to the DB, we only need to save the changed fields.\n\nSo here, I want to model a scenario where the object initially has missing\u003d\u0027something\u0027, then track the changes from that point.","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"657597502f568291c5efae2b07eeae485b56a7dc","unresolved":false,"context_lines":[{"line_number":403,"context_line":"    def test_convert_field_to_version_unsupported_set_remove(self):"},{"line_number":404,"context_line":"        obj \u003d MyObj(self.context)"},{"line_number":405,"context_line":"        obj.missing \u003d \u0027something\u0027"},{"line_number":406,"context_line":"        obj.obj_reset_changes()"},{"line_number":407,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 4), True)"},{"line_number":408,"context_line":"        self.assertNotIn(\u0027missing\u0027, obj)"},{"line_number":409,"context_line":"        self.assertEqual({}, obj.obj_get_changes())"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_8e120162","line":406,"range":{"start_line":406,"start_character":12,"end_line":406,"end_character":29},"in_reply_to":"1f1a1f67_c1ee91b3","updated":"2017-07-20 14:28:31.000000000","message":"Sorry I still can\u0027t catch up, if we reset the changes here, why bother setting at L405?","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"5e856ddd50687e7ffda7108183d8070d57820315","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        obj.missing \u003d \u0027something\u0027"},{"line_number":406,"context_line":"        obj.obj_reset_changes()"},{"line_number":407,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 4), True)"},{"line_number":408,"context_line":"        self.assertNotIn(\u0027missing\u0027, obj)"},{"line_number":409,"context_line":"        self.assertEqual({}, obj.obj_get_changes())"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def test_convert_field_to_version_unsupported_set_no_remove_non_default("}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_cb29109c","line":408,"range":{"start_line":408,"start_character":8,"end_line":408,"end_character":40},"updated":"2017-07-20 12:07:08.000000000","message":"it\u0027s strange, obj is not enumeratable i think","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"657597502f568291c5efae2b07eeae485b56a7dc","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        obj.missing \u003d \u0027something\u0027"},{"line_number":406,"context_line":"        obj.obj_reset_changes()"},{"line_number":407,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 4), True)"},{"line_number":408,"context_line":"        self.assertNotIn(\u0027missing\u0027, obj)"},{"line_number":409,"context_line":"        self.assertEqual({}, obj.obj_get_changes())"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def test_convert_field_to_version_unsupported_set_no_remove_non_default("}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_0e7f11ac","line":408,"range":{"start_line":408,"start_character":8,"end_line":408,"end_character":40},"in_reply_to":"1f1a1f67_21cae54e","updated":"2017-07-20 14:28:31.000000000","message":"cool","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1f919cb9f01f2f252234c730fb4ba8ab48e4e4d0","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        obj.missing \u003d \u0027something\u0027"},{"line_number":406,"context_line":"        obj.obj_reset_changes()"},{"line_number":407,"context_line":"        obj.convert_field_to_version(\u0027missing\u0027, \u0027\u0027, (1, 5), (1, 4), True)"},{"line_number":408,"context_line":"        self.assertNotIn(\u0027missing\u0027, obj)"},{"line_number":409,"context_line":"        self.assertEqual({}, obj.obj_get_changes())"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def test_convert_field_to_version_unsupported_set_no_remove_non_default("}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_21cae54e","line":408,"range":{"start_line":408,"start_character":8,"end_line":408,"end_character":40},"in_reply_to":"1f1a1f67_cb29109c","updated":"2017-07-20 13:28:28.000000000","message":"MyObj inherits from object_base.VersionedObjectDictCompat which allows you to use it like a dict.","commit_id":"9b36dcf0f2ab79cd9d44e143ca8f9514eaf7b70f"}]}
