)]}'
{"nova/network/neutronv2/api.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"de82661d35fbb77d67a93281aa032a0b9ec86083","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"bff0334d_afb9a915","updated":"2017-04-10 16:43:36.000000000","message":"This should really be part of the previous change","commit_id":"e86a2e06421ab573717ccfaf8e44f36f50e32384"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c4f02cf834198e014947963b4f5516b728788101","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"bff0334d_8e1900d8","in_reply_to":"bff0334d_afb9a915","updated":"2017-04-12 12:08:51.000000000","message":"Yes, I\u0027ll submit this in the previous one","commit_id":"e86a2e06421ab573717ccfaf8e44f36f50e32384"}],"nova/objects/fields.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70fb5341c206a1bfc6a3e000073acfac5881a1f9","unresolved":false,"context_lines":[{"line_number":1200,"context_line":"                     nullable\u003dTrue)"},{"line_number":1201,"context_line":""},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"class ListOfDictOfNullableStringsOrListField(AutoTypedField):"},{"line_number":1204,"context_line":"    AUTO_TYPE \u003d List(DictOfNullableStringsOrListField(),"},{"line_number":1205,"context_line":"                     nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff73747_9879c830","line":1203,"range":{"start_line":1203,"start_character":6,"end_line":1203,"end_character":44},"updated":"2017-04-26 11:08:07.000000000","message":":O\n\nSo...\n\n  [{\u0027test1\u0027: None, \u0027test2\u0027: \u0027foo\u0027, \u0027test3\u0027: [\u0027bar\u0027]}]\n\n??","commit_id":"b3c2eac5c6d1d6dc5ed1db69013f11f3fb5612de"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"367758ee6f518b1b2af11bff6490c1f66dc24d32","unresolved":false,"context_lines":[{"line_number":1200,"context_line":"                     nullable\u003dTrue)"},{"line_number":1201,"context_line":""},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"class ListOfDictOfNullableStringsOrListField(AutoTypedField):"},{"line_number":1204,"context_line":"    AUTO_TYPE \u003d List(DictOfNullableStringsOrListField(),"},{"line_number":1205,"context_line":"                     nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff73747_f83b2ce8","line":1203,"range":{"start_line":1203,"start_character":6,"end_line":1203,"end_character":44},"in_reply_to":"5ff73747_9879c830","updated":"2017-04-26 11:51:13.000000000","message":"Yes, that\u0027s correct","commit_id":"b3c2eac5c6d1d6dc5ed1db69013f11f3fb5612de"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70fb5341c206a1bfc6a3e000073acfac5881a1f9","unresolved":false,"context_lines":[{"line_number":1200,"context_line":"                     nullable\u003dTrue)"},{"line_number":1201,"context_line":""},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"class ListOfDictOfNullableStringsOrListField(AutoTypedField):"},{"line_number":1204,"context_line":"    AUTO_TYPE \u003d List(DictOfNullableStringsOrListField(),"},{"line_number":1205,"context_line":"                     nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff73747_78227c02","line":1205,"range":{"start_line":1203,"start_character":0,"end_line":1205,"end_character":35},"updated":"2017-04-26 11:08:07.000000000","message":"Isn\u0027t this unused?","commit_id":"b3c2eac5c6d1d6dc5ed1db69013f11f3fb5612de"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"367758ee6f518b1b2af11bff6490c1f66dc24d32","unresolved":false,"context_lines":[{"line_number":1200,"context_line":"                     nullable\u003dTrue)"},{"line_number":1201,"context_line":""},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"class ListOfDictOfNullableStringsOrListField(AutoTypedField):"},{"line_number":1204,"context_line":"    AUTO_TYPE \u003d List(DictOfNullableStringsOrListField(),"},{"line_number":1205,"context_line":"                     nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff73747_db73cab0","line":1205,"range":{"start_line":1203,"start_character":0,"end_line":1205,"end_character":35},"in_reply_to":"5ff73747_78227c02","updated":"2017-04-26 11:51:13.000000000","message":"Yes, I divided the original one (L1197 base patch) in:\n\nDictOfNullableStringsOrListField: used in [1]\nListOfDictOfNullableStringsOrListField: used in [2]\n\n[1] https://review.openstack.org/#/c/451777/6/nova/objects/pci_device_pool.py@39\n[2] (previous patch) https://review.openstack.org/#/c/449257/16/nova/objects/instance_pci_requests.py@34","commit_id":"b3c2eac5c6d1d6dc5ed1db69013f11f3fb5612de"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f246b6149aee57174d96d9fbfed7cf4895df6865","unresolved":false,"context_lines":[{"line_number":1217,"context_line":"                     nullable\u003dTrue)"},{"line_number":1218,"context_line":""},{"line_number":1219,"context_line":""},{"line_number":1220,"context_line":"class ListOfDictOfNullableStringsOrListField(AutoTypedField):"},{"line_number":1221,"context_line":"    AUTO_TYPE \u003d List(DictOfNullableStringsOrListField(),"},{"line_number":1222,"context_line":"                     nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5ff73747_ba14664f","line":1220,"range":{"start_line":1220,"start_character":6,"end_line":1220,"end_character":44},"updated":"2017-04-26 19:32:48.000000000","message":"discriptive but does pep8 enforce max classnames at some point\nit feels like we are getting close with this one.","commit_id":"a04eafe68405bc76fb658ebe26433c676d0b9f5f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"29883dca83fdaf5223893deba6da3e0a341e388a","unresolved":false,"context_lines":[{"line_number":1217,"context_line":"                     nullable\u003dTrue)"},{"line_number":1218,"context_line":""},{"line_number":1219,"context_line":""},{"line_number":1220,"context_line":"class ListOfDictOfNullableStringsOrListField(AutoTypedField):"},{"line_number":1221,"context_line":"    AUTO_TYPE \u003d List(DictOfNullableStringsOrListField(),"},{"line_number":1222,"context_line":"                     nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5ff73747_caecf290","line":1220,"range":{"start_line":1220,"start_character":6,"end_line":1220,"end_character":44},"in_reply_to":"5ff73747_ba14664f","updated":"2017-04-27 08:04:15.000000000","message":"There is no problem (so far) in PEP8 with the name of this class.\n\nYes, descriptive but veeeery long.","commit_id":"a04eafe68405bc76fb658ebe26433c676d0b9f5f"}],"nova/objects/objects.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8b446e3581475f667e57072340e47679cbbb1c51","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"1f1a1f67_4503ac43","updated":"2017-07-12 15:46:09.000000000","message":"what\u0027s this? :)","commit_id":"094f5063996532def22f5312972eac0701772790"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"030943cbdcc6fd2cae64936dfd832833429d91e1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"1f1a1f67_8e98c16a","in_reply_to":"1f1a1f67_4503ac43","updated":"2017-07-12 16:23:46.000000000","message":"I don\u0027t know why I changed the file mode..... My bad!","commit_id":"094f5063996532def22f5312972eac0701772790"}],"nova/objects/pci_device_pool.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70fb5341c206a1bfc6a3e000073acfac5881a1f9","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    # Version 1.0: Initial version"},{"line_number":82,"context_line":"    #              PciDevicePool \u003c\u003d 1.0"},{"line_number":83,"context_line":"    # Version 1.1: PciDevicePool version 1.1"},{"line_number":84,"context_line":"    # Version 1.2: PciDevicePool version 1.2"},{"line_number":85,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":86,"context_line":"    fields \u003d {"},{"line_number":87,"context_line":"             \u0027objects\u0027: fields.ListOfObjectsField(\u0027PciDevicePool\u0027),"},{"line_number":88,"context_line":"             }"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff73747_182ff8f6","line":85,"range":{"start_line":84,"start_character":0,"end_line":85,"end_character":19},"updated":"2017-04-26 11:08:07.000000000","message":"I don\u0027t think we need to bump the version of a parent object any more. I could be wrong though. Maybe ask jaypipes/dansmith","commit_id":"b3c2eac5c6d1d6dc5ed1db69013f11f3fb5612de"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"367758ee6f518b1b2af11bff6490c1f66dc24d32","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    # Version 1.0: Initial version"},{"line_number":82,"context_line":"    #              PciDevicePool \u003c\u003d 1.0"},{"line_number":83,"context_line":"    # Version 1.1: PciDevicePool version 1.1"},{"line_number":84,"context_line":"    # Version 1.2: PciDevicePool version 1.2"},{"line_number":85,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":86,"context_line":"    fields \u003d {"},{"line_number":87,"context_line":"             \u0027objects\u0027: fields.ListOfObjectsField(\u0027PciDevicePool\u0027),"},{"line_number":88,"context_line":"             }"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff73747_7b0396b9","line":85,"range":{"start_line":84,"start_character":0,"end_line":85,"end_character":19},"in_reply_to":"5ff73747_182ff8f6","updated":"2017-04-26 11:51:13.000000000","message":"I did that and it\u0027s no needed. I\u0027ll remove it.","commit_id":"b3c2eac5c6d1d6dc5ed1db69013f11f3fb5612de"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbc72473dfc86565b10947ae41bca2f375ad90be","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \u0027tag_dict\u0027: fields.DictOfNullableStringsField(),"},{"line_number":36,"context_line":"    }"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def create(cls, data):"},{"line_number":40,"context_line":"        \"\"\"Create a PCI request spec object."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        As the device object is just created and is not synced with db yet"},{"line_number":43,"context_line":"        thus we should not reset changes here for fields from dict."},{"line_number":44,"context_line":"        \"\"\""},{"line_number":45,"context_line":"        msg \u003d \u0027Value given must be a dict of lists or a dict of strings\u0027"},{"line_number":46,"context_line":"        if not isinstance(data, dict):"},{"line_number":47,"context_line":"            raise ValueError(msg)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        ret \u003d cls(None)"},{"line_number":50,"context_line":"        for key, value in data.items():"},{"line_number":51,"context_line":"            if isinstance(value, list):"},{"line_number":52,"context_line":"                ret.capabilities_network \u003d value"},{"line_number":53,"context_line":"            elif \u0027tag_dict\u0027 in ret:"},{"line_number":54,"context_line":"                ret.tag_dict[key] \u003d value"},{"line_number":55,"context_line":"            else:"},{"line_number":56,"context_line":"                setattr(ret, \u0027tag_dict\u0027, {key: value})"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return ret"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __getitem__(self, key):"},{"line_number":61,"context_line":"        if not isinstance(key, six.string_types):"}],"source_content_type":"text/x-python","patch_set":34,"id":"5f93b717_d988e072","line":58,"range":{"start_line":38,"start_character":0,"end_line":58,"end_character":18},"updated":"2018-01-25 11:35:40.000000000","message":"Same question as on the previous patch - why do we need to create things this way rather than via __init__ or whatever? Is it just a design thing?","commit_id":"8d885bed78b390822a8991fda6cb535d8106585c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e4e22fe0364d1d2bcfb1cbbfbbca8a1686f7e316","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \u0027tag_dict\u0027: fields.DictOfNullableStringsField(),"},{"line_number":36,"context_line":"    }"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def create(cls, data):"},{"line_number":40,"context_line":"        \"\"\"Create a PCI request spec object."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        As the device object is just created and is not synced with db yet"},{"line_number":43,"context_line":"        thus we should not reset changes here for fields from dict."},{"line_number":44,"context_line":"        \"\"\""},{"line_number":45,"context_line":"        msg \u003d \u0027Value given must be a dict of lists or a dict of strings\u0027"},{"line_number":46,"context_line":"        if not isinstance(data, dict):"},{"line_number":47,"context_line":"            raise ValueError(msg)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        ret \u003d cls(None)"},{"line_number":50,"context_line":"        for key, value in data.items():"},{"line_number":51,"context_line":"            if isinstance(value, list):"},{"line_number":52,"context_line":"                ret.capabilities_network \u003d value"},{"line_number":53,"context_line":"            elif \u0027tag_dict\u0027 in ret:"},{"line_number":54,"context_line":"                ret.tag_dict[key] \u003d value"},{"line_number":55,"context_line":"            else:"},{"line_number":56,"context_line":"                setattr(ret, \u0027tag_dict\u0027, {key: value})"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return ret"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __getitem__(self, key):"},{"line_number":61,"context_line":"        if not isinstance(key, six.string_types):"}],"source_content_type":"text/x-python","patch_set":34,"id":"5f93b717_471ce669","line":58,"range":{"start_line":38,"start_character":0,"end_line":58,"end_character":18},"in_reply_to":"5f93b717_d988e072","updated":"2018-01-25 13:17:43.000000000","message":"its a, i had the exact same question but rodolfo did not say in the code thing so i guessed he had a reason and followed the same pattern thing.\n\nill ask him and either add a comment as to why or just do this in the constructor.","commit_id":"8d885bed78b390822a8991fda6cb535d8106585c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbc72473dfc86565b10947ae41bca2f375ad90be","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            return self.tag_dict[key]"},{"line_number":67,"context_line":"        raise KeyError(key)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def to_dict(self):"},{"line_number":70,"context_line":"        ret \u003d {}"},{"line_number":71,"context_line":"        if \u0027tag_dict\u0027 in self:"},{"line_number":72,"context_line":"            ret.update(self.tag_dict)"},{"line_number":73,"context_line":"        if \u0027capabilities_network\u0027 in self:"},{"line_number":74,"context_line":"            ret[\u0027capabilities_network\u0027] \u003d self.capabilities_network"},{"line_number":75,"context_line":"        return ret"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":34,"id":"5f93b717_b9e87416","line":75,"range":{"start_line":69,"start_character":0,"end_line":75,"end_character":18},"updated":"2018-01-25 11:35:40.000000000","message":"Can you add bauzas\u0027 note from below about why we need this, please","commit_id":"8d885bed78b390822a8991fda6cb535d8106585c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e4e22fe0364d1d2bcfb1cbbfbbca8a1686f7e316","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            return self.tag_dict[key]"},{"line_number":67,"context_line":"        raise KeyError(key)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def to_dict(self):"},{"line_number":70,"context_line":"        ret \u003d {}"},{"line_number":71,"context_line":"        if \u0027tag_dict\u0027 in self:"},{"line_number":72,"context_line":"            ret.update(self.tag_dict)"},{"line_number":73,"context_line":"        if \u0027capabilities_network\u0027 in self:"},{"line_number":74,"context_line":"            ret[\u0027capabilities_network\u0027] \u003d self.capabilities_network"},{"line_number":75,"context_line":"        return ret"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":34,"id":"5f93b717_277bda8c","line":75,"range":{"start_line":69,"start_character":0,"end_line":75,"end_character":18},"in_reply_to":"5f93b717_b9e87416","updated":"2018-01-25 13:17:43.000000000","message":"sure :)","commit_id":"8d885bed78b390822a8991fda6cb535d8106585c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbc72473dfc86565b10947ae41bca2f375ad90be","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":96,"context_line":"        if target_version \u003c (1, 1) and \u0027numa_node\u0027 in primitive:"},{"line_number":97,"context_line":"            del primitive[\u0027numa_node\u0027]"},{"line_number":98,"context_line":"        if target_version \u003c (1, 2) and \u0027tags\u0027 in primitive:"},{"line_number":99,"context_line":"            # Everything but string values will be dropped. The \u0027tags\u0027"},{"line_number":100,"context_line":"            # field in version \u003c 1.2 is a dict of nullable strings."},{"line_number":101,"context_line":"            primitive[\u0027tags\u0027] \u003d ("},{"line_number":102,"context_line":"                primitive[\u0027tags\u0027][\u0027nova_object.data\u0027][\u0027tag_dict\u0027])"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    # NOTE(pmurray): before this object existed the pci device pool data was"},{"line_number":105,"context_line":"    # stored as a dict. For backward compatibility we need to be able to read"}],"source_content_type":"text/x-python","patch_set":34,"id":"5f93b717_394a2427","line":102,"range":{"start_line":98,"start_character":0,"end_line":102,"end_character":66},"updated":"2018-01-25 11:35:40.000000000","message":"Shouldn\u0027t this go before (1, 1) so we degrade through the various versions","commit_id":"8d885bed78b390822a8991fda6cb535d8106585c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e4e22fe0364d1d2bcfb1cbbfbbca8a1686f7e316","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":96,"context_line":"        if target_version \u003c (1, 1) and \u0027numa_node\u0027 in primitive:"},{"line_number":97,"context_line":"            del primitive[\u0027numa_node\u0027]"},{"line_number":98,"context_line":"        if target_version \u003c (1, 2) and \u0027tags\u0027 in primitive:"},{"line_number":99,"context_line":"            # Everything but string values will be dropped. The \u0027tags\u0027"},{"line_number":100,"context_line":"            # field in version \u003c 1.2 is a dict of nullable strings."},{"line_number":101,"context_line":"            primitive[\u0027tags\u0027] \u003d ("},{"line_number":102,"context_line":"                primitive[\u0027tags\u0027][\u0027nova_object.data\u0027][\u0027tag_dict\u0027])"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    # NOTE(pmurray): before this object existed the pci device pool data was"},{"line_number":105,"context_line":"    # stored as a dict. For backward compatibility we need to be able to read"}],"source_content_type":"text/x-python","patch_set":34,"id":"5f93b717_e782d24f","line":102,"range":{"start_line":98,"start_character":0,"end_line":102,"end_character":66},"in_reply_to":"5f93b717_394a2427","updated":"2018-01-25 13:17:43.000000000","message":"we will hit all of them anyway since they are chained if but yes i have seen it done that elsewhere so ill swap them.\nin this case it does not matter but i can think of times it would.","commit_id":"8d885bed78b390822a8991fda6cb535d8106585c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbc72473dfc86565b10947ae41bca2f375ad90be","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        pool.tags \u003d PciDevicePoolTags.create(pool_dict)"},{"line_number":116,"context_line":"        return pool"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    # NOTE(sbauza): Before using objects, pci stats was a list of"},{"line_number":119,"context_line":"    # dictionaries not having tags. For compatibility with other modules, let\u0027s"},{"line_number":120,"context_line":"    # create a reversible method"},{"line_number":121,"context_line":"    def to_dict(self):"},{"line_number":122,"context_line":"        pci_pool \u003d base.obj_to_primitive(self)"},{"line_number":123,"context_line":"        if pci_pool.pop(\u0027tags\u0027, None) and hasattr(self, \u0027tags\u0027):"},{"line_number":124,"context_line":"            tags \u003d self.tags.to_dict()"}],"source_content_type":"text/x-python","patch_set":34,"id":"5f93b717_196ac87f","line":121,"range":{"start_line":118,"start_character":0,"end_line":121,"end_character":22},"updated":"2018-01-25 11:35:40.000000000","message":"We really need to drop this. Then again, resource providers should make all of this unnecessary going forward so meh :)","commit_id":"8d885bed78b390822a8991fda6cb535d8106585c"}],"nova/pci/request.py":[{"author":{"_account_id":17814,"name":"fengzhr","email":"fengzhr@awcloud.com","username":"space"},"change_message_id":"a0753108cb1bb48409bfc640c2249eb4dbafdd17","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"PCI_NET_TAG \u003d \u0027physical_network\u0027"},{"line_number":56,"context_line":"PCI_DEVICE_TYPE_TAG \u003d \u0027dev_type\u0027"},{"line_number":57,"context_line":"PCI_NET_CAPABILITIES \u003d \u0027capabilities_network\u0027"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"DEVICE_TYPE_FOR_VNIC_TYPE \u003d {"},{"line_number":60,"context_line":"    network_model.VNIC_TYPE_DIRECT_PHYSICAL: obj_fields.PciDeviceType.SRIOV_PF"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfeb2761_9a21effe","line":57,"range":{"start_line":57,"start_character":0,"end_line":57,"end_character":20},"updated":"2017-04-01 02:58:25.000000000","message":"No need to change position, I think.","commit_id":"5478a907b38f83bb2b82c2aee80e565fe1e2ec02"}],"nova/pci/stats.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70fb5341c206a1bfc6a3e000073acfac5881a1f9","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                return pool"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @classmethod"},{"line_number":90,"context_line":"    def _pool_from_extra_info(self, pool, extra_info, level\u003d0):"},{"line_number":91,"context_line":"        \"\"\"Extract the information stored in pci_device.extra_info field."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        PciDevice.extra_info field is a coerced dictionary of strings. Each"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff73747_98f54886","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":29},"updated":"2017-04-26 11:08:07.000000000","message":"This name could be improved - you\u0027re not extracting a pool from extra_info, are you? You\u0027re simply parsing extra_info","commit_id":"b3c2eac5c6d1d6dc5ed1db69013f11f3fb5612de"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70fb5341c206a1bfc6a3e000073acfac5881a1f9","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                return pool"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @classmethod"},{"line_number":90,"context_line":"    def _pool_from_extra_info(self, pool, extra_info, level\u003d0):"},{"line_number":91,"context_line":"        \"\"\"Extract the information stored in pci_device.extra_info field."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        PciDevice.extra_info field is a coerced dictionary of strings. Each"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff73747_78db9c1a","line":90,"range":{"start_line":90,"start_character":54,"end_line":90,"end_character":61},"updated":"2017-04-26 11:08:07.000000000","message":"You\u0027re essentially using this as a \"do/don\u0027t extract\" flag. Maybe just use a boolean instead?","commit_id":"b3c2eac5c6d1d6dc5ed1db69013f11f3fb5612de"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"367758ee6f518b1b2af11bff6490c1f66dc24d32","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                return pool"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @classmethod"},{"line_number":90,"context_line":"    def _pool_from_extra_info(self, pool, extra_info, level\u003d0):"},{"line_number":91,"context_line":"        \"\"\"Extract the information stored in pci_device.extra_info field."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        PciDevice.extra_info field is a coerced dictionary of strings. Each"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff73747_fbb8c676","line":90,"range":{"start_line":90,"start_character":54,"end_line":90,"end_character":61},"in_reply_to":"5ff73747_78db9c1a","updated":"2017-04-26 11:51:13.000000000","message":"Yes, it\u0027s only used as a boolean variable in the first call.","commit_id":"b3c2eac5c6d1d6dc5ed1db69013f11f3fb5612de"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"367758ee6f518b1b2af11bff6490c1f66dc24d32","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                return pool"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @classmethod"},{"line_number":90,"context_line":"    def _pool_from_extra_info(self, pool, extra_info, level\u003d0):"},{"line_number":91,"context_line":"        \"\"\"Extract the information stored in pci_device.extra_info field."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        PciDevice.extra_info field is a coerced dictionary of strings. Each"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff73747_fb6d6604","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":29},"in_reply_to":"5ff73747_98f54886","updated":"2017-04-26 11:51:13.000000000","message":"Yes, this name is not accurate. This function is similar to \"_create_pool_keys_from_dev\", reading the dev key/values from dev.\n\nI think \"_create_pool_keys_from_extra_info\" is more accurate.","commit_id":"b3c2eac5c6d1d6dc5ed1db69013f11f3fb5612de"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbc72473dfc86565b10947ae41bca2f375ad90be","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                          is_json_object\u003dTrue):"},{"line_number":90,"context_line":"        \"\"\"Extract the information stored in pci_device.extra_info field."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        PciDevice.extra_info field is a coerced dictionary of strings. Each"},{"line_number":93,"context_line":"        string could be just a text or a serialized JSON object. This recursive"},{"line_number":94,"context_line":"        function will try to decode this string to check if it is a serialized"},{"line_number":95,"context_line":"        JSON object."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"            extra_info \u003d {\u0027key1\u0027: \u0027string\u0027,"},{"line_number":98,"context_line":"                          \u0027key2\u0027: \u003cJSON object\u003e}"}],"source_content_type":"text/x-python","patch_set":34,"id":"5f93b717_39a2249c","line":95,"range":{"start_line":92,"start_character":0,"end_line":95,"end_character":20},"updated":"2018-01-25 11:35:40.000000000","message":"This whole thing would be soooo much easier if we did the same thing for PciDevice.extra_info and converted it to a real object. Is that a viable thing to do?","commit_id":"8d885bed78b390822a8991fda6cb535d8106585c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"399a361577de6ee3d37d3353ff61807578daaf31","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                          is_json_object\u003dTrue):"},{"line_number":90,"context_line":"        \"\"\"Extract the information stored in pci_device.extra_info field."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        PciDevice.extra_info field is a coerced dictionary of strings. Each"},{"line_number":93,"context_line":"        string could be just a text or a serialized JSON object. This recursive"},{"line_number":94,"context_line":"        function will try to decode this string to check if it is a serialized"},{"line_number":95,"context_line":"        JSON object."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"            extra_info \u003d {\u0027key1\u0027: \u0027string\u0027,"},{"line_number":98,"context_line":"                          \u0027key2\u0027: \u003cJSON object\u003e}"}],"source_content_type":"text/x-python","patch_set":34,"id":"5f93b717_fefd5db1","line":95,"range":{"start_line":92,"start_character":0,"end_line":95,"end_character":20},"in_reply_to":"5f93b717_27651ab6","updated":"2018-01-26 13:52:57.000000000","message":"Agreed. That\u0027s a separate change from this one","commit_id":"8d885bed78b390822a8991fda6cb535d8106585c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e4e22fe0364d1d2bcfb1cbbfbbca8a1686f7e316","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                          is_json_object\u003dTrue):"},{"line_number":90,"context_line":"        \"\"\"Extract the information stored in pci_device.extra_info field."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        PciDevice.extra_info field is a coerced dictionary of strings. Each"},{"line_number":93,"context_line":"        string could be just a text or a serialized JSON object. This recursive"},{"line_number":94,"context_line":"        function will try to decode this string to check if it is a serialized"},{"line_number":95,"context_line":"        JSON object."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"            extra_info \u003d {\u0027key1\u0027: \u0027string\u0027,"},{"line_number":98,"context_line":"                          \u0027key2\u0027: \u003cJSON object\u003e}"}],"source_content_type":"text/x-python","patch_set":34,"id":"5f93b717_27651ab6","line":95,"range":{"start_line":92,"start_character":0,"end_line":95,"end_character":20},"in_reply_to":"5f93b717_39a2249c","updated":"2018-01-25 13:17:43.000000000","message":"probably. in this patch i dont think we should\ni can add a todo and see if i have time to follow up in a later patch but i dont want to hold up this series for that change.\n\nthat said the more json blobs of random crap we remove from the codebase the happier i will be.","commit_id":"8d885bed78b390822a8991fda6cb535d8106585c"}],"nova/tests/unit/network/test_neutronv2.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8b446e3581475f667e57072340e47679cbbb1c51","unresolved":false,"context_lines":[{"line_number":3175,"context_line":"        mock_client.show_port.return_value \u003d test_port"},{"line_number":3176,"context_line":"        mock_client.list_extensions.return_value \u003d test_ext_list"},{"line_number":3177,"context_line":"        mock_client.show_network.return_value \u003d test_net"},{"line_number":3178,"context_line":"        _, phynet_name, _ \u003d api._get_port_vnic_info("},{"line_number":3179,"context_line":"            self.context, mock_client, test_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":3180,"context_line":""},{"line_number":3181,"context_line":"        mock_client.show_network.assert_called_with("}],"source_content_type":"text/x-python","patch_set":18,"id":"1f1a1f67_683f9dd6","line":3178,"updated":"2017-07-12 15:46:09.000000000","message":"does not seem related to this patch","commit_id":"094f5063996532def22f5312972eac0701772790"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"030943cbdcc6fd2cae64936dfd832833429d91e1","unresolved":false,"context_lines":[{"line_number":3175,"context_line":"        mock_client.show_port.return_value \u003d test_port"},{"line_number":3176,"context_line":"        mock_client.list_extensions.return_value \u003d test_ext_list"},{"line_number":3177,"context_line":"        mock_client.show_network.return_value \u003d test_net"},{"line_number":3178,"context_line":"        _, phynet_name, _ \u003d api._get_port_vnic_info("},{"line_number":3179,"context_line":"            self.context, mock_client, test_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":3180,"context_line":""},{"line_number":3181,"context_line":"        mock_client.show_network.assert_called_with("}],"source_content_type":"text/x-python","patch_set":18,"id":"1f1a1f67_6eeb25b0","line":3178,"in_reply_to":"1f1a1f67_683f9dd6","updated":"2017-07-12 16:23:46.000000000","message":"You are right. I \"played\" with this file, then I reverted the changes but not this.\n\nI\u0027ll put this back again.","commit_id":"094f5063996532def22f5312972eac0701772790"}],"nova/tests/unit/pci/test_stats.py":[{"author":{"_account_id":17814,"name":"fengzhr","email":"fengzhr@awcloud.com","username":"space"},"change_message_id":"a0753108cb1bb48409bfc640c2249eb4dbafdd17","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.assertNotEqual(self.pci_stats, pci_stats2)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def test_object_create(self):"},{"line_number":124,"context_line":"        ####raise Exception(self.pci_stats)"},{"line_number":125,"context_line":"        m \u003d self.pci_stats.to_device_pools_obj()"},{"line_number":126,"context_line":"        new_stats \u003d stats.PciDeviceStats(m)"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dfeb2761_3a678350","line":124,"range":{"start_line":124,"start_character":8,"end_line":124,"end_character":43},"updated":"2017-04-01 02:58:25.000000000","message":"Unnecessary?","commit_id":"5478a907b38f83bb2b82c2aee80e565fe1e2ec02"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"343285c2fe134c749d363bed47ba445960281083","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.assertNotEqual(self.pci_stats, pci_stats2)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def test_object_create(self):"},{"line_number":124,"context_line":"        ####raise Exception(self.pci_stats)"},{"line_number":125,"context_line":"        m \u003d self.pci_stats.to_device_pools_obj()"},{"line_number":126,"context_line":"        new_stats \u003d stats.PciDeviceStats(m)"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dfeb2761_bfd2575b","line":124,"range":{"start_line":124,"start_character":8,"end_line":124,"end_character":43},"in_reply_to":"dfeb2761_3a678350","updated":"2017-04-02 07:07:34.000000000","message":"hehehe this patch is still WIP","commit_id":"5478a907b38f83bb2b82c2aee80e565fe1e2ec02"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f246b6149aee57174d96d9fbfed7cf4895df6865","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        pci_stats.remove_device(self.fake_dev_2)"},{"line_number":215,"context_line":"        self.assertEqual(1, mock_whitelist_parse.call_count)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def test_create_pool_keys_from_extra_info(self):"},{"line_number":218,"context_line":"        pci_stats \u003d stats.PciDeviceStats()"},{"line_number":219,"context_line":"        extra_info \u003d {\u0027group1\u0027: [\u0027v1\u0027, \u0027v2\u0027],"},{"line_number":220,"context_line":"                      \u0027group2\u0027: \"data1\","},{"line_number":221,"context_line":"                      \u0027group3\u0027: {\u0027subgroup3.1\u0027: [\u0027d1\u0027, \u0027d2\u0027]},"},{"line_number":222,"context_line":"                      \u0027group4\u0027: {\u0027subgroup4.1\u0027: [\u0027d3\u0027, \u0027d4\u0027]}"},{"line_number":223,"context_line":"                      }"},{"line_number":224,"context_line":"        extra_info_json \u003d {}"},{"line_number":225,"context_line":"        for k, v in extra_info.items():"},{"line_number":226,"context_line":"            extra_info_json.update({k: jsonutils.dumps(v)})"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        pool_dict_keys \u003d {\u0027group1\u0027: \u0027group1_data\u0027,"},{"line_number":229,"context_line":"                          \u0027group2\u0027: \u0027group2_data\u0027,"},{"line_number":230,"context_line":"                          \u0027group3\u0027: {\u0027subgroup3.1\u0027: \u0027subgroup3.1_data\u0027},"},{"line_number":231,"context_line":"                          \u0027group4\u0027: \u0027group4_data\u0027,"},{"line_number":232,"context_line":"                          \u0027group5\u0027: \u0027group5_data\u0027}"},{"line_number":233,"context_line":"        res \u003d {}"},{"line_number":234,"context_line":"        for val in pci_stats._create_pool_keys_from_extra_info("},{"line_number":235,"context_line":"                pool_dict_keys, extra_info_json):"},{"line_number":236,"context_line":"            res.update(val)"},{"line_number":237,"context_line":"        self.assertEqual("},{"line_number":238,"context_line":"            {\u0027group1_data\u0027: extra_info[\u0027group1\u0027],"},{"line_number":239,"context_line":"             \u0027group2_data\u0027: extra_info[\u0027group2\u0027],"},{"line_number":240,"context_line":"             \u0027subgroup3.1_data\u0027: extra_info[\u0027group3\u0027][\u0027subgroup3.1\u0027],"},{"line_number":241,"context_line":"             \u0027group4_data\u0027: extra_info[\u0027group4\u0027]},"},{"line_number":242,"context_line":"            res)"},{"line_number":243,"context_line":"        self.assertIsNone(res.get(\u0027group5_data\u0027))"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"class PciDeviceStatsWithTagsTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5ff73747_f560c1a7","line":243,"range":{"start_line":217,"start_character":4,"end_line":243,"end_character":49},"updated":"2017-04-26 19:32:48.000000000","message":"can you add some comments to this.\n\ni follow all of this code indivigually but\nat frist glance its hard to decipher what this is actully testing when you put it all together.","commit_id":"a04eafe68405bc76fb658ebe26433c676d0b9f5f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"29883dca83fdaf5223893deba6da3e0a341e388a","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        pci_stats.remove_device(self.fake_dev_2)"},{"line_number":215,"context_line":"        self.assertEqual(1, mock_whitelist_parse.call_count)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def test_create_pool_keys_from_extra_info(self):"},{"line_number":218,"context_line":"        pci_stats \u003d stats.PciDeviceStats()"},{"line_number":219,"context_line":"        extra_info \u003d {\u0027group1\u0027: [\u0027v1\u0027, \u0027v2\u0027],"},{"line_number":220,"context_line":"                      \u0027group2\u0027: \"data1\","},{"line_number":221,"context_line":"                      \u0027group3\u0027: {\u0027subgroup3.1\u0027: [\u0027d1\u0027, \u0027d2\u0027]},"},{"line_number":222,"context_line":"                      \u0027group4\u0027: {\u0027subgroup4.1\u0027: [\u0027d3\u0027, \u0027d4\u0027]}"},{"line_number":223,"context_line":"                      }"},{"line_number":224,"context_line":"        extra_info_json \u003d {}"},{"line_number":225,"context_line":"        for k, v in extra_info.items():"},{"line_number":226,"context_line":"            extra_info_json.update({k: jsonutils.dumps(v)})"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        pool_dict_keys \u003d {\u0027group1\u0027: \u0027group1_data\u0027,"},{"line_number":229,"context_line":"                          \u0027group2\u0027: \u0027group2_data\u0027,"},{"line_number":230,"context_line":"                          \u0027group3\u0027: {\u0027subgroup3.1\u0027: \u0027subgroup3.1_data\u0027},"},{"line_number":231,"context_line":"                          \u0027group4\u0027: \u0027group4_data\u0027,"},{"line_number":232,"context_line":"                          \u0027group5\u0027: \u0027group5_data\u0027}"},{"line_number":233,"context_line":"        res \u003d {}"},{"line_number":234,"context_line":"        for val in pci_stats._create_pool_keys_from_extra_info("},{"line_number":235,"context_line":"                pool_dict_keys, extra_info_json):"},{"line_number":236,"context_line":"            res.update(val)"},{"line_number":237,"context_line":"        self.assertEqual("},{"line_number":238,"context_line":"            {\u0027group1_data\u0027: extra_info[\u0027group1\u0027],"},{"line_number":239,"context_line":"             \u0027group2_data\u0027: extra_info[\u0027group2\u0027],"},{"line_number":240,"context_line":"             \u0027subgroup3.1_data\u0027: extra_info[\u0027group3\u0027][\u0027subgroup3.1\u0027],"},{"line_number":241,"context_line":"             \u0027group4_data\u0027: extra_info[\u0027group4\u0027]},"},{"line_number":242,"context_line":"            res)"},{"line_number":243,"context_line":"        self.assertIsNone(res.get(\u0027group5_data\u0027))"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"class PciDeviceStatsWithTagsTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5ff73747_0a9c1a0d","line":243,"range":{"start_line":217,"start_character":4,"end_line":243,"end_character":49},"in_reply_to":"5ff73747_f560c1a7","updated":"2017-04-27 08:04:15.000000000","message":"Yes, you are right. It\u0027s better if I explain a bit this.","commit_id":"a04eafe68405bc76fb658ebe26433c676d0b9f5f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ef03defb15e5b9e805f8909e113e6366de9d8f35","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        pci_stats.remove_device(self.fake_dev_2)"},{"line_number":215,"context_line":"        self.assertEqual(1, mock_whitelist_parse.call_count)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def test_create_pool_keys_from_extra_info(self):"},{"line_number":218,"context_line":"        pci_stats \u003d stats.PciDeviceStats()"},{"line_number":219,"context_line":"        extra_info \u003d {\u0027group1\u0027: [\u0027v1\u0027, \u0027v2\u0027],"},{"line_number":220,"context_line":"                      \u0027group2\u0027: \"data1\","},{"line_number":221,"context_line":"                      \u0027group3\u0027: {\u0027subgroup3.1\u0027: [\u0027d1\u0027, \u0027d2\u0027]},"},{"line_number":222,"context_line":"                      \u0027group4\u0027: {\u0027subgroup4.1\u0027: [\u0027d3\u0027, \u0027d4\u0027]}"},{"line_number":223,"context_line":"                      }"},{"line_number":224,"context_line":"        extra_info_json \u003d {}"},{"line_number":225,"context_line":"        for k, v in extra_info.items():"},{"line_number":226,"context_line":"            extra_info_json.update({k: jsonutils.dumps(v)})"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        # Pool of keys to extract from \u0027extra_info\u0027. Each parameter in this"},{"line_number":229,"context_line":"        # dict could have:"},{"line_number":230,"context_line":"        #    - A string value: the function will search the same key in"},{"line_number":231,"context_line":"        #      \u0027extra_info\u0027, extract the content and add in the result dict a"},{"line_number":232,"context_line":"        #      new entry with the string value as key and the content as value."},{"line_number":233,"context_line":"        #           extra_info \u003d {\u0027key1\u0027: \u0027value1\u0027}"},{"line_number":234,"context_line":"        #           pool_dict_keys \u003d {\u0027key1\u0027: \u0027renamed_key1\u0027}"},{"line_number":235,"context_line":"        #           return \u003d {\u0027renamed_key1\u0027: \u0027value1\u0027}"},{"line_number":236,"context_line":"        #    - A dict value: if the content inside the \u0027extra_info\u0027 key value"},{"line_number":237,"context_line":"        #      is a dict, the function will recursively search inside it."},{"line_number":238,"context_line":"        #           extra_info \u003d {\u0027key1\u0027: {\u0027sub_key1\u0027: \u0027value1\u0027}}"},{"line_number":239,"context_line":"        #           pool_dict_keys \u003d {\u0027key1\u0027: {\u0027sub_key1\u0027: \u0027renamed_subkey1\u0027}}"},{"line_number":240,"context_line":"        #           return \u003d {\u0027renamed_subkey1\u0027: \u0027value1\u0027}"},{"line_number":241,"context_line":"        pool_dict_keys \u003d {\u0027group1\u0027: \u0027group1_data\u0027,"},{"line_number":242,"context_line":"                          \u0027group2\u0027: \u0027group2_data\u0027,"},{"line_number":243,"context_line":"                          \u0027group3\u0027: {\u0027subgroup3.1\u0027: \u0027subgroup3.1_data\u0027},"},{"line_number":244,"context_line":"                          \u0027group4\u0027: \u0027group4_data\u0027,"},{"line_number":245,"context_line":"                          \u0027group5\u0027: \u0027group5_data\u0027}"},{"line_number":246,"context_line":"        res \u003d {}"},{"line_number":247,"context_line":"        for val in pci_stats._create_pool_keys_from_extra_info("},{"line_number":248,"context_line":"                pool_dict_keys, extra_info_json):"},{"line_number":249,"context_line":"            res.update(val)"},{"line_number":250,"context_line":"        self.assertEqual("},{"line_number":251,"context_line":"            {\u0027group1_data\u0027: extra_info[\u0027group1\u0027],"},{"line_number":252,"context_line":"             \u0027group2_data\u0027: extra_info[\u0027group2\u0027],"},{"line_number":253,"context_line":"             \u0027subgroup3.1_data\u0027: extra_info[\u0027group3\u0027][\u0027subgroup3.1\u0027],"},{"line_number":254,"context_line":"             \u0027group4_data\u0027: extra_info[\u0027group4\u0027]},"},{"line_number":255,"context_line":"            res)"},{"line_number":256,"context_line":"        self.assertIsNone(res.get(\u0027group5_data\u0027))"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"class PciDeviceStatsWithTagsTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_6f4a0381","line":256,"range":{"start_line":217,"start_character":4,"end_line":256,"end_character":49},"updated":"2017-06-29 15:10:21.000000000","message":"nit: while the doc string is good the variable name are a bit too abstract so this is hard to follow without the comments.","commit_id":"ec76c6170b16b4cc08ef5fa787902abe56c1aaa2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e45e0a5f8a74ec2753a566507d42fe8fb742ba50","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        pci_stats.remove_device(self.fake_dev_2)"},{"line_number":217,"context_line":"        self.assertEqual(1, mock_whitelist_parse.call_count)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_create_pool_keys_from_extra_info(self):"},{"line_number":220,"context_line":"        pci_stats \u003d stats.PciDeviceStats()"},{"line_number":221,"context_line":"        extra_info \u003d {\u0027generic_values\u0027: [\u0027v1\u0027, \u0027v2\u0027],"},{"line_number":222,"context_line":"                      \u0027vendor_id\u0027: \"data1\","},{"line_number":223,"context_line":"                      \u0027capabilities\u0027: {\u0027networking\u0027: [\u0027d1\u0027, \u0027d2\u0027]},"},{"line_number":224,"context_line":"                      \u0027more_capabilities\u0027: {\u0027computing\u0027: [\u0027d3\u0027, \u0027d4\u0027]}"},{"line_number":225,"context_line":"                      }"},{"line_number":226,"context_line":"        extra_info_json \u003d {}"},{"line_number":227,"context_line":"        for k, v in extra_info.items():"},{"line_number":228,"context_line":"            extra_info_json.update({k: jsonutils.dumps(v)})"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        # Pool of keys to extract from \u0027extra_info\u0027. Each parameter in this"},{"line_number":231,"context_line":"        # dict could have:"},{"line_number":232,"context_line":"        #    - A string value: the function will search the same key in"},{"line_number":233,"context_line":"        #      \u0027extra_info\u0027, extract the content and add in the result dict a"},{"line_number":234,"context_line":"        #      new entry with the string value as key and the content as value."},{"line_number":235,"context_line":"        #           extra_info \u003d {\u0027key1\u0027: \u0027value1\u0027}"},{"line_number":236,"context_line":"        #           pool_dict_keys \u003d {\u0027key1\u0027: \u0027renamed_key1\u0027}"},{"line_number":237,"context_line":"        #           return \u003d {\u0027renamed_key1\u0027: \u0027value1\u0027}"},{"line_number":238,"context_line":"        #    - A dict value: if the content inside the \u0027extra_info\u0027 key value"},{"line_number":239,"context_line":"        #      is a dict, the function will recursively search inside it."},{"line_number":240,"context_line":"        #           extra_info \u003d {\u0027key1\u0027: {\u0027sub_key1\u0027: \u0027value1\u0027}}"},{"line_number":241,"context_line":"        #           pool_dict_keys \u003d {\u0027key1\u0027: {\u0027sub_key1\u0027: \u0027renamed_subkey1\u0027}}"},{"line_number":242,"context_line":"        #           return \u003d {\u0027renamed_subkey1\u0027: \u0027value1\u0027}"},{"line_number":243,"context_line":"        pool_dict_keys \u003d {\u0027generic_values\u0027: \u0027generic_values_data\u0027,"},{"line_number":244,"context_line":"                          \u0027vendor_id\u0027: \u0027vendor_id_data\u0027,"},{"line_number":245,"context_line":"                          \u0027capabilities\u0027: {\u0027networking\u0027: \u0027networking_data\u0027},"},{"line_number":246,"context_line":"                          \u0027more_capabilities\u0027: \u0027more_capabilities_data\u0027,"},{"line_number":247,"context_line":"                          \u0027group5\u0027: \u0027group5_data\u0027}"},{"line_number":248,"context_line":"        res \u003d {}"},{"line_number":249,"context_line":"        for val in pci_stats._create_pool_keys_from_extra_info("},{"line_number":250,"context_line":"                pool_dict_keys, extra_info_json):"},{"line_number":251,"context_line":"            res.update(val)"},{"line_number":252,"context_line":"        self.assertEqual("},{"line_number":253,"context_line":"            {\u0027generic_values_data\u0027: extra_info[\u0027generic_values\u0027],"},{"line_number":254,"context_line":"             \u0027vendor_id_data\u0027: extra_info[\u0027vendor_id\u0027],"},{"line_number":255,"context_line":"             \u0027networking_data\u0027: extra_info[\u0027capabilities\u0027][\u0027networking\u0027],"},{"line_number":256,"context_line":"             \u0027more_capabilities_data\u0027: extra_info[\u0027more_capabilities\u0027]},"},{"line_number":257,"context_line":"            res)"},{"line_number":258,"context_line":"        self.assertIsNone(res.get(\u0027group5_data\u0027))"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"class PciDeviceStatsWithTagsTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":22,"id":"ff346bd7_09482fca","line":258,"range":{"start_line":219,"start_character":4,"end_line":258,"end_character":49},"updated":"2017-07-23 05:12:09.000000000","message":"thanks this is much easier to follow now","commit_id":"5e01e39febd8a2252a75bb482e0292825ef4a8c1"}]}
