)]}'
{"doc/ext/feature_matrix.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (C) 2014 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_84fd2c70","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":34},"updated":"2016-06-08 15:34:20.000000000","message":"nit: why\u0027s this Red Hat (and 2014)?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (C) 2014 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_68383ca1","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":34},"in_reply_to":"7aa08908_84fd2c70","updated":"2016-06-23 09:22:33.000000000","message":"so this whole thing is a cut and paste... oops.\n\nTo be clear its a cut and paste, so we can extract it.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Matrix(object):"},{"line_number":35,"context_line":"    \"\"\"Represents the entire feature matrix"},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self):"},{"line_number":39,"context_line":"        # List of MatrixFeature instances, describing"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_cd98f77a","line":36,"range":{"start_line":35,"start_character":4,"end_line":36,"end_character":7},"updated":"2016-06-08 15:34:20.000000000","message":"nit: Remove the line break","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self):"},{"line_number":39,"context_line":"        # List of MatrixFeature instances, describing"},{"line_number":40,"context_line":"        # all the features present in the project"},{"line_number":41,"context_line":"        self.features \u003d []"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # Dict of (name, MatrixTarget) enumerating"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_0d1aff16","line":40,"range":{"start_line":39,"start_character":8,"end_line":40,"end_character":49},"updated":"2016-06-08 15:34:20.000000000","message":"nit: can we wrap this at 79 characters (or 72 - whatever coding standards suggest)","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def __init__(self):"},{"line_number":39,"context_line":"        # List of MatrixFeature instances, describing"},{"line_number":40,"context_line":"        # all the features present in the project"},{"line_number":41,"context_line":"        self.features \u003d []"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # Dict of (name, MatrixTarget) enumerating"},{"line_number":44,"context_line":"        # all the environments that have data recorded"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_6dad839a","line":41,"range":{"start_line":41,"start_character":8,"end_line":41,"end_character":26},"updated":"2016-06-08 15:34:20.000000000","message":"Is there any advantage to making this a dict also? Would we ever index it?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def __init__(self):"},{"line_number":39,"context_line":"        # List of MatrixFeature instances, describing"},{"line_number":40,"context_line":"        # all the features present in the project"},{"line_number":41,"context_line":"        self.features \u003d []"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # Dict of (name, MatrixTarget) enumerating"},{"line_number":44,"context_line":"        # all the environments that have data recorded"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_286e3495","line":41,"range":{"start_line":41,"start_character":8,"end_line":41,"end_character":26},"in_reply_to":"7aa08908_6dad839a","updated":"2016-06-23 09:22:33.000000000","message":"its all loops, I think.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.targets \u003d {}"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class MatrixFeature(object):"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    MATURITY_INCOMPLETE \u003d \"incomplete\""},{"line_number":53,"context_line":"    MATURITY_EXPERIMENTAL \u003d \"experimental\""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_0dc83f73","line":50,"range":{"start_line":50,"start_character":6,"end_line":50,"end_character":19},"updated":"2016-06-08 15:34:20.000000000","message":"nit: Can we just call this \u0027Feature\u0027? It\u0027s 6 characters shorter and has essentially the same meaning :)","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.targets \u003d {}"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class MatrixFeature(object):"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    MATURITY_INCOMPLETE \u003d \"incomplete\""},{"line_number":53,"context_line":"    MATURITY_EXPERIMENTAL \u003d \"experimental\""}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_280594bb","line":50,"range":{"start_line":50,"start_character":6,"end_line":50,"end_character":19},"in_reply_to":"7aa08908_0dc83f73","updated":"2016-06-23 09:22:33.000000000","message":"yeah, I like that. This just came with the cut and paste.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self, key, title,"},{"line_number":61,"context_line":"                 notes\u003dNone, cli\u003dNone, maturity\u003dNone,"},{"line_number":62,"context_line":"                 api_doc_link\u003dNone, admin_doc_link\u003dNone,"},{"line_number":63,"context_line":"                 tempest_test_uuids\u003dNone):"},{"line_number":64,"context_line":"        if cli is None:"},{"line_number":65,"context_line":"            cli \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_0dc4bf3d","line":62,"range":{"start_line":62,"start_character":17,"end_line":62,"end_character":35},"updated":"2016-06-08 15:34:20.000000000","message":"thought: we should probably provide guidance on what to state here for extra-spec provided features, until such a time as that aspect of Nova dies.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self, key, title,"},{"line_number":61,"context_line":"                 notes\u003dNone, cli\u003dNone, maturity\u003dNone,"},{"line_number":62,"context_line":"                 api_doc_link\u003dNone, admin_doc_link\u003dNone,"},{"line_number":63,"context_line":"                 tempest_test_uuids\u003dNone):"},{"line_number":64,"context_line":"        if cli is None:"},{"line_number":65,"context_line":"            cli \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_a8dea43c","line":62,"range":{"start_line":62,"start_character":17,"end_line":62,"end_character":35},"in_reply_to":"7aa08908_0dc4bf3d","updated":"2016-06-23 09:22:33.000000000","message":"Lets start with what we agreed at the summit, we can add things as it evolves.\n\nI want to merge a v1 really.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            cli \u003d []"},{"line_number":66,"context_line":"        if tempest_test_uuids is None:"},{"line_number":67,"context_line":"            tempest_test_uuids \u003d []"},{"line_number":68,"context_line":"        # A unique key (eg \u0027foo.bar.wizz\u0027) to identify the feature"},{"line_number":69,"context_line":"        self.key \u003d key"},{"line_number":70,"context_line":"        # A human friendly short title for the feature"},{"line_number":71,"context_line":"        self.title \u003d title"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_4d636742","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":66},"updated":"2016-06-08 15:34:20.000000000","message":"Can you move these into the docstring for this function/class?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"34e9572189dcc12474cba826be2bade10e16f501","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            tempest_test_uuids \u003d []"},{"line_number":68,"context_line":"        # A unique key (eg \u0027foo.bar.wizz\u0027) to identify the feature"},{"line_number":69,"context_line":"        self.key \u003d key"},{"line_number":70,"context_line":"        # A human friendly short title for the feature"},{"line_number":71,"context_line":"        self.title \u003d title"},{"line_number":72,"context_line":"        # Arbitrarily long string describing the feature in detail"},{"line_number":73,"context_line":"        self.notes \u003d notes"},{"line_number":74,"context_line":"        # Dict of (name, MatrixImplementation) detailing"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_2cb4247e","line":71,"range":{"start_line":70,"start_character":8,"end_line":71,"end_character":26},"updated":"2016-06-08 14:44:57.000000000","message":"Can we build this by normalizing the key?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            tempest_test_uuids \u003d []"},{"line_number":68,"context_line":"        # A unique key (eg \u0027foo.bar.wizz\u0027) to identify the feature"},{"line_number":69,"context_line":"        self.key \u003d key"},{"line_number":70,"context_line":"        # A human friendly short title for the feature"},{"line_number":71,"context_line":"        self.title \u003d title"},{"line_number":72,"context_line":"        # Arbitrarily long string describing the feature in detail"},{"line_number":73,"context_line":"        self.notes \u003d notes"},{"line_number":74,"context_line":"        # Dict of (name, MatrixImplementation) detailing"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_28cab46d","line":71,"range":{"start_line":70,"start_character":8,"end_line":71,"end_character":26},"in_reply_to":"7aa08908_2cb4247e","updated":"2016-06-23 09:22:33.000000000","message":"No. The key is a long lived URL link.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        # A human friendly short title for the feature"},{"line_number":71,"context_line":"        self.title \u003d title"},{"line_number":72,"context_line":"        # Arbitrarily long string describing the feature in detail"},{"line_number":73,"context_line":"        self.notes \u003d notes"},{"line_number":74,"context_line":"        # Dict of (name, MatrixImplementation) detailing"},{"line_number":75,"context_line":"        # the implementation for each hypervisor driver. The"},{"line_number":76,"context_line":"        # \u0027name\u0027 dict key is the value from MatrixTarget.key"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_0d203ff6","line":73,"range":{"start_line":73,"start_character":8,"end_line":73,"end_character":26},"updated":"2016-06-08 15:34:20.000000000","message":"I think \u0027description\u0027 be a more meaningful name, based on your own comment","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        # A human friendly short title for the feature"},{"line_number":71,"context_line":"        self.title \u003d title"},{"line_number":72,"context_line":"        # Arbitrarily long string describing the feature in detail"},{"line_number":73,"context_line":"        self.notes \u003d notes"},{"line_number":74,"context_line":"        # Dict of (name, MatrixImplementation) detailing"},{"line_number":75,"context_line":"        # the implementation for each hypervisor driver. The"},{"line_number":76,"context_line":"        # \u0027name\u0027 dict key is the value from MatrixTarget.key"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_a8834403","line":73,"range":{"start_line":73,"start_character":8,"end_line":73,"end_character":26},"in_reply_to":"7aa08908_0d203ff6","updated":"2016-06-23 09:22:33.000000000","message":"True, this is just from the cut and paste.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"34e9572189dcc12474cba826be2bade10e16f501","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.title \u003d title"},{"line_number":72,"context_line":"        # Arbitrarily long string describing the feature in detail"},{"line_number":73,"context_line":"        self.notes \u003d notes"},{"line_number":74,"context_line":"        # Dict of (name, MatrixImplementation) detailing"},{"line_number":75,"context_line":"        # the implementation for each hypervisor driver. The"},{"line_number":76,"context_line":"        # \u0027name\u0027 dict key is the value from MatrixTarget.key"},{"line_number":77,"context_line":"        # for the hypervisor in question"},{"line_number":78,"context_line":"        self.implementations \u003d {}"},{"line_number":79,"context_line":"        # A list of CLI commands which are related to that feature"},{"line_number":80,"context_line":"        self.cli \u003d cli"},{"line_number":81,"context_line":"        # One of the maturity constants"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_871ed16d","line":78,"range":{"start_line":74,"start_character":0,"end_line":78,"end_character":33},"updated":"2016-06-08 14:44:57.000000000","message":"IMO, the hypervisor is not the only significant variable: for NFV, hardware\u0027s a huge requirement. Without a suitable NIC, you can\u0027t validate the SR-IOV feature. Without multiple sockets or a CPU with cluster-on-die, you can\u0027t validate NUMA topologies. Perhaps a required-hardware flag, or similar, is required to make this option? How to make this suitably specific, without being completely vendor specific, is something I haven\u0027t figured out yet though. Perhaps a \u0027MatrixHardwareRequirement\u0027 class?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.title \u003d title"},{"line_number":72,"context_line":"        # Arbitrarily long string describing the feature in detail"},{"line_number":73,"context_line":"        self.notes \u003d notes"},{"line_number":74,"context_line":"        # Dict of (name, MatrixImplementation) detailing"},{"line_number":75,"context_line":"        # the implementation for each hypervisor driver. The"},{"line_number":76,"context_line":"        # \u0027name\u0027 dict key is the value from MatrixTarget.key"},{"line_number":77,"context_line":"        # for the hypervisor in question"},{"line_number":78,"context_line":"        self.implementations \u003d {}"},{"line_number":79,"context_line":"        # A list of CLI commands which are related to that feature"},{"line_number":80,"context_line":"        self.cli \u003d cli"},{"line_number":81,"context_line":"        # One of the maturity constants"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_889da85b","line":78,"range":{"start_line":74,"start_character":0,"end_line":78,"end_character":33},"in_reply_to":"7aa08908_871ed16d","updated":"2016-06-23 09:22:33.000000000","message":"so this is an old comment, this matrix isn\u0027t planning to be just hypervisor, its a minimal set of configurations, with notes to discuss the edge cases.\n\nSee the rst for details.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"34e9572189dcc12474cba826be2bade10e16f501","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.implementations \u003d {}"},{"line_number":79,"context_line":"        # A list of CLI commands which are related to that feature"},{"line_number":80,"context_line":"        self.cli \u003d cli"},{"line_number":81,"context_line":"        # One of the maturity constants"},{"line_number":82,"context_line":"        self.maturity \u003d maturity"},{"line_number":83,"context_line":"        # Link to API docs"},{"line_number":84,"context_line":"        self.api_doc_link \u003d api_doc_link"},{"line_number":85,"context_line":"        # Link to Admin docs"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_ac4db49b","line":82,"range":{"start_line":81,"start_character":8,"end_line":82,"end_character":32},"updated":"2016-06-08 14:44:57.000000000","message":"Are there any guidelines on what defines this?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.implementations \u003d {}"},{"line_number":79,"context_line":"        # A list of CLI commands which are related to that feature"},{"line_number":80,"context_line":"        self.cli \u003d cli"},{"line_number":81,"context_line":"        # One of the maturity constants"},{"line_number":82,"context_line":"        self.maturity \u003d maturity"},{"line_number":83,"context_line":"        # Link to API docs"},{"line_number":84,"context_line":"        self.api_doc_link \u003d api_doc_link"},{"line_number":85,"context_line":"        # Link to Admin docs"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_a8b184e3","line":82,"range":{"start_line":81,"start_character":8,"end_line":82,"end_character":32},"in_reply_to":"7aa08908_ac4db49b","updated":"2016-06-23 09:22:33.000000000","message":"Yes, see the existing rst","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"34e9572189dcc12474cba826be2bade10e16f501","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.api_doc_link \u003d api_doc_link"},{"line_number":85,"context_line":"        # Link to Admin docs"},{"line_number":86,"context_line":"        self.admin_doc_link \u003d admin_doc_link"},{"line_number":87,"context_line":"        # List of tempest test uuids"},{"line_number":88,"context_line":"        self.tempest_test_uuids \u003d tempest_test_uuids"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"class MatrixImplementation(object):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_a7bf8d5f","line":88,"range":{"start_line":87,"start_character":8,"end_line":88,"end_character":52},"updated":"2016-06-08 14:44:57.000000000","message":"While I get the point of this, it doesn\u0027t allow us to represent third party CI validation. For example, the \u0027openstack/intel-nfv-ci-tests\u0027 repo provides tests that validate CPU (thread) pinning, NUMA topology and hugepage features. How would we represent these?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.api_doc_link \u003d api_doc_link"},{"line_number":85,"context_line":"        # Link to Admin docs"},{"line_number":86,"context_line":"        self.admin_doc_link \u003d admin_doc_link"},{"line_number":87,"context_line":"        # List of tempest test uuids"},{"line_number":88,"context_line":"        self.tempest_test_uuids \u003d tempest_test_uuids"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"class MatrixImplementation(object):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_88ebe8af","line":88,"range":{"start_line":87,"start_character":8,"end_line":88,"end_character":52},"in_reply_to":"7aa08908_a7bf8d5f","updated":"2016-06-23 09:22:33.000000000","message":"They don\u0027t count.\n\nAll tests should be tempest for upstream API facing features.\n\nYou simply use the tempest tests that point at a correctly configured flavor. So those details need covering, but it should still really be a tempest test.\n\nI honestly expect \"real time VMs\" as a extra implementation collumn.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                  STATUS_UKNOWN]"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def __init__(self, status\u003dSTATUS_MISSING, notes\u003dNone, release\u003dNone):"},{"line_number":102,"context_line":"        # One of the status constants detailing the implementation"},{"line_number":103,"context_line":"        # level"},{"line_number":104,"context_line":"        self.status \u003d status"},{"line_number":105,"context_line":"        # Arbitrary string describing any caveats of the implementation."},{"line_number":106,"context_line":"        # Mandatory if status is \u0027partial\u0027, optional otherwise."}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_2dcd3b31","line":103,"range":{"start_line":102,"start_character":8,"end_line":103,"end_character":15},"updated":"2016-06-08 15:34:20.000000000","message":"ditto - let\u0027s move these into the docstring","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                  STATUS_UKNOWN]"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def __init__(self, status\u003dSTATUS_MISSING, notes\u003dNone, release\u003dNone):"},{"line_number":102,"context_line":"        # One of the status constants detailing the implementation"},{"line_number":103,"context_line":"        # level"},{"line_number":104,"context_line":"        self.status \u003d status"},{"line_number":105,"context_line":"        # Arbitrary string describing any caveats of the implementation."},{"line_number":106,"context_line":"        # Mandatory if status is \u0027partial\u0027, optional otherwise."}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_68615c39","line":103,"range":{"start_line":102,"start_character":8,"end_line":103,"end_character":15},"in_reply_to":"7aa08908_2dcd3b31","updated":"2016-06-23 09:22:33.000000000","message":"so I didn\u0027t want to spend too long changing this stuff in the cut and paste phase.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def __init__(self, key, title, driver, hypervisor\u003dNone, architecture\u003dNone,"},{"line_number":116,"context_line":"                 link\u003dNone):"},{"line_number":117,"context_line":"        \"\"\":param key: Unique identifier for the hypervisor driver"},{"line_number":118,"context_line":"        :param title: Human friendly name of the hypervisor"},{"line_number":119,"context_line":"        :param driver: Name of the Nova driver"},{"line_number":120,"context_line":"        :param hypervisor: (optional) Name of the hypervisor, if many"},{"line_number":121,"context_line":"        :param architecture: (optional) Name of the architecture, if many"},{"line_number":122,"context_line":"        \"\"\""},{"line_number":123,"context_line":"        self.key \u003d key"},{"line_number":124,"context_line":"        self.title \u003d title"},{"line_number":125,"context_line":"        self.driver \u003d driver"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_0dfcbf3c","line":122,"range":{"start_line":117,"start_character":8,"end_line":122,"end_character":11},"updated":"2016-06-08 15:34:20.000000000","message":"These are class variables also. Do they belong here, or in the class docstring?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def __init__(self, key, title, driver, hypervisor\u003dNone, architecture\u003dNone,"},{"line_number":116,"context_line":"                 link\u003dNone):"},{"line_number":117,"context_line":"        \"\"\":param key: Unique identifier for the hypervisor driver"},{"line_number":118,"context_line":"        :param title: Human friendly name of the hypervisor"},{"line_number":119,"context_line":"        :param driver: Name of the Nova driver"},{"line_number":120,"context_line":"        :param hypervisor: (optional) Name of the hypervisor, if many"},{"line_number":121,"context_line":"        :param architecture: (optional) Name of the architecture, if many"},{"line_number":122,"context_line":"        \"\"\""},{"line_number":123,"context_line":"        self.key \u003d key"},{"line_number":124,"context_line":"        self.title \u003d title"},{"line_number":125,"context_line":"        self.driver \u003d driver"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_2850f45c","line":122,"range":{"start_line":117,"start_character":8,"end_line":122,"end_character":11},"in_reply_to":"7aa08908_0dfcbf3c","updated":"2016-06-23 09:22:33.000000000","message":"they are args, that seems OK.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        self.driver \u003d driver"},{"line_number":126,"context_line":"        self.hypervisor \u003d hypervisor"},{"line_number":127,"context_line":"        self.architecture \u003d architecture"},{"line_number":128,"context_line":"        self.link \u003d link"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class FeatureMatrixDirective(rst.Directive):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_8d9eef04","line":128,"range":{"start_line":128,"start_character":8,"end_line":128,"end_character":24},"updated":"2016-06-08 15:34:20.000000000","message":"Documentation?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e51c5a95b6274b9faf36723410e98b6c83c7455","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        self.driver \u003d driver"},{"line_number":126,"context_line":"        self.hypervisor \u003d hypervisor"},{"line_number":127,"context_line":"        self.architecture \u003d architecture"},{"line_number":128,"context_line":"        self.link \u003d link"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class FeatureMatrixDirective(rst.Directive):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_08e2589f","line":128,"range":{"start_line":128,"start_character":8,"end_line":128,"end_character":24},"in_reply_to":"7aa08908_8d9eef04","updated":"2016-06-23 09:22:33.000000000","message":"Its actually a full http link to the CI information, its covered more in the RST, but we are missing the comment here.","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class FeatureMatrixDirective(rst.Directive):"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    # The argument is the filename, e.g. feature-matrix.ini"},{"line_number":134,"context_line":"    required_arguments \u003d 1"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def run(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_6d6f43fc","line":133,"range":{"start_line":133,"start_character":4,"end_line":133,"end_character":59},"updated":"2016-06-08 15:34:20.000000000","message":"nit: this documentation could probably be in the docstring?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        return matrix"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _get_targets(self, cfg):"},{"line_number":165,"context_line":"        # The \u0027targets\u0027 section is special - it lists all the"},{"line_number":166,"context_line":"        # hypervisors that this file records data for"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        targets \u003d {}"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_4d3407fb","line":166,"range":{"start_line":165,"start_character":8,"end_line":166,"end_character":53},"updated":"2016-06-08 15:34:20.000000000","message":"Should probably be a docstring","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        features \u003d []"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        for section in cfg.sections():"},{"line_number":191,"context_line":"            if section \u003d\u003d \"targets\":"},{"line_number":192,"context_line":"                continue"},{"line_number":193,"context_line":"            if section.startswith(\"target.\"):"},{"line_number":194,"context_line":"                continue"},{"line_number":195,"context_line":"            if not cfg.has_option(section, \"title\"):"},{"line_number":196,"context_line":"                raise Exception("}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_cd0f5735","line":193,"range":{"start_line":191,"start_character":12,"end_line":193,"end_character":45},"updated":"2016-06-08 15:34:20.000000000","message":"nit: could combine these","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                if maturity not in MatrixFeature.MATURITY_ALL:"},{"line_number":205,"context_line":"                    raise Exception("},{"line_number":206,"context_line":"                        \"\u0027maturity\u0027 field value \u0027%s\u0027 in [\u0027%s\u0027]\""},{"line_number":207,"context_line":"                        \"section must be %s\" %"},{"line_number":208,"context_line":"                        (maturity, section,"},{"line_number":209,"context_line":"                         \",\".join(MatrixFeature.MATURITY_ALL)))"},{"line_number":210,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_b83debc5","line":207,"range":{"start_line":207,"start_character":38,"end_line":207,"end_character":43},"updated":"2016-06-08 15:34:20.000000000","message":"s/be %s/be one of %s/","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a8c2c7106facda13de108831ae2609262f5ed30","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                tempest_test_uuids \u003d cfg.get(section, \"tempest_test_uuids\")"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"            feature \u003d MatrixFeature(section,"},{"line_number":228,"context_line":"                                           title,"},{"line_number":229,"context_line":"                                           notes,"},{"line_number":230,"context_line":"                                           cli,"},{"line_number":231,"context_line":"                                           maturity,"},{"line_number":232,"context_line":"                                           api_doc_link,"},{"line_number":233,"context_line":"                                           admin_doc_link,"},{"line_number":234,"context_line":"                                           tempest_test_uuids)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"            # Now we\u0027ve got the basic feature details, we must process"},{"line_number":237,"context_line":"            # the hypervisor driver implementation for each feature"}],"source_content_type":"text/x-python","patch_set":10,"id":"7aa08908_d8455743","line":234,"range":{"start_line":228,"start_character":0,"end_line":234,"end_character":62},"updated":"2016-06-08 15:34:20.000000000","message":"supernit: This indentation annoys me. Sorry :)","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"01e0d98246e5082b12fe72f8340c23bceb3c1fca","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.targets \u003d {}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class MatrixTarget(object):"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def __init__(self, key, title, driver, hypervisor\u003dNone, architecture\u003dNone,"},{"line_number":46,"context_line":"                 link\u003dNone):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_ea88b024","line":43,"range":{"start_line":43,"start_character":6,"end_line":43,"end_character":18},"updated":"2016-08-09 16:14:24.000000000","message":"s/MatrixTarget/Target ?","commit_id":"027b92dc4ecc5ba819e98883b9fc9a681bbbe2b7"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"01e0d98246e5082b12fe72f8340c23bceb3c1fca","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def __init__(self, key, title, driver, hypervisor\u003dNone, architecture\u003dNone,"},{"line_number":46,"context_line":"                 link\u003dNone):"},{"line_number":47,"context_line":"        \"\"\"MatrixTarget modes a target, a column in the matrix"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        This is usually a specific CI system, or collection of related"},{"line_number":50,"context_line":"        deployment configurations."}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_6a96804d","line":47,"range":{"start_line":47,"start_character":24,"end_line":47,"end_character":29},"updated":"2016-08-09 16:14:24.000000000","message":"s/modes/models","commit_id":"027b92dc4ecc5ba819e98883b9fc9a681bbbe2b7"}],"doc/ext/support_matrix.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"19c3a235e90bbd2f451262e146b70d67e218597c","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def __init__(self, key, title, status\u003dSTATUS_OPTIONAL,"},{"line_number":69,"context_line":"                 group\u003dNone, notes\u003dNone, cli\u003d[], maturity\u003dNone,"},{"line_number":70,"context_line":"                 api_doc_link\u003dNone, admin_doc_link\u003dNone,"},{"line_number":71,"context_line":"                 tempest_test_uuids\u003d[]):"},{"line_number":72,"context_line":"        # A unique key (eg \u0027foo.bar.wizz\u0027) to identify the feature"},{"line_number":73,"context_line":"        self.key \u003d key"},{"line_number":74,"context_line":"        # A human friendly short title for the feature"}],"source_content_type":"text/x-python","patch_set":4,"id":"7af24918_5625bf06","line":71,"updated":"2016-03-03 17:03:15.000000000","message":"Might not be a bug here, but tempest_test_uuids is using a mutable argument -- which generally results in surprising behavior for most Python developers. It\u0027s an anti-pattern that should be generally avoided or strongly documented when the behavior is actually desirable.","commit_id":"b72e297936f5f9b75a3083f9109b6cb9c04ac597"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"1ec6cf008a5ff8ce16f871639030f16255f6e77e","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def __init__(self, key, title, status\u003dSTATUS_OPTIONAL,"},{"line_number":69,"context_line":"                 group\u003dNone, notes\u003dNone, cli\u003d[], maturity\u003dNone,"},{"line_number":70,"context_line":"                 api_doc_link\u003dNone, admin_doc_link\u003dNone,"},{"line_number":71,"context_line":"                 tempest_test_uuids\u003d[]):"},{"line_number":72,"context_line":"        # A unique key (eg \u0027foo.bar.wizz\u0027) to identify the feature"},{"line_number":73,"context_line":"        self.key \u003d key"},{"line_number":74,"context_line":"        # A human friendly short title for the feature"}],"source_content_type":"text/x-python","patch_set":4,"id":"5aef4532_85bf26a9","line":71,"in_reply_to":"7af24918_5625bf06","updated":"2016-03-09 17:22:27.000000000","message":"Very, true. We should fix those up.","commit_id":"b72e297936f5f9b75a3083f9109b6cb9c04ac597"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"680277280aac19636ae48f1bd64408ff6b965977","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                 group\u003dNone, notes\u003dNone, cli\u003dNone, maturity\u003dNone,"},{"line_number":70,"context_line":"                 api_doc_link\u003dNone, admin_doc_link\u003dNone,"},{"line_number":71,"context_line":"                 tempest_test_uuids\u003dNone):"},{"line_number":72,"context_line":"        if cli is None:"},{"line_number":73,"context_line":"            cli \u003d []"},{"line_number":74,"context_line":"        if tempest_test_uuids is None:"},{"line_number":75,"context_line":"            tempest_test_uuids \u003d []"},{"line_number":76,"context_line":"        # A unique key (eg \u0027foo.bar.wizz\u0027) to identify the feature"},{"line_number":77,"context_line":"        self.key \u003d key"},{"line_number":78,"context_line":"        # A human friendly short title for the feature"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_c337394b","line":75,"range":{"start_line":72,"start_character":0,"end_line":75,"end_character":35},"updated":"2016-04-20 15:04:10.000000000","message":"nit: These should _really_ be in a different change :)","commit_id":"a06d4f1a09ad99f978ba894731153e2c2681c351"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ea14e95bef81caea8a650ac695ecdc2c733b2d22","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            if not section.startswith(\"target.\"):"},{"line_number":229,"context_line":"                continue"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"            key \u003d section[7:]"},{"line_number":232,"context_line":"            title \u003d cfg.get(section, \"title\")"},{"line_number":233,"context_line":"            link \u003d cfg.get(section, \"link\")"},{"line_number":234,"context_line":"            driver \u003d key.split(\"-\")[0]"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_e13c5ae4","line":231,"updated":"2016-04-13 14:10:01.000000000","message":"well, Python is good enough for that, but I\u0027d have preferred to use either a regex or a substring call for removing the \u0027target.\u0027 prefix. Using a list comprehension for a string is sometimes a bit obfuscating.","commit_id":"a06d4f1a09ad99f978ba894731153e2c2681c351"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"680277280aac19636ae48f1bd64408ff6b965977","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            if not section.startswith(\"target.\"):"},{"line_number":229,"context_line":"                continue"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"            key \u003d section[7:]"},{"line_number":232,"context_line":"            title \u003d cfg.get(section, \"title\")"},{"line_number":233,"context_line":"            link \u003d cfg.get(section, \"link\")"},{"line_number":234,"context_line":"            driver \u003d key.split(\"-\")[0]"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_0353f16b","line":231,"in_reply_to":"5a18252c_e13c5ae4","updated":"2016-04-20 15:04:10.000000000","message":"Call me a fool, but I only sussed this thanks to Sylain\u0027s comment. Using `lstrip`, the `item.replace` format from below, or adding a comment would help here.","commit_id":"a06d4f1a09ad99f978ba894731153e2c2681c351"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ea14e95bef81caea8a650ac695ecdc2c733b2d22","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            key \u003d section[7:]"},{"line_number":232,"context_line":"            title \u003d cfg.get(section, \"title\")"},{"line_number":233,"context_line":"            link \u003d cfg.get(section, \"link\")"},{"line_number":234,"context_line":"            driver \u003d key.split(\"-\")[0]"},{"line_number":235,"context_line":"            target \u003d SupportMatrixTarget(key, title, driver, link\u003dlink)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"            targets[key] \u003d target"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a18252c_811c8678","line":234,"updated":"2016-04-13 14:10:01.000000000","message":"see, here a regex could do both lines in one call. \n\nEg. :\n\n  (key, driver) \u003d re.match(\"target.((\\w+)-\\w+)\", \"target.libvirt-kvm\").group(1, 2)","commit_id":"a06d4f1a09ad99f978ba894731153e2c2681c351"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7efb1311ecd2fe72575c5aa78dd4ec00aaaed9e5","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            key \u003d section[7:]"},{"line_number":232,"context_line":"            title \u003d cfg.get(section, \"title\")"},{"line_number":233,"context_line":"            link \u003d cfg.get(section, \"link\")"},{"line_number":234,"context_line":"            driver \u003d key.split(\"-\")[0]"},{"line_number":235,"context_line":"            target \u003d SupportMatrixTarget(key, title, driver, link\u003dlink)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"            targets[key] \u003d target"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_0a2ae6da","line":234,"in_reply_to":"5a18252c_811c8678","updated":"2016-04-20 14:16:32.000000000","message":"yeah, I wondered about that too, I just went with the local style, see line 195.","commit_id":"a06d4f1a09ad99f978ba894731153e2c2681c351"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"680277280aac19636ae48f1bd64408ff6b965977","unresolved":false,"context_lines":[{"line_number":274,"context_line":"                         \",\".join(SupportMatrixFeature.STATUS_ALL)))"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"            maturity \u003d None"},{"line_number":277,"context_line":"            maturity_mode \u003d self.options.get(\u0027maturity-mode\u0027, False)"},{"line_number":278,"context_line":"            if maturity_mode:"},{"line_number":279,"context_line":"                maturity \u003d SupportMatrixFeature.MATURITY_INCOMPLETE"},{"line_number":280,"context_line":"            if cfg.has_option(section, \"maturity\"):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_43a5e944","line":277,"range":{"start_line":277,"start_character":45,"end_line":277,"end_character":60},"updated":"2016-04-20 15:04:10.000000000","message":"super nit: s/\u0027/\"","commit_id":"a06d4f1a09ad99f978ba894731153e2c2681c351"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"b64ee1d1112a18d294952018a91d21cdce9b4d0b","unresolved":false,"context_lines":[{"line_number":398,"context_line":"        if maturity_mode:"},{"line_number":399,"context_line":"            blank.append(nodes.emphasis(text\u003d\"Maturity\"))"},{"line_number":400,"context_line":"        else:"},{"line_number":401,"context_line":"            blank.append(nodes.emphasis(text\u003d\"Status\"))"},{"line_number":402,"context_line":"        header.append(blank)"},{"line_number":403,"context_line":"        summaryhead.append(header)"},{"line_number":404,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a061dce_d01f9907","line":401,"updated":"2016-04-08 20:22:06.000000000","message":"sphinx extensions are a bit hard to keep in your head in the first place, I do wonder if we should really combine these with options, or just make this another directive type. Especially as the needs of the 2 may diverge more over time.","commit_id":"a06d4f1a09ad99f978ba894731153e2c2681c351"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7efb1311ecd2fe72575c5aa78dd4ec00aaaed9e5","unresolved":false,"context_lines":[{"line_number":398,"context_line":"        if maturity_mode:"},{"line_number":399,"context_line":"            blank.append(nodes.emphasis(text\u003d\"Maturity\"))"},{"line_number":400,"context_line":"        else:"},{"line_number":401,"context_line":"            blank.append(nodes.emphasis(text\u003d\"Status\"))"},{"line_number":402,"context_line":"        header.append(blank)"},{"line_number":403,"context_line":"        summaryhead.append(header)"},{"line_number":404,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_0afca66e","line":401,"in_reply_to":"9a061dce_d01f9907","updated":"2016-04-20 14:16:32.000000000","message":"Good point, I was trying to be DRY, but this has already started to diverge a bit already.\n\nI will think on that, particularly as we need to extract this into docutils for other projects to use this.","commit_id":"a06d4f1a09ad99f978ba894731153e2c2681c351"}],"doc/source/feature_classification.rst":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c857c0a953f2f442a403830ae6e6ec0b9715c63d","unresolved":false,"context_lines":[{"line_number":78,"context_line":".. feature_matrix:: feature_matrix_hpc.ini"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":".. _notes-on-concepts:"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Notes on Concepts"},{"line_number":83,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"9abb7d3a_de29b79c","line":81,"updated":"2016-06-01 14:57:49.000000000","message":"Maybe add technology independent features?","commit_id":"38926360a6c05314b4fc999fd0ebe8a467dd4c1e"}]}
