)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"646c9f315560490fa0156b9328f293247a6259a8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Mike Perez \u003cthingee@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-06-08 17:20:02 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Initial support matrix script and documentation"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Icf4975b1dafefc9ba9f063bd8f9c6c54a36c1e13"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9f0e0f27_4b13c567","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":47},"updated":"2017-06-09 09:49:30.000000000","message":"update with previous commit message of https://review.openstack.org/#/c/330027/ ?","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Mike Perez \u003cthingee@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-06-08 17:20:02 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Initial support matrix script and documentation"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Icf4975b1dafefc9ba9f063bd8f9c6c54a36c1e13"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1f1a1f67_810c82a5","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":47},"in_reply_to":"9f0e0f27_4b13c567","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"}],"doc/source/usage.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"1. This extension uses an ini file to render your driver matrix in Sphinx. You"},{"line_number":15,"context_line":"   can begin by creating the file support-matrix.rst file in your sphinx\u0027s"},{"line_number":16,"context_line":"   source directory."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"2. Start by creating a [targets] section. Each new line item in this section"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f1d235d_bae4e93d","line":15,"range":{"start_line":15,"start_character":29,"end_line":15,"end_character":57},"updated":"2017-07-07 14:44:34.000000000","message":"strike one of these \u0027file\u0027s\n\nIs it support-matrix.rst or .ini?","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"1. This extension uses an ini file to render your driver matrix in Sphinx. You"},{"line_number":15,"context_line":"   can begin by creating the file support-matrix.rst file in your sphinx\u0027s"},{"line_number":16,"context_line":"   source directory."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"2. Start by creating a [targets] section. Each new line item in this section"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f1d235d_a7834da9","line":15,"range":{"start_line":15,"start_character":29,"end_line":15,"end_character":57},"in_reply_to":"3f1d235d_bae4e93d","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":16,"context_line":"   source directory."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"2. Start by creating a [targets] section. Each new line item in this section"},{"line_number":19,"context_line":"   will represent a driver in our matrix. In the example below, we have"},{"line_number":20,"context_line":"   a prefix \u0027driver-impl-\u0027 followed by the name of the driver. This is then set"},{"line_number":21,"context_line":"   to a friendly name of the driver. This variable will be used throughout the"},{"line_number":22,"context_line":"   ini file to identify if this particular driver supports a project\u0027s feature."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f1d235d_5dd5cf42","line":20,"range":{"start_line":19,"start_character":42,"end_line":20,"end_character":61},"updated":"2017-07-07 14:44:34.000000000","message":"This sentence reads as though the \u0027driver-impl-\u0027 prefix is whimsically used for purposes of this example, whereas the code requires it.\n\n[Later] Yeah, there needs to be a lot more detail in here about the format specification of the ini file.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"2. Start by creating a [targets] section. Each new line item in this section"},{"line_number":19,"context_line":"   will represent a driver in our matrix. In the example below, we have"},{"line_number":20,"context_line":"   a prefix \u0027driver-impl-\u0027 followed by the name of the driver. This is then set"},{"line_number":21,"context_line":"   to a friendly name of the driver. This variable will be used throughout the"},{"line_number":22,"context_line":"   ini file to identify if this particular driver supports a project\u0027s feature."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"1f1a1f67_305e1a76","line":20,"in_reply_to":"3f1d235d_5dd5cf42","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":27,"context_line":"  driver-impl-xenserver\u003dXenServer"},{"line_number":28,"context_line":"  driver-impl-libvirt-kvm-x86\u003dLibvirt KVM (x86)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"3. Next we\u0027ll create a feature section to show which drivers have support it."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":".. code-block:: INI"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f1d235d_babd0904","line":30,"range":{"start_line":30,"start_character":61,"end_line":30,"end_character":65},"updated":"2017-07-07 14:44:34.000000000","message":"strike","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":27,"context_line":"  driver-impl-xenserver\u003dXenServer"},{"line_number":28,"context_line":"  driver-impl-libvirt-kvm-x86\u003dLibvirt KVM (x86)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"3. Next we\u0027ll create a feature section to show which drivers have support it."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":".. code-block:: INI"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f1d235d_07b8c173","line":30,"range":{"start_line":30,"start_character":61,"end_line":30,"end_character":65},"in_reply_to":"3f1d235d_babd0904","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"1f1a1f67_77062d23","updated":"2017-07-21 15:48:31.000000000","message":"Still wanting more detail on the format spec of the file.","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ff346bd7_7ac5ed5a","in_reply_to":"1f1a1f67_77062d23","updated":"2017-12-01 22:13:36.000000000","message":"Can you let me know what more you want from what I added below? Thanks!","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"1. This extension uses an ini file to render your driver matrix in Sphinx. You"},{"line_number":15,"context_line":"   can begin by creating the file support-matrix.ini file in your sphinx\u0027s"},{"line_number":16,"context_line":"   source directory."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"2. Start by creating a [targets] section. Each new line item in this section"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1f1a1f67_17937951","line":15,"range":{"start_line":15,"start_character":29,"end_line":15,"end_character":57},"updated":"2017-07-21 15:48:31.000000000","message":"Still got an extra \u0027file\u0027 here","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"1. This extension uses an ini file to render your driver matrix in Sphinx. You"},{"line_number":15,"context_line":"   can begin by creating the file support-matrix.ini file in your sphinx\u0027s"},{"line_number":16,"context_line":"   source directory."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"2. Start by creating a [targets] section. Each new line item in this section"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ff346bd7_6d4f9cbd","line":15,"range":{"start_line":15,"start_character":29,"end_line":15,"end_character":57},"in_reply_to":"1f1a1f67_17937951","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":308,"name":"Thierry Carrez","email":"thierry@openstack.org","username":"ttx"},"change_message_id":"ab81d820c5b90eb885eb1981b177b57f2f30a938","unresolved":false,"context_lines":[{"line_number":5,"context_line":"Sphinx Configuration"},{"line_number":6,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"To use the extension, add ``\u0027sphinx-feature-classificiation\u0027`` to the"},{"line_number":9,"context_line":"``extensions`` list in the ``conf.py`` file in your Sphinx project."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Documenting Your Drivers"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_c9afa092","line":8,"updated":"2017-12-04 10:06:14.000000000","message":"classification","commit_id":"6c06f37aae2f89833e74b3bcd76ec510ed90ed57"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":".. code-block:: INI"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"  [driver-slow-driver]"},{"line_number":32,"context_line":"  title\u003dSlow Driver"},{"line_number":33,"context_line":"  link\u003dhttps://docs.openstack.org/foo/latest/some-slow-driver-doc"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"df87a7cf_41a2b24d","line":31,"updated":"2017-12-12 21:12:26.000000000","message":"The code seems to be looking for \"driver.\" not \"driver-\"","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"b1aef6804b1579ee28873dada662a27f00209469","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":".. code-block:: INI"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"  [driver-slow-driver]"},{"line_number":32,"context_line":"  title\u003dSlow Driver"},{"line_number":33,"context_line":"  link\u003dhttps://docs.openstack.org/foo/latest/some-slow-driver-doc"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"df87a7cf_8c720b7c","line":31,"in_reply_to":"df87a7cf_41a2b24d","updated":"2017-12-13 22:59:49.000000000","message":"Done","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e3cc7db3915f70fd97eb0e9a20a279cd334ba775","unresolved":false,"context_lines":[{"line_number":5,"context_line":"Sphinx Configuration"},{"line_number":6,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"To use the extension, add ``\u0027sphinx-feature-classificiation\u0027`` to the"},{"line_number":9,"context_line":"``extensions`` list in the ``conf.py`` file in your Sphinx project."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Documenting Your Drivers"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7f96bb07_301bc981","line":8,"range":{"start_line":8,"start_character":44,"end_line":8,"end_character":59},"updated":"2018-01-15 15:11:18.000000000","message":"classification","commit_id":"ae491bccdfc679277297af050d4af4cc1ce64941"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"62329b495bb14a2448381521c9def40039e6addd","unresolved":false,"context_lines":[{"line_number":5,"context_line":"Sphinx Configuration"},{"line_number":6,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"To use the extension, add ``\u0027sphinx-feature-classificiation\u0027`` to the"},{"line_number":9,"context_line":"``extensions`` list in the ``conf.py`` file in your Sphinx project."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Documenting Your Drivers"}],"source_content_type":"text/x-rst","patch_set":11,"id":"7f96bb07_d4e21da0","line":8,"range":{"start_line":8,"start_character":44,"end_line":8,"end_character":59},"in_reply_to":"7f96bb07_301bc981","updated":"2018-01-24 20:47:48.000000000","message":"Done","commit_id":"ae491bccdfc679277297af050d4af4cc1ce64941"}],"sphinx_feature_classification/support_matrix.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":"\"\"\""},{"line_number":13,"context_line":"This provides a sphinx extension able to render the"},{"line_number":14,"context_line":"source/general_feature_support_matrix.ini"},{"line_number":15,"context_line":"file into the developer documentation."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"It is used via a single directive in the .rst file"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_e3f4fc89","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":41},"updated":"2017-07-07 14:44:34.000000000","message":"Is this path right?  Contradicts L119 \u0026 L121.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":"\"\"\""},{"line_number":13,"context_line":"This provides a sphinx extension able to render the"},{"line_number":14,"context_line":"source/general_feature_support_matrix.ini"},{"line_number":15,"context_line":"file into the developer documentation."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"It is used via a single directive in the .rst file"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_cadc1076","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":41},"in_reply_to":"3f1d235d_e3f4fc89","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from docutils.parsers import rst"},{"line_number":27,"context_line":"from six.moves import configparser"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"RE_PATTERN \u003d re.compile(\"[^a-zA-Z0-9_]\")"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class SupportMatrix(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_9aeecdb2","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":10},"updated":"2017-07-07 14:44:34.000000000","message":"This could have a better name.  Something that indicates it represents illegal characters in a feature/driver token.  Or at least add a comment to that effect.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from docutils.parsers import rst"},{"line_number":27,"context_line":"from six.moves import configparser"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"RE_PATTERN \u003d re.compile(\"[^a-zA-Z0-9_]\")"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class SupportMatrix(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_4ad2405e","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":10},"in_reply_to":"3f1d235d_9aeecdb2","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self.targets \u003d {}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class SupportMatrixFeature(object):"},{"line_number":41,"context_line":"    STATUS_CHOICE \u003d \"choice\""},{"line_number":42,"context_line":"    STATUS_CONDITION \u003d \"condition\""},{"line_number":43,"context_line":"    STATUS_IMMATURE \u003d \"immature\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_ba4d09c6","line":40,"range":{"start_line":40,"start_character":6,"end_line":40,"end_character":26},"updated":"2017-07-07 14:44:34.000000000","message":"[throughout] Given that we\u0027re in the support_matrix module, it seems unnecessary for all these class names to be prefixed with SupportMatrix.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self.targets \u003d {}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class SupportMatrixFeature(object):"},{"line_number":41,"context_line":"    STATUS_CHOICE \u003d \"choice\""},{"line_number":42,"context_line":"    STATUS_CONDITION \u003d \"condition\""},{"line_number":43,"context_line":"    STATUS_IMMATURE \u003d \"immature\""}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_9ba2afad","line":40,"in_reply_to":"3f1d235d_ba4d09c6","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class SupportMatrixFeature(object):"},{"line_number":41,"context_line":"    STATUS_CHOICE \u003d \"choice\""},{"line_number":42,"context_line":"    STATUS_CONDITION \u003d \"condition\""},{"line_number":43,"context_line":"    STATUS_IMMATURE \u003d \"immature\""},{"line_number":44,"context_line":"    STATUS_MATURE \u003d \"mature\""},{"line_number":45,"context_line":"    STATUS_REQUIRED \u003d \"required\""},{"line_number":46,"context_line":"    STATUS_DEPRECATED \u003d \"deprecated\""},{"line_number":47,"context_line":"    STATUS_OPTIONAL \u003d \"optional\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    STATUS_ALL \u003d [STATUS_IMMATURE, STATUS_MATURE,"},{"line_number":50,"context_line":"                  STATUS_REQUIRED, STATUS_DEPRECATED,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_bac3c938","line":47,"range":{"start_line":41,"start_character":0,"end_line":47,"end_character":32},"updated":"2017-07-07 14:44:34.000000000","message":"\u0027immature\u0027, \u0027mature\u0027, and \u0027deprecated\u0027 aren\u0027t mentioned in the doc.  What are those about?","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    STATUS_MATURE \u003d \"mature\""},{"line_number":45,"context_line":"    STATUS_REQUIRED \u003d \"required\""},{"line_number":46,"context_line":"    STATUS_DEPRECATED \u003d \"deprecated\""},{"line_number":47,"context_line":"    STATUS_OPTIONAL \u003d \"optional\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    STATUS_ALL \u003d [STATUS_IMMATURE, STATUS_MATURE,"},{"line_number":50,"context_line":"                  STATUS_REQUIRED, STATUS_DEPRECATED,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_10267ecf","line":47,"in_reply_to":"3f1d235d_bac3c938","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.notes \u003d notes"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"STATUS_DICT \u003d {"},{"line_number":83,"context_line":"    SupportMatrixImplementation.STATUS_COMPLETE: u\"\\u2714\","},{"line_number":84,"context_line":"    SupportMatrixImplementation.STATUS_MISSING: u\"\\u2716\","},{"line_number":85,"context_line":"    SupportMatrixImplementation.STATUS_PARTIAL: u\"\\u2714\","}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_5a7cb5ea","line":82,"range":{"start_line":82,"start_character":0,"end_line":82,"end_character":11},"updated":"2017-07-07 14:44:34.000000000","message":"This could have a better name.  Maybe STATUS_SYMBOLS","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.notes \u003d notes"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"STATUS_DICT \u003d {"},{"line_number":83,"context_line":"    SupportMatrixImplementation.STATUS_COMPLETE: u\"\\u2714\","},{"line_number":84,"context_line":"    SupportMatrixImplementation.STATUS_MISSING: u\"\\u2716\","},{"line_number":85,"context_line":"    SupportMatrixImplementation.STATUS_PARTIAL: u\"\\u2714\","}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_702012ad","line":82,"in_reply_to":"3f1d235d_5a7cb5ea","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"7792038f716b746d5e62d20cdc8c08d0ce76f756","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        :param driver: name of the driver"},{"line_number":98,"context_line":"        :param plugin: optional name of plugin"},{"line_number":99,"context_line":"        :param architecture: optional name of architecture"},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":"        self.api \u003d api"},{"line_number":102,"context_line":"        self.key \u003d key"},{"line_number":103,"context_line":"        self.title \u003d title"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f0e0f27_8b4b1d86","line":100,"range":{"start_line":100,"start_character":8,"end_line":100,"end_character":11},"updated":"2017-06-09 09:48:22.000000000","message":"missing docstring for parameter api.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        :param driver: name of the driver"},{"line_number":98,"context_line":"        :param plugin: optional name of plugin"},{"line_number":99,"context_line":"        :param architecture: optional name of architecture"},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":"        self.api \u003d api"},{"line_number":102,"context_line":"        self.key \u003d key"},{"line_number":103,"context_line":"        self.title \u003d title"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_bb2fab86","line":100,"in_reply_to":"9f0e0f27_8b4b1d86","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        return self._build_markup(matrix)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _load_support_matrix(self):"},{"line_number":119,"context_line":"        \"\"\"Parse support-matrix.ini file."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        Reads the support-matrix.ini file and populates an instance of the"},{"line_number":122,"context_line":"        SupportMatrix class with all the data."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        :returns: SupportMatrix instance"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_4333b063","line":121,"range":{"start_line":119,"start_character":0,"end_line":121,"end_character":74},"updated":"2017-07-07 14:44:34.000000000","message":"See L14.  I don\u0027t know how this Directive business works, but is the file name hardcoded somewhere?","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    def _load_support_matrix(self):"},{"line_number":119,"context_line":"        \"\"\"Parse support-matrix.ini file."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        Reads the support-matrix.ini file and populates an instance of the"},{"line_number":122,"context_line":"        SupportMatrix class with all the data."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        :returns: SupportMatrix instance"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_5bc9b7a9","line":121,"in_reply_to":"3f1d235d_4333b063","updated":"2017-07-17 23:21:57.000000000","message":"It\u0027s the arg passed to he directive in source/support-matrix.rst.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        env.note_dependency(rel_fpath)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        matrix \u003d SupportMatrix()"},{"line_number":139,"context_line":"        matrix.targets \u003d self._get_targets(cfg)"},{"line_number":140,"context_line":"        matrix.features \u003d self._get_features(cfg, matrix.targets)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        return matrix"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_881207b4","line":140,"range":{"start_line":139,"start_character":0,"end_line":140,"end_character":65},"updated":"2017-07-07 14:44:34.000000000","message":"These would feel cleaner and more OO if implemented within SupportMatrix.  The calls would then look something like:\n\n matrix.set_targets(cfg)\n matrix.set_features(cfg)  # internally uses targets set by above\n\nOr perhaps even better:\n\n return SupportMatrix(cfg)","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        matrix \u003d SupportMatrix()"},{"line_number":139,"context_line":"        matrix.targets \u003d self._get_targets(cfg)"},{"line_number":140,"context_line":"        matrix.features \u003d self._get_features(cfg, matrix.targets)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        return matrix"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_dbc6e768","line":140,"in_reply_to":"3f1d235d_881207b4","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # backend drivers that this file records data for"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        targets \u003d {}"},{"line_number":149,"context_line":"        driver_target \u003d \"driver-impl\""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        for item in cfg.options(\"targets\"):"},{"line_number":152,"context_line":"            if not item.startswith(driver_target):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_bd52a3dd","line":149,"range":{"start_line":149,"start_character":24,"end_line":149,"end_character":37},"updated":"2017-07-07 14:44:34.000000000","message":"Should be \"driver-impl-\" (including that last hyphen).","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # backend drivers that this file records data for"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        targets \u003d {}"},{"line_number":149,"context_line":"        driver_target \u003d \"driver-impl\""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        for item in cfg.options(\"targets\"):"},{"line_number":152,"context_line":"            if not item.startswith(driver_target):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_db9b8770","line":149,"in_reply_to":"3f1d235d_bd52a3dd","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        for item in cfg.options(\"targets\"):"},{"line_number":152,"context_line":"            if not item.startswith(driver_target):"},{"line_number":153,"context_line":"                continue"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"            # The driver string will optionally contain"},{"line_number":156,"context_line":"            # \u0027driver-*\u0027 qualifier"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_fdac9bef","line":153,"range":{"start_line":153,"start_character":16,"end_line":153,"end_character":24},"updated":"2017-07-07 14:44:34.000000000","message":"Should raise an exception or emit a message here (\"Ignoring malformed [targets] entry %s\" kind of thing) to help the user identify typos.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        for item in cfg.options(\"targets\"):"},{"line_number":152,"context_line":"            if not item.startswith(driver_target):"},{"line_number":153,"context_line":"                continue"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"            # The driver string will optionally contain"},{"line_number":156,"context_line":"            # \u0027driver-*\u0027 qualifier"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_3be95bb6","line":153,"in_reply_to":"3f1d235d_fdac9bef","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            if not item.startswith(driver_target):"},{"line_number":153,"context_line":"                continue"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"            # The driver string will optionally contain"},{"line_number":156,"context_line":"            # \u0027driver-*\u0027 qualifier"},{"line_number":157,"context_line":"            # so we expect between 1 and 3 components"},{"line_number":158,"context_line":"            # in the name"},{"line_number":159,"context_line":"            key \u003d item[len(driver_target):]"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_7d2c0b4a","line":156,"range":{"start_line":155,"start_character":0,"end_line":156,"end_character":34},"updated":"2017-07-07 14:44:34.000000000","message":"eh?  Like \"driver-impl-driver-myvirt\" ??\n\nOh, as in, the first hyphen-delimited bit after the \u0027driver-impl-\u0027 prefix is the driver name.\n\nBut based on the SupportMatrixTarget init below, it looks like it\u0027s *not* optional.  Unless you\u0027re referring to the bit represented by the \u0027-*\u0027 as being optional.\n\nAlso looks like it\u0027s between 1 and 4 components (driver, plugin, architecture, api) not 1 and 3.\n\nSo yeah, the usage.rst should have more details on these format specifications.  And this comment is really confusing.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                continue"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"            # The driver string will optionally contain"},{"line_number":156,"context_line":"            # \u0027driver-*\u0027 qualifier"},{"line_number":157,"context_line":"            # so we expect between 1 and 3 components"},{"line_number":158,"context_line":"            # in the name"},{"line_number":159,"context_line":"            key \u003d item[len(driver_target):]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_3b103ba8","line":156,"in_reply_to":"3f1d235d_7d2c0b4a","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            key \u003d item[len(driver_target):]"},{"line_number":160,"context_line":"            title \u003d cfg.get(\"targets\", item)"},{"line_number":161,"context_line":"            name \u003d key.split(\"-\")"},{"line_number":162,"context_line":"            if len(name) \u003e 4:"},{"line_number":163,"context_line":"                raise Exception(\"\u0027%s\u0027 field is malformed in \u0027[%s]\u0027 section\" %"},{"line_number":164,"context_line":"                                (item, \"DEFAULT\"))"},{"line_number":165,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_fdaffb28","line":162,"range":{"start_line":162,"start_character":24,"end_line":162,"end_character":28},"updated":"2017-07-07 14:44:34.000000000","message":"Should also make sure the \u0027driver\u0027 is nonempty.  As written, this will allow e.g. \u0027driver-impl-\u0027 or \u0027driver-impl--myplugin\u0027 (double hyphen).","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            key \u003d item[len(driver_target):]"},{"line_number":160,"context_line":"            title \u003d cfg.get(\"targets\", item)"},{"line_number":161,"context_line":"            name \u003d key.split(\"-\")"},{"line_number":162,"context_line":"            if len(name) \u003e 4:"},{"line_number":163,"context_line":"                raise Exception(\"\u0027%s\u0027 field is malformed in \u0027[%s]\u0027 section\" %"},{"line_number":164,"context_line":"                                (item, \"DEFAULT\"))"},{"line_number":165,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_fb25230a","line":162,"in_reply_to":"3f1d235d_fdaffb28","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            title \u003d cfg.get(\"targets\", item)"},{"line_number":161,"context_line":"            name \u003d key.split(\"-\")"},{"line_number":162,"context_line":"            if len(name) \u003e 4:"},{"line_number":163,"context_line":"                raise Exception(\"\u0027%s\u0027 field is malformed in \u0027[%s]\u0027 section\" %"},{"line_number":164,"context_line":"                                (item, \"DEFAULT\"))"},{"line_number":165,"context_line":"            else:"},{"line_number":166,"context_line":"                target \u003d SupportMatrixTarget(key, title, *name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_ddd55fb9","line":163,"range":{"start_line":163,"start_character":32,"end_line":163,"end_character":75},"updated":"2017-07-07 14:44:34.000000000","message":"This message needs to be more descriptive.  \"A target must be of the form \u0027driver-impl-\u003cdriver\u003e[-\u003cplugin\u003e[-\u003carchitecture\u003e[-\u003capi\u003e]]]\u0027.\"","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            title \u003d cfg.get(\"targets\", item)"},{"line_number":161,"context_line":"            name \u003d key.split(\"-\")"},{"line_number":162,"context_line":"            if len(name) \u003e 4:"},{"line_number":163,"context_line":"                raise Exception(\"\u0027%s\u0027 field is malformed in \u0027[%s]\u0027 section\" %"},{"line_number":164,"context_line":"                                (item, \"DEFAULT\"))"},{"line_number":165,"context_line":"            else:"},{"line_number":166,"context_line":"                target \u003d SupportMatrixTarget(key, title, *name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_1b29ffe4","line":163,"in_reply_to":"3f1d235d_ddd55fb9","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            name \u003d key.split(\"-\")"},{"line_number":162,"context_line":"            if len(name) \u003e 4:"},{"line_number":163,"context_line":"                raise Exception(\"\u0027%s\u0027 field is malformed in \u0027[%s]\u0027 section\" %"},{"line_number":164,"context_line":"                                (item, \"DEFAULT\"))"},{"line_number":165,"context_line":"            else:"},{"line_number":166,"context_line":"                target \u003d SupportMatrixTarget(key, title, *name)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_bde2a39f","line":164,"range":{"start_line":164,"start_character":40,"end_line":164,"end_character":47},"updated":"2017-07-07 14:44:34.000000000","message":"\"targets\", not \"DEFAULT\"","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            name \u003d key.split(\"-\")"},{"line_number":162,"context_line":"            if len(name) \u003e 4:"},{"line_number":163,"context_line":"                raise Exception(\"\u0027%s\u0027 field is malformed in \u0027[%s]\u0027 section\" %"},{"line_number":164,"context_line":"                                (item, \"DEFAULT\"))"},{"line_number":165,"context_line":"            else:"},{"line_number":166,"context_line":"                target \u003d SupportMatrixTarget(key, title, *name)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_bb1b2bc8","line":164,"in_reply_to":"3f1d235d_bde2a39f","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        return targets"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def _get_features(self, cfg, targets):"},{"line_number":173,"context_line":"        # All sections except \u0027targets\u0027 describe some feature of"},{"line_number":174,"context_line":"        # the backend driver."},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_23f674fb","line":172,"range":{"start_line":172,"start_character":8,"end_line":172,"end_character":21},"updated":"2017-07-07 14:44:34.000000000","message":"This guy would be way more readable/maintainable if refactored e.g. extracting a _process_feature(section) method from the outer loop, and a _process_impl(item) from the inner loop.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        return targets"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def _get_features(self, cfg, targets):"},{"line_number":173,"context_line":"        # All sections except \u0027targets\u0027 describe some feature of"},{"line_number":174,"context_line":"        # the backend driver."},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_61e4c6e0","line":172,"in_reply_to":"3f1d235d_23f674fb","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            if cfg.has_option(section, \"status\"):"},{"line_number":189,"context_line":"                # The value is a string \"status(group)\" where"},{"line_number":190,"context_line":"                # the \u0027group\u0027 part is optional"},{"line_number":191,"context_line":"                status \u003d cfg.get(section, \"status\")"},{"line_number":192,"context_line":"                offset \u003d status.find(\"(\")"},{"line_number":193,"context_line":"                group \u003d None"},{"line_number":194,"context_line":"                if offset !\u003d -1:"},{"line_number":195,"context_line":"                    group \u003d status[offset + 1:-1]"},{"line_number":196,"context_line":"                    status \u003d status[0:offset]"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"                if status not in SupportMatrixFeature.STATUS_ALL:"},{"line_number":199,"context_line":"                    raise Exception("}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_c89c7f6c","line":196,"range":{"start_line":191,"start_character":0,"end_line":196,"end_character":45},"updated":"2017-07-07 14:44:34.000000000","message":"Could do this with a regex match.  E.g.:\n\n status, group \u003d re.match(\u0027^([^(]+)(?:\\(([^)]+)\\))?$\u0027, cfg.get(section, \"status\")).groups()","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                group \u003d None"},{"line_number":194,"context_line":"                if offset !\u003d -1:"},{"line_number":195,"context_line":"                    group \u003d status[offset + 1:-1]"},{"line_number":196,"context_line":"                    status \u003d status[0:offset]"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"                if status not in SupportMatrixFeature.STATUS_ALL:"},{"line_number":199,"context_line":"                    raise Exception("}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_fb01a339","line":196,"in_reply_to":"3f1d235d_c89c7f6c","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                if status not in SupportMatrixFeature.STATUS_ALL:"},{"line_number":199,"context_line":"                    raise Exception("},{"line_number":200,"context_line":"                        \"\u0027status\u0027 field value \u0027%s\u0027 in [\u0027%s\u0027]\""},{"line_number":201,"context_line":"                        \"section must be %s\" %"},{"line_number":202,"context_line":"                        (status, section,"},{"line_number":203,"context_line":"                         \",\".join(SupportMatrixFeature.STATUS_ALL)))"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_4882af02","line":201,"range":{"start_line":201,"start_character":33,"end_line":201,"end_character":43},"updated":"2017-07-07 14:44:34.000000000","message":"\"must be one of (%s)\" would be clearer.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                if status not in SupportMatrixFeature.STATUS_ALL:"},{"line_number":199,"context_line":"                    raise Exception("},{"line_number":200,"context_line":"                        \"\u0027status\u0027 field value \u0027%s\u0027 in [\u0027%s\u0027]\""},{"line_number":201,"context_line":"                        \"section must be %s\" %"},{"line_number":202,"context_line":"                        (status, section,"},{"line_number":203,"context_line":"                         \",\".join(SupportMatrixFeature.STATUS_ALL)))"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_fb8643b9","line":201,"in_reply_to":"3f1d235d_4882af02","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            # Now we\u0027ve got the basic feature details, we must process"},{"line_number":220,"context_line":"            # the backend driver implementation for each feature"},{"line_number":221,"context_line":"            for item in cfg.options(section):"},{"line_number":222,"context_line":"                driver_target \u003d \"driver-impl\""},{"line_number":223,"context_line":"                driver_notes \u003d \"driver-notes-\""},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"                if not item.startswith(driver_target):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_8877a709","line":222,"range":{"start_line":222,"start_character":32,"end_line":222,"end_character":45},"updated":"2017-07-07 14:44:34.000000000","message":"\"driver-impl-\" (last hyphen)\n\nSince you\u0027re using this twice, may as well make a const for it at the top.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            # Now we\u0027ve got the basic feature details, we must process"},{"line_number":220,"context_line":"            # the backend driver implementation for each feature"},{"line_number":221,"context_line":"            for item in cfg.options(section):"},{"line_number":222,"context_line":"                driver_target \u003d \"driver-impl\""},{"line_number":223,"context_line":"                driver_notes \u003d \"driver-notes-\""},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"                if not item.startswith(driver_target):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_db8f07cb","line":222,"in_reply_to":"3f1d235d_8877a709","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":228,"context_line":"                key \u003d item[len(driver_target):]"},{"line_number":229,"context_line":"                if key not in targets:"},{"line_number":230,"context_line":"                    raise Exception("},{"line_number":231,"context_line":"                        \"driver-\u0027%s\u0027 in \u0027[%s]\u0027 not declared\" %"},{"line_number":232,"context_line":"                        (item, section))"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"                status \u003d cfg.get(section, item)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_a3172446","line":231,"range":{"start_line":231,"start_character":24,"end_line":231,"end_character":60},"updated":"2017-07-07 14:44:34.000000000","message":"\"Driver %s in \u0027[%s]\u0027 not declared in [targets].\"\n\n- The \u0027driver-\u0027 prefix is weird; you\u0027ll end up saying something like \"driver-\u0027driver-impl-libvirt-kvm-x86\u0027 in ...\"\n- Clarify that it should have been declared in [targets].","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":228,"context_line":"                key \u003d item[len(driver_target):]"},{"line_number":229,"context_line":"                if key not in targets:"},{"line_number":230,"context_line":"                    raise Exception("},{"line_number":231,"context_line":"                        \"driver-\u0027%s\u0027 in \u0027[%s]\u0027 not declared\" %"},{"line_number":232,"context_line":"                        (item, section))"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"                status \u003d cfg.get(section, item)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_1b61ff05","line":231,"in_reply_to":"3f1d235d_a3172446","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                status \u003d cfg.get(section, item)"},{"line_number":235,"context_line":"                if status not in SupportMatrixImplementation.STATUS_ALL:"},{"line_number":236,"context_line":"                    raise Exception("},{"line_number":237,"context_line":"                        \"\u0027%s\u0027 value \u0027%s\u0027 in \u0027[%s]\u0027 section must be %s\" %"},{"line_number":238,"context_line":"                        (item, status, section,"},{"line_number":239,"context_line":"                         \",\".join(SupportMatrixImplementation.STATUS_ALL)))"},{"line_number":240,"context_line":"                notes_key \u003d driver_notes + item[len(driver_notes):]"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_c3e4603f","line":237,"range":{"start_line":237,"start_character":59,"end_line":237,"end_character":70},"updated":"2017-07-07 14:44:34.000000000","message":"\"must be one of (%s).\"","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                status \u003d cfg.get(section, item)"},{"line_number":235,"context_line":"                if status not in SupportMatrixImplementation.STATUS_ALL:"},{"line_number":236,"context_line":"                    raise Exception("},{"line_number":237,"context_line":"                        \"\u0027%s\u0027 value \u0027%s\u0027 in \u0027[%s]\u0027 section must be %s\" %"},{"line_number":238,"context_line":"                        (item, status, section,"},{"line_number":239,"context_line":"                         \",\".join(SupportMatrixImplementation.STATUS_ALL)))"},{"line_number":240,"context_line":"                notes_key \u003d driver_notes + item[len(driver_notes):]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_fb22c3b8","line":237,"in_reply_to":"3f1d235d_c3e4603f","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                notes_key \u003d driver_notes + item[len(driver_notes):]"},{"line_number":241,"context_line":"                notes \u003d None"},{"line_number":242,"context_line":"                if cfg.has_option(section, notes_key):"},{"line_number":243,"context_line":"                    notes \u003d cfg.get(section, notes_key)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"                target \u003d targets[key]"},{"line_number":246,"context_line":"                impl \u003d SupportMatrixImplementation(status, notes)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_633a2c99","line":243,"range":{"start_line":243,"start_character":0,"end_line":243,"end_character":55},"updated":"2017-07-07 14:44:34.000000000","message":"Else perhaps an info message (\"No driver notes found for impl %s in section [%s].\") again to help the user nail down typos.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                notes_key \u003d driver_notes + item[len(driver_notes):]"},{"line_number":241,"context_line":"                notes \u003d None"},{"line_number":242,"context_line":"                if cfg.has_option(section, notes_key):"},{"line_number":243,"context_line":"                    notes \u003d cfg.get(section, notes_key)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"                target \u003d targets[key]"},{"line_number":246,"context_line":"                impl \u003d SupportMatrixImplementation(status, notes)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_f67bfa24","line":243,"in_reply_to":"3f1d235d_633a2c99","updated":"2017-07-17 23:21:57.000000000","message":"I think that would get a bit noisy.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                if cfg.has_option(section, notes_key):"},{"line_number":243,"context_line":"                    notes \u003d cfg.get(section, notes_key)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"                target \u003d targets[key]"},{"line_number":246,"context_line":"                impl \u003d SupportMatrixImplementation(status, notes)"},{"line_number":247,"context_line":"                feature.implementations[target.key] \u003d impl"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_a31604f1","line":245,"range":{"start_line":245,"start_character":16,"end_line":245,"end_character":37},"updated":"2017-07-07 14:44:34.000000000","message":"targets[key].key \u003d\u003d key, nah?  So you should be able to say feature.implementations[key] \u003d impl below, and you don\u0027t need this \u0027target\u0027 var.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"74352d940d352a340a0d2b36939b6b9e7a06c015","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                if cfg.has_option(section, notes_key):"},{"line_number":243,"context_line":"                    notes \u003d cfg.get(section, notes_key)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"                target \u003d targets[key]"},{"line_number":246,"context_line":"                impl \u003d SupportMatrixImplementation(status, notes)"},{"line_number":247,"context_line":"                feature.implementations[target.key] \u003d impl"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_8166c2c0","line":245,"in_reply_to":"3f1d235d_a31604f1","updated":"2017-07-17 23:21:57.000000000","message":"Done","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2aad958ecc5977b949967193bda0abf0ede6aa38","unresolved":false,"context_lines":[{"line_number":254,"context_line":"            features.append(feature)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        return features"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def _build_markup(self, matrix):"},{"line_number":259,"context_line":"        \"\"\"Constructs the docutils content for the support matrix.\"\"\""},{"line_number":260,"context_line":"        content \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_63a46cba","line":257,"updated":"2017-07-07 14:44:34.000000000","message":"[efried] stopped reviewing here; I don\u0027t know from formatting/layout stuff.","commit_id":"91744d580cbedb1527209538a28c2d6bf2350526"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"1f1a1f67_1e39513e","updated":"2017-07-21 15:48:31.000000000","message":"(carryover) UT for this module.","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ff346bd7_1a9a6162","in_reply_to":"1f1a1f67_1e39513e","updated":"2017-12-01 22:13:36.000000000","message":"Yup definitely. I\u0027ll mark this as WIP.","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from docutils import nodes"},{"line_number":25,"context_line":"from docutils.parsers import rst"},{"line_number":26,"context_line":"from six.moves import configparser"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"KEY_PATTERN \u003d re.compile(\"[^a-zA-Z0-9_]\")"},{"line_number":29,"context_line":"DRIVER_TARGET_PREFIX \u003d \"driver-impl-\""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_fbefc7e6","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":34},"updated":"2017-07-21 15:48:31.000000000","message":"Is there actually any reason to support py2?","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from docutils import nodes"},{"line_number":25,"context_line":"from docutils.parsers import rst"},{"line_number":26,"context_line":"from six.moves import configparser"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"KEY_PATTERN \u003d re.compile(\"[^a-zA-Z0-9_]\")"},{"line_number":29,"context_line":"DRIVER_TARGET_PREFIX \u003d \"driver-impl-\""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_d24aa77e","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":34},"in_reply_to":"1f1a1f67_fbefc7e6","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"73010315c512b576db669c1fdebe3e76bfed4305","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from docutils import nodes"},{"line_number":25,"context_line":"from docutils.parsers import rst"},{"line_number":26,"context_line":"from six.moves import configparser"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"KEY_PATTERN \u003d re.compile(\"[^a-zA-Z0-9_]\")"},{"line_number":29,"context_line":"DRIVER_TARGET_PREFIX \u003d \"driver-impl-\""}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_9ebd6c6a","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":34},"in_reply_to":"ff346bd7_d24aa77e","updated":"2017-12-01 22:16:19.000000000","message":"Actually looks like Nova for example sets py27 for docs build http://git.openstack.org/cgit/openstack/nova/tree/tox.ini#n125","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self.targets \u003d self._set_targets(cfg)"},{"line_number":38,"context_line":"        self.features \u003d self._set_features(cfg)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _set_targets(self, cfg):"},{"line_number":41,"context_line":"        # The \u0027targets\u0027 section is special - it lists all the"},{"line_number":42,"context_line":"        # backend drivers that this file records data for"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_db988b76","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":20},"updated":"2017-07-21 15:48:31.000000000","message":"can be @staticmethod","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self.targets \u003d self._set_targets(cfg)"},{"line_number":38,"context_line":"        self.features \u003d self._set_features(cfg)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _set_targets(self, cfg):"},{"line_number":41,"context_line":"        # The \u0027targets\u0027 section is special - it lists all the"},{"line_number":42,"context_line":"        # backend drivers that this file records data for"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_5256b72b","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":20},"in_reply_to":"1f1a1f67_db988b76","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        for item in cfg.options(\"targets\"):"},{"line_number":47,"context_line":"            if not item.startswith(DRIVER_TARGET_PREFIX):"},{"line_number":48,"context_line":"                raise Exception(\"\u0027%s\u0027 target field is malformed in \u0027[%s]\u0027 \""},{"line_number":49,"context_line":"                                \"section\" % (item, \"DEFAULT\"))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"            key \u003d item[len(DRIVER_TARGET_PREFIX):]"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_9b9d73bd","line":48,"range":{"start_line":48,"start_character":22,"end_line":48,"end_character":31},"updated":"2017-07-21 15:48:31.000000000","message":"I guess i18n isn\u0027t required because this is only used by devs?","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        for item in cfg.options(\"targets\"):"},{"line_number":47,"context_line":"            if not item.startswith(DRIVER_TARGET_PREFIX):"},{"line_number":48,"context_line":"                raise Exception(\"\u0027%s\u0027 target field is malformed in \u0027[%s]\u0027 \""},{"line_number":49,"context_line":"                                \"section\" % (item, \"DEFAULT\"))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"            key \u003d item[len(DRIVER_TARGET_PREFIX):]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_b20de33f","line":48,"range":{"start_line":48,"start_character":22,"end_line":48,"end_character":31},"in_reply_to":"1f1a1f67_9b9d73bd","updated":"2017-12-01 22:13:36.000000000","message":"that\u0027s my understanding","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        for item in cfg.options(\"targets\"):"},{"line_number":47,"context_line":"            if not item.startswith(DRIVER_TARGET_PREFIX):"},{"line_number":48,"context_line":"                raise Exception(\"\u0027%s\u0027 target field is malformed in \u0027[%s]\u0027 \""},{"line_number":49,"context_line":"                                \"section\" % (item, \"DEFAULT\"))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"            key \u003d item[len(DRIVER_TARGET_PREFIX):]"},{"line_number":52,"context_line":"            title \u003d cfg.get(\"targets\", item)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_77aaad19","line":49,"range":{"start_line":49,"start_character":52,"end_line":49,"end_character":59},"updated":"2017-07-21 15:48:31.000000000","message":"targets\n\nOr just hardcode it in the message.","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        for item in cfg.options(\"targets\"):"},{"line_number":47,"context_line":"            if not item.startswith(DRIVER_TARGET_PREFIX):"},{"line_number":48,"context_line":"                raise Exception(\"\u0027%s\u0027 target field is malformed in \u0027[%s]\u0027 \""},{"line_number":49,"context_line":"                                \"section\" % (item, \"DEFAULT\"))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"            key \u003d item[len(DRIVER_TARGET_PREFIX):]"},{"line_number":52,"context_line":"            title \u003d cfg.get(\"targets\", item)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_121f0f6d","line":49,"range":{"start_line":49,"start_character":52,"end_line":49,"end_character":59},"in_reply_to":"1f1a1f67_77aaad19","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"            title \u003d cfg.get(section, \"title\")"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"            status \u003d Feature.STATUS_OPTIONAL"},{"line_number":74,"context_line":"            if cfg.has_option(section, \"status\"):"},{"line_number":75,"context_line":"                # The value is a string \"status(group)\" where"},{"line_number":76,"context_line":"                # the \u0027group\u0027 part is optional"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_7b985769","line":73,"updated":"2017-07-21 15:48:31.000000000","message":"Should also init `group` here.  (If no `status` option, it\u0027ll be unassigned on L94.)","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"            title \u003d cfg.get(section, \"title\")"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"            status \u003d Feature.STATUS_OPTIONAL"},{"line_number":74,"context_line":"            if cfg.has_option(section, \"status\"):"},{"line_number":75,"context_line":"                # The value is a string \"status(group)\" where"},{"line_number":76,"context_line":"                # the \u0027group\u0027 part is optional"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_8dcc008a","line":73,"in_reply_to":"1f1a1f67_7b985769","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                if status not in Feature.STATUS_ALL:"},{"line_number":81,"context_line":"                    raise Exception("},{"line_number":82,"context_line":"                        \"\u0027status\u0027 field value \u0027%s\u0027 in [\u0027%s\u0027]\""},{"line_number":83,"context_line":"                        \"section must be (%s)\" %"},{"line_number":84,"context_line":"                        (status, section,"},{"line_number":85,"context_line":"                         \",\".join(Feature.STATUS_ALL)))"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_1b3ba3c8","line":83,"updated":"2017-07-21 15:48:31.000000000","message":"must be one of (%s)","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                if status not in Feature.STATUS_ALL:"},{"line_number":81,"context_line":"                    raise Exception("},{"line_number":82,"context_line":"                        \"\u0027status\u0027 field value \u0027%s\u0027 in [\u0027%s\u0027]\""},{"line_number":83,"context_line":"                        \"section must be (%s)\" %"},{"line_number":84,"context_line":"                        (status, section,"},{"line_number":85,"context_line":"                         \",\".join(Feature.STATUS_ALL)))"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_b2b16392","line":83,"in_reply_to":"1f1a1f67_1b3ba3c8","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        def _process_implementation(item, feature):"},{"line_number":97,"context_line":"            key \u003d item[len(DRIVER_TARGET_PREFIX):]"},{"line_number":98,"context_line":"            if key not in targets:"},{"line_number":99,"context_line":"                raise Exception("},{"line_number":100,"context_line":"                    \"driver-impl-\u0027%s\u0027 in \u0027[%s]\u0027 not declared in the \""},{"line_number":101,"context_line":"                    \"[targets] section of the INI file.\" % (item, section))"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_3e7d2d1c","line":98,"range":{"start_line":98,"start_character":26,"end_line":98,"end_character":33},"updated":"2017-07-21 15:48:31.000000000","message":"self.targets (or pass `targets` into this method)","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        def _process_implementation(item, feature):"},{"line_number":97,"context_line":"            key \u003d item[len(DRIVER_TARGET_PREFIX):]"},{"line_number":98,"context_line":"            if key not in targets:"},{"line_number":99,"context_line":"                raise Exception("},{"line_number":100,"context_line":"                    \"driver-impl-\u0027%s\u0027 in \u0027[%s]\u0027 not declared in the \""},{"line_number":101,"context_line":"                    \"[targets] section of the INI file.\" % (item, section))"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_92853fb0","line":98,"range":{"start_line":98,"start_character":26,"end_line":98,"end_character":33},"in_reply_to":"1f1a1f67_3e7d2d1c","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                    \"driver-impl-\u0027%s\u0027 in \u0027[%s]\u0027 not declared in the \""},{"line_number":101,"context_line":"                    \"[targets] section of the INI file.\" % (item, section))"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            status \u003d cfg.get(section, item)"},{"line_number":104,"context_line":"            if status not in SupportMatrixImplementation.STATUS_ALL:"},{"line_number":105,"context_line":"                raise Exception("},{"line_number":106,"context_line":"                    \"\u0027%s\u0027 value \u0027%s\u0027 in \u0027[%s]\u0027 section must be one of \""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_9b07b3ca","line":103,"range":{"start_line":103,"start_character":29,"end_line":103,"end_character":36},"updated":"2017-07-21 15:48:31.000000000","message":"`section` (declared on L126) should be passed into this method instead of implicitly used from the outer scope.","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                    \"driver-impl-\u0027%s\u0027 in \u0027[%s]\u0027 not declared in the \""},{"line_number":101,"context_line":"                    \"[targets] section of the INI file.\" % (item, section))"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            status \u003d cfg.get(section, item)"},{"line_number":104,"context_line":"            if status not in SupportMatrixImplementation.STATUS_ALL:"},{"line_number":105,"context_line":"                raise Exception("},{"line_number":106,"context_line":"                    \"\u0027%s\u0027 value \u0027%s\u0027 in \u0027[%s]\u0027 section must be one of \""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_7292dbf8","line":103,"range":{"start_line":103,"start_character":29,"end_line":103,"end_character":36},"in_reply_to":"1f1a1f67_9b07b3ca","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                    \"\u0027%s\u0027 value \u0027%s\u0027 in \u0027[%s]\u0027 section must be one of \""},{"line_number":107,"context_line":"                    \"(%s)\" % (item, status, section, \",\".join("},{"line_number":108,"context_line":"                        SupportMatrixImplementation.STATUS_ALL)))"},{"line_number":109,"context_line":"            notes_key \u003d DRIVER_NOTES_PREFIX + item[len("},{"line_number":110,"context_line":"                DRIVER_NOTES_PREFIX):]"},{"line_number":111,"context_line":"            notes \u003d None"},{"line_number":112,"context_line":"            if cfg.has_option(section, notes_key):"},{"line_number":113,"context_line":"                notes \u003d cfg.get(section, notes_key)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_5bf59bec","line":110,"range":{"start_line":109,"start_character":24,"end_line":110,"end_character":38},"updated":"2017-07-21 15:48:31.000000000","message":"This is weird - aren\u0027t you stripping off the DRIVER_NOTES_PREFIX just to add it back on?  Can\u0027t this just be\n\n notes_key \u003d item\n\n...or better yet, use `item` below and get rid of `notes_key` entirely.\n\n[Later] Ohh, did you mean to strip off DRIVER_*TARGET*_PREFIX?","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                    \"\u0027%s\u0027 value \u0027%s\u0027 in \u0027[%s]\u0027 section must be one of \""},{"line_number":107,"context_line":"                    \"(%s)\" % (item, status, section, \",\".join("},{"line_number":108,"context_line":"                        SupportMatrixImplementation.STATUS_ALL)))"},{"line_number":109,"context_line":"            notes_key \u003d DRIVER_NOTES_PREFIX + item[len("},{"line_number":110,"context_line":"                DRIVER_NOTES_PREFIX):]"},{"line_number":111,"context_line":"            notes \u003d None"},{"line_number":112,"context_line":"            if cfg.has_option(section, notes_key):"},{"line_number":113,"context_line":"                notes \u003d cfg.get(section, notes_key)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_0d1930d6","line":110,"range":{"start_line":109,"start_character":24,"end_line":110,"end_character":38},"in_reply_to":"1f1a1f67_5bf59bec","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    raise Exception(\"\u0027%s\u0027 missing in \u0027[%s]\u0027 section\" %"},{"line_number":121,"context_line":"                                    (key, section))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            features.append(feature)"},{"line_number":124,"context_line":"            return features"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        for section in cfg.sections():"},{"line_number":127,"context_line":"            if section \u003d\u003d \"targets\":"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_5ee909b5","line":124,"range":{"start_line":123,"start_character":12,"end_line":124,"end_character":27},"updated":"2017-07-21 15:48:31.000000000","message":"`features` is declared outside this scope.  I say don\u0027t mess with it here.  See below.","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    raise Exception(\"\u0027%s\u0027 missing in \u0027[%s]\u0027 section\" %"},{"line_number":121,"context_line":"                                    (key, section))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            features.append(feature)"},{"line_number":124,"context_line":"            return features"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        for section in cfg.sections():"},{"line_number":127,"context_line":"            if section \u003d\u003d \"targets\":"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_2d62b43f","line":124,"range":{"start_line":123,"start_character":12,"end_line":124,"end_character":27},"in_reply_to":"1f1a1f67_5ee909b5","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                    continue"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"                _process_implementation(item, feature)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        return features"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_be05bd7c","line":138,"updated":"2017-07-21 15:48:31.000000000","message":"This would be a better place to do the\n\n features.append(feature)","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                    continue"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"                _process_implementation(item, feature)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        return features"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_0d67f04f","line":138,"in_reply_to":"1f1a1f67_be05bd7c","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        self.implementations \u003d {}"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class SupportMatrixImplementation(object):"},{"line_number":164,"context_line":"    STATUS_COMPLETE \u003d \"complete\""},{"line_number":165,"context_line":"    STATUS_PARTIAL \u003d \"partial\""},{"line_number":166,"context_line":"    STATUS_MISSING \u003d \"missing\""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_bb838f56","line":163,"range":{"start_line":163,"start_character":6,"end_line":163,"end_character":33},"updated":"2017-07-21 15:48:31.000000000","message":"or just \"Implementation\"","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        self.implementations \u003d {}"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class SupportMatrixImplementation(object):"},{"line_number":164,"context_line":"    STATUS_COMPLETE \u003d \"complete\""},{"line_number":165,"context_line":"    STATUS_PARTIAL \u003d \"partial\""},{"line_number":166,"context_line":"    STATUS_MISSING \u003d \"missing\""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_b203a342","line":163,"range":{"start_line":163,"start_character":6,"end_line":163,"end_character":33},"in_reply_to":"1f1a1f67_bb838f56","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":183,"context_line":"}"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"class SupportMatrixTarget(object):"},{"line_number":187,"context_line":"    def __init__(self, key, title, driver, plugin\u003dNone,"},{"line_number":188,"context_line":"                 architecture\u003dNone):"},{"line_number":189,"context_line":"        \"\"\"Target/Driver object."}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_b723a5be","line":186,"range":{"start_line":186,"start_character":6,"end_line":186,"end_character":25},"updated":"2017-07-21 15:48:31.000000000","message":"or just \"Target\"","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":183,"context_line":"}"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"class SupportMatrixTarget(object):"},{"line_number":187,"context_line":"    def __init__(self, key, title, driver, plugin\u003dNone,"},{"line_number":188,"context_line":"                 architecture\u003dNone):"},{"line_number":189,"context_line":"        \"\"\"Target/Driver object."}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_32c7b315","line":186,"range":{"start_line":186,"start_character":6,"end_line":186,"end_character":25},"in_reply_to":"1f1a1f67_b723a5be","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        self.architecture \u003d architecture"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"class SupportMatrixDirective(rst.Directive):"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    # support-matrix.ini is the arg"},{"line_number":207,"context_line":"    required_arguments \u003d 1"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_3719d587","line":204,"range":{"start_line":204,"start_character":6,"end_line":204,"end_character":28},"updated":"2017-07-21 15:48:31.000000000","message":"or just \"Directive\"","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        self.architecture \u003d architecture"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"class SupportMatrixDirective(rst.Directive):"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    # support-matrix.ini is the arg"},{"line_number":207,"context_line":"    required_arguments \u003d 1"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_b255e352","line":204,"range":{"start_line":204,"start_character":6,"end_line":204,"end_character":28},"in_reply_to":"1f1a1f67_3719d587","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        :returns: SupportMatrix instance"},{"line_number":220,"context_line":"        \"\"\""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        cfg \u003d configparser.SafeConfigParser()"},{"line_number":223,"context_line":"        env \u003d self.state.document.settings.env"},{"line_number":224,"context_line":"        fname \u003d self.arguments[0]"},{"line_number":225,"context_line":"        rel_fpath, fpath \u003d env.relfn2path(fname)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_db42cbab","line":222,"range":{"start_line":222,"start_character":27,"end_line":222,"end_character":43},"updated":"2017-07-21 15:48:31.000000000","message":"I gather this is outdated - should just be ConfigParser()","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        :returns: SupportMatrix instance"},{"line_number":220,"context_line":"        \"\"\""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        cfg \u003d configparser.SafeConfigParser()"},{"line_number":223,"context_line":"        env \u003d self.state.document.settings.env"},{"line_number":224,"context_line":"        fname \u003d self.arguments[0]"},{"line_number":225,"context_line":"        rel_fpath, fpath \u003d env.relfn2path(fname)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_32621340","line":222,"range":{"start_line":222,"start_character":27,"end_line":222,"end_character":43},"in_reply_to":"1f1a1f67_db42cbab","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        fname \u003d self.arguments[0]"},{"line_number":225,"context_line":"        rel_fpath, fpath \u003d env.relfn2path(fname)"},{"line_number":226,"context_line":"        with open(fpath) as fp:"},{"line_number":227,"context_line":"            cfg.readfp(fp)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        # This ensures that the docs are rebuilt whenever the"},{"line_number":230,"context_line":"        # .ini file changes"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_7b0df78e","line":227,"range":{"start_line":227,"start_character":16,"end_line":227,"end_character":22},"updated":"2017-07-21 15:48:31.000000000","message":"read_file","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        fname \u003d self.arguments[0]"},{"line_number":225,"context_line":"        rel_fpath, fpath \u003d env.relfn2path(fname)"},{"line_number":226,"context_line":"        with open(fpath) as fp:"},{"line_number":227,"context_line":"            cfg.readfp(fp)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        # This ensures that the docs are rebuilt whenever the"},{"line_number":230,"context_line":"        # .ini file changes"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_52735716","line":227,"range":{"start_line":227,"start_character":16,"end_line":227,"end_character":22},"in_reply_to":"1f1a1f67_7b0df78e","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        self._build_notes(content)"},{"line_number":242,"context_line":"        return content"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def _build_summary(self, matrix, content):"},{"line_number":245,"context_line":"        \"\"\"Constructs the content for the summary of the support matrix."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        The summary consists of a giant table, with one row"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_3ef88dc2","line":244,"range":{"start_line":244,"start_character":8,"end_line":244,"end_character":22},"updated":"2017-07-21 15:48:31.000000000","message":"@staticmethod","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        self._build_notes(content)"},{"line_number":242,"context_line":"        return content"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def _build_summary(self, matrix, content):"},{"line_number":245,"context_line":"        \"\"\"Constructs the content for the summary of the support matrix."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        The summary consists of a giant table, with one row"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_d28747d7","line":244,"range":{"start_line":244,"start_character":8,"end_line":244,"end_character":22},"in_reply_to":"1f1a1f67_3ef88dc2","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":313,"context_line":"            impls \u003d matrix.targets.keys()"},{"line_number":314,"context_line":"            impls.sort()"},{"line_number":315,"context_line":"            for key in impls:"},{"line_number":316,"context_line":"                target \u003d matrix.targets[key]"},{"line_number":317,"context_line":"                impl \u003d feature.implementations[key]"},{"line_number":318,"context_line":"                impl_col \u003d nodes.entry()"},{"line_number":319,"context_line":"                item.append(impl_col)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_de6759b7","line":316,"range":{"start_line":316,"start_character":16,"end_line":316,"end_character":22},"updated":"2017-07-21 15:48:31.000000000","message":"not used","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":313,"context_line":"            impls \u003d matrix.targets.keys()"},{"line_number":314,"context_line":"            impls.sort()"},{"line_number":315,"context_line":"            for key in impls:"},{"line_number":316,"context_line":"                target \u003d matrix.targets[key]"},{"line_number":317,"context_line":"                impl \u003d feature.implementations[key]"},{"line_number":318,"context_line":"                impl_col \u003d nodes.entry()"},{"line_number":319,"context_line":"                item.append(impl_col)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_127eefe3","line":316,"range":{"start_line":316,"start_character":16,"end_line":316,"end_character":22},"in_reply_to":"1f1a1f67_de6759b7","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            item.append(para_divers)"},{"line_number":394,"context_line":"            details.append(item)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _build_notes(self, content):"},{"line_number":397,"context_line":"        \"\"\"Constructs a list of notes content for the support matrix."},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        This is generated as a bullet list."}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_5b859bce","line":396,"range":{"start_line":396,"start_character":8,"end_line":396,"end_character":20},"updated":"2017-07-21 15:48:31.000000000","message":"@staticmethod","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            item.append(para_divers)"},{"line_number":394,"context_line":"            details.append(item)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _build_notes(self, content):"},{"line_number":397,"context_line":"        \"\"\"Constructs a list of notes content for the support matrix."},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        This is generated as a bullet list."}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_7221bbfb","line":396,"range":{"start_line":396,"start_character":8,"end_line":396,"end_character":20},"in_reply_to":"1f1a1f67_5b859bce","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":409,"context_line":"            item.append(nodes.strong(text\u003dnote))"},{"line_number":410,"context_line":"            notes.append(item)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def _create_cli_paragraph(self, feature):"},{"line_number":413,"context_line":"        \"\"\"Create a paragraph which represents the CLI commands of the feature"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        The paragraph will have a bullet list of CLI commands."}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_db1bebc7","line":412,"range":{"start_line":412,"start_character":8,"end_line":412,"end_character":29},"updated":"2017-07-21 15:48:31.000000000","message":"@staticmethod","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":409,"context_line":"            item.append(nodes.strong(text\u003dnote))"},{"line_number":410,"context_line":"            notes.append(item)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def _create_cli_paragraph(self, feature):"},{"line_number":413,"context_line":"        \"\"\"Create a paragraph which represents the CLI commands of the feature"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        The paragraph will have a bullet list of CLI commands."}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_d212a7b1","line":412,"range":{"start_line":412,"start_character":8,"end_line":412,"end_character":29},"in_reply_to":"1f1a1f67_db1bebc7","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ebd7c6623496eafc982c1a859010ed6321e4546d","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        para.append(commands)"},{"line_number":425,"context_line":"        return para"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def _create_notes_paragraph(self, notes):"},{"line_number":428,"context_line":"        \"\"\"Constructs a paragraph which represents the implementation notes"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"        The paragraph consists of text and clickable URL nodes if links were"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_3b277f15","line":427,"range":{"start_line":427,"start_character":8,"end_line":427,"end_character":31},"updated":"2017-07-21 15:48:31.000000000","message":"@staticmethod","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"82a5e961fcd788c72efd1e9d6006c101db270bd2","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        para.append(commands)"},{"line_number":425,"context_line":"        return para"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def _create_notes_paragraph(self, notes):"},{"line_number":428,"context_line":"        \"\"\"Constructs a paragraph which represents the implementation notes"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"        The paragraph consists of text and clickable URL nodes if links were"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_12194fd6","line":427,"range":{"start_line":427,"start_character":8,"end_line":427,"end_character":31},"in_reply_to":"1f1a1f67_3b277f15","updated":"2017-12-01 22:13:36.000000000","message":"Done","commit_id":"f2cfc357c47c88b2a136d4920c08f1f4d88fec8e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5db511bee3f55404f5e25c87dbd77c7f37d8af5c","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            impl \u003d Implementation(status, notes)"},{"line_number":116,"context_line":"            feature.implementations[key] \u003d impl"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            #for key in targets:"},{"line_number":119,"context_line":"                #if key not in feature.implementations:"},{"line_number":120,"context_line":"                    #raise Exception(\"\u0027%s\u0027 missing in \u0027[%s]\u0027 section\" %"},{"line_number":121,"context_line":"                                    #(key, section))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            return feature"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_b9664a51","line":121,"range":{"start_line":118,"start_character":0,"end_line":121,"end_character":52},"updated":"2017-12-01 22:57:46.000000000","message":"?","commit_id":"6c06f37aae2f89833e74b3bcd76ec510ed90ed57"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"24b73086f837de37373adf2706f4a7d4b565f9d6","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            impl \u003d Implementation(status, notes)"},{"line_number":116,"context_line":"            feature.implementations[key] \u003d impl"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            #for key in targets:"},{"line_number":119,"context_line":"                #if key not in feature.implementations:"},{"line_number":120,"context_line":"                    #raise Exception(\"\u0027%s\u0027 missing in \u0027[%s]\u0027 section\" %"},{"line_number":121,"context_line":"                                    #(key, section))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            return feature"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_54c7a013","line":121,"range":{"start_line":118,"start_character":0,"end_line":121,"end_character":52},"in_reply_to":"df87a7cf_11cccaba","updated":"2017-12-04 16:25:05.000000000","message":"Okay, then consider my comment as expanding to, \"Don\u0027t forget about this when you publish the next edit.\" :)","commit_id":"6c06f37aae2f89833e74b3bcd76ec510ed90ed57"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"98fa48381e69714798a194e7713f165cc548348e","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            impl \u003d Implementation(status, notes)"},{"line_number":116,"context_line":"            feature.implementations[key] \u003d impl"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            #for key in targets:"},{"line_number":119,"context_line":"                #if key not in feature.implementations:"},{"line_number":120,"context_line":"                    #raise Exception(\"\u0027%s\u0027 missing in \u0027[%s]\u0027 section\" %"},{"line_number":121,"context_line":"                                    #(key, section))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            return feature"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_11cccaba","line":121,"range":{"start_line":118,"start_character":0,"end_line":121,"end_character":52},"in_reply_to":"df87a7cf_b9664a51","updated":"2017-12-04 15:55:17.000000000","message":"This patch is marked as wip.","commit_id":"6c06f37aae2f89833e74b3bcd76ec510ed90ed57"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5db511bee3f55404f5e25c87dbd77c7f37d8af5c","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        fname \u003d self.arguments[0]"},{"line_number":216,"context_line":"        rel_fpath, fpath \u003d env.relfn2path(fname)"},{"line_number":217,"context_line":"        with open(fpath) as fp:"},{"line_number":218,"context_line":"            cfg.readfp(fp)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        # This ensures that the docs are rebuilt whenever the"},{"line_number":221,"context_line":"        # .ini file changes"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_798762d9","line":218,"range":{"start_line":218,"start_character":16,"end_line":218,"end_character":22},"updated":"2017-12-01 22:57:46.000000000","message":"not done","commit_id":"6c06f37aae2f89833e74b3bcd76ec510ed90ed57"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"98fa48381e69714798a194e7713f165cc548348e","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        fname \u003d self.arguments[0]"},{"line_number":216,"context_line":"        rel_fpath, fpath \u003d env.relfn2path(fname)"},{"line_number":217,"context_line":"        with open(fpath) as fp:"},{"line_number":218,"context_line":"            cfg.readfp(fp)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        # This ensures that the docs are rebuilt whenever the"},{"line_number":221,"context_line":"        # .ini file changes"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_f1704675","line":218,"range":{"start_line":218,"start_character":16,"end_line":218,"end_character":22},"in_reply_to":"df87a7cf_798762d9","updated":"2017-12-04 15:55:17.000000000","message":"I noted in the previous patchset that we\u0027re using configparser 2.7 because of nova setting 2.7 for now http://git.openstack.org/cgit/openstack/nova/tree/tox.ini#n125","commit_id":"6c06f37aae2f89833e74b3bcd76ec510ed90ed57"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"24b73086f837de37373adf2706f4a7d4b565f9d6","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        fname \u003d self.arguments[0]"},{"line_number":216,"context_line":"        rel_fpath, fpath \u003d env.relfn2path(fname)"},{"line_number":217,"context_line":"        with open(fpath) as fp:"},{"line_number":218,"context_line":"            cfg.readfp(fp)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        # This ensures that the docs are rebuilt whenever the"},{"line_number":221,"context_line":"        # .ini file changes"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_f4f6f48f","line":218,"range":{"start_line":218,"start_character":16,"end_line":218,"end_character":22},"in_reply_to":"df87a7cf_f1704675","updated":"2017-12-04 16:25:05.000000000","message":"Ah, my bad; I thought the six.moves ConfigParser also had read_file, but I see that it does not.","commit_id":"6c06f37aae2f89833e74b3bcd76ec510ed90ed57"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        def _process_feature(section):"},{"line_number":64,"context_line":"            if section.startswith(\"title\"):"},{"line_number":65,"context_line":"                raise Exception("},{"line_number":66,"context_line":"                    \"\u0027title\u0027 option missing in \u0027[%s]\u0027 section\" % section)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"            title \u003d cfg.get(section, \"title\")"},{"line_number":69,"context_line":"            status \u003d Feature.STATUS_OPTIONAL"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_81667a29","line":66,"updated":"2017-12-12 21:12:26.000000000","message":"I don\u0027t understand this check. It\u0027s looking at the section name for \"title\" and then complaining that a title isn\u0027t found?","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"b1aef6804b1579ee28873dada662a27f00209469","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        def _process_feature(section):"},{"line_number":64,"context_line":"            if section.startswith(\"title\"):"},{"line_number":65,"context_line":"                raise Exception("},{"line_number":66,"context_line":"                    \"\u0027title\u0027 option missing in \u0027[%s]\u0027 section\" % section)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"            title \u003d cfg.get(section, \"title\")"},{"line_number":69,"context_line":"            status \u003d Feature.STATUS_OPTIONAL"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_4cef23e9","line":66,"in_reply_to":"df87a7cf_81667a29","updated":"2017-12-13 22:59:49.000000000","message":"Whoops, this should be check if the option exists.","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                                         cfg.get(section, \"status\")).groups()"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"                if status not in Feature.STATUS_ALL:"},{"line_number":79,"context_line":"                    raise Exception("},{"line_number":80,"context_line":"                        \"\u0027status\u0027 option value \u0027%s\u0027 in [\u0027%s\u0027]\""},{"line_number":81,"context_line":"                        \"section must be one of (%s)\" %"},{"line_number":82,"context_line":"                        (status, section,"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_6474a49d","line":79,"updated":"2017-12-12 21:12:26.000000000","message":"This could be a ValueError.","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"b1aef6804b1579ee28873dada662a27f00209469","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                                         cfg.get(section, \"status\")).groups()"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"                if status not in Feature.STATUS_ALL:"},{"line_number":79,"context_line":"                    raise Exception("},{"line_number":80,"context_line":"                        \"\u0027status\u0027 option value \u0027%s\u0027 in [\u0027%s\u0027]\""},{"line_number":81,"context_line":"                        \"section must be one of (%s)\" %"},{"line_number":82,"context_line":"                        (status, section,"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_6cc5475b","line":79,"in_reply_to":"df87a7cf_6474a49d","updated":"2017-12-13 22:59:49.000000000","message":"Done","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                        \"\u0027status\u0027 option value \u0027%s\u0027 in [\u0027%s\u0027]\""},{"line_number":81,"context_line":"                        \"section must be one of (%s)\" %"},{"line_number":82,"context_line":"                        (status, section,"},{"line_number":83,"context_line":"                         \",\".join(Feature.STATUS_ALL)))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"            cli \u003d []"},{"line_number":86,"context_line":"            if cfg.has_option(section, \"cli\"):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_c4457045","line":83,"updated":"2017-12-12 21:12:26.000000000","message":"as a cleanup patch, maybe add a space between the values (make it \", \".join())","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"b1aef6804b1579ee28873dada662a27f00209469","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                        \"\u0027status\u0027 option value \u0027%s\u0027 in [\u0027%s\u0027]\""},{"line_number":81,"context_line":"                        \"section must be one of (%s)\" %"},{"line_number":82,"context_line":"                        (status, section,"},{"line_number":83,"context_line":"                         \",\".join(Feature.STATUS_ALL)))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"            cli \u003d []"},{"line_number":86,"context_line":"            if cfg.has_option(section, \"cli\"):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_ecae3797","line":83,"in_reply_to":"df87a7cf_c4457045","updated":"2017-12-13 22:59:49.000000000","message":"Done","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        def _process_implementation(section, option, feature):"},{"line_number":95,"context_line":"            if option not in self.drivers:"},{"line_number":96,"context_line":"                raise Exception("},{"line_number":97,"context_line":"                    \"\u0027%s\u0027 section is not declared in the \""},{"line_number":98,"context_line":"                    \"INI file.\" % (option))"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_8479a894","line":96,"updated":"2017-12-12 21:12:26.000000000","message":"This could be a ValueError","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"b1aef6804b1579ee28873dada662a27f00209469","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        def _process_implementation(section, option, feature):"},{"line_number":95,"context_line":"            if option not in self.drivers:"},{"line_number":96,"context_line":"                raise Exception("},{"line_number":97,"context_line":"                    \"\u0027%s\u0027 section is not declared in the \""},{"line_number":98,"context_line":"                    \"INI file.\" % (option))"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_ac902f50","line":96,"in_reply_to":"df87a7cf_8479a894","updated":"2017-12-13 22:59:49.000000000","message":"Done","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"            status \u003d cfg.get(section, option)"},{"line_number":101,"context_line":"            if status not in Implementation.STATUS_ALL:"},{"line_number":102,"context_line":"                raise Exception("},{"line_number":103,"context_line":"                    \"%s is set to %s in \u0027[%s]\u0027 section but must be \""},{"line_number":104,"context_line":"                    \"one of (%s)\" % (option, status, section, \",\".join("},{"line_number":105,"context_line":"                        Implementation.STATUS_ALL)))"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_4473a0b2","line":102,"updated":"2017-12-12 21:12:26.000000000","message":"This could be a ValueError","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"b1aef6804b1579ee28873dada662a27f00209469","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"            status \u003d cfg.get(section, option)"},{"line_number":101,"context_line":"            if status not in Implementation.STATUS_ALL:"},{"line_number":102,"context_line":"                raise Exception("},{"line_number":103,"context_line":"                    \"%s is set to %s in \u0027[%s]\u0027 section but must be \""},{"line_number":104,"context_line":"                    \"one of (%s)\" % (option, status, section, \",\".join("},{"line_number":105,"context_line":"                        Implementation.STATUS_ALL)))"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_4c764341","line":102,"in_reply_to":"df87a7cf_4473a0b2","updated":"2017-12-13 22:59:49.000000000","message":"Done","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            if status not in Implementation.STATUS_ALL:"},{"line_number":102,"context_line":"                raise Exception("},{"line_number":103,"context_line":"                    \"%s is set to %s in \u0027[%s]\u0027 section but must be \""},{"line_number":104,"context_line":"                    \"one of (%s)\" % (option, status, section, \",\".join("},{"line_number":105,"context_line":"                        Implementation.STATUS_ALL)))"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"            impl \u003d Implementation(status)"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_046598e1","line":104,"updated":"2017-12-12 21:12:26.000000000","message":"Same comment about formatting with spaces between the options","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"b1aef6804b1579ee28873dada662a27f00209469","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            if status not in Implementation.STATUS_ALL:"},{"line_number":102,"context_line":"                raise Exception("},{"line_number":103,"context_line":"                    \"%s is set to %s in \u0027[%s]\u0027 section but must be \""},{"line_number":104,"context_line":"                    \"one of (%s)\" % (option, status, section, \",\".join("},{"line_number":105,"context_line":"                        Implementation.STATUS_ALL)))"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"            impl \u003d Implementation(status)"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_ac790f30","line":104,"in_reply_to":"df87a7cf_046598e1","updated":"2017-12-13 22:59:49.000000000","message":"Done","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"                implementation \u003d _process_implementation(section, option,"},{"line_number":125,"context_line":"                                                         feature)"},{"line_number":126,"context_line":"                features.append(implementation)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        return features"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_64d02455","line":126,"updated":"2017-12-12 21:12:26.000000000","message":"_process_implementation() returns feature, so this is going to result in the same Feature instance being appended to the list multiple times. Is that what we want? Or is _process_implementation() returning the wrong value?","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"b1aef6804b1579ee28873dada662a27f00209469","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"                implementation \u003d _process_implementation(section, option,"},{"line_number":125,"context_line":"                                                         feature)"},{"line_number":126,"context_line":"                features.append(implementation)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        return features"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_cc333362","line":126,"in_reply_to":"df87a7cf_64d02455","updated":"2017-12-13 22:59:49.000000000","message":"Yes a driver\u0027s implementation will be set for various features.","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self.link \u003d link"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"class Directive(rst.Directive):"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    # support-matrix.ini is the arg"},{"line_number":190,"context_line":"    required_arguments \u003d 1"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_0184aab0","line":187,"updated":"2017-12-12 21:12:26.000000000","message":"This class could use a more descriptive name.","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"5928bb0b3105541ab870514c1094e11ff94d00ee","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self.link \u003d link"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"class Directive(rst.Directive):"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    # support-matrix.ini is the arg"},{"line_number":190,"context_line":"    required_arguments \u003d 1"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f96bb07_d7bb746f","line":187,"in_reply_to":"7f96bb07_170a3c89","updated":"2018-01-15 19:33:49.000000000","message":"OK, I didn\u0027t see that comment when I went to review the latest version.\n\nI prefer to stick to descriptive names as much as possible.","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59180fa57ee2668153cc02cac817b768aa5dc0e2","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self.link \u003d link"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"class Directive(rst.Directive):"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    # support-matrix.ini is the arg"},{"line_number":190,"context_line":"    required_arguments \u003d 1"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f96bb07_2267f427","line":187,"in_reply_to":"7f96bb07_d7bb746f","updated":"2018-01-15 20:28:09.000000000","message":"My philosophy was that we\u0027re in a module called support_matrix; so prefixing stuff with SupportMatrix seems redundant.","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"322398151bc9c12b9eb44186391e425d733488ad","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self.link \u003d link"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"class Directive(rst.Directive):"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    # support-matrix.ini is the arg"},{"line_number":190,"context_line":"    required_arguments \u003d 1"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f96bb07_170a3c89","line":187,"in_reply_to":"7f96bb07_dc2b9b2d","updated":"2018-01-15 19:19:22.000000000","message":"My initial patch did exactly that, but Eric suggested removing it.","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"b1aef6804b1579ee28873dada662a27f00209469","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self.link \u003d link"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"class Directive(rst.Directive):"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    # support-matrix.ini is the arg"},{"line_number":190,"context_line":"    required_arguments \u003d 1"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_4c2083f8","line":187,"in_reply_to":"df87a7cf_0184aab0","updated":"2017-12-13 22:59:49.000000000","message":"Can you give me an idea? This is the directive of the extension file it\u0027s written in. Something like MatrixDirective?","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"585584e7ea6337140b4da1a1e73d7097ba388823","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self.link \u003d link"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"class Directive(rst.Directive):"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    # support-matrix.ini is the arg"},{"line_number":190,"context_line":"    required_arguments \u003d 1"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f96bb07_dc2b9b2d","line":187,"in_reply_to":"df87a7cf_4c2083f8","updated":"2018-01-15 18:29:37.000000000","message":"It\u0027s common to include the actual directive name in the class. So maybe SupportMatrixDirective?","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        \"\"\""},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        summary_title \u003d nodes.subtitle(text\u003d\"Summary\")"},{"line_number":238,"context_line":"        summary \u003d nodes.table()"},{"line_number":239,"context_line":"        cols \u003d len(matrix.drivers.keys())"},{"line_number":240,"context_line":"        cols +\u003d 2"},{"line_number":241,"context_line":"        summary_group \u003d nodes.tgroup(cols\u003dcols)"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_2458dcf8","line":238,"updated":"2017-12-12 21:12:26.000000000","message":"Building the table data structure from scratch certainly works. You could also build a list-table directive in a text string and then parse it recursively. You don\u0027t *have* to rewrite it, but I think that approach is somewhat easier to debug because the table can be printed out easily.","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"285e2dd4a13a844f1d3fbffa3da33d597235f87e","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        summary_title \u003d nodes.subtitle(text\u003d\"Summary\")"},{"line_number":238,"context_line":"        summary \u003d nodes.table()"},{"line_number":239,"context_line":"        cols \u003d len(matrix.drivers.keys())"},{"line_number":240,"context_line":"        cols +\u003d 2"},{"line_number":241,"context_line":"        summary_group \u003d nodes.tgroup(cols\u003dcols)"},{"line_number":242,"context_line":"        summary_body \u003d nodes.tbody()"},{"line_number":243,"context_line":"        summary_head \u003d nodes.thead()"}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_84d52846","line":240,"updated":"2017-12-12 21:12:26.000000000","message":"What is magic about the extra 2 columns?","commit_id":"351a992b95cd37edb3375f51f0583eeb78d282cc"}]}
