)]}'
{"ironic/api/controllers/v1/port.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1d0719bc7b6e0956bb3bd440f10ba8f54ea6d127","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def __init__(self, **kwargs):"},{"line_number":91,"context_line":"        self.fields \u003d []"},{"line_number":92,"context_line":"        fields \u003d list(objects.Port.fields.keys())"},{"line_number":93,"context_line":"        # NOTE(lucasagomes): node_uuid is not part of objects.Port.fields"},{"line_number":94,"context_line":"        #                    because it\u0027s an API-only attribute"},{"line_number":95,"context_line":"        fields.append(\u0027node_uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_873c4731","side":"PARENT","line":92,"updated":"2014-11-01 23:22:45.000000000","message":"please do not change, this is for py3k compatibility. you may change to\n\n fields \u003d list(objects.Port.fields)\n\nthough","commit_id":"9cee24e257031c74afcbc9e37c0b705240e9b399"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9f5a5ea8ca0ff024e5931da605e90f8eeb61eae9","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def __init__(self, **kwargs):"},{"line_number":91,"context_line":"        self.fields \u003d []"},{"line_number":92,"context_line":"        fields \u003d list(objects.Port.fields.keys())"},{"line_number":93,"context_line":"        # NOTE(lucasagomes): node_uuid is not part of objects.Port.fields"},{"line_number":94,"context_line":"        #                    because it\u0027s an API-only attribute"},{"line_number":95,"context_line":"        fields.append(\u0027node_uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_c60c8a45","side":"PARENT","line":92,"in_reply_to":"7a8c0949_873c4731","updated":"2014-11-03 13:43:26.000000000","message":"Done","commit_id":"9cee24e257031c74afcbc9e37c0b705240e9b399"}],"ironic/tests/api/v1/test_chassis.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1d0719bc7b6e0956bb3bd440f10ba8f54ea6d127","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        self.assertIsNotNone(response.location)"},{"line_number":407,"context_line":"        expected_location \u003d \u0027/v1/chassis/%s\u0027 % cdict[\u0027uuid\u0027]"},{"line_number":408,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":409,"context_line":"                         expected_location)"},{"line_number":410,"context_line":"        self.assertEqual(1, mock_as_dict.call_count)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_c7464fbf","line":409,"updated":"2014-11-01 23:22:45.000000000","message":"nit:\n\n self.assertEqual(expected_location, urlparse.urlparse(response.location).path)\n\n(different order preferred)","commit_id":"c889d5f92736974a1f1583739c0b85431b53f5c9"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9f5a5ea8ca0ff024e5931da605e90f8eeb61eae9","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        self.assertIsNotNone(response.location)"},{"line_number":407,"context_line":"        expected_location \u003d \u0027/v1/chassis/%s\u0027 % cdict[\u0027uuid\u0027]"},{"line_number":408,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":409,"context_line":"                         expected_location)"},{"line_number":410,"context_line":"        self.assertEqual(1, mock_as_dict.call_count)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_e607c61b","line":409,"in_reply_to":"7a8c0949_c7464fbf","updated":"2014-11-03 13:43:26.000000000","message":"Done","commit_id":"c889d5f92736974a1f1583739c0b85431b53f5c9"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d638ecdf749b99784964dc0577f34ebee2770c11","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        mock_chassis_init.side_effect \u003d init_replacement"},{"line_number":311,"context_line":"        chassis \u003d obj_utils.get_test_chassis(self.context)"},{"line_number":312,"context_line":"        response \u003d self.patch_json(\u0027/chassis/%s\u0027 % chassis.uuid,"},{"line_number":313,"context_line":"                                   [{\u0027path\u0027: \u0027/description\u0027, \u0027op\u0027: \u0027remove\u0027}])"},{"line_number":314,"context_line":"        self.assertEqual(\u0027application/json\u0027, response.content_type)"},{"line_number":315,"context_line":"        self.assertEqual(200, response.status_int)"},{"line_number":316,"context_line":"        self.assertEqual(2, mock_chassis_init.call_count)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_00c4eb3e","line":313,"updated":"2014-11-10 09:35:37.000000000","message":"the problem with tests is that they\u0027re not unit tests. you\u0027re testing __init__ function but you\u0027re calling patch_json. if you switch to directly testing a calling __init__ (and as_dict below), you won\u0027t need to do the replacement","commit_id":"48f3d583cbe3bd7b169e0a90ef96ae4fe7fa6092"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8659d308903b166509742867002f258a212241ff","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        mock_chassis_init.side_effect \u003d init_replacement"},{"line_number":311,"context_line":"        chassis \u003d obj_utils.get_test_chassis(self.context)"},{"line_number":312,"context_line":"        response \u003d self.patch_json(\u0027/chassis/%s\u0027 % chassis.uuid,"},{"line_number":313,"context_line":"                                   [{\u0027path\u0027: \u0027/description\u0027, \u0027op\u0027: \u0027remove\u0027}])"},{"line_number":314,"context_line":"        self.assertEqual(\u0027application/json\u0027, response.content_type)"},{"line_number":315,"context_line":"        self.assertEqual(200, response.status_int)"},{"line_number":316,"context_line":"        self.assertEqual(2, mock_chassis_init.call_count)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_ea225500","line":313,"in_reply_to":"5a890539_00c4eb3e","updated":"2014-11-10 14:05:41.000000000","message":"Right, but I was trying to both test __init__ and ensure that it doesn\u0027t break patching and posting.","commit_id":"48f3d583cbe3bd7b169e0a90ef96ae4fe7fa6092"}],"ironic/tests/api/v1/test_nodes.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1d0719bc7b6e0956bb3bd440f10ba8f54ea6d127","unresolved":false,"context_lines":[{"line_number":971,"context_line":"        self.assertIsNotNone(response.location)"},{"line_number":972,"context_line":"        expected_location \u003d \u0027/v1/nodes/%s\u0027 % ndict[\u0027uuid\u0027]"},{"line_number":973,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":974,"context_line":"                         expected_location)"},{"line_number":975,"context_line":"        self.assertEqual(1, mock_as_dict.call_count)"},{"line_number":976,"context_line":""},{"line_number":977,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_e7126bb3","line":974,"updated":"2014-11-01 23:22:45.000000000","message":"ditto","commit_id":"c889d5f92736974a1f1583739c0b85431b53f5c9"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9f5a5ea8ca0ff024e5931da605e90f8eeb61eae9","unresolved":false,"context_lines":[{"line_number":971,"context_line":"        self.assertIsNotNone(response.location)"},{"line_number":972,"context_line":"        expected_location \u003d \u0027/v1/nodes/%s\u0027 % ndict[\u0027uuid\u0027]"},{"line_number":973,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":974,"context_line":"                         expected_location)"},{"line_number":975,"context_line":"        self.assertEqual(1, mock_as_dict.call_count)"},{"line_number":976,"context_line":""},{"line_number":977,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_0607721d","line":974,"in_reply_to":"7a8c0949_e7126bb3","updated":"2014-11-03 13:43:26.000000000","message":"Done","commit_id":"c889d5f92736974a1f1583739c0b85431b53f5c9"}],"ironic/tests/api/v1/test_ports.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1d0719bc7b6e0956bb3bd440f10ba8f54ea6d127","unresolved":false,"context_lines":[{"line_number":661,"context_line":"        self.assertIsNotNone(response.location)"},{"line_number":662,"context_line":"        expected_location \u003d \u0027/v1/ports/%s\u0027 % pdict[\u0027uuid\u0027]"},{"line_number":663,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":664,"context_line":"                         expected_location)"},{"line_number":665,"context_line":"        self.assertEqual(1, mock_as_dict.call_count)"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_071857d2","line":664,"updated":"2014-11-01 23:22:45.000000000","message":"ditto","commit_id":"c889d5f92736974a1f1583739c0b85431b53f5c9"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9f5a5ea8ca0ff024e5931da605e90f8eeb61eae9","unresolved":false,"context_lines":[{"line_number":661,"context_line":"        self.assertIsNotNone(response.location)"},{"line_number":662,"context_line":"        expected_location \u003d \u0027/v1/ports/%s\u0027 % pdict[\u0027uuid\u0027]"},{"line_number":663,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":664,"context_line":"                         expected_location)"},{"line_number":665,"context_line":"        self.assertEqual(1, mock_as_dict.call_count)"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8c0949_2602ae0b","line":664,"in_reply_to":"7a8c0949_071857d2","updated":"2014-11-03 13:43:26.000000000","message":"Done","commit_id":"c889d5f92736974a1f1583739c0b85431b53f5c9"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4ab680627801c0accc1b1b787367b3bd5a90180f","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        port_dict \u003d apiutils.port_post_data(node_id\u003dNone)"},{"line_number":52,"context_line":"        del port_dict[\u0027extra\u0027]"},{"line_number":53,"context_line":"        port \u003d api_port.Port(**port_dict)"},{"line_number":54,"context_line":"        self.assertEqual(wtypes.Unset, port.extra)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class TestListPorts(api_base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a890539_31fd833b","line":54,"updated":"2014-11-12 10:49:06.000000000","message":"It kinda worried me a bit because \u0027extra\u0027 if not set should be an empty dictionary. That said I did some tests locally deleting the extra attribute via api etc... And it works fine, the dict_or_none() from objects should take care of dictfy it correctly.","commit_id":"645072bfa3da8c63b6e469021db334b8d7586416"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7db375693b1a4d623bed49f53e3cfa83278d70b2","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        port_dict \u003d apiutils.port_post_data(node_id\u003dNone)"},{"line_number":52,"context_line":"        del port_dict[\u0027extra\u0027]"},{"line_number":53,"context_line":"        port \u003d api_port.Port(**port_dict)"},{"line_number":54,"context_line":"        self.assertEqual(wtypes.Unset, port.extra)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class TestListPorts(api_base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a890539_bdace2a1","line":54,"in_reply_to":"5a890539_31fd833b","updated":"2014-11-12 12:42:11.000000000","message":"Yup, that was another option - not to add check to patch, but check if the value is Unset in all objects/utils converters.","commit_id":"645072bfa3da8c63b6e469021db334b8d7586416"}]}
