)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"0aef56c0b1ff1b84e265ebd7c73bc2efc8847b32","unresolved":false,"context_lines":[{"line_number":13,"context_line":"value, however, it\u0027s not possible to delete that or set it to null."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change the behavior to allow having nulls in extra properties."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-bug: #1560354"},{"line_number":18,"context_line":"Change-Id: I70a9018b39eb973a787fcf94516445be0bacfbad"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"fa6399be_3c2b3d35","line":16,"updated":"2016-10-18 08:24:07.000000000","message":"please add yourself here as the co-author, or even feel free to change the patch author.","commit_id":"d49b6761488846671b22d68ef3ac04027d6a2005"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"e283821f772ce0d5e151469c00a5e9ef230948c4","unresolved":false,"context_lines":[{"line_number":13,"context_line":"value, however, it\u0027s not possible to delete that or set it to null."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change the behavior to allow having nulls in extra properties."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-bug: #1560354"},{"line_number":18,"context_line":"Change-Id: I70a9018b39eb973a787fcf94516445be0bacfbad"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"fa6399be_b0168c53","line":16,"in_reply_to":"fa6399be_3c2b3d35","updated":"2016-10-18 10:08:01.000000000","message":"Done. Thanks for the original patch!","commit_id":"d49b6761488846671b22d68ef3ac04027d6a2005"}],"keystoneclient/base.py":[{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"f1d8622e7483d5346dd87f6bb7e3bdd4874b0304","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def filter_none(**kwargs):"},{"line_number":53,"context_line":"    \"\"\"Remove any null entries that are contained in the required_properties."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    If the required_properties is None, remove all the null values."},{"line_number":56,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_dcc193e5","line":53,"range":{"start_line":53,"start_character":18,"end_line":53,"end_character":22},"updated":"2016-10-17 08:20:03.000000000","message":"Just curious, is \"null entries\" an official term? Because from the code below it looks like we are removing None entities, which are not null by any means. Also it is not immediately clear why something is removed from required_properties, since the name suggests that such properties are required i.e. have to be set, even to None, right? I suggest expanding the docstring or picking a more descriptive name.","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"406a9fbedfe59f49584272febe259245c52576bd","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def filter_none(**kwargs):"},{"line_number":53,"context_line":"    \"\"\"Remove any null entries that are contained in the required_properties."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    If the required_properties is None, remove all the null values."},{"line_number":56,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_fffb7745","line":53,"range":{"start_line":53,"start_character":18,"end_line":53,"end_character":22},"in_reply_to":"fa6399be_993ffbd5","updated":"2016-10-18 08:59:11.000000000","message":"Well, it is hard to pick a name both descriptive and of reasonable length. I suggest adding another sentence to the docstring describing this argument. Something like \"required_properties are those which must be set to some value other than None.\"","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"9388c6e522de3fa2619694b89378b2c90c074921","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def filter_none(**kwargs):"},{"line_number":53,"context_line":"    \"\"\"Remove any null entries that are contained in the required_properties."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    If the required_properties is None, remove all the null values."},{"line_number":56,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_993ffbd5","line":53,"range":{"start_line":53,"start_character":18,"end_line":53,"end_character":22},"in_reply_to":"fa6399be_dcc193e5","updated":"2016-10-18 08:11:41.000000000","message":"I guess \u0027null\u0027 here comes from the representation layer (as it\u0027s \u0027null\u0027 in JSON, not None). But as we\u0027re not working with representation layer here, you\u0027re right, it should be None, not \u0027null\u0027. Fixed that.\n\nAs for \u0027required_properties\u0027 name, I guess the original idea is \"required to be not none\". I\u0027m not sure what another name would be better, \"not_none_properties\"?","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"f1d8622e7483d5346dd87f6bb7e3bdd4874b0304","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    If the required_properties is None, remove all the null values."},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    required_properties \u003d kwargs.pop(\u0027required_properties\u0027, [])"},{"line_number":58,"context_line":"    return dict((k, v) for k, v in six.iteritems(kwargs) if ("},{"line_number":59,"context_line":"        v is not None or (required_properties and k not in required_properties)"},{"line_number":60,"context_line":"    ))"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_9ca47b4b","line":57,"range":{"start_line":57,"start_character":26,"end_line":57,"end_character":63},"updated":"2016-10-17 08:20:03.000000000","message":"According to the docstring required_properties must be None to remove everything. Why kwargs.pop returns [] on KeyError instead of None?","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"9388c6e522de3fa2619694b89378b2c90c074921","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    If the required_properties is None, remove all the null values."},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    required_properties \u003d kwargs.pop(\u0027required_properties\u0027, [])"},{"line_number":58,"context_line":"    return dict((k, v) for k, v in six.iteritems(kwargs) if ("},{"line_number":59,"context_line":"        v is not None or (required_properties and k not in required_properties)"},{"line_number":60,"context_line":"    ))"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_b924bfc6","line":57,"range":{"start_line":57,"start_character":26,"end_line":57,"end_character":63},"in_reply_to":"fa6399be_9ca47b4b","updated":"2016-10-18 08:11:41.000000000","message":"Done","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"f1d8622e7483d5346dd87f6bb7e3bdd4874b0304","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    If the required_properties is None, remove all the null values."},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    required_properties \u003d kwargs.pop(\u0027required_properties\u0027, [])"},{"line_number":58,"context_line":"    return dict((k, v) for k, v in six.iteritems(kwargs) if ("},{"line_number":59,"context_line":"        v is not None or (required_properties and k not in required_properties)"},{"line_number":60,"context_line":"    ))"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_3c7a8fbd","line":58,"range":{"start_line":58,"start_character":4,"end_line":58,"end_character":61},"updated":"2016-10-17 08:20:03.000000000","message":"I would have rearranged dictionary building. It seems to be a bit hard to comprehend.","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"9388c6e522de3fa2619694b89378b2c90c074921","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    If the required_properties is None, remove all the null values."},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    required_properties \u003d kwargs.pop(\u0027required_properties\u0027, [])"},{"line_number":58,"context_line":"    return dict((k, v) for k, v in six.iteritems(kwargs) if ("},{"line_number":59,"context_line":"        v is not None or (required_properties and k not in required_properties)"},{"line_number":60,"context_line":"    ))"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_d92173b6","line":58,"range":{"start_line":58,"start_character":4,"end_line":58,"end_character":61},"in_reply_to":"fa6399be_3c7a8fbd","updated":"2016-10-18 08:11:41.000000000","message":"Done","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"f1d8622e7483d5346dd87f6bb7e3bdd4874b0304","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    required_properties \u003d kwargs.pop(\u0027required_properties\u0027, [])"},{"line_number":58,"context_line":"    return dict((k, v) for k, v in six.iteritems(kwargs) if ("},{"line_number":59,"context_line":"        v is not None or (required_properties and k not in required_properties)"},{"line_number":60,"context_line":"    ))"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_9c7b9bbd","line":59,"range":{"start_line":59,"start_character":25,"end_line":59,"end_character":45},"updated":"2016-10-17 08:20:03.000000000","message":"A nitpick. If as per docstring required_properties is None then this check should be done explicitly against None. Alternatively an empty iterable could have been used.","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"9388c6e522de3fa2619694b89378b2c90c074921","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    required_properties \u003d kwargs.pop(\u0027required_properties\u0027, [])"},{"line_number":58,"context_line":"    return dict((k, v) for k, v in six.iteritems(kwargs) if ("},{"line_number":59,"context_line":"        v is not None or (required_properties and k not in required_properties)"},{"line_number":60,"context_line":"    ))"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_f92e37a4","line":59,"range":{"start_line":59,"start_character":25,"end_line":59,"end_character":45},"in_reply_to":"fa6399be_9c7b9bbd","updated":"2016-10-18 08:11:41.000000000","message":"Done","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"}],"keystoneclient/tests/unit/test_base.py":[{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"f1d8622e7483d5346dd87f6bb7e3bdd4874b0304","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                         \u0027extra_property1\u0027: None, \u0027extra_property2\u0027: \u0027test2\u0027}"},{"line_number":213,"context_line":"        self.assertEqual(expect_result, result)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        result_without_required_properties \u003d test(project_id\u003dp_id,"},{"line_number":216,"context_line":"                                                  domain_id\u003dNone, name\u003d\u0027test1\u0027,"},{"line_number":217,"context_line":"                                                  extra_property1\u003dNone,"},{"line_number":218,"context_line":"                                                  extra_property2\u003d\u0027test2\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_bc33ff12","line":215,"range":{"start_line":215,"start_character":7,"end_line":215,"end_character":49},"updated":"2016-10-17 08:20:03.000000000","message":"This looks like a separate test-case. Probably it is not a good idea to bundle several test-cases in one. I suggest splitting this test.","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"9388c6e522de3fa2619694b89378b2c90c074921","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                         \u0027extra_property1\u0027: None, \u0027extra_property2\u0027: \u0027test2\u0027}"},{"line_number":213,"context_line":"        self.assertEqual(expect_result, result)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        result_without_required_properties \u003d test(project_id\u003dp_id,"},{"line_number":216,"context_line":"                                                  domain_id\u003dNone, name\u003d\u0027test1\u0027,"},{"line_number":217,"context_line":"                                                  extra_property1\u003dNone,"},{"line_number":218,"context_line":"                                                  extra_property2\u003d\u0027test2\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_79b5c77c","line":215,"range":{"start_line":215,"start_character":7,"end_line":215,"end_character":49},"in_reply_to":"fa6399be_bc33ff12","updated":"2016-10-18 08:11:41.000000000","message":"Done","commit_id":"1c300d6d1e51e23a3810384c0bae104755a06564"}]}
