)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The initial implementation only has support for an in memory KVS backing store"},{"line_number":18,"context_line":"More backends are planned, specifically a SQL based.  The KVS Backend will be"},{"line_number":19,"context_line":"upgraded to use the dogtag backed KVS stores"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"The default revoke provider does not record anything.  There is a"},{"line_number":22,"context_line":"sample kvs backend that does not persist the tokens."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"AAAAUH%2F%2B%2FH0%3D","line":19,"updated":"2014-01-20 03:15:47.000000000","message":"s/dogtag/dogpile","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"de58f753817d406d046914a53cad6863cbbc1a13","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The initial implementation only has support for an in memory KVS backing store"},{"line_number":18,"context_line":"More backends are planned, specifically a SQL based.  The KVS Backend will be"},{"line_number":19,"context_line":"upgraded to use the dogtag backed KVS stores"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"The default revoke provider does not record anything.  There is a"},{"line_number":22,"context_line":"sample kvs backend that does not persist the tokens."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"AAAAUH%2F%2B%2FAY%3D","line":19,"in_reply_to":"AAAAUH%2F%2B%2FH0%3D","updated":"2014-01-20 04:15:53.000000000","message":"Done","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Revocation Events"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Base API for reporting revocation events Includes registering V3 only"},{"line_number":10,"context_line":"extensions. Does not include the generation of the events as side effects from"},{"line_number":11,"context_line":"other calls, such as token revocations. Adds a config file option to disable"},{"line_number":12,"context_line":"the existing mechanismas that support revoking a token by that token\u0027s id:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"AAAAUH%2F%2B5kc%3D","line":9,"updated":"2014-01-20 23:55:32.000000000","message":"add a . after events","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Base API for reporting revocation events Includes registering V3 only"},{"line_number":10,"context_line":"extensions. Does not include the generation of the events as side effects from"},{"line_number":11,"context_line":"other calls, such as token revocations. Adds a config file option to disable"},{"line_number":12,"context_line":"the existing mechanismas that support revoking a token by that token\u0027s id:"},{"line_number":13,"context_line":"revoke_by_id. This flag is necessary totest that the revocation mechanism is"},{"line_number":14,"context_line":"working as defined, but will also be part of the phased removal of the older"},{"line_number":15,"context_line":"mechanisms."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"AAAAUH%2F%2B5kY%3D","line":12,"updated":"2014-01-20 23:55:32.000000000","message":"change \"mechanismas\" to \"mechanisms\"\n\nalso, the sample config doesn\u0027t mention this option, so it should be updated with this.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":10,"context_line":"extensions. Does not include the generation of the events as side effects from"},{"line_number":11,"context_line":"other calls, such as token revocations. Adds a config file option to disable"},{"line_number":12,"context_line":"the existing mechanismas that support revoking a token by that token\u0027s id:"},{"line_number":13,"context_line":"revoke_by_id. This flag is necessary totest that the revocation mechanism is"},{"line_number":14,"context_line":"working as defined, but will also be part of the phased removal of the older"},{"line_number":15,"context_line":"mechanisms."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"AAAAUH%2F%2B5kQ%3D","line":13,"updated":"2014-01-20 23:55:32.000000000","message":"change \"totest\" to \"to test\"","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The initial implementation only has support for an in memory KVS backing store"},{"line_number":18,"context_line":"More backends are planned, specifically a SQL based.  The KVS Backend will be"},{"line_number":19,"context_line":"upgraded to use the Dogpile backed KVS stores"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"The default revoke provider does not record anything.  It is called from"},{"line_number":22,"context_line":"man places in the cod, and that code would be much more verbose if it were"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"AAAAUH%2F%2B5j4%3D","line":19,"updated":"2014-01-20 23:55:32.000000000","message":"add a . at end of sentence.\n\nAlso, thanks for splitting that work out into a separate commit!","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":19,"context_line":"upgraded to use the Dogpile backed KVS stores"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"The default revoke provider does not record anything.  It is called from"},{"line_number":22,"context_line":"man places in the cod, and that code would be much more verbose if it were"},{"line_number":23,"context_line":"conditional.  If the extension is removed from the pipeline, the revoke calls"},{"line_number":24,"context_line":"will not be accessable.  Thus, to use this, both add the extension to the"},{"line_number":25,"context_line":"pipeline and add a backend other than the fake one."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"AAAAUH%2F%2B5jk%3D","line":22,"updated":"2014-01-20 23:55:32.000000000","message":"change \"man\" to \"many\". gross.\n\nchange \"cod\" to \"code\". gross.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":25,"context_line":"pipeline and add a backend other than the fake one."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"There is a"},{"line_number":28,"context_line":"sample kvs backend that does not persist the tokens."},{"line_number":29,"context_line":"Revoke tests have been extended to testboth with and without"},{"line_number":30,"context_line":"revoke-by-id enabled"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"AAAAUH%2F%2B5jI%3D","line":28,"updated":"2014-01-20 23:55:32.000000000","message":"this was already mentioned at line 17","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"There is a"},{"line_number":28,"context_line":"sample kvs backend that does not persist the tokens."},{"line_number":29,"context_line":"Revoke tests have been extended to testboth with and without"},{"line_number":30,"context_line":"revoke-by-id enabled"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Blueprint: revocation-events"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"AAAAUH%2F%2B5jA%3D","line":29,"updated":"2014-01-20 23:55:32.000000000","message":"change \"testboth\" to \"test both\"","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":28,"context_line":"sample kvs backend that does not persist the tokens."},{"line_number":29,"context_line":"Revoke tests have been extended to testboth with and without"},{"line_number":30,"context_line":"revoke-by-id enabled"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Blueprint: revocation-events"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Change-Id: If76c8cd5d01a5b991c58a4d1a9d534b2a3da875a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"AAAAUH%2F%2B5hg%3D","line":31,"updated":"2014-01-20 23:55:32.000000000","message":"could also mention that group role revocations aren\u0027t done? (see assignment/core.py line 460 TODO)","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f2d27140feb6804a1c436e2a5a869ebbf5ac8894","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The initial implementation only has support for an in memory KVS backing store"},{"line_number":18,"context_line":"More backends are planned, specifically a SQL based.  The KVS Backend will be"},{"line_number":19,"context_line":"upgraded to use the Dogpile backed KVS stores."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"The default revoke provider does not record anything.  It is called from"},{"line_number":22,"context_line":"many places in the code, and that code would be much more verbose if it were"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"AAAAUH%2F%2B1x4%3D","line":19,"updated":"2014-01-21 15:24:58.000000000","message":"Is this doc\u0027d somewhere other than this commit message?","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":26,"context_line":"to test that the revocation mechanism is working as defined, but will also"},{"line_number":27,"context_line":"be part of the phased removal of the older mechanisms. TokenRevoke tests"},{"line_number":28,"context_line":"have been extended to test both with and without revoke-by-id enabled."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Blueprint: revocation-events"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Change-Id: If76c8cd5d01a5b991c58a4d1a9d534b2a3da875a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":46,"id":"AAAAUX%2F%2B%2FpA%3D","line":29,"updated":"2014-02-17 19:26:32.000000000","message":"Should add limitations to the implementation to this commit message:\n\n The links aren\u0027t filled in in the list_events response.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":26,"context_line":"to test that the revocation mechanism is working as defined, but will also"},{"line_number":27,"context_line":"be part of the phased removal of the older mechanisms. TokenRevoke tests"},{"line_number":28,"context_line":"have been extended to test both with and without revoke-by-id enabled."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Blueprint: revocation-events"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Change-Id: If76c8cd5d01a5b991c58a4d1a9d534b2a3da875a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":46,"id":"AAAAUX%2F%2B8j8%3D","line":29,"in_reply_to":"AAAAUX%2F%2B%2FpA%3D","updated":"2014-02-19 18:41:05.000000000","message":"Done","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"The KVS Backend uses the Dogpile backed KVS stores."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"revocation event integration"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Modifies the places that were directly deleting tokens to instead generate"},{"line_number":16,"context_line":"revocation events."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":59,"id":"AAAAU3%2F%2FZVs%3D","line":13,"updated":"2014-02-26 22:05:50.000000000","message":"Remove this line?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"revocation event integration"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Modifies the places that were directly deleting tokens to instead generate"},{"line_number":16,"context_line":"revocation events."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Where possible the revocations are triggered by listening to the notifications."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":59,"id":"AAAAU3%2F%2FZVU%3D","line":15,"updated":"2014-02-26 22:05:50.000000000","message":"change \"instead\" to \"also\"","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"be part of the phased removal of the older mechanisms. TokenRevoke tests"},{"line_number":26,"context_line":"have been extended to test both with and without revoke-by-id enabled."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Note: The links aren\u0027t filled in in the list_events response."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Blueprint: revocation-events"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":59,"id":"AAAAU3%2F%2FZMs%3D","line":28,"updated":"2014-02-26 22:05:50.000000000","message":"remove extra \"in\"","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"The KVS Backend uses the Dogpile backed KVS stores."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"revocation event integration"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Modifies the places that were directly deleting tokens to instead generate"},{"line_number":16,"context_line":"revocation events."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":60,"id":"AAAAVX%2F%2F%2BlM%3D","line":13,"updated":"2014-02-27 02:22:07.000000000","message":"Remove this line?","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"revocation event integration"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Modifies the places that were directly deleting tokens to instead generate"},{"line_number":16,"context_line":"revocation events."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Where possible the revocations are triggered by listening to the notifications."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":60,"id":"AAAAVX%2F%2F%2BlE%3D","line":15,"updated":"2014-02-27 02:22:07.000000000","message":"change \"instead\" to \"also\"","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":25,"context_line":"be part of the phased removal of the older mechanisms. TokenRevoke tests"},{"line_number":26,"context_line":"have been extended to test both with and without revoke-by-id enabled."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Note: The links aren\u0027t filled in in the list_events response."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Blueprint: revocation-events"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":60,"id":"AAAAVX%2F%2F%2BlA%3D","line":28,"updated":"2014-02-27 02:22:07.000000000","message":"remove extra \"in\"","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"4350cf79ecaf607a3f9d5429066ac2c1dc5d3ff0","unresolved":false,"context_lines":[{"line_number":40,"context_line":"create a set of nested maps for the events. Look up revocation by"},{"line_number":41,"context_line":"traversing down the tree."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Blueprint: efficient-revocation-check"},{"line_number":44,"context_line":"Blueprint: revocation-events"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Change-Id: If76c8cd5d01a5b991c58a4d1a9d534b2a3da875a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":71,"id":"AAAAVn%2F%2F3Yo%3D","line":43,"updated":"2014-03-03 18:26:08.000000000","message":"remove","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":40,"context_line":"create a set of nested maps for the events. Look up revocation by"},{"line_number":41,"context_line":"traversing down the tree."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Blueprint: efficient-revocation-check"},{"line_number":44,"context_line":"Blueprint: revocation-events"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Change-Id: If76c8cd5d01a5b991c58a4d1a9d534b2a3da875a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":71,"id":"AAAAVn%2F%2F2Nc%3D","line":43,"in_reply_to":"AAAAVn%2F%2F3Yo%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"}],"doc/source/configuration.rst":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e9f1df475070be9985f36a140cb60632ba141791","unresolved":false,"context_lines":[{"line_number":857,"context_line":"   extensions/federation-configuration.rst"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"Revocation Events"},{"line_number":860,"context_line":"------------------"},{"line_number":861,"context_line":".. toctree::"},{"line_number":862,"context_line":"   :maxdepth: 1"},{"line_number":863,"context_line":""}],"source_content_type":"text/x-rst","patch_set":75,"id":"AAAAVn%2F%2Fz1g%3D","line":860,"updated":"2014-03-04 01:33:17.000000000","message":"missing whitespace after L860","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":857,"context_line":"   extensions/federation-configuration.rst"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"Revocation Events"},{"line_number":860,"context_line":"------------------"},{"line_number":861,"context_line":".. toctree::"},{"line_number":862,"context_line":"   :maxdepth: 1"},{"line_number":863,"context_line":""}],"source_content_type":"text/x-rst","patch_set":75,"id":"AAAAVn%2F%2Fzg0%3D","line":860,"in_reply_to":"AAAAVn%2F%2Fz1g%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"}],"doc/source/extensions/revoke-configuration.rst":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"For the SQL driver it should will be::"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    driver \u003d keystone.contrib.revoke.backends.kvs.Revoke"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"2. Add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"}],"source_content_type":"text/x-rst","patch_set":71,"id":"AAAAVn%2F%2F6hw%3D","line":28,"updated":"2014-03-03 15:23:04.000000000","message":"Either this or the line above is incorrect.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    [pipeline:api_v3]"},{"line_number":37,"context_line":"    pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"3. Create the extension tables if using the provided sql backend{{"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    ./bin/keystone-manage db_sync --extension revoke"}],"source_content_type":"text/x-rst","patch_set":71,"id":"AAAAVn%2F%2F6hQ%3D","line":39,"updated":"2014-03-03 15:23:04.000000000","message":"Do we capitalize SQL in our documentation or do we always refer to it as sql?","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    [pipeline:api_v3]"},{"line_number":37,"context_line":"    pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"3. Create the extension tables if using the provided sql backend{{"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    ./bin/keystone-manage db_sync --extension revoke"}],"source_content_type":"text/x-rst","patch_set":71,"id":"AAAAVn%2F%2F5GA%3D","line":39,"in_reply_to":"AAAAVn%2F%2F6hQ%3D","updated":"2014-03-03 21:12:49.000000000","message":"I\u0027d have to do an exhaustive search, but SQL is more correct; its an acronym for   Structured Query Language.  I\u0027ll use that consistently.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0af7b8d0bc91da6283895605b8a72bab27f547be","unresolved":false,"context_lines":[{"line_number":12,"context_line":"      under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":15,"context_line":"Extension OS-REVOKE"},{"line_number":16,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"To enable the ``OS-REVOKE`` extension:"}],"source_content_type":"text/x-rst","patch_set":75,"id":"AAAAVn%2F%2Fzfo%3D","line":15,"updated":"2014-03-04 02:02:43.000000000","message":"Suggest rename to: \"Enable Revocation Extension\"\nto be consistent with the other extensions.","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"      under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":15,"context_line":"Extension OS-REVOKE"},{"line_number":16,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"To enable the ``OS-REVOKE`` extension:"}],"source_content_type":"text/x-rst","patch_set":75,"id":"AAAAVn%2F%2FzVc%3D","line":15,"in_reply_to":"AAAAVn%2F%2Fzfo%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e9f1df475070be9985f36a140cb60632ba141791","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    driver \u003d keystone.contrib.revoke.backends.sql.Revoke"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"2. Add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    [filter:revoke_extension]"},{"line_number":34,"context_line":"    paste.filter_factory \u003d keystone.contrib.revoke.routers:RevokeExtension.factory"}],"source_content_type":"text/x-rst","patch_set":75,"id":"AAAAVn%2F%2Fz1Q%3D","line":31,"updated":"2014-03-04 01:33:17.000000000","message":"::","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    driver \u003d keystone.contrib.revoke.backends.sql.Revoke"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"2. Add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    [filter:revoke_extension]"},{"line_number":34,"context_line":"    paste.filter_factory \u003d keystone.contrib.revoke.routers:RevokeExtension.factory"}],"source_content_type":"text/x-rst","patch_set":75,"id":"AAAAVn%2F%2FzgY%3D","line":31,"in_reply_to":"AAAAVn%2F%2Fz1Q%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0af7b8d0bc91da6283895605b8a72bab27f547be","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    paste.filter_factory \u003d keystone.contrib.revoke.routers:RevokeExtension.factory"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    [pipeline:api_v3]"},{"line_number":37,"context_line":"    pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"3. Create the extension tables if using the provided SQL backend{{"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-rst","patch_set":75,"id":"AAAAVn%2F%2FzfE%3D","line":37,"updated":"2014-03-04 02:02:43.000000000","message":"missing \u0027service_v3\u0027 at the end of this pipeline:\n\naccess_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body rev\noke_extension service_v3","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    paste.filter_factory \u003d keystone.contrib.revoke.routers:RevokeExtension.factory"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    [pipeline:api_v3]"},{"line_number":37,"context_line":"    pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"3. Create the extension tables if using the provided SQL backend{{"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-rst","patch_set":75,"id":"AAAAVn%2F%2FzVY%3D","line":37,"in_reply_to":"AAAAVn%2F%2FzfE%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e9f1df475070be9985f36a140cb60632ba141791","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    [pipeline:api_v3]"},{"line_number":37,"context_line":"    pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"3. Create the extension tables if using the provided SQL backend{{"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    ./bin/keystone-manage db_sync --extension revoke"}],"source_content_type":"text/x-rst","patch_set":75,"id":"AAAAVn%2F%2Fz1U%3D","line":39,"updated":"2014-03-04 01:33:17.000000000","message":"::","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    [pipeline:api_v3]"},{"line_number":37,"context_line":"    pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"3. Create the extension tables if using the provided SQL backend{{"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    ./bin/keystone-manage db_sync --extension revoke"}],"source_content_type":"text/x-rst","patch_set":75,"id":"AAAAVn%2F%2FzgU%3D","line":39,"in_reply_to":"AAAAVn%2F%2Fz1U%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":26,"context_line":"For the SQL driver::"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    driver \u003d keystone.contrib.revoke.backends.sql.Revoke"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"2. Add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``::"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-rst","patch_set":82,"id":"AAAAVn%2F%2Fp4U%3D","line":29,"updated":"2014-03-04 23:26:37.000000000","message":"random extra whitespace","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"etc/keystone-paste.ini":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7b32013c0c4ebdb17d1ca50d4488ceac064742d1","unresolved":false,"context_lines":[{"line_number":64,"context_line":"pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body ec2_extension user_crud_extension public_service"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"[pipeline:admin_api]"},{"line_number":67,"context_line":"pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension crud_extension admin_service"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"[pipeline:api_v3]"},{"line_number":70,"context_line":"pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body ec2_extension s3_extension revoke_extension service_v3"}],"source_content_type":"text/x-properties","patch_set":3,"id":"AAAATn%2F%2BEVs%3D","line":67,"updated":"2013-12-02 21:44:33.000000000","message":"did we want this running by default? I don\u0027t recall if we spoke about this in the design session, but usually the stuff in contrib doesn\u0027t run by default","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b260fc008d2b19da08aa91007a383477bfe1d7a2","unresolved":false,"context_lines":[{"line_number":64,"context_line":"pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body ec2_extension user_crud_extension public_service"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"[pipeline:admin_api]"},{"line_number":67,"context_line":"pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension crud_extension admin_service"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"[pipeline:api_v3]"},{"line_number":70,"context_line":"pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body ec2_extension s3_extension revoke_extension service_v3"}],"source_content_type":"text/x-properties","patch_set":3,"id":"AAAATn%2F%2BDUA%3D","line":67,"in_reply_to":"AAAATn%2F%2BEVs%3D","updated":"2013-12-03 02:26:23.000000000","message":"Yes, it can.  It needs to get in before Icehouse 2 closes, though.","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7b32013c0c4ebdb17d1ca50d4488ceac064742d1","unresolved":false,"context_lines":[{"line_number":67,"context_line":"pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension crud_extension admin_service"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"[pipeline:api_v3]"},{"line_number":70,"context_line":"pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body ec2_extension s3_extension revoke_extension service_v3"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"[app:public_version_service]"},{"line_number":73,"context_line":"paste.app_factory \u003d keystone.service:public_version_app_factory"}],"source_content_type":"text/x-properties","patch_set":3,"id":"AAAATn%2F%2BEVo%3D","line":70,"updated":"2013-12-02 21:44:33.000000000","message":"same here","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":7052,"name":"Fabio Giannetti","email":"fgiannet@cisco.com","username":"fabgia"},"change_message_id":"87b157ece3f34ca3d6460f39f38cd0359c297103","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"[pipeline:admin_api]"},{"line_number":76,"context_line":"pipeline \u003d access_log sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension crud_extension admin_service"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"[pipeline:api_v3]"},{"line_number":79,"context_line":"pipeline \u003d access_log sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension simple_cert_extension service_v3"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-properties","patch_set":39,"id":"AAAAUH%2F98sg%3D","line":77,"updated":"2014-01-31 19:06:31.000000000","message":"This should be removed from the pipeline since it is optional","commit_id":"a941324a43b10fb89449207a417198ad8f4d4a5a"},{"author":{"_account_id":7052,"name":"Fabio Giannetti","email":"fgiannet@cisco.com","username":"fabgia"},"change_message_id":"87b157ece3f34ca3d6460f39f38cd0359c297103","unresolved":false,"context_lines":[{"line_number":76,"context_line":"pipeline \u003d access_log sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension crud_extension admin_service"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"[pipeline:api_v3]"},{"line_number":79,"context_line":"pipeline \u003d access_log sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension simple_cert_extension service_v3"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"[app:public_version_service]"},{"line_number":82,"context_line":"paste.app_factory \u003d keystone.service:public_version_app_factory"}],"source_content_type":"text/x-properties","patch_set":39,"id":"AAAAUH%2F98sU%3D","line":79,"updated":"2014-01-31 19:06:31.000000000","message":"Same as above","commit_id":"a941324a43b10fb89449207a417198ad8f4d4a5a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":73,"context_line":"pipeline \u003d sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body ec2_extension user_crud_extension public_service"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"[pipeline:admin_api]"},{"line_number":76,"context_line":"pipeline \u003d sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension crud_extension admin_service"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"[pipeline:api_v3]"},{"line_number":79,"context_line":"pipeline \u003d sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension simple_cert_extension service_v3"}],"source_content_type":"text/x-properties","patch_set":46,"id":"AAAAUX%2F%2B%2BlA%3D","line":76,"updated":"2014-02-17 22:00:23.000000000","message":"remove this from the v2 pipeline","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9e384c82b6742bbfd0cea1a7873b0d09774fbba7","unresolved":false,"context_lines":[{"line_number":76,"context_line":"pipeline \u003d sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body ec2_extension s3_extension crud_extension admin_service"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"[pipeline:api_v3]"},{"line_number":79,"context_line":"pipeline \u003d sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension simple_cert_extension service_v3"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"[app:public_version_service]"},{"line_number":82,"context_line":"paste.app_factory \u003d keystone.service:public_version_app_factory"}],"source_content_type":"text/x-properties","patch_set":59,"id":"AAAAU3%2F%2FbW8%3D","line":79,"updated":"2014-02-26 19:06:56.000000000","message":"I thought extensions are not supposed to be on the default pipeline.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ea63c3108e8cf964ac8a81ea76640b98bf647ce5","unresolved":false,"context_lines":[{"line_number":76,"context_line":"pipeline \u003d sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body ec2_extension s3_extension crud_extension admin_service"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"[pipeline:api_v3]"},{"line_number":79,"context_line":"pipeline \u003d sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body revoke_extension ec2_extension s3_extension simple_cert_extension service_v3"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"[app:public_version_service]"},{"line_number":82,"context_line":"paste.app_factory \u003d keystone.service:public_version_app_factory"}],"source_content_type":"text/x-properties","patch_set":59,"id":"AAAAU3%2F%2FaWE%3D","line":79,"in_reply_to":"AAAAU3%2F%2FbW8%3D","updated":"2014-02-26 19:55:38.000000000","message":"Before Feature Freeze, I believe this is fine.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"}],"etc/keystone.conf.sample":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":278,"context_line":"# revocation_cache_time \u003d 3600"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"[revoke]"},{"line_number":281,"context_line":"#driver \u003d keystone.contrib.revoke.backends.fake.Revoke"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"[cache]"},{"line_number":284,"context_line":"# Global cache functionality toggle."}],"source_content_type":"application/octet-stream","patch_set":20,"id":"AAAAUH%2F%2B7Lw%3D","line":281,"updated":"2014-01-20 18:09:40.000000000","message":"is this is missing from common.config, nvm, it\u0027s in the extension","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"}],"etc/policy.json":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ea63c3108e8cf964ac8a81ea76640b98bf647ce5","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    \"identity:delete_mapping\": \"rule:admin_required\","},{"line_number":127,"context_line":"    \"identity:update_mapping\": \"rule:admin_required\","},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    \"identity:list_revoke_events\": \"@\""},{"line_number":130,"context_line":"}"}],"source_content_type":"application/json","patch_set":59,"id":"AAAAU3%2F%2FaVw%3D","line":129,"updated":"2014-02-26 19:55:38.000000000","message":"Does this really need policy around it? Didn\u0027t we decide that revocation events were always public?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    \"identity:delete_mapping\": \"rule:admin_required\","},{"line_number":127,"context_line":"    \"identity:update_mapping\": \"rule:admin_required\","},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    \"identity:list_revoke_events\": \"@\""},{"line_number":130,"context_line":"}"}],"source_content_type":"application/json","patch_set":59,"id":"AAAAU3%2F%2FZMI%3D","line":129,"updated":"2014-02-26 22:05:50.000000000","message":"suggest remove the \"@\". Would be more consistent since this file uses empty string at line 86.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    \"identity:delete_mapping\": \"rule:admin_required\","},{"line_number":127,"context_line":"    \"identity:update_mapping\": \"rule:admin_required\","},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    \"identity:list_revoke_events\": \"@\""},{"line_number":130,"context_line":"}"}],"source_content_type":"application/json","patch_set":60,"id":"AAAAVX%2F%2F%2Bk4%3D","line":129,"updated":"2014-02-27 02:22:07.000000000","message":"suggest remove the \"@\". Would be more consistent since this file uses empty string at line 86.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"}],"etc/policy.v3cloudsample.json":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    \"identity:delete_mapping\": \"rule:admin_required\","},{"line_number":139,"context_line":"    \"identity:update_mapping\": \"rule:admin_required\","},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    \"identity:list_revoke_events\": \"@\""},{"line_number":142,"context_line":"}"}],"source_content_type":"application/json","patch_set":59,"id":"AAAAU3%2F%2FZLg%3D","line":141,"updated":"2014-02-26 22:05:50.000000000","message":"suggest remove the \"@\". Would be more consistent since this file uses empty string at line 98.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    \"identity:delete_mapping\": \"rule:admin_required\","},{"line_number":139,"context_line":"    \"identity:update_mapping\": \"rule:admin_required\","},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    \"identity:list_revoke_events\": \"@\""},{"line_number":142,"context_line":"}"}],"source_content_type":"application/json","patch_set":60,"id":"AAAAVX%2F%2F%2Bk0%3D","line":141,"updated":"2014-02-27 02:22:07.000000000","message":"suggest remove the \"@\". Would be more consistent since this file uses empty string at line 98.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"}],"keystone/assignment/controllers.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2043bcc33dfb126ccb390f44629287b4f831c989","unresolved":false,"context_lines":[{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    @controller.protected()"},{"line_number":416,"context_line":"    def delete_project(self, context, project_id):"},{"line_number":417,"context_line":"        self.revoke_api.revoke_by_project(project_id)"},{"line_number":418,"context_line":"        return self.assignment_api.delete_project(project_id)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B6c8%3D","line":417,"updated":"2014-01-20 21:26:46.000000000","message":"Do you need to do this here if you are doing it in the assignment API already?","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fe0b264b37876c2fdbf17e4476865d3eb7d441de","unresolved":false,"context_lines":[{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    @controller.protected()"},{"line_number":416,"context_line":"    def delete_project(self, context, project_id):"},{"line_number":417,"context_line":"        self.revoke_api.revoke_by_project(project_id)"},{"line_number":418,"context_line":"        return self.assignment_api.delete_project(project_id)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B5wY%3D","line":417,"in_reply_to":"AAAAUH%2F%2B6c8%3D","updated":"2014-01-20 22:25:24.000000000","message":"Nope. Done","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"}],"keystone/assignment/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"@dependency.provider(\u0027assignment_api\u0027)"},{"line_number":46,"context_line":"@dependency.requires(\u0027credential_api\u0027, \u0027identity_api\u0027, \u0027token_api\u0027,"},{"line_number":47,"context_line":"                     \u0027revoke_api\u0027)"},{"line_number":48,"context_line":"class Manager(manager.Manager):"},{"line_number":49,"context_line":"    \"\"\"Default pivot point for the Assignment backend."},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5ks%3D","line":47,"updated":"2014-01-20 23:55:32.000000000","message":"keep these in alphabetical order.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                                            domain_id\u003ddomain_id,"},{"line_number":492,"context_line":"                                            project_id\u003dproject_id)"},{"line_number":493,"context_line":"        else:"},{"line_number":494,"context_line":"            try:"},{"line_number":495,"context_line":"                for user in self.identity_api.list_users_in_group(group_id,"},{"line_number":496,"context_line":"                                                                  domain_id):"},{"line_number":497,"context_line":"                    if user[\u0027id\u0027] !\u003d user_id:"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2F0Y%3D","line":494,"updated":"2014-02-17 19:26:32.000000000","message":"the original comment still applies --\n\n # NOTE(morganfainberg): The user ids are the important part for\n # invalidating tokens below, so extract them here.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                                            project_id\u003dproject_id)"},{"line_number":498,"context_line":"        else:"},{"line_number":499,"context_line":"            try:"},{"line_number":500,"context_line":"                #NOTE(morganfainberg): The user ids are the important part"},{"line_number":501,"context_line":"                #for invalidating tokens below, so extract them here."},{"line_number":502,"context_line":"                for user in self.identity_api.list_users_in_group(group_id,"},{"line_number":503,"context_line":"                                                                  domain_id):"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FqY%3D","line":500,"updated":"2014-02-22 19:58:28.000000000","message":"add space after # so that it matches the format for comments used in this file.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                                            project_id\u003dproject_id)"},{"line_number":498,"context_line":"        else:"},{"line_number":499,"context_line":"            try:"},{"line_number":500,"context_line":"                #NOTE(morganfainberg): The user ids are the important part"},{"line_number":501,"context_line":"                #for invalidating tokens below, so extract them here."},{"line_number":502,"context_line":"                for user in self.identity_api.list_users_in_group(group_id,"},{"line_number":503,"context_line":"                                                                  domain_id):"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2FwhQ%3D","line":500,"in_reply_to":"AAAAU3%2F%2F%2FqY%3D","updated":"2014-02-25 02:26:45.000000000","message":"Done","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":1091,"name":"Arun Kant","email":"arukant@cisco.com","username":"arunkant-uws"},"change_message_id":"e3a668c1f24b92ee4ade560fd1ab2fabe7b7b876","unresolved":false,"context_lines":[{"line_number":512,"context_line":"                          group_id)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        self.driver.delete_grant(role_id, user_id, group_id, domain_id,"},{"line_number":515,"context_line":"                                 project_id, inherited_to_projects)"},{"line_number":516,"context_line":"        if user_id is not None:"},{"line_number":517,"context_line":"            user_ids.append(user_id)"},{"line_number":518,"context_line":"        self.token_api.delete_tokens_for_users(user_ids)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZeI%3D","line":515,"updated":"2014-02-27 01:36:35.000000000","message":"Should revoke_api logic be invoked after driver delete_grant call. I mean what is the expected behavior if driver delete_grant fails for some reason?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e3d828c2db87301bd0ebb2bc3dd8db77c65682c5","unresolved":false,"context_lines":[{"line_number":49,"context_line":"@dependency.provider(\u0027assignment_api\u0027)"},{"line_number":50,"context_line":"@dependency.optional(\u0027revoke_api\u0027)"},{"line_number":51,"context_line":"@dependency.requires(\u0027credential_api\u0027, \u0027identity_api\u0027,"},{"line_number":52,"context_line":"                     \u0027revoke_api\u0027, \u0027token_api\u0027)"},{"line_number":53,"context_line":"class Manager(manager.Manager):"},{"line_number":54,"context_line":"    \"\"\"Default pivot point for the Assignment backend."},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fr8g%3D","line":52,"updated":"2014-03-04 17:43:49.000000000","message":"why \u0027revoke_api\u0027 is both optional and requires? doesn\u0027t seem right","commit_id":"b859ec1384b89157126f642a3b8b274fff6da5b1"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"db856a6d445ac55a19eddd4bdf2d1baa8dc567b7","unresolved":false,"context_lines":[{"line_number":49,"context_line":"@dependency.provider(\u0027assignment_api\u0027)"},{"line_number":50,"context_line":"@dependency.optional(\u0027revoke_api\u0027)"},{"line_number":51,"context_line":"@dependency.requires(\u0027credential_api\u0027, \u0027identity_api\u0027,"},{"line_number":52,"context_line":"                     \u0027revoke_api\u0027, \u0027token_api\u0027)"},{"line_number":53,"context_line":"class Manager(manager.Manager):"},{"line_number":54,"context_line":"    \"\"\"Default pivot point for the Assignment backend."},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2FrRs%3D","line":52,"in_reply_to":"AAAAVn%2F%2Fr8g%3D","updated":"2014-03-04 18:42:49.000000000","message":"AH...CRUD","commit_id":"b859ec1384b89157126f642a3b8b274fff6da5b1"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e3d828c2db87301bd0ebb2bc3dd8db77c65682c5","unresolved":false,"context_lines":[{"line_number":266,"context_line":"                self.driver.remove_role_from_user_and_project(user_id,"},{"line_number":267,"context_line":"                                                              tenant_id,"},{"line_number":268,"context_line":"                                                              role_id)"},{"line_number":269,"context_line":"                if self.revoke_api:"},{"line_number":270,"context_line":"                    self.revoke_api.revoke_by_grant(role_id, user_id\u003duser_id,"},{"line_number":271,"context_line":"                                                    project_id\u003dtenant_id)"},{"line_number":272,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fr70%3D","line":269,"updated":"2014-03-04 17:43:49.000000000","message":"you mean this? I would think \u0027revoke_api\u0027 is either getting injected or not.\n\nif getattr(self, \u0027revoke_api\u0027):","commit_id":"b859ec1384b89157126f642a3b8b274fff6da5b1"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"db856a6d445ac55a19eddd4bdf2d1baa8dc567b7","unresolved":false,"context_lines":[{"line_number":266,"context_line":"                self.driver.remove_role_from_user_and_project(user_id,"},{"line_number":267,"context_line":"                                                              tenant_id,"},{"line_number":268,"context_line":"                                                              role_id)"},{"line_number":269,"context_line":"                if self.revoke_api:"},{"line_number":270,"context_line":"                    self.revoke_api.revoke_by_grant(role_id, user_id\u003duser_id,"},{"line_number":271,"context_line":"                                                    project_id\u003dtenant_id)"},{"line_number":272,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2FrRU%3D","line":269,"in_reply_to":"AAAAVn%2F%2Fr70%3D","updated":"2014-03-04 18:42:49.000000000","message":"Supposed to be optional","commit_id":"b859ec1384b89157126f642a3b8b274fff6da5b1"}],"keystone/auth/controllers.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a43cd07f3004e5c7363c681c00d95850bd77bce1","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    @controller.protected()"},{"line_number":446,"context_line":"    def revocation_list(self, context, auth\u003dNone):"},{"line_number":447,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":448,"context_line":"            raise exception.Gone()"},{"line_number":449,"context_line":"        tokens \u003d self.token_api.list_revoked_tokens()"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        for t in tokens:"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FxZU%3D","line":448,"updated":"2014-03-04 07:50:11.000000000","message":"Always wanted to use HTTP status GONE!","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"656d4bcccf51de070056856546fa35d89f65ad86","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    @controller.protected()"},{"line_number":446,"context_line":"    def revocation_list(self, context, auth\u003dNone):"},{"line_number":447,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":448,"context_line":"            raise exception.Gone()"},{"line_number":449,"context_line":"        tokens \u003d self.token_api.list_revoked_tokens()"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        for t in tokens:"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FtFI%3D","line":448,"in_reply_to":"AAAAVn%2F%2FxZU%3D","updated":"2014-03-04 17:28:38.000000000","message":"I know. right?","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e3d828c2db87301bd0ebb2bc3dd8db77c65682c5","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    @controller.protected()"},{"line_number":446,"context_line":"    def revocation_list(self, context, auth\u003dNone):"},{"line_number":447,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":448,"context_line":"            raise exception.Gone()"},{"line_number":449,"context_line":"        tokens \u003d self.token_api.list_revoked_tokens()"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        for t in tokens:"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fr5A%3D","line":448,"updated":"2014-03-04 17:43:49.000000000","message":"ha nice! \u0027Gone\u0027 exception? perhaps a more intuitive name, like ByeByeToken? :D","commit_id":"b859ec1384b89157126f642a3b8b274fff6da5b1"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"db856a6d445ac55a19eddd4bdf2d1baa8dc567b7","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    @controller.protected()"},{"line_number":446,"context_line":"    def revocation_list(self, context, auth\u003dNone):"},{"line_number":447,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":448,"context_line":"            raise exception.Gone()"},{"line_number":449,"context_line":"        tokens \u003d self.token_api.list_revoked_tokens()"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        for t in tokens:"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2FrQw%3D","line":448,"in_reply_to":"AAAAVn%2F%2Fr5A%3D","updated":"2014-03-04 18:42:49.000000000","message":"Its an HTTP response code:\n\n410 Gone","commit_id":"b859ec1384b89157126f642a3b8b274fff6da5b1"}],"keystone/cli.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            migration.sync_database(version, extension)"},{"line_number":69,"context_line":"        except ImportError:"},{"line_number":70,"context_line":"            print (_(\"This extension does not provide migrations.\"))"},{"line_number":71,"context_line":"            exit(0)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class DbVersion(BaseApp):"}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F93M%3D","line":71,"updated":"2014-02-27 04:59:37.000000000","message":"exit(1) to match line 94?","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"}],"keystone/common/config.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                   default\u003d\u0027keystone.token.backends.sql.Token\u0027),"},{"line_number":76,"context_line":"        cfg.BoolOpt(\u0027caching\u0027, default\u003dTrue),"},{"line_number":77,"context_line":"        cfg.IntOpt(\u0027revocation_cache_time\u0027, default\u003d3600),"},{"line_number":78,"context_line":"        cfg.IntOpt(\u0027cache_time\u0027, default\u003dNone),"},{"line_number":79,"context_line":"        cfg.BoolOpt(\u0027revoke_by_id\u0027, default\u003dTrue)],"},{"line_number":80,"context_line":"    \u0027cache\u0027: ["},{"line_number":81,"context_line":"        cfg.StrOpt(\u0027config_prefix\u0027, default\u003d\u0027cache.keystone\u0027),"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B7MI%3D","line":78,"updated":"2014-01-20 18:09:40.000000000","message":"i don\u0027t see this option in your change to sample conf.","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        cfg.BoolOpt(\u0027caching\u0027, default\u003dTrue),"},{"line_number":85,"context_line":"        cfg.IntOpt(\u0027revocation_cache_time\u0027, default\u003d3600),"},{"line_number":86,"context_line":"        cfg.IntOpt(\u0027cache_time\u0027, default\u003dNone),"},{"line_number":87,"context_line":"        cfg.BoolOpt(\u0027revoke_by_id\u0027, default\u003dTrue)],"},{"line_number":88,"context_line":"    \u0027revoke\u0027: ["},{"line_number":89,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":90,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027)],"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2F0E%3D","line":87,"updated":"2014-02-17 19:26:32.000000000","message":"this isn\u0027t in the sample config.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cdd671a930fb6fce5886fc6bf1252f4125a2421f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        cfg.BoolOpt(\u0027caching\u0027, default\u003dTrue),"},{"line_number":85,"context_line":"        cfg.IntOpt(\u0027revocation_cache_time\u0027, default\u003d3600),"},{"line_number":86,"context_line":"        cfg.IntOpt(\u0027cache_time\u0027, default\u003dNone),"},{"line_number":87,"context_line":"        cfg.BoolOpt(\u0027revoke_by_id\u0027, default\u003dTrue)],"},{"line_number":88,"context_line":"    \u0027revoke\u0027: ["},{"line_number":89,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":90,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027)],"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Bjg%3D","line":87,"in_reply_to":"AAAAUX%2F%2B%2F0E%3D","updated":"2014-02-17 21:51:34.000000000","message":"++ this would need to be regenerated since Morgan\u0027s config_generator patches are going it.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        cfg.BoolOpt(\u0027caching\u0027, default\u003dTrue),"},{"line_number":85,"context_line":"        cfg.IntOpt(\u0027revocation_cache_time\u0027, default\u003d3600),"},{"line_number":86,"context_line":"        cfg.IntOpt(\u0027cache_time\u0027, default\u003dNone),"},{"line_number":87,"context_line":"        cfg.BoolOpt(\u0027revoke_by_id\u0027, default\u003dTrue)],"},{"line_number":88,"context_line":"    \u0027revoke\u0027: ["},{"line_number":89,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":90,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027)],"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BjM%3D","line":87,"in_reply_to":"AAAAUX%2F%2B%2F0E%3D","updated":"2014-02-17 22:00:23.000000000","message":"... and what does it do?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                         \u0027effect unless global and token caching are \u0027"},{"line_number":189,"context_line":"                         \u0027enabled.\u0027)),"},{"line_number":190,"context_line":"        cfg.BoolOpt(\u0027revoke_by_id\u0027, default\u003dTrue,"},{"line_number":191,"context_line":"                    help\u003d\u0027Revoke Tokens By Token Identifier.  Setting\u0027"},{"line_number":192,"context_line":"                    \u0027revoke_by_id to True enables various forms of \u0027"},{"line_number":193,"context_line":"                    \u0027enumerating tokens, e.g. `list tokens for user`.  \u0027"},{"line_number":194,"context_line":"                    \u0027These enumerations are processed to determine the \u0027"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FtI%3D","line":191,"updated":"2014-02-22 19:17:19.000000000","message":"change \"Tokens\" to \"tokens\"\n\nAlso, space missing at end of line.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"df49f9bc89daf838c4b46e20ad25b41b43d33ca5","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                         \u0027effect unless global and token caching are \u0027"},{"line_number":189,"context_line":"                         \u0027enabled.\u0027)),"},{"line_number":190,"context_line":"        cfg.BoolOpt(\u0027revoke_by_id\u0027, default\u003dTrue,"},{"line_number":191,"context_line":"                    help\u003d\u0027Revoke Tokens By Token Identifier.  Setting\u0027"},{"line_number":192,"context_line":"                    \u0027revoke_by_id to True enables various forms of \u0027"},{"line_number":193,"context_line":"                    \u0027enumerating tokens, e.g. `list tokens for user`.  \u0027"},{"line_number":194,"context_line":"                    \u0027These enumerations are processed to determine the \u0027"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F0EI%3D","line":191,"in_reply_to":"AAAAU3%2F%2F%2FtI%3D","updated":"2014-02-24 17:14:58.000000000","message":"++","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"df49f9bc89daf838c4b46e20ad25b41b43d33ca5","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                    \u0027enumerating tokens, e.g. `list tokens for user`.  \u0027"},{"line_number":194,"context_line":"                    \u0027These enumerations are processed to determine the \u0027"},{"line_number":195,"context_line":"                    \u0027list of tokens to revoke.   Only disable if you are \u0027"},{"line_number":196,"context_line":"                    \u0027switching to using the Revoke extension with a\u0027"},{"line_number":197,"context_line":"                    \u0027backend other than \u0027"},{"line_number":198,"context_line":"                    \u0027`keystone.contrib.revoke.backends.fake.Revoke`\u0027)],"},{"line_number":199,"context_line":"    \u0027revoke\u0027: ["}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F0D4%3D","line":196,"updated":"2014-02-24 17:14:58.000000000","message":"missing a space at the end of the line","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    \u0027revoke\u0027: ["},{"line_number":200,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":201,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027,"},{"line_number":202,"context_line":"                   help\u003d\u0027An implementation of the Revoke backend that does not\u0027"},{"line_number":203,"context_line":"                        \u0027actually record the revocation events.  It is the \u0027"},{"line_number":204,"context_line":"                        \u0027default implementation during the transition from\u0027"},{"line_number":205,"context_line":"                        \u0027revoke_by_id  to revocation events.  The default \u0027"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fp0%3D","line":202,"updated":"2014-02-22 19:58:28.000000000","message":"Change the help text to document the option and not the fake revoke driver.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"df49f9bc89daf838c4b46e20ad25b41b43d33ca5","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027,"},{"line_number":202,"context_line":"                   help\u003d\u0027An implementation of the Revoke backend that does not\u0027"},{"line_number":203,"context_line":"                        \u0027actually record the revocation events.  It is the \u0027"},{"line_number":204,"context_line":"                        \u0027default implementation during the transition from\u0027"},{"line_number":205,"context_line":"                        \u0027revoke_by_id  to revocation events.  The default \u0027"},{"line_number":206,"context_line":"                        \u0027will change in a future release to backend that \u0027"},{"line_number":207,"context_line":"                        \u0027actually persists\u0027)],"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F0EE%3D","line":204,"updated":"2014-02-24 17:14:58.000000000","message":"missing a space at the end of the line","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                        \u0027default implementation during the transition from\u0027"},{"line_number":205,"context_line":"                        \u0027revoke_by_id  to revocation events.  The default \u0027"},{"line_number":206,"context_line":"                        \u0027will change in a future release to backend that \u0027"},{"line_number":207,"context_line":"                        \u0027actually persists\u0027)],"},{"line_number":208,"context_line":"    \u0027cache\u0027: ["},{"line_number":209,"context_line":"        cfg.StrOpt(\u0027config_prefix\u0027, default\u003d\u0027cache.keystone\u0027,"},{"line_number":210,"context_line":"                   help\u003d(\u0027Prefix for building the configuration dictionary \u0027"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fp4%3D","line":207,"updated":"2014-02-22 19:58:28.000000000","message":"suggest put the ] on a separate line and add a , after the StrOpt so that it\u0027s easier to add more options.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"df49f9bc89daf838c4b46e20ad25b41b43d33ca5","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                        \u0027default implementation during the transition from\u0027"},{"line_number":205,"context_line":"                        \u0027revoke_by_id  to revocation events.  The default \u0027"},{"line_number":206,"context_line":"                        \u0027will change in a future release to backend that \u0027"},{"line_number":207,"context_line":"                        \u0027actually persists\u0027)],"},{"line_number":208,"context_line":"    \u0027cache\u0027: ["},{"line_number":209,"context_line":"        cfg.StrOpt(\u0027config_prefix\u0027, default\u003d\u0027cache.keystone\u0027,"},{"line_number":210,"context_line":"                   help\u003d(\u0027Prefix for building the configuration dictionary \u0027"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F0CE%3D","line":207,"updated":"2014-02-24 17:14:58.000000000","message":"without a sql backend, is there any production use case to land this in icehouse?","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                        \u0027default implementation during the transition from\u0027"},{"line_number":205,"context_line":"                        \u0027revoke_by_id  to revocation events.  The default \u0027"},{"line_number":206,"context_line":"                        \u0027will change in a future release to backend that \u0027"},{"line_number":207,"context_line":"                        \u0027actually persists\u0027)],"},{"line_number":208,"context_line":"    \u0027cache\u0027: ["},{"line_number":209,"context_line":"        cfg.StrOpt(\u0027config_prefix\u0027, default\u003d\u0027cache.keystone\u0027,"},{"line_number":210,"context_line":"                   help\u003d(\u0027Prefix for building the configuration dictionary \u0027"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2Fwf4%3D","line":207,"in_reply_to":"AAAAU3%2F%2F0CE%3D","updated":"2014-02-25 02:26:45.000000000","message":"No, but SQL can easily be merged into this commit., or KVS persistance added.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                         \u0027effect unless global and token caching are \u0027"},{"line_number":189,"context_line":"                         \u0027enabled.\u0027)),"},{"line_number":190,"context_line":"        cfg.BoolOpt(\u0027revoke_by_id\u0027, default\u003dTrue,"},{"line_number":191,"context_line":"                    help\u003d\u0027Revoke Token By Token Identifier.  Setting \u0027"},{"line_number":192,"context_line":"                    \u0027revoke_by_id to True enables various forms of \u0027"},{"line_number":193,"context_line":"                    \u0027enumerating tokens, e.g. `list tokens for user`.  \u0027"},{"line_number":194,"context_line":"                    \u0027These enumerations are processed to determine the \u0027"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdHM%3D","line":191,"updated":"2014-02-26 15:51:13.000000000","message":"Suggest: \"Revoke token by token identifier.\"","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                    \u0027list of tokens to revoke.   Only disable if you are \u0027"},{"line_number":196,"context_line":"                    \u0027switching to using the Revoke extension with a \u0027"},{"line_number":197,"context_line":"                    \u0027backend other than \u0027"},{"line_number":198,"context_line":"                    \u0027`keystone.contrib.revoke.backends.fake.Revoke`\u0027)],"},{"line_number":199,"context_line":"    \u0027revoke\u0027: ["},{"line_number":200,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":201,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027,"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZKg%3D","line":198,"updated":"2014-02-26 22:05:50.000000000","message":"suggest put the ] on a separate line and add a , after the StrOpt so that it\u0027s easier to add more options.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":201,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027,"},{"line_number":202,"context_line":"                   help\u003d\u0027An implementation of the backend for persisting \u0027"},{"line_number":203,"context_line":"                        \u0027revocation events.\u0027)],"},{"line_number":204,"context_line":"    \u0027cache\u0027: ["},{"line_number":205,"context_line":"        cfg.StrOpt(\u0027config_prefix\u0027, default\u003d\u0027cache.keystone\u0027,"},{"line_number":206,"context_line":"                   help\u003d(\u0027Prefix for building the configuration dictionary \u0027"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZUA%3D","line":203,"updated":"2014-02-26 22:05:50.000000000","message":"suggest put the ] on a separate line and add a , after the StrOpt so that it\u0027s easier to add more options.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                    \u0027list of tokens to revoke.   Only disable if you are \u0027"},{"line_number":196,"context_line":"                    \u0027switching to using the Revoke extension with a \u0027"},{"line_number":197,"context_line":"                    \u0027backend other than \u0027"},{"line_number":198,"context_line":"                    \u0027`keystone.contrib.revoke.backends.fake.Revoke`\u0027)],"},{"line_number":199,"context_line":"    \u0027revoke\u0027: ["},{"line_number":200,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":201,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027,"}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2Bks%3D","line":198,"updated":"2014-02-27 02:22:07.000000000","message":"suggest put the ] on a separate line and add a , after the StrOpt so that it\u0027s easier to add more options.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":201,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027,"},{"line_number":202,"context_line":"                   help\u003d\u0027An implementation of the backend for persisting \u0027"},{"line_number":203,"context_line":"                        \u0027revocation events.\u0027)],"},{"line_number":204,"context_line":"    \u0027cache\u0027: ["},{"line_number":205,"context_line":"        cfg.StrOpt(\u0027config_prefix\u0027, default\u003d\u0027cache.keystone\u0027,"},{"line_number":206,"context_line":"                   help\u003d(\u0027Prefix for building the configuration dictionary \u0027"}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2Bko%3D","line":203,"updated":"2014-02-27 02:22:07.000000000","message":"suggest put the ] on a separate line and add a , after the StrOpt so that it\u0027s easier to add more options.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"88bb2a5cb27498a77f638c91a22b22f69c4aee98","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    ],"},{"line_number":200,"context_line":"    \u0027revoke\u0027: ["},{"line_number":201,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":202,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027,"},{"line_number":203,"context_line":"                   help\u003d\u0027An implementation of the backend for persisting \u0027"},{"line_number":204,"context_line":"                        \u0027revocation events.\u0027)"},{"line_number":205,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuHQ%3D","line":202,"updated":"2014-02-28 19:37:04.000000000","message":"can this default to SQL?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    ],"},{"line_number":200,"context_line":"    \u0027revoke\u0027: ["},{"line_number":201,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":202,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.fake.Revoke\u0027,"},{"line_number":203,"context_line":"                   help\u003d\u0027An implementation of the backend for persisting \u0027"},{"line_number":204,"context_line":"                        \u0027revocation events.\u0027)"},{"line_number":205,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtX4%3D","line":202,"in_reply_to":"AAAAVX%2F%2FuHQ%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e9c2c3758c63b6f072fc8ddbe4e6975eb5242938","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    ],"},{"line_number":200,"context_line":"    \u0027revoke\u0027: ["},{"line_number":201,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":202,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027,"},{"line_number":203,"context_line":"                   help\u003d\u0027An implementation of the backend for persisting \u0027"},{"line_number":204,"context_line":"                        \u0027revocation events.\u0027),"},{"line_number":205,"context_line":"        cfg.IntOpt(\u0027expiration_buffer\u0027, default\u003d30 * 60,"}],"source_content_type":"text/x-python","patch_set":69,"id":"AAAAVX%2F%2FpqU%3D","line":202,"updated":"2014-03-01 23:22:09.000000000","message":"Can\u0027t be SQL as is, as the SQL migrations are not run for the Tempest tests.  We can fix that in the future","commit_id":"30f458652455449a10d320c7a4062790df8986d0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                        \u0027effect unless global and token caching are \u0027"},{"line_number":189,"context_line":"                        \u0027enabled.\u0027),"},{"line_number":190,"context_line":"        cfg.BoolOpt(\u0027revoke_by_id\u0027, default\u003dTrue,"},{"line_number":191,"context_line":"                    help\u003d\u0027Revoke token By token identifier.  Setting \u0027"},{"line_number":192,"context_line":"                    \u0027revoke_by_id to True enables various forms of \u0027"},{"line_number":193,"context_line":"                    \u0027enumerating tokens, e.g. `list tokens for user`.  \u0027"},{"line_number":194,"context_line":"                    \u0027These enumerations are processed to determine the \u0027"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F6O4%3D","line":191,"updated":"2014-03-03 15:23:04.000000000","message":"Suggest s/By/by/","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                        \u0027effect unless global and token caching are \u0027"},{"line_number":189,"context_line":"                        \u0027enabled.\u0027),"},{"line_number":190,"context_line":"        cfg.BoolOpt(\u0027revoke_by_id\u0027, default\u003dTrue,"},{"line_number":191,"context_line":"                    help\u003d\u0027Revoke token By token identifier.  Setting \u0027"},{"line_number":192,"context_line":"                    \u0027revoke_by_id to True enables various forms of \u0027"},{"line_number":193,"context_line":"                    \u0027enumerating tokens, e.g. `list tokens for user`.  \u0027"},{"line_number":194,"context_line":"                    \u0027These enumerations are processed to determine the \u0027"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F2N0%3D","line":191,"in_reply_to":"AAAAVn%2F%2F6O4%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e9f1df475070be9985f36a140cb60632ba141791","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                    \u0027list of tokens to revoke.   Only disable if you are \u0027"},{"line_number":196,"context_line":"                    \u0027switching to using the Revoke extension with a \u0027"},{"line_number":197,"context_line":"                    \u0027backend other than \u0027"},{"line_number":198,"context_line":"                    \u0027`keystone.contrib.revoke.backends.fake.Revoke`\u0027)"},{"line_number":199,"context_line":"    ],"},{"line_number":200,"context_line":"    \u0027revoke\u0027: ["},{"line_number":201,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2Fzys%3D","line":198,"updated":"2014-03-04 01:33:17.000000000","message":"i assume this should reference the KVS backend? (is this still relevant?)","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                    \u0027list of tokens to revoke.   Only disable if you are \u0027"},{"line_number":196,"context_line":"                    \u0027switching to using the Revoke extension with a \u0027"},{"line_number":197,"context_line":"                    \u0027backend other than \u0027"},{"line_number":198,"context_line":"                    \u0027`keystone.contrib.revoke.backends.fake.Revoke`\u0027)"},{"line_number":199,"context_line":"    ],"},{"line_number":200,"context_line":"    \u0027revoke\u0027: ["},{"line_number":201,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2Fzcw%3D","line":198,"in_reply_to":"AAAAVn%2F%2Fzys%3D","updated":"2014-03-04 02:28:09.000000000","message":"Dropped the Fake one, finally.  It was necessary back when the revoke_api dependecies were everywhere, but now that they are limited to just a couple points in the Provider, it is easier to remove Fake and state that you can just disable the revoke extension in the pipelines.  Modified this to reference the KVS in memory instead.","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0af7b8d0bc91da6283895605b8a72bab27f547be","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027,"},{"line_number":203,"context_line":"                   help\u003d\u0027An implementation of the backend for persisting \u0027"},{"line_number":204,"context_line":"                        \u0027revocation events.\u0027),"},{"line_number":205,"context_line":"        cfg.IntOpt(\u0027expiration_buffer\u0027, default\u003d30 * 60,"},{"line_number":206,"context_line":"                   help\u003d\u0027This value (calculated in seconds) is added to token \u0027"},{"line_number":207,"context_line":"                        \u0027expiration before a revocation event may be removed \u0027"},{"line_number":208,"context_line":"                        \u0027from the backend.\u0027),"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2Fzdk%3D","line":205,"updated":"2014-03-04 02:02:43.000000000","message":"why not just write 1800?","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027,"},{"line_number":203,"context_line":"                   help\u003d\u0027An implementation of the backend for persisting \u0027"},{"line_number":204,"context_line":"                        \u0027revocation events.\u0027),"},{"line_number":205,"context_line":"        cfg.IntOpt(\u0027expiration_buffer\u0027, default\u003d30 * 60,"},{"line_number":206,"context_line":"                   help\u003d\u0027This value (calculated in seconds) is added to token \u0027"},{"line_number":207,"context_line":"                        \u0027expiration before a revocation event may be removed \u0027"},{"line_number":208,"context_line":"                        \u0027from the backend.\u0027),"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzU0%3D","line":205,"in_reply_to":"AAAAVn%2F%2Fzdk%3D","updated":"2014-03-04 02:28:09.000000000","message":"I could, just felt this was clearer.  If the value is in second, breaking it down into units makes it easier to process.","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a43cd07f3004e5c7363c681c00d95850bd77bce1","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027,"},{"line_number":202,"context_line":"                   help\u003d\u0027An implementation of the backend for persisting \u0027"},{"line_number":203,"context_line":"                        \u0027revocation events.\u0027),"},{"line_number":204,"context_line":"        cfg.IntOpt(\u0027expiration_buffer\u0027, default\u003d30 * 60,"},{"line_number":205,"context_line":"                   help\u003d\u0027This value (calculated in seconds) is added to token \u0027"},{"line_number":206,"context_line":"                        \u0027expiration before a revocation event may be removed \u0027"},{"line_number":207,"context_line":"                        \u0027from the backend.\u0027),"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FxZQ%3D","line":204,"updated":"2014-03-04 07:50:11.000000000","message":"NIT: (ignore unless there is another change set) - suggest just specifying the full number of seconds since it\u0027s how we do this elsewhere.","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"188cf4e83fca0cfd7411d800e3fc264d7c1a6b8a","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                   default\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027,"},{"line_number":202,"context_line":"                   help\u003d\u0027An implementation of the backend for persisting \u0027"},{"line_number":203,"context_line":"                        \u0027revocation events.\u0027),"},{"line_number":204,"context_line":"        cfg.IntOpt(\u0027expiration_buffer\u0027, default\u003d30 * 60,"},{"line_number":205,"context_line":"                   help\u003d\u0027This value (calculated in seconds) is added to token \u0027"},{"line_number":206,"context_line":"                        \u0027expiration before a revocation event may be removed \u0027"},{"line_number":207,"context_line":"                        \u0027from the backend.\u0027),"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FupQ%3D","line":204,"in_reply_to":"AAAAVn%2F%2FxZQ%3D","updated":"2014-03-04 13:52:56.000000000","message":"Done","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"}],"keystone/common/controller.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        LOG.debug(_(\u0027RBAC: building auth context from the incoming \u0027"},{"line_number":53,"context_line":"                    \u0027auth token\u0027))"},{"line_number":54,"context_line":"        #TODO(ayoung): These two functions return the token in different"},{"line_number":55,"context_line":"        #formats instead of two calls, only make one.  However, the call"},{"line_number":56,"context_line":"        #to get_token hits the caching layer, and does not validate the"},{"line_number":57,"context_line":"        #token.  Reduce to one call"},{"line_number":58,"context_line":"        if not CONF.token.revoke_by_id:"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fzw%3D","line":55,"updated":"2014-02-17 19:26:32.000000000","message":"add a . after formats.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        #TODO(ayoung): These two functions return the token in different"},{"line_number":55,"context_line":"        #formats instead of two calls, only make one.  However, the call"},{"line_number":56,"context_line":"        #to get_token hits the caching layer, and does not validate the"},{"line_number":57,"context_line":"        #token.  Reduce to one call"},{"line_number":58,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":59,"context_line":"            (self.token_api.token_provider_api."},{"line_number":60,"context_line":"             validate_token(context[\u0027token_id\u0027]))"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fy0%3D","line":57,"updated":"2014-02-17 19:26:32.000000000","message":"Remove \"Reduce to one call\" since it\u0027s already been mentioned.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        #to get_token hits the caching layer, and does not validate the"},{"line_number":57,"context_line":"        #token.  Reduce to one call"},{"line_number":58,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":59,"context_line":"            (self.token_api.token_provider_api."},{"line_number":60,"context_line":"             validate_token(context[\u0027token_id\u0027]))"},{"line_number":61,"context_line":"        token_ref \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":62,"context_line":"    except exception.TokenNotFound:"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Bh0%3D","line":59,"updated":"2014-02-17 22:00:23.000000000","message":"this format for line breaks is terrible to read. remove the extraneous outer parens. i\u0027m only going to mention this once in this patch.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        #to get_token hits the caching layer, and does not validate the"},{"line_number":57,"context_line":"        #token.  Reduce to one call"},{"line_number":58,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":59,"context_line":"            (self.token_api.token_provider_api."},{"line_number":60,"context_line":"             validate_token(context[\u0027token_id\u0027]))"},{"line_number":61,"context_line":"        token_ref \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":62,"context_line":"    except exception.TokenNotFound:"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B8Pk%3D","line":59,"in_reply_to":"AAAAUX%2F%2B%2Bh0%3D","updated":"2014-02-19 18:41:05.000000000","message":"Done.  Python line wrapping sucks.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    try:"},{"line_number":50,"context_line":"        LOG.debug(_(\u0027RBAC: building auth context from the incoming \u0027"},{"line_number":51,"context_line":"                    \u0027auth token\u0027))"},{"line_number":52,"context_line":"        #TODO(ayoung): These two functions return the token in different"},{"line_number":53,"context_line":"        #formats.  However, the call"},{"line_number":54,"context_line":"        #to get_token hits the caching layer, and does not validate the"},{"line_number":55,"context_line":"        #token.  This should be reduced to one call"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fpo%3D","line":52,"updated":"2014-02-22 19:58:28.000000000","message":"add a space after # so that it matches the format for comments used throughout this file.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    try:"},{"line_number":50,"context_line":"        LOG.debug(_(\u0027RBAC: building auth context from the incoming \u0027"},{"line_number":51,"context_line":"                    \u0027auth token\u0027))"},{"line_number":52,"context_line":"        #TODO(ayoung): These two functions return the token in different"},{"line_number":53,"context_line":"        #formats.  However, the call"},{"line_number":54,"context_line":"        #to get_token hits the caching layer, and does not validate the"},{"line_number":55,"context_line":"        #token.  This should be reduced to one call"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2FwCo%3D","line":52,"in_reply_to":"AAAAU3%2F%2F%2Fpo%3D","updated":"2014-02-25 02:26:45.000000000","message":"Done","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9e384c82b6742bbfd0cea1a7873b0d09774fbba7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # token.  This should be reduced to one call"},{"line_number":56,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":57,"context_line":"            self.token_api.token_provider_api.validate_token("},{"line_number":58,"context_line":"                context[\u0027token_id\u0027])"},{"line_number":59,"context_line":"        token_ref \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":60,"context_line":"    except exception.TokenNotFound:"},{"line_number":61,"context_line":"        LOG.warning(_(\u0027RBAC: Invalid token\u0027))"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fa1I%3D","line":58,"updated":"2014-02-26 19:06:56.000000000","message":"but but token_provider_api.validate_token() also calls token_api.get_token() underneath. So what are we solving by do validate_token() here?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1091,"name":"Arun Kant","email":"arukant@cisco.com","username":"arunkant-uws"},"change_message_id":"e3a668c1f24b92ee4ade560fd1ab2fabe7b7b876","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # token.  This should be reduced to one call"},{"line_number":56,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":57,"context_line":"            self.token_api.token_provider_api.validate_token("},{"line_number":58,"context_line":"                context[\u0027token_id\u0027])"},{"line_number":59,"context_line":"        token_ref \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":60,"context_line":"    except exception.TokenNotFound:"},{"line_number":61,"context_line":"        LOG.warning(_(\u0027RBAC: Invalid token\u0027))"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZQ8%3D","line":58,"in_reply_to":"AAAAU3%2F%2Fa1I%3D","updated":"2014-02-27 01:36:35.000000000","message":"As mentioned in earlier comment, validate_token in provider api also goes through caching logic. Also why do we want to force db read for token if specific deployment wants to use caching at token module level?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # token.  This should be reduced to one call"},{"line_number":56,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":57,"context_line":"            self.token_api.token_provider_api.validate_token("},{"line_number":58,"context_line":"                context[\u0027token_id\u0027])"},{"line_number":59,"context_line":"        token_ref \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":60,"context_line":"    except exception.TokenNotFound:"},{"line_number":61,"context_line":"        LOG.warning(_(\u0027RBAC: Invalid token\u0027))"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZF0%3D","line":58,"in_reply_to":"AAAAU3%2F%2Fa1I%3D","updated":"2014-02-26 21:54:53.000000000","message":"this is where the token used for authorization on the current call is validated.  If CONF.token.revoke_by_id is True, the token will be loked up in thedatabase, and its lack of presence will indicate that it has been revoked. If that is missing, we have to do the events based validation.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e3d828c2db87301bd0ebb2bc3dd8db77c65682c5","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # token.  This should be reduced to one call"},{"line_number":56,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":57,"context_line":"            self.token_api.token_provider_api.validate_token("},{"line_number":58,"context_line":"                context[\u0027token_id\u0027])"},{"line_number":59,"context_line":"        token_ref \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":60,"context_line":"    except exception.TokenNotFound:"},{"line_number":61,"context_line":"        LOG.warning(_(\u0027RBAC: Invalid token\u0027))"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Frv4%3D","line":58,"updated":"2014-03-04 17:43:49.000000000","message":"validate_token() calls token_api.get_token(), which would eventually hit the caching layer","commit_id":"b859ec1384b89157126f642a3b8b274fff6da5b1"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"db856a6d445ac55a19eddd4bdf2d1baa8dc567b7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        # token.  This should be reduced to one call"},{"line_number":56,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":57,"context_line":"            self.token_api.token_provider_api.validate_token("},{"line_number":58,"context_line":"                context[\u0027token_id\u0027])"},{"line_number":59,"context_line":"        token_ref \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":60,"context_line":"    except exception.TokenNotFound:"},{"line_number":61,"context_line":"        LOG.warning(_(\u0027RBAC: Invalid token\u0027))"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2FrQQ%3D","line":58,"in_reply_to":"AAAAVn%2F%2Frv4%3D","updated":"2014-03-04 18:42:49.000000000","message":"That is OK, it doesn\u0027t cache the call to actually validate the token via the revocation events.","commit_id":"b859ec1384b89157126f642a3b8b274fff6da5b1"}],"keystone/common/extension.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    PUBLIC_EXTENSIONS[url_prefix] \u003d extension_data"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def register_v3_extension(url_prefix, extension_data):"},{"line_number":52,"context_line":"    \"\"\"Same as register_admin_extension but for V3 extensions.\"\"\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    V3_EXTENSIONS[url_prefix] \u003d extension_data"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5gs%3D","line":51,"updated":"2014-01-20 23:55:32.000000000","message":"seems like this should be split out into a separate commit since other extensions could use it.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c63f67fa80962b333bc2eff421336c16f5a3ec6","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    PUBLIC_EXTENSIONS[url_prefix] \u003d extension_data"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def register_v3_extension(url_prefix, extension_data):"},{"line_number":52,"context_line":"    \"\"\"Same as register_admin_extension but for V3 extensions.\"\"\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    V3_EXTENSIONS[url_prefix] \u003d extension_data"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B4%2B8%3D","line":51,"in_reply_to":"AAAAUH%2F%2B5gs%3D","updated":"2014-01-21 04:55:07.000000000","message":"This is the first, though.  If I split it out, it would be untested until this code goes in.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    PUBLIC_EXTENSIONS[url_prefix] \u003d extension_data"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def register_v3_extension(url_prefix, extension_data):"},{"line_number":52,"context_line":"    \"\"\"Same as register_admin_extension but for V3 extensions.\"\"\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    V3_EXTENSIONS[url_prefix] \u003d extension_data"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B2As%3D","line":51,"updated":"2014-01-21 14:39:11.000000000","message":"split this out into a separate commit and write tests specific to it so that it\u0027s not untested.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"}],"keystone/common/sql/migration.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            db_sync(version\u003dversion, package\u003dpackage)"},{"line_number":62,"context_line":"        except exception.MigrationNotProvided as e:"},{"line_number":63,"context_line":"            print(e)"},{"line_number":64,"context_line":"            exit(0)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"def print_db_version(extension):"}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F928%3D","line":64,"updated":"2014-02-27 04:59:37.000000000","message":"are these suppose to be exit(0)\u0027s? I would think we\u0027d want to return an error code?","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                    migration_helpers.find_migrate_repo(package)), 0)"},{"line_number":78,"context_line":"            except exception.MigrationNotProvided as e:"},{"line_number":79,"context_line":"                print(e)"},{"line_number":80,"context_line":"                exit(0)"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            print(db_version("},{"line_number":83,"context_line":"                migration_helpers.find_migrate_repo()), 0)"}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F924%3D","line":80,"updated":"2014-02-27 04:59:37.000000000","message":"ditto","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"88bb2a5cb27498a77f638c91a22b22f69c4aee98","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def sync_database(version\u003dNone, extension\u003dNone):"},{"line_number":46,"context_line":"    if not extension:"},{"line_number":47,"context_line":"        db_sync(version\u003dversion)"},{"line_number":48,"context_line":"    else:"},{"line_number":49,"context_line":"        try:"},{"line_number":50,"context_line":"            package_name \u003d \u0027.\u0027.join((contrib.__name__, extension))"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuGY%3D","line":47,"updated":"2014-02-28 19:37:04.000000000","message":"exit early \u0027if not extension\u0027:\n\n  return db_sync(version\u003dversion)\n\nand then you can drop the \u0027else\u0027 and then unindent the rest of this method","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def sync_database(version\u003dNone, extension\u003dNone):"},{"line_number":46,"context_line":"    if not extension:"},{"line_number":47,"context_line":"        db_sync(version\u003dversion)"},{"line_number":48,"context_line":"    else:"},{"line_number":49,"context_line":"        try:"},{"line_number":50,"context_line":"            package_name \u003d \u0027.\u0027.join((contrib.__name__, extension))"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuAA%3D","line":47,"in_reply_to":"AAAAVX%2F%2FuGY%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"88bb2a5cb27498a77f638c91a22b22f69c4aee98","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"def print_db_version(extension):"},{"line_number":68,"context_line":"        if extension:"},{"line_number":69,"context_line":"            try:"},{"line_number":70,"context_line":"                package_name \u003d \u0027.\u0027.join((contrib.__name__, extension))"},{"line_number":71,"context_line":"                package \u003d importutils.import_module(package_name)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuHE%3D","line":68,"updated":"2014-02-28 19:37:04.000000000","message":"random extra indentation","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"def print_db_version(extension):"},{"line_number":68,"context_line":"        if extension:"},{"line_number":69,"context_line":"            try:"},{"line_number":70,"context_line":"                package_name \u003d \u0027.\u0027.join((contrib.__name__, extension))"},{"line_number":71,"context_line":"                package \u003d importutils.import_module(package_name)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft2k%3D","line":68,"in_reply_to":"AAAAVX%2F%2FuHE%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"88bb2a5cb27498a77f638c91a22b22f69c4aee98","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                exit(1)"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            print(db_version("},{"line_number":83,"context_line":"                migration_helpers.find_migrate_repo()), 0)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"def migrate_repository(version, current_version, repo_path):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuFY%3D","line":83,"updated":"2014-02-28 19:37:04.000000000","message":"it\u0027d be nice if this followed the same patterns as above (if not extension print and return","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                exit(1)"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            print(db_version("},{"line_number":83,"context_line":"                migration_helpers.find_migrate_repo()), 0)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"def migrate_repository(version, current_version, repo_path):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft2g%3D","line":83,"in_reply_to":"AAAAVX%2F%2FuFY%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"}],"keystone/common/sql/migration_helpers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e9f1df475070be9985f36a140cb60632ba141791","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from migrate import exceptions"},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystone.common import sql"},{"line_number":25,"context_line":"from keystone import contrib"},{"line_number":26,"context_line":"from keystone import exception"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2Fzvk%3D","line":23,"updated":"2014-03-04 01:33:17.000000000","message":"remove extra whitespace","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from migrate import exceptions"},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystone.common import sql"},{"line_number":25,"context_line":"from keystone import contrib"},{"line_number":26,"context_line":"from keystone import exception"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzcY%3D","line":23,"in_reply_to":"AAAAVn%2F%2Fzvk%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5f537921bb8214ceeaa07a9e52f8a112b7f2000c","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                find_migrate_repo(package), 0))"},{"line_number":153,"context_line":"        except exception.MigrationNotProvided as e:"},{"line_number":154,"context_line":"            print(e)"},{"line_number":155,"context_line":"            exit(0)"}],"source_content_type":"text/x-python","patch_set":77,"id":"AAAAVn%2F%2Fyy0%3D","line":155,"updated":"2014-03-04 03:58:45.000000000","message":"should the error status be \u00271\u0027 here?","commit_id":"90b4e62889af4c714d1cd8c5a67b24482727cc2f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"41aa85a3bde1d220096a74e205e25ac9ad1c097a","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                pass"},{"line_number":134,"context_line":"        except exception.MigrationNotProvided as e:"},{"line_number":135,"context_line":"            print(e)"},{"line_number":136,"context_line":"            exit(0)"},{"line_number":137,"context_line":"    migration.db_sync(abs_path, version\u003dversion)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":78,"id":"AAAAVn%2F%2FyfY%3D","line":136,"updated":"2014-03-04 04:53:03.000000000","message":"I think this one should also exit with a status code of 1, but the better question is where is exit coming from? I think this may have been broken in the original code.","commit_id":"0eba4e5da0221d154eb06965653e186c51c3b21f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a43cd07f3004e5c7363c681c00d95850bd77bce1","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                pass"},{"line_number":134,"context_line":"        except exception.MigrationNotProvided as e:"},{"line_number":135,"context_line":"            print(e)"},{"line_number":136,"context_line":"            exit(1)"},{"line_number":137,"context_line":"    migration.db_sync(abs_path, version\u003dversion)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FxYg%3D","line":136,"updated":"2014-03-04 07:50:11.000000000","message":"Where is exit coming from? is this supposed to be sys.exit? As far as I can tell, while you can call \"exit\" directly everything says use sys.exit instead (heck, builtin exit doesn\u0027t even exist on the python 2 doc site)","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"188cf4e83fca0cfd7411d800e3fc264d7c1a6b8a","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                pass"},{"line_number":134,"context_line":"        except exception.MigrationNotProvided as e:"},{"line_number":135,"context_line":"            print(e)"},{"line_number":136,"context_line":"            exit(1)"},{"line_number":137,"context_line":"    migration.db_sync(abs_path, version\u003dversion)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2Funo%3D","line":136,"in_reply_to":"AAAAVn%2F%2FxYg%3D","updated":"2014-03-04 13:52:56.000000000","message":"Done","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"}],"keystone/contrib/oauth1/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        user_token_ref \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":64,"context_line":"        user_id \u003d user_token_ref[\u0027user\u0027].get(\u0027id\u0027)"},{"line_number":65,"context_line":"        self.revoke_api.revoke_for_consumer(consumer_id\u003dconsumer_id)"},{"line_number":66,"context_line":"        if CONF.token.revoke_by_id:"},{"line_number":67,"context_line":"            self.token_api.delete_tokens(user_id, consumer_id\u003dconsumer_id)"},{"line_number":68,"context_line":"        self.oauth_api.delete_consumer(consumer_id)"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5gM%3D","line":66,"updated":"2014-01-20 23:55:32.000000000","message":"seems like support for CONF.token.revoke_by_id could be split out to a separate commit.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c63f67fa80962b333bc2eff421336c16f5a3ec6","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        user_token_ref \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":64,"context_line":"        user_id \u003d user_token_ref[\u0027user\u0027].get(\u0027id\u0027)"},{"line_number":65,"context_line":"        self.revoke_api.revoke_for_consumer(consumer_id\u003dconsumer_id)"},{"line_number":66,"context_line":"        if CONF.token.revoke_by_id:"},{"line_number":67,"context_line":"            self.token_api.delete_tokens(user_id, consumer_id\u003dconsumer_id)"},{"line_number":68,"context_line":"        self.oauth_api.delete_consumer(consumer_id)"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B468%3D","line":66,"in_reply_to":"AAAAUH%2F%2B5gM%3D","updated":"2014-01-21 04:55:07.000000000","message":"Then there would be no revocation mechanism available.  Also, each change conditional on  CONF.token.revoke_by_id  needs to be paired with the new revoke call: this makes it easier to confirm that.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        consumer_id \u003d access_token[\u0027consumer_id\u0027]"},{"line_number":99,"context_line":"        self.revoke_api.revoke_for_consumer(consumer_id\u003dconsumer_id)"},{"line_number":100,"context_line":"        if CONF.token.revoke_by_id:"},{"line_number":101,"context_line":"            self.token_api.delete_tokens(user_id, consumer_id\u003dconsumer_id)"},{"line_number":102,"context_line":"        return self.oauth_api.delete_access_token("},{"line_number":103,"context_line":"            user_id, access_token_id)"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5f8%3D","line":101,"updated":"2014-01-20 23:55:32.000000000","message":"could the \"if CONF.token.revoke_by_id:\" check be moved into delete_tokens? then wouldn\u0027t have to check it everywhere this is called.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        user_token_ref \u003d self.token_api.get_token(context[\u0027token_id\u0027])"},{"line_number":64,"context_line":"        user_id \u003d user_token_ref[\u0027user\u0027].get(\u0027id\u0027)"},{"line_number":65,"context_line":"        self.revoke_api.revoke_for_consumer(consumer_id\u003dconsumer_id)"},{"line_number":66,"context_line":"        if CONF.token.revoke_by_id:"},{"line_number":67,"context_line":"            self.token_api.delete_tokens(user_id, consumer_id\u003dconsumer_id)"},{"line_number":68,"context_line":"        self.oauth_api.delete_consumer(consumer_id)"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B2AI%3D","line":66,"updated":"2014-01-21 14:39:11.000000000","message":"if each change conditional on CONF.token.revoke_by_id needs to be paired with the new revoke call then there should be a function that does both and call that.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        consumer_id \u003d access_token[\u0027consumer_id\u0027]"},{"line_number":99,"context_line":"        self.revoke_api.revoke_for_consumer(consumer_id\u003dconsumer_id)"},{"line_number":100,"context_line":"        if CONF.token.revoke_by_id:"},{"line_number":101,"context_line":"            self.token_api.delete_tokens(user_id, consumer_id\u003dconsumer_id)"},{"line_number":102,"context_line":"        return self.oauth_api.delete_access_token("},{"line_number":103,"context_line":"            user_id, access_token_id)"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B2AA%3D","line":101,"updated":"2014-01-21 14:39:11.000000000","message":"could the \"if CONF.token.revoke_by_id:\" check be moved into delete_tokens? then wouldn\u0027t have to check it everywhere this is called.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"}],"keystone/contrib/revoke/__init__.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efbdab75ac7906fd5eb8ae6c7e6d339ebbab9d3e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FJx4%3D","line":3,"updated":"2014-01-16 23:03:10.000000000","message":"Update Copyright year to 2014.","commit_id":"06d60b533dd6f1d189ce5c4b05ccbceda76a67c3"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B8Ig%3D","line":1,"updated":"2014-02-18 04:42:19.000000000","message":"remove the vim header","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Bhc%3D","line":3,"updated":"2014-02-17 22:00:23.000000000","message":"remove copyright attribute to the foundation - you don\u0027t work for them","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from keystone.contrib.revoke.core import * # flake8: noqa"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdG0%3D","line":13,"updated":"2014-02-26 15:51:13.000000000","message":"Extra newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"}],"keystone/contrib/revoke/backends/fake.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class Revoke(revoke.Driver):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    #helper method for tests"},{"line_number":24,"context_line":"    def _clear(self):"},{"line_number":25,"context_line":"        pass"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5fg%3D","line":23,"updated":"2014-01-20 23:55:32.000000000","message":"how does it help to have a function that doesn\u0027t do anything?","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        pass"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_events(self, filter\u003dNone):"},{"line_number":28,"context_line":"        \"\"\"return the revocation events,"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param filter:"},{"line_number":31,"context_line":"        :raises: keystone.exception,"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5e0%3D","line":28,"updated":"2014-01-20 23:55:32.000000000","message":"Make this a sentence.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    def get_events(self, filter\u003dNone):"},{"line_number":28,"context_line":"        \"\"\"return the revocation events,"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param filter:"},{"line_number":31,"context_line":"        :raises: keystone.exception,"},{"line_number":32,"context_line":"        :returns: None."},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5e8%3D","line":30,"updated":"2014-01-20 23:55:32.000000000","message":"add a description.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \"\"\"return the revocation events,"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param filter:"},{"line_number":31,"context_line":"        :raises: keystone.exception,"},{"line_number":32,"context_line":"        :returns: None."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5fA%3D","line":31,"updated":"2014-01-20 23:55:32.000000000","message":"doesn\u0027t raise anything","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param filter:"},{"line_number":31,"context_line":"        :raises: keystone.exception,"},{"line_number":32,"context_line":"        :returns: None."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        \"\"\""},{"line_number":35,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5fI%3D","line":32,"updated":"2014-01-20 23:55:32.000000000","message":"this returns []","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f2d27140feb6804a1c436e2a5a869ebbf5ac8894","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        return []"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def revoke(self, event):"},{"line_number":34,"context_line":"        \"\"\"A real implementation would record the revocation event."},{"line_number":35,"context_line":"        :param event: Ignored"},{"line_number":36,"context_line":"        :raises: None"},{"line_number":37,"context_line":"        :returns: No return value"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1w8%3D","line":34,"updated":"2014-01-21 15:24:58.000000000","message":"(NIT): add a newline after line 34 to be consistent with the doc strings in the method above.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5fcd423317c2a89b283c8483619d13a671be979a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        return []"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def revoke(self, event):"},{"line_number":34,"context_line":"        \"\"\"A real implementation would record the revocation event."},{"line_number":35,"context_line":"        :param event: Ignored"},{"line_number":36,"context_line":"        :raises: None"},{"line_number":37,"context_line":"        :returns: No return value"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUH%2F%2Bn%2BA%3D","line":34,"updated":"2014-01-23 19:52:24.000000000","message":"(NIT): add newline after description to be consistent with the doc strings above.","commit_id":"a952a49787cfbaa045e1195a881e40c4a08d3b62"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fyg%3D","line":1,"updated":"2014-02-17 19:26:32.000000000","message":"let\u0027s not add these back in again.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BhY%3D","line":3,"updated":"2014-02-17 22:00:23.000000000","message":"remove this whole module - there\u0027s already a kvs implementation, there\u0027s no need for a \"fake\" one (?)","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class Revoke(revoke.Driver):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def get_events(self, filter\u003dNone):"},{"line_number":24,"context_line":"        \"\"\"A real implementation would return the revocation events."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"        :param filter: Ignored"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BgY%3D","line":23,"updated":"2014-02-17 22:00:23.000000000","message":"remove filter if you\u0027re not going to use it","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    def get_events(self, filter\u003dNone):"},{"line_number":24,"context_line":"        \"\"\"A real implementation would return the revocation events."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"        :param filter: Ignored"},{"line_number":27,"context_line":"        :raises: None"},{"line_number":28,"context_line":"        :returns: []"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Bgk%3D","line":26,"updated":"2014-02-17 22:00:23.000000000","message":"then don\u0027t make it a part of the method signature","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        \"\"\"A real implementation would return the revocation events."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"        :param filter: Ignored"},{"line_number":27,"context_line":"        :raises: None"},{"line_number":28,"context_line":"        :returns: []"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Bgs%3D","line":27,"updated":"2014-02-17 22:00:23.000000000","message":"it raises null? remove this","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"        :param filter: Ignored"},{"line_number":27,"context_line":"        :raises: None"},{"line_number":28,"context_line":"        :returns: []"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        \"\"\""},{"line_number":31,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Bg4%3D","line":28,"updated":"2014-02-17 22:00:23.000000000","message":"this always returns an empty list?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        return []"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def revoke(self, event):"},{"line_number":34,"context_line":"        \"\"\"A real implementation would record the revocation event."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        :param event: Ignored"},{"line_number":37,"context_line":"        :raises: None"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BgI%3D","line":34,"updated":"2014-02-17 22:00:23.000000000","message":"just describe the behavior of the interface","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        :param event: Ignored"},{"line_number":37,"context_line":"        :raises: None"},{"line_number":38,"context_line":"        :returns: No return value"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        \"\"\""},{"line_number":41,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BgQ%3D","line":38,"updated":"2014-02-17 22:00:23.000000000","message":"same as above, these docs are useless","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from keystone.contrib import revoke"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdGw%3D","line":13,"updated":"2014-02-26 15:51:13.000000000","message":"Extra newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from keystone.contrib import revoke"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"#This implementation is to allow the revoke code to be integrated into the"},{"line_number":18,"context_line":"#providers unconditionally, but to bypass recording or reporting actual events."},{"line_number":19,"context_line":"#Instead, this implementation drops all events. Since the in memory KVS"},{"line_number":20,"context_line":"#implementation does not clean up expired events, it would be unsafe to use as"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdGk%3D","line":17,"updated":"2014-02-26 15:51:13.000000000","message":"Space after #","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e9f1df475070be9985f36a140cb60632ba141791","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2Fzug%3D","line":1,"updated":"2014-03-04 01:33:17.000000000","message":"is this module necessary?","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzcU%3D","line":1,"in_reply_to":"AAAAVn%2F%2Fzug%3D","updated":"2014-03-04 02:28:09.000000000","message":"Gone","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"}],"keystone/contrib/revoke/backends/kvs.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7b32013c0c4ebdb17d1ca50d4488ceac064742d1","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.contrib import revoke"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class Revoke(revoke.Driver):"},{"line_number":22,"context_line":"    _events \u003d []"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BESA%3D","line":20,"updated":"2013-12-02 21:44:33.000000000","message":"do we really need a kvs backend too?","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class Revoke(revoke.Driver):"},{"line_number":22,"context_line":"    _events \u003d []"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    #helper method for tests"},{"line_number":25,"context_line":"    def _clear(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9gAs%3D","line":22,"updated":"2013-12-10 22:23:38.000000000","message":"Should this really be class scope?","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efbdab75ac7906fd5eb8ae6c7e6d339ebbab9d3e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FJxw%3D","line":3,"updated":"2014-01-16 23:03:10.000000000","message":"Update Copyright year to 2014. \n\nSame for all new files in this patch.","commit_id":"06d60b533dd6f1d189ce5c4b05ccbceda76a67c3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efbdab75ac7906fd5eb8ae6c7e6d339ebbab9d3e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        self._events \u003d []"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def get_events(self, filter\u003dNone):"},{"line_number":29,"context_line":"        \"\"\"return the revocation events,"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param filter:"},{"line_number":32,"context_line":"        :raises: keystone.exception,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FJxI%3D","line":29,"updated":"2014-01-16 23:03:10.000000000","message":"\u0027Return\u0027 and end with a period.","commit_id":"06d60b533dd6f1d189ce5c4b05ccbceda76a67c3"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def _clear(self):"},{"line_number":34,"context_line":"        self._events \u003d []"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def prune_expired_events(self):"},{"line_number":37,"context_line":"        pruned \u003d []"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B7Gg%3D","line":36,"updated":"2014-01-20 18:09:40.000000000","message":"nit: if it\u0027s supposed to be private, prefix it with an _","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class Revoke(revoke.Driver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self):"},{"line_number":30,"context_line":"        self._events \u003d []"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    #helper method for tests"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5dc%3D","line":29,"updated":"2014-01-20 23:55:32.000000000","message":"call super(Revoke, self).__init__() ?","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c63f67fa80962b333bc2eff421336c16f5a3ec6","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class Revoke(revoke.Driver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self):"},{"line_number":30,"context_line":"        self._events \u003d []"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    #helper method for tests"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B46k%3D","line":29,"in_reply_to":"AAAAUH%2F%2B5dc%3D","updated":"2014-01-21 04:55:07.000000000","message":"No, base class is abstract.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self._events \u003d []"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    #helper method for tests"},{"line_number":33,"context_line":"    def _clear(self):"},{"line_number":34,"context_line":"        self._events \u003d []"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _prune_expired_events(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5eQ%3D","line":33,"updated":"2014-01-20 23:55:32.000000000","message":"suggest make this public since it\u0027s called from tests, and make the comment a docstring.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c63f67fa80962b333bc2eff421336c16f5a3ec6","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self._events \u003d []"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    #helper method for tests"},{"line_number":33,"context_line":"    def _clear(self):"},{"line_number":34,"context_line":"        self._events \u003d []"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _prune_expired_events(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B46o%3D","line":33,"in_reply_to":"AAAAUH%2F%2B5eQ%3D","updated":"2014-01-21 04:55:07.000000000","message":"changed to a docstring, but want to keep it priviate.  It is a \"friend\" method for testing, but should not be called in anger.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return pruned"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def get_events(self, filter\u003dNone):"},{"line_number":51,"context_line":"        \"\"\"return the revocation events,"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :param filter:"},{"line_number":54,"context_line":"        :raises: keystone.exception,"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5eI%3D","line":51,"updated":"2014-01-20 23:55:32.000000000","message":"make this a sentence.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def get_events(self, filter\u003dNone):"},{"line_number":51,"context_line":"        \"\"\"return the revocation events,"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :param filter:"},{"line_number":54,"context_line":"        :raises: keystone.exception,"},{"line_number":55,"context_line":"        :returns: None."},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5eA%3D","line":53,"updated":"2014-01-20 23:55:32.000000000","message":"add a description","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        \"\"\"return the revocation events,"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :param filter:"},{"line_number":54,"context_line":"        :raises: keystone.exception,"},{"line_number":55,"context_line":"        :returns: None."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5dw%3D","line":54,"updated":"2014-01-20 23:55:32.000000000","message":"I don\u0027t see anything raised.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :param filter:"},{"line_number":54,"context_line":"        :raises: keystone.exception,"},{"line_number":55,"context_line":"        :returns: None."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        return self._prune_expired_events()"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5d0%3D","line":55,"updated":"2014-01-20 23:55:32.000000000","message":"this returns a list.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        :returns: None."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        return self._prune_expired_events()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def revoke(self, event):"},{"line_number":61,"context_line":"        self._prune_expired_events()"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5do%3D","line":58,"updated":"2014-01-20 23:55:32.000000000","message":"would be nice if we could deal with iterators here rather than having to make copies.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c63f67fa80962b333bc2eff421336c16f5a3ec6","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        :returns: None."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        return self._prune_expired_events()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def revoke(self, event):"},{"line_number":61,"context_line":"        self._prune_expired_events()"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B46U%3D","line":58,"in_reply_to":"AAAAUH%2F%2B5do%3D","updated":"2014-01-21 04:55:07.000000000","message":"copy is to remove the old references so they can be garbage collected.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f2d27140feb6804a1c436e2a5a869ebbf5ac8894","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            revoked_at \u003d event.revoked_at"},{"line_number":39,"context_line":"            if revoked_at \u003e oldest:"},{"line_number":40,"context_line":"                pruned.append(event)"},{"line_number":41,"context_line":"        self._events \u003d copy.copy(pruned)"},{"line_number":42,"context_line":"        return pruned"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def get_events(self, filter\u003dNone):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1wQ%3D","line":41,"updated":"2014-01-21 15:24:58.000000000","message":"We know that this will always work with a shallow copy? Maybe add unit tests to prove this?","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f2d27140feb6804a1c436e2a5a869ebbf5ac8894","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        \"\"\""},{"line_number":52,"context_line":"        return self._prune_expired_events()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def revoke(self, event):"},{"line_number":55,"context_line":"        self._prune_expired_events()"},{"line_number":56,"context_line":"        self._events.append(event)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1wk%3D","line":54,"updated":"2014-01-21 15:24:58.000000000","message":"(NIT): missing doc strings here","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FxQ%3D","line":1,"updated":"2014-02-17 19:26:32.000000000","message":"let\u0027s not add these back in again.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B8IA%3D","line":3,"updated":"2014-02-18 04:42:19.000000000","message":"remove","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        :param filter: Ignored"},{"line_number":48,"context_line":"        :raises: None"},{"line_number":49,"context_line":"        :returns: A list of keystone.contrib.revoke.model.RevocationEvents"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        \"\"\""},{"line_number":52,"context_line":"        return self._prune_expired_events()"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Bf0%3D","line":49,"updated":"2014-02-17 22:00:23.000000000","message":"you don\u0027t have to copy/paste doc strings for drivers around","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cdd671a930fb6fce5886fc6bf1252f4125a2421f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        return self._prune_expired_events()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def revoke(self, event):"},{"line_number":55,"context_line":"        \"\"\"register a revocation event"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :param event: An instance of"},{"line_number":58,"context_line":"            keystone.contrib.revoke.model.RevocationEvent"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Bhg%3D","line":55,"updated":"2014-02-17 21:51:34.000000000","message":"s/register/Register/ and add a period to the end.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class Revoke(revoke.Driver):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self):"},{"line_number":26,"context_line":"        self._events \u003d []"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def _prune_expired_events(self, last_fetch\u003dNone):"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FpU%3D","line":25,"updated":"2014-02-22 19:58:28.000000000","message":"add call to super() __init__","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                        results.append(event)"},{"line_number":41,"context_line":"                else:"},{"line_number":42,"context_line":"                    results.append(event)"},{"line_number":43,"context_line":"        self._events \u003d copy.copy(pruned)"},{"line_number":44,"context_line":"        return results"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def get_events(self, last_fetch\u003dNone):"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FpM%3D","line":43,"updated":"2014-02-22 19:58:28.000000000","message":"why copy here? pruned is just going away at the end of the function anyways.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                        results.append(event)"},{"line_number":41,"context_line":"                else:"},{"line_number":42,"context_line":"                    results.append(event)"},{"line_number":43,"context_line":"        self._events \u003d copy.copy(pruned)"},{"line_number":44,"context_line":"        return results"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def get_events(self, last_fetch\u003dNone):"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2Fwew%3D","line":43,"in_reply_to":"AAAAU3%2F%2F%2FpM%3D","updated":"2014-02-25 02:26:45.000000000","message":"Done/  was a vestige","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from keystone.contrib import revoke"},{"line_number":18,"context_line":"from keystone import exception"},{"line_number":19,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"CONF \u003d config.CONF"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"_EVENT_KEY \u003d \u0027os-revoke-events\u0027"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdGc%3D","line":20,"updated":"2014-02-26 15:51:13.000000000","message":"Missing newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ea63c3108e8cf964ac8a81ea76640b98bf647ce5","unresolved":false,"context_lines":[{"line_number":21,"context_line":"CONF \u003d config.CONF"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"_EVENT_KEY \u003d \u0027os-revoke-events\u0027"},{"line_number":24,"context_line":"_KVS_BACKEND \u003d \u0027openstack.kvs.Memory\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class Revoke(revoke.Driver):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FadY%3D","line":24,"updated":"2014-02-26 19:55:38.000000000","message":"Suggest making this a config option. (probably a later patchset than this one)","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _set(self, events, lock\u003dNone):"},{"line_number":40,"context_line":"        self._store.set(_EVENT_KEY, events, lock)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _prune_expired_events(self, last_fetch\u003dNone, lock\u003dNone):"},{"line_number":43,"context_line":"        pruned \u003d []"},{"line_number":44,"context_line":"        results \u003d []"},{"line_number":45,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdDI%3D","line":42,"updated":"2014-02-26 15:51:13.000000000","message":"Don\u0027t you always need a lock? You are protecting against multiple revoke calls below, but you could have pruning happening because of the get_events call. What about the code that adds entries to the KVS?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _set(self, events, lock\u003dNone):"},{"line_number":40,"context_line":"        self._store.set(_EVENT_KEY, events, lock)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _prune_expired_events(self, last_fetch\u003dNone, lock\u003dNone):"},{"line_number":43,"context_line":"        pruned \u003d []"},{"line_number":44,"context_line":"        results \u003d []"},{"line_number":45,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZBk%3D","line":42,"updated":"2014-02-26 22:05:50.000000000","message":"suggest change name to \"_get_and_prune\" so it\u0027s obvious that this is also the method used to get the current events.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _set(self, events, lock\u003dNone):"},{"line_number":40,"context_line":"        self._store.set(_EVENT_KEY, events, lock)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _prune_expired_events(self, last_fetch\u003dNone, lock\u003dNone):"},{"line_number":43,"context_line":"        pruned \u003d []"},{"line_number":44,"context_line":"        results \u003d []"},{"line_number":45,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FbHM%3D","line":42,"in_reply_to":"AAAAU3%2F%2FdDI%3D","updated":"2014-02-26 21:54:53.000000000","message":"Done.  Yeah.  I was thinking that get should be read only, but since it prunes, it is read-write, and needs to be locked.  Thanks, that would have been nasty.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ea63c3108e8cf964ac8a81ea76640b98bf647ce5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _set(self, events, lock\u003dNone):"},{"line_number":40,"context_line":"        self._store.set(_EVENT_KEY, events, lock)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _prune_expired_events(self, last_fetch\u003dNone, lock\u003dNone):"},{"line_number":43,"context_line":"        pruned \u003d []"},{"line_number":44,"context_line":"        results \u003d []"},{"line_number":45,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FacU%3D","line":42,"in_reply_to":"AAAAU3%2F%2FdDI%3D","updated":"2014-02-26 19:55:38.000000000","message":"It looks like a lock is always require (should always be required). _prune_expired_events (if it\u0027s doing a set) needs to always be wrapped in a lock","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ea63c3108e8cf964ac8a81ea76640b98bf647ce5","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                        results.append(event)"},{"line_number":56,"context_line":"                else:"},{"line_number":57,"context_line":"                    results.append(event)"},{"line_number":58,"context_line":"        self._set(pruned, lock)"},{"line_number":59,"context_line":"        return results"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_events(self, last_fetch\u003dNone):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FabE%3D","line":58,"updated":"2014-02-26 19:55:38.000000000","message":"Suggest not doing get/set in _prune_expired_events. Perhaps the only time you set the pruned event is on new revocations? This would also mitigate the need to lock around it.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                        results.append(event)"},{"line_number":56,"context_line":"                else:"},{"line_number":57,"context_line":"                    results.append(event)"},{"line_number":58,"context_line":"        self._set(pruned, lock)"},{"line_number":59,"context_line":"        return results"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_events(self, last_fetch\u003dNone):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZC4%3D","line":58,"in_reply_to":"AAAAU3%2F%2FabE%3D","updated":"2014-02-26 21:54:53.000000000","message":"Nah, would still need a lock, to make sure two revokes don\u0027;t trample each other.  The goal here is to make sure we don\u0027t have a growing list, but also that a fetch of the list is always \"fresh\"","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def revoke(self, event):"},{"line_number":65,"context_line":"        with self._store.get_lock(_EVENT_KEY) as lock:"},{"line_number":66,"context_line":"            self._prune_expired_events(lock\u003dlock)"},{"line_number":67,"context_line":"            events \u003d self._get()"},{"line_number":68,"context_line":"            events.append(event)"},{"line_number":69,"context_line":"            self._set(events, lock)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdF8%3D","line":66,"updated":"2014-02-26 15:51:13.000000000","message":"It would be nice if _prune_expired_events didn\u0027t do its own _get and _set, but I don\u0027t think that\u0027s a show stopper. Maybe a NOTE about it for later cleanup?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def revoke(self, event):"},{"line_number":65,"context_line":"        with self._store.get_lock(_EVENT_KEY) as lock:"},{"line_number":66,"context_line":"            self._prune_expired_events(lock\u003dlock)"},{"line_number":67,"context_line":"            events \u003d self._get()"},{"line_number":68,"context_line":"            events.append(event)"},{"line_number":69,"context_line":"            self._set(events, lock)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FbFE%3D","line":66,"in_reply_to":"AAAAU3%2F%2FdF8%3D","updated":"2014-02-26 21:54:53.000000000","message":"Done","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        except exception.NotFound:"},{"line_number":38,"context_line":"            return []"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _prune_expired_events(self, lock, last_fetch\u003dNone, new_event\u003dNone):"},{"line_number":41,"context_line":"        pruned \u003d []"},{"line_number":42,"context_line":"        results \u003d []"},{"line_number":43,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2Bj8%3D","line":40,"updated":"2014-02-27 02:22:07.000000000","message":"suggest change name to \"_get_and_prune\" so it\u0027s obvious that this is also the method used to get the current events.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def get_events(self, last_fetch\u003dNone):"},{"line_number":63,"context_line":"        with self._store.get_lock(_EVENT_KEY) as lock:"},{"line_number":64,"context_line":"            return self._prune_expired_events(lock, last_fetch)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def revoke(self, event):"},{"line_number":67,"context_line":"        with self._store.get_lock(_EVENT_KEY) as lock:"}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2Bgc%3D","line":64,"updated":"2014-02-27 02:22:07.000000000","message":"suggest change last_fetch to \"last_fetch\u003dlast_fetch\" since there\u0027s multiple named parameters.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def revoke(self, event):"},{"line_number":67,"context_line":"        with self._store.get_lock(_EVENT_KEY) as lock:"},{"line_number":68,"context_line":"            self._prune_expired_events(lock\u003dlock, new_event\u003devent)"}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2Bgo%3D","line":68,"updated":"2014-02-27 02:22:07.000000000","message":"suggest change \"lock\u003dlock\" to \"lock\" since it\u0027s a positional parameter now.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"},{"line_number":44,"context_line":"        oldest \u003d timeutils.utcnow() - expire_delta"},{"line_number":45,"context_line":"        #TODO(ayoung)  Store the time of the oldest event so that the"},{"line_number":46,"context_line":"        #prune process can be skipped it none of the events have timed out."},{"line_number":47,"context_line":"        with self._store.get_lock(_EVENT_KEY) as lock:"},{"line_number":48,"context_line":"            events \u003d self._get()"},{"line_number":49,"context_line":"            if new_event is not None:"}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F92s%3D","line":46,"updated":"2014-02-27 04:59:37.000000000","message":"if*","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        results \u003d []"},{"line_number":43,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"},{"line_number":44,"context_line":"        oldest \u003d timeutils.utcnow() - expire_delta"},{"line_number":45,"context_line":"        #TODO(ayoung)  Store the time of the oldest event so that the"},{"line_number":46,"context_line":"        #prune process can be skipped if none of the events have timed out."},{"line_number":47,"context_line":"        with self._store.get_lock(_EVENT_KEY) as lock:"},{"line_number":48,"context_line":"            events \u003d self._get()"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F6Ig%3D","line":45,"updated":"2014-03-03 15:23:04.000000000","message":"Add spaces after the # and a : after the )","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        results \u003d []"},{"line_number":43,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"},{"line_number":44,"context_line":"        oldest \u003d timeutils.utcnow() - expire_delta"},{"line_number":45,"context_line":"        #TODO(ayoung)  Store the time of the oldest event so that the"},{"line_number":46,"context_line":"        #prune process can be skipped if none of the events have timed out."},{"line_number":47,"context_line":"        with self._store.get_lock(_EVENT_KEY) as lock:"},{"line_number":48,"context_line":"            events \u003d self._get()"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F2NU%3D","line":45,"in_reply_to":"AAAAVn%2F%2F6Ig%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0af7b8d0bc91da6283895605b8a72bab27f547be","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self._store \u003d kvs.get_key_value_store(\u0027os-revoke-driver\u0027)"},{"line_number":32,"context_line":"        self._store.configure(backing_store\u003d_KVS_BACKEND, **kwargs)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _get(self):"},{"line_number":35,"context_line":"        try:"},{"line_number":36,"context_line":"            return self._store.get(_EVENT_KEY)"},{"line_number":37,"context_line":"        except exception.NotFound:"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2Fzcg%3D","line":34,"updated":"2014-03-04 02:02:43.000000000","message":"nit: should this be _get_event?","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self._store \u003d kvs.get_key_value_store(\u0027os-revoke-driver\u0027)"},{"line_number":32,"context_line":"        self._store.configure(backing_store\u003d_KVS_BACKEND, **kwargs)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _get(self):"},{"line_number":35,"context_line":"        try:"},{"line_number":36,"context_line":"            return self._store.get(_EVENT_KEY)"},{"line_number":37,"context_line":"        except exception.NotFound:"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzUo%3D","line":34,"in_reply_to":"AAAAVn%2F%2Fzcg%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e9f1df475070be9985f36a140cb60632ba141791","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                revoked_at \u003d event.revoked_at"},{"line_number":54,"context_line":"                if revoked_at \u003e oldest:"},{"line_number":55,"context_line":"                    pruned.append(event)"},{"line_number":56,"context_line":"                    if last_fetch:"},{"line_number":57,"context_line":"                        if revoked_at \u003e last_fetch:"},{"line_number":58,"context_line":"                            results.append(event)"},{"line_number":59,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzlE%3D","line":56,"updated":"2014-03-04 01:33:17.000000000","message":"simplify!\n\n  if last_fetch is None or revoked_at \u003e last_fetch:\n    results.append(event)","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                revoked_at \u003d event.revoked_at"},{"line_number":54,"context_line":"                if revoked_at \u003e oldest:"},{"line_number":55,"context_line":"                    pruned.append(event)"},{"line_number":56,"context_line":"                    if last_fetch:"},{"line_number":57,"context_line":"                        if revoked_at \u003e last_fetch:"},{"line_number":58,"context_line":"                            results.append(event)"},{"line_number":59,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2Fzbs%3D","line":56,"in_reply_to":"AAAAVn%2F%2FzlE%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done.  I like that.","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a43cd07f3004e5c7363c681c00d95850bd77bce1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"},{"line_number":44,"context_line":"        oldest \u003d timeutils.utcnow() - expire_delta"},{"line_number":45,"context_line":"        # TODO(ayoung): Store the time of the oldest event so that the"},{"line_number":46,"context_line":"        # prune process can be skipped if none of the events have timed out."},{"line_number":47,"context_line":"        with self._store.get_lock(_EVENT_KEY) as lock:"},{"line_number":48,"context_line":"            events \u003d self._get_event()"},{"line_number":49,"context_line":"            if new_event is not None:"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FxXU%3D","line":46,"updated":"2014-03-04 07:50:11.000000000","message":"NIT: add a bug id for tracking if there is one.","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"656d4bcccf51de070056856546fa35d89f65ad86","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003dCONF.token.expiration)"},{"line_number":44,"context_line":"        oldest \u003d timeutils.utcnow() - expire_delta"},{"line_number":45,"context_line":"        # TODO(ayoung): Store the time of the oldest event so that the"},{"line_number":46,"context_line":"        # prune process can be skipped if none of the events have timed out."},{"line_number":47,"context_line":"        with self._store.get_lock(_EVENT_KEY) as lock:"},{"line_number":48,"context_line":"            events \u003d self._get_event()"},{"line_number":49,"context_line":"            if new_event is not None:"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FtB0%3D","line":46,"in_reply_to":"AAAAVn%2F%2FxXU%3D","updated":"2014-03-04 17:28:38.000000000","message":"https://bugs.launchpad.net/keystone/+bug/1287757","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"}],"keystone/contrib/revoke/backends/sql.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d51f15b6ccc04973a3e006360dab6fc3cf89a1a5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class RevokedToken(sql.ModelBase, sql.DictBase):"},{"line_number":18,"context_line":"    __tablename__ \u003d \u0027revoked_token\u0027"},{"line_number":19,"context_line":"    attributes \u003d [\u0027scope_id\u0027, \u0027scope_type\u0027,\u0027expires_net\u0027, \u0027expires_nlt\u0027]"},{"line_number":20,"context_line":"    "},{"line_number":21,"context_line":"    scope_id \u003d sql.Column(sql.String(64)),"},{"line_number":22,"context_line":"    scope_type \u003d sql.Column(sql.Integer()),"},{"line_number":23,"context_line":"    expires_net \u003d sql.Column( sql.DateTime()),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B5Qs%3D","line":20,"updated":"2013-11-18 21:38:48.000000000","message":"Whoopse! Whitespace!","commit_id":"387354726b73b21e5e99ddacdc24b4362b7db7ba"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def get_events(self, filter\u003dNone):"},{"line_number":49,"context_line":"        \"\"\"return the revocation events,"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        :param filter:"},{"line_number":52,"context_line":"        :raises: keystone.exception,"},{"line_number":53,"context_line":"        :returns: None."},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9f6o%3D","line":51,"updated":"2013-12-10 22:23:38.000000000","message":"Is this docstring correct?  It looks like the raises and returns values are incorrect.","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        query \u003d session.query(RevokedToken).order_by(RevokedToken.scope_id)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        for e in query:"},{"line_number":61,"context_line":"            kwargs \u003d dict()"},{"line_number":62,"context_line":"            for attr in e.attributes:"},{"line_number":63,"context_line":"                kwargs[attr] \u003d getattr(e, attr)"},{"line_number":64,"context_line":"            events.append(revoke.RevokeEvent(**kwargs))"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9f8c%3D","line":61,"updated":"2013-12-10 22:23:38.000000000","message":"Is there any reason you are doing it this way? Most of the other SQL backends turn return something like:\n\n  [e.to_dict() for e in query]","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    __tablename__ \u003d \u0027revocation_event\u0027"},{"line_number":27,"context_line":"    attributes \u003d model.REVOKE_KEYS"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #index is not going to be exposed to the outside world."},{"line_number":30,"context_line":"    # It is, however,necessary for SQL Alchemy.  If we end up"},{"line_number":31,"context_line":"    #sharing revocation IDs, we\u0027ll want them to be UUIDs"},{"line_number":32,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F92Q%3D","line":29,"updated":"2014-02-27 04:59:37.000000000","message":"(NIT): # index","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    attributes \u003d model.REVOKE_KEYS"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #index is not going to be exposed to the outside world."},{"line_number":30,"context_line":"    # It is, however,necessary for SQL Alchemy.  If we end up"},{"line_number":31,"context_line":"    #sharing revocation IDs, we\u0027ll want them to be UUIDs"},{"line_number":32,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":33,"context_line":"    domain_id \u003d sql.Column(sql.String(64))"}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F92I%3D","line":30,"updated":"2014-02-27 04:59:37.000000000","message":"(NIT): SQLAlchemy","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #index is not going to be exposed to the outside world."},{"line_number":30,"context_line":"    # It is, however,necessary for SQL Alchemy.  If we end up"},{"line_number":31,"context_line":"    #sharing revocation IDs, we\u0027ll want them to be UUIDs"},{"line_number":32,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":33,"context_line":"    domain_id \u003d sql.Column(sql.String(64))"},{"line_number":34,"context_line":"    project_id \u003d sql.Column(sql.String(64))"}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F92M%3D","line":31,"updated":"2014-02-27 04:59:37.000000000","message":"(NIT): # sharing","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    def get_events(self, last_fetch\u003dNone):"},{"line_number":99,"context_line":"        \"\"\"return the revocation events,"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        :param filter:"},{"line_number":102,"context_line":"        :raises: keystone.exception,"},{"line_number":103,"context_line":"        :returns: None."},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F91s%3D","line":101,"updated":"2014-02-27 04:59:37.000000000","message":"(NIT): update this to last_fetch to match the method signature","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        :param filter:"},{"line_number":102,"context_line":"        :raises: keystone.exception,"},{"line_number":103,"context_line":"        :returns: None."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":"        self._prune_expired_events()"}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F91o%3D","line":103,"updated":"2014-02-27 04:59:37.000000000","message":"returns a list of events","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    attributes \u003d model.REVOKE_KEYS"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #The id field is not going to be exposed to the outside world."},{"line_number":30,"context_line":"    # It is, however, necessary for SQLAlchemy."},{"line_number":31,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":32,"context_line":"    domain_id \u003d sql.Column(sql.String(64))"},{"line_number":33,"context_line":"    project_id \u003d sql.Column(sql.String(64))"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuDs%3D","line":30,"updated":"2014-02-28 20:21:47.000000000","message":"not if you use a composite primary key instead (look at the new assignments implementation); it\u0027s a lot of columns to key across though. also, none of these are indexed?!","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    #The id field is not going to be exposed to the outside world."},{"line_number":30,"context_line":"    # It is, however, necessary for SQLAlchemy."},{"line_number":31,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":32,"context_line":"    domain_id \u003d sql.Column(sql.String(64))"},{"line_number":33,"context_line":"    project_id \u003d sql.Column(sql.String(64))"},{"line_number":34,"context_line":"    user_id \u003d sql.Column(sql.String(64))"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuCc%3D","line":31,"updated":"2014-02-28 21:04:05.000000000","message":"If it isn\u0027t ever exposed and is the PK, do you want it to be UUID or auto_inc? I\u0027m not opposed to uuid, just wondering if we expect this to be used elsewhere, and an INT is, IIRC less storage/quicker index matching.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    role_id \u003d sql.Column(sql.String(64))"},{"line_number":36,"context_line":"    trust_id \u003d sql.Column(sql.String(64))"},{"line_number":37,"context_line":"    consumer_id \u003d sql.Column(sql.String(64))"},{"line_number":38,"context_line":"    access_token_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    issued_before \u003d sql.Column(sql.DateTime())"},{"line_number":40,"context_line":"    expires_at \u003d sql.Column(sql.DateTime())"},{"line_number":41,"context_line":"    revoked_at \u003d sql.Column(sql.DateTime())"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuC8%3D","line":38,"updated":"2014-02-28 20:21:47.000000000","message":"this isn\u0027t in the spec","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    role_id \u003d sql.Column(sql.String(64))"},{"line_number":36,"context_line":"    trust_id \u003d sql.Column(sql.String(64))"},{"line_number":37,"context_line":"    consumer_id \u003d sql.Column(sql.String(64))"},{"line_number":38,"context_line":"    access_token_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    issued_before \u003d sql.Column(sql.DateTime())"},{"line_number":40,"context_line":"    expires_at \u003d sql.Column(sql.DateTime())"},{"line_number":41,"context_line":"    revoked_at \u003d sql.Column(sql.DateTime())"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtXo%3D","line":38,"in_reply_to":"AAAAVX%2F%2FuC8%3D","updated":"2014-03-01 06:22:38.000000000","message":"Crud.  It needs to be.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    access_token_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    issued_before \u003d sql.Column(sql.DateTime())"},{"line_number":40,"context_line":"    expires_at \u003d sql.Column(sql.DateTime())"},{"line_number":41,"context_line":"    revoked_at \u003d sql.Column(sql.DateTime())"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    #override base class which assumes class has \"extra\" attribute"},{"line_number":44,"context_line":"    def __getitem__(self, key):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtvE%3D","line":41,"updated":"2014-02-28 21:04:05.000000000","message":"Are all of these fields acceptable to be Null?  I believe \"nullable\u003dTrue\" is the default.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    access_token_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    issued_before \u003d sql.Column(sql.DateTime())"},{"line_number":40,"context_line":"    expires_at \u003d sql.Column(sql.DateTime())"},{"line_number":41,"context_line":"    revoked_at \u003d sql.Column(sql.DateTime())"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    #override base class which assumes class has \"extra\" attribute"},{"line_number":44,"context_line":"    def __getitem__(self, key):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtXk%3D","line":41,"in_reply_to":"AAAAVX%2F%2FtvE%3D","updated":"2014-03-01 06:22:38.000000000","message":"Good point,  issued_before and revoke_at are both not nullable","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def _prune_expired_events(self):"},{"line_number":75,"context_line":"        oldest \u003d revoke.revoked_before_cutoff()"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        session \u003d db_session.get_session()"},{"line_number":78,"context_line":"        dialect \u003d session.bind.dialect.name"},{"line_number":79,"context_line":"        batch_size \u003d self._flush_batch_size(dialect)"},{"line_number":80,"context_line":"        if batch_size \u003e 0:"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuFU%3D","line":77,"updated":"2014-02-28 21:04:05.000000000","message":"Out of curiosity, is there a reason you\u0027re not using the context manager form of the session creating a single transaction for the delete?  If there is a reason, please comment. By default (IIRC) auto-commit is on","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def _prune_expired_events(self):"},{"line_number":75,"context_line":"        oldest \u003d revoke.revoked_before_cutoff()"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        session \u003d db_session.get_session()"},{"line_number":78,"context_line":"        dialect \u003d session.bind.dialect.name"},{"line_number":79,"context_line":"        batch_size \u003d self._flush_batch_size(dialect)"},{"line_number":80,"context_line":"        if batch_size \u003e 0:"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtRU%3D","line":77,"in_reply_to":"AAAAVX%2F%2FuFU%3D","updated":"2014-03-01 06:22:38.000000000","message":"Nope.  No reason","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4cf7ac528c762e3d41caaa5207be15701e7dd411","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            query \u003d query.filter(RevocationEvent.revoked_at \u003c oldest)"},{"line_number":93,"context_line":"            query.delete(synchronize_session\u003dFalse)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        session.flush()"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def get_events(self, last_fetch\u003dNone):"},{"line_number":98,"context_line":"        \"\"\"return the revocation events,"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FsvA%3D","line":95,"updated":"2014-03-03 01:27:02.000000000","message":"About Morgan\u0027s comment above, I thought we stumbled across a review were we went through this same thing. Debating on whether or not it was needed. I\u0027ll dig for that and see if I can find it.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4cf7ac528c762e3d41caaa5207be15701e7dd411","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def get_events(self, last_fetch\u003dNone):"},{"line_number":98,"context_line":"        \"\"\"return the revocation events,"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        :param filter:"},{"line_number":101,"context_line":"        :raises: keystone.exception,"},{"line_number":102,"context_line":"        :returns: None."},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Fsu4%3D","line":100,"updated":"2014-03-03 01:27:02.000000000","message":"update docstrings to match the method signature","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4cf7ac528c762e3d41caaa5207be15701e7dd411","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        :param filter:"},{"line_number":101,"context_line":"        :raises: keystone.exception,"},{"line_number":102,"context_line":"        :returns: None."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":"        self._prune_expired_events()"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Fsuw%3D","line":102,"updated":"2014-03-03 01:27:02.000000000","message":"Update the return value","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self._prune_expired_events()"},{"line_number":106,"context_line":"        session \u003d db_session.get_session()"},{"line_number":107,"context_line":"        query \u003d session.query(RevocationEvent).order_by("},{"line_number":108,"context_line":"            RevocationEvent.revoked_at)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        if last_fetch:"},{"line_number":111,"context_line":"            query.filter(RevocationEvent.revoked_at \u003e last_fetch)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuCE%3D","line":108,"updated":"2014-02-28 20:21:47.000000000","message":"does this have implicit sort one way or the other?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            RevocationEvent.revoked_at)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        if last_fetch:"},{"line_number":111,"context_line":"            query.filter(RevocationEvent.revoked_at \u003e last_fetch)"},{"line_number":112,"context_line":"            events \u003d []"},{"line_number":113,"context_line":"            for e in query:"},{"line_number":114,"context_line":"                if last_fetch and e.revoked_at \u003e last_fetch:"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuBE%3D","line":111,"updated":"2014-02-28 20:21:47.000000000","message":"it\u0027s possible to miss events that have the same timestamp as last_fetch but that were written to the db at separate times unless this is \u003e\u003d (so one redundant result should be returned)","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            RevocationEvent.revoked_at)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        if last_fetch:"},{"line_number":111,"context_line":"            query.filter(RevocationEvent.revoked_at \u003e last_fetch)"},{"line_number":112,"context_line":"            events \u003d []"},{"line_number":113,"context_line":"            for e in query:"},{"line_number":114,"context_line":"                if last_fetch and e.revoked_at \u003e last_fetch:"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtRE%3D","line":111,"in_reply_to":"AAAAVX%2F%2FuBE%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            query.filter(RevocationEvent.revoked_at \u003e last_fetch)"},{"line_number":112,"context_line":"            events \u003d []"},{"line_number":113,"context_line":"            for e in query:"},{"line_number":114,"context_line":"                if last_fetch and e.revoked_at \u003e last_fetch:"},{"line_number":115,"context_line":"                    events.append(model.RevokeEvent(**e.to_dict(False)))"},{"line_number":116,"context_line":"        else:"},{"line_number":117,"context_line":"            events \u003d [model.RevokeEvent(**e.to_dict(False)) for e in query]"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuAc%3D","line":114,"updated":"2014-02-28 20:21:47.000000000","message":"did you just check this?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                if last_fetch and e.revoked_at \u003e last_fetch:"},{"line_number":115,"context_line":"                    events.append(model.RevokeEvent(**e.to_dict(False)))"},{"line_number":116,"context_line":"        else:"},{"line_number":117,"context_line":"            events \u003d [model.RevokeEvent(**e.to_dict(False)) for e in query]"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        return events"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft%2Fs%3D","line":117,"updated":"2014-02-28 20:21:47.000000000","message":"seems like you\u0027re doing the same thing regardless of last_fetch, so this probably shouldn\u0027t be conditional\n\na kwarg for the False value would be helpful as well","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                if last_fetch and e.revoked_at \u003e last_fetch:"},{"line_number":115,"context_line":"                    events.append(model.RevokeEvent(**e.to_dict(False)))"},{"line_number":116,"context_line":"        else:"},{"line_number":117,"context_line":"            events \u003d [model.RevokeEvent(**e.to_dict(False)) for e in query]"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        return events"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtQM%3D","line":117,"in_reply_to":"AAAAVX%2F%2Ft%2Fs%3D","updated":"2014-03-01 06:22:38.000000000","message":"last_  adds the filter.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def revoke(self, event):"},{"line_number":122,"context_line":"        kwargs \u003d dict()"},{"line_number":123,"context_line":"        for attr in model.REVOKE_KEYS:"},{"line_number":124,"context_line":"            kwargs[attr] \u003d getattr(event, attr)"},{"line_number":125,"context_line":"        kwargs[\u0027id\u0027] \u003d str(kwargs[\u0027id\u0027])"},{"line_number":126,"context_line":"        record \u003d RevocationEvent(**kwargs)"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft%2FA%3D","line":124,"updated":"2014-02-28 20:21:47.000000000","message":"this looks to be reimplementing from_dict()","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def revoke(self, event):"},{"line_number":122,"context_line":"        kwargs \u003d dict()"},{"line_number":123,"context_line":"        for attr in model.REVOKE_KEYS:"},{"line_number":124,"context_line":"            kwargs[attr] \u003d getattr(event, attr)"},{"line_number":125,"context_line":"        kwargs[\u0027id\u0027] \u003d str(kwargs[\u0027id\u0027])"},{"line_number":126,"context_line":"        record \u003d RevocationEvent(**kwargs)"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Fs4E%3D","line":124,"in_reply_to":"AAAAVX%2F%2Ft%2FA%3D","updated":"2014-03-01 06:22:38.000000000","message":"The event.from_dict converts things to strings.  This uses the base types.  Difference is important to SQL","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        kwargs \u003d dict()"},{"line_number":123,"context_line":"        for attr in model.REVOKE_KEYS:"},{"line_number":124,"context_line":"            kwargs[attr] \u003d getattr(event, attr)"},{"line_number":125,"context_line":"        kwargs[\u0027id\u0027] \u003d str(kwargs[\u0027id\u0027])"},{"line_number":126,"context_line":"        record \u003d RevocationEvent(**kwargs)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        session \u003d db_session.get_session()"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft%2Fc%3D","line":125,"updated":"2014-02-28 20:21:47.000000000","message":"remove this","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from keystone.common import sql"},{"line_number":17,"context_line":"from keystone.contrib import revoke"},{"line_number":18,"context_line":"from keystone.contrib.revoke import model"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone.openstack.common.db.sqlalchemy import session as db_session"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F6E8%3D","line":19,"updated":"2014-03-03 15:23:04.000000000","message":"Why the newline?","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d config.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class RevocationEvent(sql.ModelBase, sql.DictBase):"},{"line_number":27,"context_line":"    __tablename__ \u003d \u0027revocation_event\u0027"},{"line_number":28,"context_line":"    attributes \u003d model.REVOKE_KEYS"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F6Dw%3D","line":26,"updated":"2014-03-03 15:23:04.000000000","message":"Instead of sql.DictBase I think you can you the new sql.ModelDictMixin that I added. It would allow you to get rid of attributes on line 28 and your to_dict impl on line 49.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            delete_query \u003d (session.query(RevocationEvent)."},{"line_number":86,"context_line":"                            filter(RevocationEvent.id.in_(query)))"},{"line_number":87,"context_line":"            while True:"},{"line_number":88,"context_line":"                rowcount \u003d delete_query.delete(synchronize_session\u003dFalse)"},{"line_number":89,"context_line":"                if rowcount \u003d\u003d 0:"},{"line_number":90,"context_line":"                    break"},{"line_number":91,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F6Aw%3D","line":88,"updated":"2014-03-03 15:23:04.000000000","message":"Do you need to explicitly flush for this to work? I have no idea...it just seems weird not to.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            query.filter(RevocationEvent.revoked_at \u003e\u003d last_fetch)"},{"line_number":106,"context_line":"            events \u003d [model.RevokeEvent(**e.to_dict())"},{"line_number":107,"context_line":"                      for e in query"},{"line_number":108,"context_line":"                      if e.revoked_at \u003e last_fetch]"},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            events \u003d [model.RevokeEvent(**e.to_dict()) for e in query]"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F96E%3D","line":108,"updated":"2014-03-03 05:44:07.000000000","message":"why do this rather than simply make that the filter?","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            query.filter(RevocationEvent.revoked_at \u003e\u003d last_fetch)"},{"line_number":106,"context_line":"            events \u003d [model.RevokeEvent(**e.to_dict())"},{"line_number":107,"context_line":"                      for e in query"},{"line_number":108,"context_line":"                      if e.revoked_at \u003e last_fetch]"},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            events \u003d [model.RevokeEvent(**e.to_dict()) for e in query]"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5aI%3D","line":108,"in_reply_to":"AAAAVn%2F%2F96E%3D","updated":"2014-03-03 21:12:49.000000000","message":"Ah...removed the comment:  something is not working with the filter.  I suspect either SQLAlchemy or SQLite.  I realy need to see if the filter works with MySQL Postgresql","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            query.filter(RevocationEvent.revoked_at \u003e\u003d last_fetch)"},{"line_number":106,"context_line":"            events \u003d [model.RevokeEvent(**e.to_dict())"},{"line_number":107,"context_line":"                      for e in query"},{"line_number":108,"context_line":"                      if e.revoked_at \u003e last_fetch]"},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            events \u003d [model.RevokeEvent(**e.to_dict()) for e in query]"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5%2FI%3D","line":108,"in_reply_to":"AAAAVn%2F%2F96E%3D","updated":"2014-03-03 15:23:04.000000000","message":"Yeah, I agree. If that was the filter then you\u0027d only need to:\n\n   return [model.RevokeEvent(**e.to_dict()) for e in query]","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        return events"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def revoke(self, event):"},{"line_number":115,"context_line":"        kwargs \u003d dict()"},{"line_number":116,"context_line":"        for attr in model.REVOKE_KEYS:"},{"line_number":117,"context_line":"            kwargs[attr] \u003d getattr(event, attr)"},{"line_number":118,"context_line":"        kwargs[\u0027id\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F59o%3D","line":115,"updated":"2014-03-03 15:23:04.000000000","message":"Is there anything special about the REVOKE_KEYS list? I would have expected lines 115-119 to just be:\n\n    new_event \u003d event.copy()\n    new_event[\u0027id\u0027] \u003d uuid.uuid4().hex\n    record \u003d RevocationEvent(**new_event)","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e9f1df475070be9985f36a140cb60632ba141791","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d config.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class RevocationEvent(sql.ModelBase, sql.DictBase):"},{"line_number":27,"context_line":"    __tablename__ \u003d \u0027revocation_event\u0027"},{"line_number":28,"context_line":"    attributes \u003d model.REVOKE_KEYS"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzkU%3D","line":26,"updated":"2014-03-04 01:33:17.000000000","message":"extend sql.ModelDictMixin instead of sql.DictBase","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d config.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class RevocationEvent(sql.ModelBase, sql.DictBase):"},{"line_number":27,"context_line":"    __tablename__ \u003d \u0027revocation_event\u0027"},{"line_number":28,"context_line":"    attributes \u003d model.REVOKE_KEYS"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzaE%3D","line":26,"in_reply_to":"AAAAVn%2F%2FzkU%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e9f1df475070be9985f36a140cb60632ba141791","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    #override base class which assumes class has \"extra\" attribute"},{"line_number":45,"context_line":"    def __getitem__(self, key):"},{"line_number":46,"context_line":"        return getattr(self, key)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    #override to avoid dealing with the \u0027extra\u0027 field"},{"line_number":49,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzkM%3D","line":46,"updated":"2014-03-04 01:33:17.000000000","message":"remove this method","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    #override base class which assumes class has \"extra\" attribute"},{"line_number":45,"context_line":"    def __getitem__(self, key):"},{"line_number":46,"context_line":"        return getattr(self, key)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    #override to avoid dealing with the \u0027extra\u0027 field"},{"line_number":49,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzaA%3D","line":46,"in_reply_to":"AAAAVn%2F%2FzkM%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e9f1df475070be9985f36a140cb60632ba141791","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        d \u003d dict()"},{"line_number":51,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":52,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":53,"context_line":"        return d"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class Revoke(revoke.Driver):"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzkI%3D","line":53,"updated":"2014-03-04 01:33:17.000000000","message":"remove this method","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        d \u003d dict()"},{"line_number":51,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":52,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":53,"context_line":"        return d"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class Revoke(revoke.Driver):"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzZ4%3D","line":53,"in_reply_to":"AAAAVn%2F%2FzkI%3D","updated":"2014-03-04 02:28:09.000000000","message":"Done","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a43cd07f3004e5c7363c681c00d95850bd77bce1","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    # The id field is not going to be exposed to the outside world."},{"line_number":31,"context_line":"    # It is, however, necessary for SQLAlchemy."},{"line_number":32,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":33,"context_line":"    domain_id \u003d sql.Column(sql.String(64))"},{"line_number":34,"context_line":"    project_id \u003d sql.Column(sql.String(64))"},{"line_number":35,"context_line":"    user_id \u003d sql.Column(sql.String(64))"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FxWM%3D","line":32,"updated":"2014-03-04 07:50:11.000000000","message":"I\u0027m still not clear why this needs to be a uuid vs an int, you don\u0027t reference this anywhere where you need to pre-generate the id. If you made this an INT and auto_inc you could just leave it off when creating the events.","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"656d4bcccf51de070056856546fa35d89f65ad86","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    # The id field is not going to be exposed to the outside world."},{"line_number":31,"context_line":"    # It is, however, necessary for SQLAlchemy."},{"line_number":32,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":33,"context_line":"    domain_id \u003d sql.Column(sql.String(64))"},{"line_number":34,"context_line":"    project_id \u003d sql.Column(sql.String(64))"},{"line_number":35,"context_line":"    user_id \u003d sql.Column(sql.String(64))"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FsWI%3D","line":32,"in_reply_to":"AAAAVn%2F%2FxWM%3D","updated":"2014-03-04 17:28:38.000000000","message":"Can be done either way.  Just tested out the Integer and it is not much code: about 113 lines, including about 30 for refactor of the migration tests.","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            # of default maximum size while not significantly"},{"line_number":59,"context_line":"            # impacting the performance of large token purges on"},{"line_number":60,"context_line":"            # systems where the maximum transaction log size has"},{"line_number":61,"context_line":"            # been increased beyond the default."},{"line_number":62,"context_line":"        return batch_size"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def _prune_expired_events(self):"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FpY8%3D","line":61,"updated":"2014-03-04 23:26:37.000000000","message":"obviously this is a copy/paste from the token backend, but this needs to be revised to avoid talking about tokens, specifically","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"keystone/contrib/revoke/configuration.rst":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7b32013c0c4ebdb17d1ca50d4488ceac064742d1","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":"Extension Example"},{"line_number":19,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Please describe here in details how to enable your extension:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"AAAATn%2F%2BEUU%3D","line":18,"updated":"2013-12-02 21:44:33.000000000","message":"Update title","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7b32013c0c4ebdb17d1ca50d4488ceac064742d1","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Please describe here in details how to enable your extension:"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"1. Add the required fields and values in the ``[example]`` section"},{"line_number":24,"context_line":"   in ``keystone.conf``."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"2. Optional: add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"}],"source_content_type":"text/x-rst","patch_set":3,"id":"AAAATn%2F%2BEUI%3D","line":23,"updated":"2013-12-02 21:44:33.000000000","message":"s/example/revoke\n\nalso, they values aren\u0027t in etc/sample.conf yet","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7b32013c0c4ebdb17d1ca50d4488ceac064742d1","unresolved":false,"context_lines":[{"line_number":28,"context_line":"3. Optional: create the extension tables if using the provided sql backend. Example::"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    ./bin/keystone-manage db_sync --extension example"}],"source_content_type":"text/x-rst","patch_set":3,"id":"AAAATn%2F%2BEUQ%3D","line":31,"updated":"2013-12-02 21:44:33.000000000","message":"s/example/revoke","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":"Extension Example"},{"line_number":19,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Please describe here in details how to enable your extension:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"AAAATn%2F9fyg%3D","line":18,"updated":"2013-12-10 22:23:38.000000000","message":"This should have a real title","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Please describe here in details how to enable your extension:"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"1. Add the required fields and values in the ``[example]`` section"},{"line_number":24,"context_line":"   in ``keystone.conf``."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"2. Optional: add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"}],"source_content_type":"text/x-rst","patch_set":6,"id":"AAAATn%2F9fyQ%3D","line":23,"updated":"2013-12-10 22:23:38.000000000","message":"Do 1, 2 and 3 need to be revised for this particular extension?","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":28,"context_line":"3. Optional: create the extension tables if using the provided sql backend. Example::"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    ./bin/keystone-manage db_sync --extension example"}],"source_content_type":"text/x-rst","patch_set":6,"id":"AAAATn%2F9fys%3D","line":31,"updated":"2013-12-10 22:23:38.000000000","message":"Should this be revoke instead of example?","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Copyright 2013 OpenStack, Foundation"},{"line_number":3,"context_line":"      All Rights Reserved."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-rst","patch_set":20,"id":"AAAAUH%2F%2B7I4%3D","line":2,"updated":"2014-01-20 18:09:40.000000000","message":"delete this line","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":"Extension Example"},{"line_number":19,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Please describe here in details how to enable your extension:"}],"source_content_type":"text/x-rst","patch_set":20,"id":"AAAAUH%2F%2B7JY%3D","line":18,"updated":"2014-01-20 18:09:40.000000000","message":"copy pasta on Example","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Please describe here in details how to enable your extension:"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"1. Add the required fields and values in the ``[example]`` section"},{"line_number":24,"context_line":"   in ``keystone.conf``."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"2. Optional: add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"}],"source_content_type":"text/x-rst","patch_set":20,"id":"AAAAUH%2F%2B7JQ%3D","line":23,"updated":"2014-01-20 18:09:40.000000000","message":"example section does not exist","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":28,"context_line":"3. Optional: create the extension tables if using the provided sql backend. Example::"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    ./bin/keystone-manage db_sync --extension example"}],"source_content_type":"text/x-rst","patch_set":20,"id":"AAAAUH%2F%2B7JA%3D","line":31,"updated":"2014-01-20 18:09:40.000000000","message":"I think this whole doc needs to be updated to actually reflect how to enable extensions. also, it should live over here: https://github.com/openstack/keystone/tree/master/doc/source/extensions","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2043bcc33dfb126ccb390f44629287b4f831c989","unresolved":false,"context_lines":[{"line_number":15,"context_line":"Extension revoke"},{"line_number":16,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Please describe here in details how to enable your extension:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"1. Add the driver fields and values in the ``[revoke]`` section"},{"line_number":21,"context_line":"   in ``keystone.conf``."}],"source_content_type":"text/x-rst","patch_set":22,"id":"AAAAUH%2F%2B6V0%3D","line":18,"updated":"2014-01-20 21:26:46.000000000","message":"Is this cut-n-paste from the template?","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fe0b264b37876c2fdbf17e4476865d3eb7d441de","unresolved":false,"context_lines":[{"line_number":15,"context_line":"Extension revoke"},{"line_number":16,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Please describe here in details how to enable your extension:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"1. Add the driver fields and values in the ``[revoke]`` section"},{"line_number":21,"context_line":"   in ``keystone.conf``."}],"source_content_type":"text/x-rst","patch_set":22,"id":"AAAAUH%2F%2B5wQ%3D","line":18,"in_reply_to":"AAAAUH%2F%2B6V0%3D","updated":"2014-01-20 22:25:24.000000000","message":"yep.  Fixed","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":23,"id":"AAAAUH%2F%2B5dQ%3D","line":1,"updated":"2014-01-20 23:55:32.000000000","message":"seems like this should be in the docs/ directory so it gets published.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":24,"id":"AAAAUH%2F%2B1%2FE%3D","line":1,"updated":"2014-01-21 14:39:11.000000000","message":"seems like this should be in the docs/ directory so it gets published.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5fcd423317c2a89b283c8483619d13a671be979a","unresolved":false,"context_lines":[{"line_number":18,"context_line":"To enable the revoke extension:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"1. Add the driver fields and values in the ``[revoke]`` section"},{"line_number":21,"context_line":"   in ``keystone.conf``."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"2. Add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-rst","patch_set":34,"id":"AAAAUH%2F%2Bn7Y%3D","line":21,"updated":"2014-01-23 19:52:24.000000000","message":"Add an example with the [revoke] section and an example driver. Something similar to \nhttps://github.com/openstack/keystone/blob/master/doc/source/configuration.rst#step-1-configure-keystoneconf","commit_id":"a952a49787cfbaa045e1195a881e40c4a08d3b62"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5fcd423317c2a89b283c8483619d13a671be979a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"1. Add the driver fields and values in the ``[revoke]`` section"},{"line_number":21,"context_line":"   in ``keystone.conf``."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"2. Add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"3. Create the extension tables if using the provided sql backend. Example::"},{"line_number":26,"context_line":"  (Note: this is not yet supported, but will be shortly)"}],"source_content_type":"text/x-rst","patch_set":34,"id":"AAAAUH%2F%2Bn8A%3D","line":23,"updated":"2014-01-23 19:52:24.000000000","message":"Add an example here like: \n\nhttps://github.com/openstack/keystone/blob/master/doc/source/configuration.rst#user-crud","commit_id":"a952a49787cfbaa045e1195a881e40c4a08d3b62"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":12,"context_line":"      under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":15,"context_line":"Extension revoke"},{"line_number":16,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"To enable the revoke extension:"}],"source_content_type":"text/x-rst","patch_set":46,"id":"AAAAUX%2F%2B%2Bfk%3D","line":15,"updated":"2014-02-17 22:00:23.000000000","message":"s/revoke/OS-REVOKE/","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":15,"context_line":"Extension revoke"},{"line_number":16,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"To enable the revoke extension:"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-rst","patch_set":46,"id":"AAAAUX%2F%2B%2FsQ%3D","line":16,"updated":"2014-02-17 19:26:32.000000000","message":"the over/under lines look too long.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":15,"context_line":"Extension revoke"},{"line_number":16,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"To enable the revoke extension:"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-rst","patch_set":46,"id":"AAAAUX%2F%2B%2Bfo%3D","line":16,"in_reply_to":"AAAAUX%2F%2B%2FsQ%3D","updated":"2014-02-17 22:00:23.000000000","message":"might just be gerrit, but hopefully that would raise doc build errors now","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":15,"context_line":"Extension revoke"},{"line_number":16,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"To enable the revoke extension:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"1. Add the driver fields and values in the ``[revoke]`` section"},{"line_number":21,"context_line":"   in ``keystone.conf``."}],"source_content_type":"text/x-rst","patch_set":46,"id":"AAAAUX%2F%2B%2Fso%3D","line":18,"updated":"2014-02-17 19:26:32.000000000","message":"suggest put \"revoke\" in `.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":15,"context_line":"Extension revoke"},{"line_number":16,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"To enable the revoke extension:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"1. Add the driver fields and values in the ``[revoke]`` section"},{"line_number":21,"context_line":"   in ``keystone.conf``."}],"source_content_type":"text/x-rst","patch_set":46,"id":"AAAAUX%2F%2B%2BfY%3D","line":18,"in_reply_to":"AAAAUX%2F%2B%2Fso%3D","updated":"2014-02-17 22:00:23.000000000","message":"``OS-REVOKE``","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":21,"context_line":"   in ``keystone.conf``."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    [revoke]"},{"line_number":24,"context_line":"    driver \u003d keystone.contrib.revoke.backends.kvs.Revoke"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"2. Add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-rst","patch_set":46,"id":"AAAAUX%2F%2B%2Fsk%3D","line":24,"updated":"2014-02-17 19:26:32.000000000","message":"they probably shouldn\u0027t use kvs backend?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":21,"context_line":"   in ``keystone.conf``."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    [revoke]"},{"line_number":24,"context_line":"    driver \u003d keystone.contrib.revoke.backends.kvs.Revoke"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"2. Add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-rst","patch_set":46,"id":"AAAAUX%2F%2B%2BfU%3D","line":24,"in_reply_to":"AAAAUX%2F%2B%2Fsk%3D","updated":"2014-02-17 22:00:23.000000000","message":"that\u0027s all this patch has atm","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    [pipeline:api_v3]"},{"line_number":32,"context_line":"    pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"3. Create the extension tables if using the provided sql backend. Example::"},{"line_number":35,"context_line":"  (Note: this is not yet supported, but will be shortly)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    ./bin/keystone-manage db_sync --extension revoke"}],"source_content_type":"text/x-rst","patch_set":46,"id":"AAAAUX%2F%2B%2FsY%3D","line":34,"updated":"2014-02-17 19:26:32.000000000","message":"I don\u0027t think it\u0027s going to generate properly to have :: here.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    [pipeline:api_v3]"},{"line_number":32,"context_line":"    pipeline \u003d access_log sizelimit url_normalize token_auth admin_token_auth xml_body json_body revoke_extension"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"3. Create the extension tables if using the provided sql backend. Example::"},{"line_number":35,"context_line":"  (Note: this is not yet supported, but will be shortly)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    ./bin/keystone-manage db_sync --extension revoke"}],"source_content_type":"text/x-rst","patch_set":46,"id":"AAAAUX%2F%2B%2BfA%3D","line":34,"in_reply_to":"AAAAUX%2F%2B%2FsY%3D","updated":"2014-02-17 22:00:23.000000000","message":"++","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    [revoke]"},{"line_number":24,"context_line":"    driver \u003d keystone.contrib.revoke.backends.kvs.Revoke"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"When the SQL driver is supported it will be::"},{"line_number":27,"context_line":"    driver \u003d keystone.contrib.revoke.backends.kvs.Revoke"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-rst","patch_set":55,"id":"AAAAU3%2F%2F%2Fok%3D","line":26,"updated":"2014-02-22 19:58:28.000000000","message":"add a blank line after this for rst.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":1091,"name":"Arun Kant","email":"arukant@cisco.com","username":"arunkant-uws"},"change_message_id":"e3a668c1f24b92ee4ade560fd1ab2fabe7b7b876","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"When the SQL driver is supported it will be::"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    driver \u003d keystone.contrib.revoke.backends.kvs.Revoke"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"2. Add the required ``filter`` to the ``pipeline`` in ``keystone-paste.ini``"}],"source_content_type":"text/x-rst","patch_set":59,"id":"AAAAVX%2F%2F%2FAM%3D","line":28,"updated":"2014-02-27 01:36:35.000000000","message":"Should this be keystone.contrib.revoke.backends.sql.Revoke as its mentioned as sql example","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    [revoke]"},{"line_number":24,"context_line":"    driver \u003d keystone.contrib.revoke.backends.kvs.Revoke"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"When the SQL driver is supported it will be::"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    driver \u003d keystone.contrib.revoke.backends.kvs.Revoke"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-rst","patch_set":61,"id":"AAAAVX%2F%2F91U%3D","line":26,"updated":"2014-02-27 04:59:37.000000000","message":"It is known that kvs is the only backend for the Revoke extension correct?","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":63,"id":"AAAAVX%2F%2FuAM%3D","line":1,"updated":"2014-02-28 21:04:05.000000000","message":"Shouldn\u0027t this file be in doc/source/extensions and linked into the main configuration.rst?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"      not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"      a copy of the License at"}],"source_content_type":"text/x-rst","patch_set":63,"id":"AAAAVX%2F%2Fs2E%3D","line":1,"in_reply_to":"AAAAVX%2F%2FuAM%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"}],"keystone/contrib/revoke/controllers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7b32013c0c4ebdb17d1ca50d4488ceac064742d1","unresolved":false,"context_lines":[{"line_number":22,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":23,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"#    @controller.protected()"},{"line_number":26,"context_line":"    def describe(self, context):"},{"line_number":27,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":28,"context_line":"        container \u003d {\"revoke\": \"\"}"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BESI%3D","line":25,"updated":"2013-12-02 21:44:33.000000000","message":"remove comment if not needed","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b260fc008d2b19da08aa91007a383477bfe1d7a2","unresolved":false,"context_lines":[{"line_number":22,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":23,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"#    @controller.protected()"},{"line_number":26,"context_line":"    def describe(self, context):"},{"line_number":27,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":28,"context_line":"        container \u003d {\"revoke\": \"\"}"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BDTg%3D","line":25,"in_reply_to":"AAAATn%2F%2BESI%3D","updated":"2013-12-03 02:26:23.000000000","message":"It will be needed, but I have not written the policy for it yet.","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7b32013c0c4ebdb17d1ca50d4488ceac064742d1","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @controller.protected()"},{"line_number":38,"context_line":"    def get_revocation_events(self, filter):"},{"line_number":39,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":40,"context_line":"        self.revoke_api.get_revoked_tokens(filter)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @controller.protected()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BETE%3D","line":39,"updated":"2013-12-02 21:44:33.000000000","message":"this comment is copy/pasted from line 27, \nthis functional actually returns the revoked tokens","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":22,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":23,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"#    @controller.protected()"},{"line_number":26,"context_line":"    def describe(self, context):"},{"line_number":27,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":28,"context_line":"        container \u003d {\"revoke\": \"\"}"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9f4o%3D","line":25,"updated":"2013-12-10 22:23:38.000000000","message":"Is this commented out on purpose?","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @controller.protected()"},{"line_number":38,"context_line":"    def get_revocation_events(self, filter):"},{"line_number":39,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":40,"context_line":"        self.revoke_api.get_revoked_tokens(filter)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @controller.protected()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9fx0%3D","line":39,"updated":"2013-12-10 22:23:38.000000000","message":"I think this needs to be updated.  Looks like it was copied here and never updated.","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efbdab75ac7906fd5eb8ae6c7e6d339ebbab9d3e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":23,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"#    @controller.protected()"},{"line_number":26,"context_line":"    def describe(self, context):"},{"line_number":27,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":28,"context_line":"        container \u003d {\"revoke\": \"\"}"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FJw8%3D","line":25,"updated":"2014-01-16 23:03:10.000000000","message":"remove commented out code","commit_id":"06d60b533dd6f1d189ce5c4b05ccbceda76a67c3"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":22,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":23,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"#    @controller.protected()"},{"line_number":26,"context_line":"    def describe(self, context):"},{"line_number":27,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":28,"context_line":"        container \u003d {\"revoke\": \"\"}"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FMg%3D","line":25,"updated":"2014-01-20 03:15:47.000000000","message":"If we are going to keep this unprotected, suggest removing this line.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"de58f753817d406d046914a53cad6863cbbc1a13","unresolved":false,"context_lines":[{"line_number":22,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":23,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"#    @controller.protected()"},{"line_number":26,"context_line":"    def describe(self, context):"},{"line_number":27,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":28,"context_line":"        container \u003d {\"revoke\": \"\"}"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FB8%3D","line":25,"in_reply_to":"AAAAUH%2F%2B%2FMg%3D","updated":"2014-01-20 04:15:53.000000000","message":"Done","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            \u0027revoked_tokens\u0027: RevokeController.base_url("},{"line_number":33,"context_line":"                path\u003dcontext[\u0027path\u0027] + \"/events\"),"},{"line_number":34,"context_line":"            \u0027previous\u0027: None}"},{"line_number":35,"context_line":"        return container"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"#    @controller.protected()"},{"line_number":38,"context_line":"    def list_events(self, filter):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FMU%3D","line":35,"updated":"2014-01-20 03:15:47.000000000","message":"Should this use the v3 controller wrap_member method instead of rolling it\u0027s own logic?","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"de58f753817d406d046914a53cad6863cbbc1a13","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            \u0027revoked_tokens\u0027: RevokeController.base_url("},{"line_number":33,"context_line":"                path\u003dcontext[\u0027path\u0027] + \"/events\"),"},{"line_number":34,"context_line":"            \u0027previous\u0027: None}"},{"line_number":35,"context_line":"        return container"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"#    @controller.protected()"},{"line_number":38,"context_line":"    def list_events(self, filter):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FBw%3D","line":35,"in_reply_to":"AAAAUH%2F%2B%2FMU%3D","updated":"2014-01-20 04:15:53.000000000","message":"Not quite:  its different enough.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            \u0027previous\u0027: None}"},{"line_number":35,"context_line":"        return container"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"#    @controller.protected()"},{"line_number":38,"context_line":"    def list_events(self, filter):"},{"line_number":39,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FMc%3D","line":37,"updated":"2014-01-20 03:15:47.000000000","message":"same as above","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"de58f753817d406d046914a53cad6863cbbc1a13","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            \u0027previous\u0027: None}"},{"line_number":35,"context_line":"        return container"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"#    @controller.protected()"},{"line_number":38,"context_line":"    def list_events(self, filter):"},{"line_number":39,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FBs%3D","line":37,"in_reply_to":"AAAAUH%2F%2B%2FMc%3D","updated":"2014-01-20 04:15:53.000000000","message":"Done, and commented why its not protected","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        for event in events:"},{"line_number":45,"context_line":"            e \u003d event.to_dict()"},{"line_number":46,"context_line":"            event_list.append(e)"},{"line_number":47,"context_line":"        events \u003d {\"events\": event_list}"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        return events"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FMY%3D","line":47,"updated":"2014-01-20 03:15:47.000000000","message":"Shouldn\u0027t this use the wrap_collection method instead of constructing it itself (it is a V3 controller)","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"de58f753817d406d046914a53cad6863cbbc1a13","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        for event in events:"},{"line_number":45,"context_line":"            e \u003d event.to_dict()"},{"line_number":46,"context_line":"            event_list.append(e)"},{"line_number":47,"context_line":"        events \u003d {\"events\": event_list}"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        return events"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FBo%3D","line":47,"in_reply_to":"AAAAUH%2F%2B%2FMY%3D","updated":"2014-01-20 04:15:53.000000000","message":"should, but right now it breaks if I try that.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B7FQ%3D","line":3,"updated":"2014-01-20 18:09:40.000000000","message":"nit, remove this","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            \u0027previous\u0027: None}"},{"line_number":33,"context_line":"        return container"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":36,"context_line":"    def list_events(self, context):"},{"line_number":37,"context_line":"        events \u003d self.revoke_api.get_events(filter)"},{"line_number":38,"context_line":"        event_list \u003d []"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B7Fg%3D","line":35,"updated":"2014-01-20 18:09:40.000000000","message":"nice comment","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2043bcc33dfb126ccb390f44629287b4f831c989","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":34,"context_line":"    def list_events(self, context):"},{"line_number":35,"context_line":"        events \u003d self.revoke_api.get_events(filter)"},{"line_number":36,"context_line":"        event_list \u003d []"},{"line_number":37,"context_line":"        for event in events:"},{"line_number":38,"context_line":"            e \u003d event.to_dict()"},{"line_number":39,"context_line":"            event_list.append(e)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B6IU%3D","line":36,"updated":"2014-01-20 21:26:46.000000000","message":"event_list \u003d [event.to_dict() for event in events]","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fe0b264b37876c2fdbf17e4476865d3eb7d441de","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":34,"context_line":"    def list_events(self, context):"},{"line_number":35,"context_line":"        events \u003d self.revoke_api.get_events(filter)"},{"line_number":36,"context_line":"        event_list \u003d []"},{"line_number":37,"context_line":"        for event in events:"},{"line_number":38,"context_line":"            e \u003d event.to_dict()"},{"line_number":39,"context_line":"            event_list.append(e)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B5wI%3D","line":36,"in_reply_to":"AAAAUH%2F%2B6IU%3D","updated":"2014-01-20 22:25:24.000000000","message":"Done","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def describe(self, context):"},{"line_number":24,"context_line":"        container \u003d {\"revoke\": \"\"}"},{"line_number":25,"context_line":"        container[\u0027links\u0027] \u003d {"},{"line_number":26,"context_line":"            \u0027next\u0027: None,"},{"line_number":27,"context_line":"            \u0027self\u0027: RevokeController.base_url(path\u003dcontext[\u0027path\u0027]),"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5co%3D","line":24,"updated":"2014-01-20 23:55:32.000000000","message":"use \u0027 for strings for consistency.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            \u0027previous\u0027: None}"},{"line_number":31,"context_line":"        return container"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":34,"context_line":"    def list_events(self, context):"},{"line_number":35,"context_line":"        events \u003d self.revoke_api.get_events(filter)"},{"line_number":36,"context_line":"        #TODO(ayoung): fill in the links"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5cU%3D","line":33,"updated":"2014-01-20 23:55:32.000000000","message":"you can use RBAC to make things publically callable, suggest add @controller.protected() and set the policy so that it\u0027s public.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":34,"context_line":"    def list_events(self, context):"},{"line_number":35,"context_line":"        events \u003d self.revoke_api.get_events(filter)"},{"line_number":36,"context_line":"        #TODO(ayoung): fill in the links"},{"line_number":37,"context_line":"        events \u003d {\u0027events\u0027: [event.to_dict() for event in events],"},{"line_number":38,"context_line":"                  \u0027links\u0027: []}"},{"line_number":39,"context_line":"        return events"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5cQ%3D","line":36,"updated":"2014-01-20 23:55:32.000000000","message":"did you want to do this now or have a separate commit? if doing in separate commit then should mention in the commit message that this is a limitation.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def describe(self, context):"},{"line_number":24,"context_line":"        container \u003d {\"revoke\": \"\"}"},{"line_number":25,"context_line":"        container[\u0027links\u0027] \u003d {"},{"line_number":26,"context_line":"            \u0027next\u0027: None,"},{"line_number":27,"context_line":"            \u0027self\u0027: RevokeController.base_url(path\u003dcontext[\u0027path\u0027]),"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1%2B8%3D","line":24,"updated":"2014-01-21 14:39:11.000000000","message":"use \u0027 for strings for consistency.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            \u0027previous\u0027: None}"},{"line_number":31,"context_line":"        return container"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":34,"context_line":"    def list_events(self, context):"},{"line_number":35,"context_line":"        events \u003d self.revoke_api.get_events(filter)"},{"line_number":36,"context_line":"        #TODO(ayoung): fill in the links"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1%2B4%3D","line":33,"updated":"2014-01-21 14:39:11.000000000","message":"you can use policy to make things publically callable, suggest add @controller.protected() and set the policy so that it\u0027s public.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":34,"context_line":"    def list_events(self, context):"},{"line_number":35,"context_line":"        events \u003d self.revoke_api.get_events(filter)"},{"line_number":36,"context_line":"        #TODO(ayoung): fill in the links"},{"line_number":37,"context_line":"        events \u003d {\u0027events\u0027: [event.to_dict() for event in events],"},{"line_number":38,"context_line":"                  \u0027links\u0027: []}"},{"line_number":39,"context_line":"        return events"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1%2B0%3D","line":36,"updated":"2014-01-21 14:39:11.000000000","message":"did you want to do this now or have a separate commit? if doing in separate commit then should mention in the commit message that this is a limitation.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FsE%3D","line":1,"updated":"2014-02-17 19:26:32.000000000","message":"remove","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6653ec192fccf0f81645a6c9b188c42e7c11ac93","unresolved":false,"context_lines":[{"line_number":20,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":21,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def describe(self, context):"},{"line_number":24,"context_line":"        container \u003d {\"revoke\": \"\"}"},{"line_number":25,"context_line":"        container[\u0027links\u0027] \u003d {"},{"line_number":26,"context_line":"            \u0027next\u0027: None,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FNc%3D","line":23,"updated":"2014-02-17 19:51:20.000000000","message":"there should be a unit test for this function.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def describe(self, context):"},{"line_number":24,"context_line":"        container \u003d {\"revoke\": \"\"}"},{"line_number":25,"context_line":"        container[\u0027links\u0027] \u003d {"},{"line_number":26,"context_line":"            \u0027next\u0027: None,"},{"line_number":27,"context_line":"            \u0027self\u0027: RevokeController.base_url(path\u003dcontext[\u0027path\u0027]),"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fr0%3D","line":24,"updated":"2014-02-17 19:26:32.000000000","message":"use \u0027 for strings consistently.\n\nwhat does empty string for revoke mean here?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def describe(self, context):"},{"line_number":24,"context_line":"        container \u003d {\"revoke\": \"\"}"},{"line_number":25,"context_line":"        container[\u0027links\u0027] \u003d {"},{"line_number":26,"context_line":"            \u0027next\u0027: None,"},{"line_number":27,"context_line":"            \u0027self\u0027: RevokeController.base_url(path\u003dcontext[\u0027path\u0027]),"},{"line_number":28,"context_line":"            \u0027revoked_tokens\u0027: RevokeController.base_url("}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Frs%3D","line":25,"updated":"2014-02-17 19:26:32.000000000","message":"suggest combine 25 and 24 so that it\u0027s done consistently.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            \u0027previous\u0027: None}"},{"line_number":31,"context_line":"        return container"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":34,"context_line":"    def list_events(self, context):"},{"line_number":35,"context_line":"        events \u003d self.revoke_api.get_events(filter)"},{"line_number":36,"context_line":"        #TODO(ayoung): fill in the links"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FqM%3D","line":33,"updated":"2014-02-17 19:26:32.000000000","message":"can\u0027t you set up the policy.json so that it\u0027s publically available?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def describe(self, context):"},{"line_number":27,"context_line":"        container \u003d {\"revoke\": \"\"}"},{"line_number":28,"context_line":"        container[\u0027links\u0027] \u003d {"},{"line_number":29,"context_line":"            \u0027next\u0027: None,"},{"line_number":30,"context_line":"            \u0027self\u0027: RevokeController.base_url(path\u003dcontext[\u0027path\u0027]),"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fsw%3D","line":27,"updated":"2014-02-22 19:17:19.000000000","message":"use \u0027 for strings consistently.\n\nwhat does empty string for revoke mean here?","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class RevokeController(controller.V3Controller):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def describe(self, context):"},{"line_number":27,"context_line":"        container \u003d {\"revoke\": \"\"}"},{"line_number":28,"context_line":"        container[\u0027links\u0027] \u003d {"},{"line_number":29,"context_line":"            \u0027next\u0027: None,"},{"line_number":30,"context_line":"            \u0027self\u0027: RevokeController.base_url(path\u003dcontext[\u0027path\u0027]),"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2FvHk%3D","line":27,"in_reply_to":"AAAAU3%2F%2F%2Fsw%3D","updated":"2014-02-25 02:26:45.000000000","message":"Dropped this function, as the API it was supporting has been removed.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def describe(self, context):"},{"line_number":27,"context_line":"        container \u003d {\"revoke\": \"\"}"},{"line_number":28,"context_line":"        container[\u0027links\u0027] \u003d {"},{"line_number":29,"context_line":"            \u0027next\u0027: None,"},{"line_number":30,"context_line":"            \u0027self\u0027: RevokeController.base_url(path\u003dcontext[\u0027path\u0027]),"},{"line_number":31,"context_line":"            \u0027revoked_tokens\u0027: RevokeController.base_url("}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fsk%3D","line":28,"updated":"2014-02-22 19:17:19.000000000","message":"suggest combine 25 and 24 so that it\u0027s done consistently.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def describe(self, context):"},{"line_number":27,"context_line":"        container \u003d {\"revoke\": \"\"}"},{"line_number":28,"context_line":"        container[\u0027links\u0027] \u003d {"},{"line_number":29,"context_line":"            \u0027next\u0027: None,"},{"line_number":30,"context_line":"            \u0027self\u0027: RevokeController.base_url(path\u003dcontext[\u0027path\u0027]),"},{"line_number":31,"context_line":"            \u0027revoked_tokens\u0027: RevokeController.base_url("}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FoI%3D","line":28,"in_reply_to":"AAAAU3%2F%2F%2Fsk%3D","updated":"2014-02-22 19:58:28.000000000","message":"oops, this comment should be \"suggest combine 27 and 28 so that it\u0027s done consistently.\"","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            \u0027previous\u0027: None}"},{"line_number":34,"context_line":"        return container"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":37,"context_line":"    def list_events(self, context):"},{"line_number":38,"context_line":"        since \u003d context[\u0027query_string\u0027].get(\u0027since\u0027)"},{"line_number":39,"context_line":"        last_fetch \u003d None"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fsg%3D","line":36,"updated":"2014-02-22 19:17:19.000000000","message":"can\u0027t you set up the policy.json so that it\u0027s publically available?","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b195bcaad85860dbe913cac2da3f921c4c4ff003","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            \u0027previous\u0027: None}"},{"line_number":34,"context_line":"        return container"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":37,"context_line":"    def list_events(self, context):"},{"line_number":38,"context_line":"        since \u003d context[\u0027query_string\u0027].get(\u0027since\u0027)"},{"line_number":39,"context_line":"        last_fetch \u003d None"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fd4%3D","line":36,"in_reply_to":"AAAAU3%2F%2F%2Fsg%3D","updated":"2014-02-22 21:18:02.000000000","message":"++","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            \u0027previous\u0027: None}"},{"line_number":34,"context_line":"        return container"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    #Not @controller.protected() to allow this to be publicly callable."},{"line_number":37,"context_line":"    def list_events(self, context):"},{"line_number":38,"context_line":"        since \u003d context[\u0027query_string\u0027].get(\u0027since\u0027)"},{"line_number":39,"context_line":"        last_fetch \u003d None"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2FvFE%3D","line":36,"in_reply_to":"AAAAU3%2F%2F%2Fsg%3D","updated":"2014-02-25 02:26:45.000000000","message":"Done","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FY9w%3D","line":1,"updated":"2014-02-26 22:05:50.000000000","message":"remove vim line.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common import controller"},{"line_number":17,"context_line":"from keystone.common import dependency"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdCo%3D","line":15,"updated":"2014-02-26 15:51:13.000000000","message":"Extra newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common import controller"},{"line_number":17,"context_line":"from keystone.common import dependency"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone import exception"},{"line_number":20,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdCc%3D","line":18,"updated":"2014-02-26 15:51:13.000000000","message":"Extra newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            except Exception:"},{"line_number":34,"context_line":"                raise exception.ValidationError("},{"line_number":35,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":36,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch)"},{"line_number":37,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict(with_id\u003dFalse)"},{"line_number":38,"context_line":"                               for event in events],"},{"line_number":39,"context_line":"                    \u0027links\u0027: {"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FY%2F8%3D","line":36,"updated":"2014-02-26 22:05:50.000000000","message":"suggest use named parameter for named argument -- last_fetch\u003dlast_fetch","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2Bjs%3D","line":1,"updated":"2014-02-27 02:22:07.000000000","message":"remove vim line.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            except Exception:"},{"line_number":33,"context_line":"                raise exception.ValidationError("},{"line_number":34,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":35,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch)"},{"line_number":36,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict(with_id\u003dFalse)"},{"line_number":37,"context_line":"                               for event in events],"},{"line_number":38,"context_line":"                    \u0027links\u0027: {"}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2Bjg%3D","line":35,"updated":"2014-02-27 02:22:07.000000000","message":"suggest use named parameter for named argument -- last_fetch\u003dlast_fetch","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                    timeutils.parse_isotime(since))"},{"line_number":29,"context_line":"            except Exception:"},{"line_number":30,"context_line":"                raise exception.ValidationError("},{"line_number":31,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":32,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch\u003dlast_fetch)"},{"line_number":33,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict(with_id\u003dFalse)"},{"line_number":34,"context_line":"                               for event in events],"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft9s%3D","line":31,"updated":"2014-02-28 20:21:47.000000000","message":"or, for example, you\u0027re suppressing attribute error \"timeutils doesn\u0027t have normalize_time\" and causing a debugging nightmare because you\u0027re catching Exception instead of something relevant","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4cf7ac528c762e3d41caaa5207be15701e7dd411","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                    timeutils.parse_isotime(since))"},{"line_number":29,"context_line":"            except Exception:"},{"line_number":30,"context_line":"                raise exception.ValidationError("},{"line_number":31,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":32,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch\u003dlast_fetch)"},{"line_number":33,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict(with_id\u003dFalse)"},{"line_number":34,"context_line":"                               for event in events],"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FstI%3D","line":31,"in_reply_to":"AAAAVX%2F%2Ft9s%3D","updated":"2014-03-03 01:27:02.000000000","message":"++ nice catch","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":29,"context_line":"            except Exception:"},{"line_number":30,"context_line":"                raise exception.ValidationError("},{"line_number":31,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":32,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch\u003dlast_fetch)"},{"line_number":33,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict(with_id\u003dFalse)"},{"line_number":34,"context_line":"                               for event in events],"},{"line_number":35,"context_line":"                    \u0027links\u0027: {"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft%2Bw%3D","line":32,"updated":"2014-02-28 21:04:05.000000000","message":"(NIT) Suggest newline between 31 and 32 for readability","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                raise exception.ValidationError("},{"line_number":31,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":32,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch\u003dlast_fetch)"},{"line_number":33,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict(with_id\u003dFalse)"},{"line_number":34,"context_line":"                               for event in events],"},{"line_number":35,"context_line":"                    \u0027links\u0027: {"},{"line_number":36,"context_line":"                        \u0027next\u0027: None,"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft8s%3D","line":33,"updated":"2014-02-28 20:21:47.000000000","message":"use the collection wrapper instead of re-inventing it","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                raise exception.ValidationError("},{"line_number":31,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":32,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch\u003dlast_fetch)"},{"line_number":33,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict(with_id\u003dFalse)"},{"line_number":34,"context_line":"                               for event in events],"},{"line_number":35,"context_line":"                    \u0027links\u0027: {"},{"line_number":36,"context_line":"                        \u0027next\u0027: None,"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FrUs%3D","line":33,"in_reply_to":"AAAAVX%2F%2Ft8s%3D","updated":"2014-03-01 06:22:38.000000000","message":"Wrappers all assume Ids.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0af7b8d0bc91da6283895605b8a72bab27f547be","unresolved":false,"context_lines":[{"line_number":29,"context_line":"            except ValueError:"},{"line_number":30,"context_line":"                raise exception.ValidationError("},{"line_number":31,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":32,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch\u003dlast_fetch)"},{"line_number":33,"context_line":"        #Build the links by hand as the standard controller calls require ids"},{"line_number":34,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict() for event in events],"},{"line_number":35,"context_line":"                    \u0027links\u0027: {"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2Fza4%3D","line":32,"updated":"2014-03-04 02:02:43.000000000","message":"this will still work if last_fetch is None?","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"            except ValueError:"},{"line_number":30,"context_line":"                raise exception.ValidationError("},{"line_number":31,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":32,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch\u003dlast_fetch)"},{"line_number":33,"context_line":"        #Build the links by hand as the standard controller calls require ids"},{"line_number":34,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict() for event in events],"},{"line_number":35,"context_line":"                    \u0027links\u0027: {"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzWw%3D","line":32,"in_reply_to":"AAAAVn%2F%2Fza4%3D","updated":"2014-03-04 02:28:09.000000000","message":"Yes, the backend handles that for just this reason: to simplify the logic.","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0af7b8d0bc91da6283895605b8a72bab27f547be","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict() for event in events],"},{"line_number":35,"context_line":"                    \u0027links\u0027: {"},{"line_number":36,"context_line":"                        \u0027next\u0027: None,"},{"line_number":37,"context_line":"                        \u0027self\u0027: RevokeController.base_url("},{"line_number":38,"context_line":"                            path\u003dcontext[\u0027path\u0027]) + \u0027/events\u0027,"},{"line_number":39,"context_line":"                        \u0027previous\u0027: None}"},{"line_number":40,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2Fzao%3D","line":37,"updated":"2014-03-04 02:02:43.000000000","message":"\u0027OS-REVOKE\u0027 will be in the self link, because it\u0027s in context[\u0027path\u0027]","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict() for event in events],"},{"line_number":35,"context_line":"                    \u0027links\u0027: {"},{"line_number":36,"context_line":"                        \u0027next\u0027: None,"},{"line_number":37,"context_line":"                        \u0027self\u0027: RevokeController.base_url("},{"line_number":38,"context_line":"                            path\u003dcontext[\u0027path\u0027]) + \u0027/events\u0027,"},{"line_number":39,"context_line":"                        \u0027previous\u0027: None}"},{"line_number":40,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzWk%3D","line":37,"in_reply_to":"AAAAVn%2F%2Fzao%3D","updated":"2014-03-04 02:28:09.000000000","message":"This is correct.","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    @controller.protected()"},{"line_number":22,"context_line":"    def list_revoke_events(self, context):"},{"line_number":23,"context_line":"        since \u003d context[\u0027query_string\u0027].get(\u0027since\u0027)"},{"line_number":24,"context_line":"        last_fetch \u003d None"},{"line_number":25,"context_line":"        if since:"},{"line_number":26,"context_line":"            try:"},{"line_number":27,"context_line":"                last_fetch \u003d timeutils.normalize_time("}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FpX4%3D","line":24,"updated":"2014-03-04 23:26:37.000000000","message":"this is unnecessary","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                raise exception.ValidationError("},{"line_number":31,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":32,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch\u003dlast_fetch)"},{"line_number":33,"context_line":"        # Build the links by hand as the standard controller calls require ids"},{"line_number":34,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict() for event in events],"},{"line_number":35,"context_line":"                    \u0027links\u0027: {"},{"line_number":36,"context_line":"                        \u0027next\u0027: None,"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FpXs%3D","line":33,"updated":"2014-03-04 23:26:37.000000000","message":"would be better to extend the parent\u0027s method to not require IDs","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                    message\u003d_(\u0027invalid date format %s\u0027) % since)"},{"line_number":32,"context_line":"        events \u003d self.revoke_api.get_events(last_fetch\u003dlast_fetch)"},{"line_number":33,"context_line":"        # Build the links by hand as the standard controller calls require ids"},{"line_number":34,"context_line":"        response \u003d {\u0027events\u0027: [event.to_dict() for event in events],"},{"line_number":35,"context_line":"                    \u0027links\u0027: {"},{"line_number":36,"context_line":"                        \u0027next\u0027: None,"},{"line_number":37,"context_line":"                        \u0027self\u0027: RevokeController.base_url("}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FpXQ%3D","line":34,"updated":"2014-03-04 23:26:37.000000000","message":"you shouldn\u0027t be passing non-dicts back to the controller","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"keystone/contrib/revoke/core.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d51f15b6ccc04973a3e006360dab6fc3cf89a1a5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super(ExampleManager, self).__init__(CONF.ExampleDriver.driver)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class RevokeDriver(object):"},{"line_number":43,"context_line":"    \"\"\"Interface description for Example driver.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def do_something(self, data):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B5QI%3D","line":42,"updated":"2013-11-18 21:38:48.000000000","message":"use six and abc here for the driver in the long run.\n\n@six.addmetaclass(abc.ABCMeta)\n\nand the \"methods\" should be decorated with @abc.abstractmethod","commit_id":"387354726b73b21e5e99ddacdc24b4362b7db7ba"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7b32013c0c4ebdb17d1ca50d4488ceac064742d1","unresolved":false,"context_lines":[{"line_number":32,"context_line":"CONF \u003d config.CONF"},{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"revoke_opts \u003d ["},{"line_number":36,"context_line":"    cfg.StrOpt(\u0027driver\u0027,"},{"line_number":37,"context_line":"               default\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027),"},{"line_number":38,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BEUk%3D","line":35,"updated":"2013-12-02 21:44:33.000000000","message":"might be better if placed at keystone/common/config.py ?","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b260fc008d2b19da08aa91007a383477bfe1d7a2","unresolved":false,"context_lines":[{"line_number":32,"context_line":"CONF \u003d config.CONF"},{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"revoke_opts \u003d ["},{"line_number":36,"context_line":"    cfg.StrOpt(\u0027driver\u0027,"},{"line_number":37,"context_line":"               default\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027),"},{"line_number":38,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BDTc%3D","line":35,"in_reply_to":"AAAATn%2F%2BEUk%3D","updated":"2013-12-03 02:26:23.000000000","message":"We are trying to get config options out of there.  This solution is more modular.  But it probably should be in something called by the router, not in core.","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efbdab75ac7906fd5eb8ae6c7e6d339ebbab9d3e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from keystone import config"},{"line_number":27,"context_line":"from keystone.contrib.revoke import model"},{"line_number":28,"context_line":"from keystone import exception"},{"line_number":29,"context_line":"from keystone.openstack.common import log as logging"},{"line_number":30,"context_line":"from oslo.config import cfg"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF \u003d config.CONF"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FJwY%3D","line":29,"updated":"2014-01-16 23:03:10.000000000","message":"(NIT): this is really minor, but I think the most of Keystone just leaves: \n\n    from keystone.openstack.common import log as logging \n\nas... \n\n    from keystone.openstack.common.import log \n\n    LOG \u003d log.getLogger(__name__)\n\nhttps://github.com/openstack/keystone/blob/master/keystone/identity/core.py#L34","commit_id":"06d60b533dd6f1d189ce5c4b05ccbceda76a67c3"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"@dependency.provider(\u0027revoke_api\u0027)"},{"line_number":68,"context_line":"class Manager(manager.Manager):"},{"line_number":69,"context_line":"    \"\"\"Example Manager."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    See :mod:`keystone.common.manager.Manager` for more details on"},{"line_number":72,"context_line":"    how this dynamically calls the backend."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FLA%3D","line":69,"updated":"2014-01-20 03:15:47.000000000","message":"This is not an example manager.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"de58f753817d406d046914a53cad6863cbbc1a13","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"@dependency.provider(\u0027revoke_api\u0027)"},{"line_number":68,"context_line":"class Manager(manager.Manager):"},{"line_number":69,"context_line":"    \"\"\"Example Manager."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    See :mod:`keystone.common.manager.Manager` for more details on"},{"line_number":72,"context_line":"    how this dynamically calls the backend."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FBk%3D","line":69,"in_reply_to":"AAAAUH%2F%2B%2FLA%3D","updated":"2014-01-20 04:15:53.000000000","message":"No it is not.  It is a filthy liar.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                                  domain_id\u003ddomain_id)"},{"line_number":93,"context_line":"        self.driver.revoke(event)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def revoke_by_user_and_project(self, user_id, project_id):"},{"line_number":96,"context_line":"        event \u003d model.RevokeEvent(model.EventIdentifier(),"},{"line_number":97,"context_line":"                                  project_id\u003dproject_id,"},{"line_number":98,"context_line":"                                  user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FKA%3D","line":95,"updated":"2014-01-20 03:15:47.000000000","message":"If we support domain scoped tokens you likely need a similar by_user_and_domain method since you wouldnt want to revoke _all_ domain tokens if a specific user-domain combination is needed  But if domain-scoped tokens aren\u0027t supported, we don\u0027t need to add the method.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self.driver.revoke(event)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def revoke_by_trust(self, trust_id):"},{"line_number":107,"context_line":"        raise exception.NotImplemented()"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def revoke_by_project_role_assignment(self, project_id, role_id):"},{"line_number":110,"context_line":"        event \u003d model.RevokeEvent(id\u003dmodel.EventIdentifier(),"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FJ0%3D","line":107,"updated":"2014-01-20 03:15:47.000000000","message":"Is there a bug/bp or other bit of information for supporting trust revocations (e.g. timeline for implementation).  Suggest comment.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"de58f753817d406d046914a53cad6863cbbc1a13","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self.driver.revoke(event)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def revoke_by_trust(self, trust_id):"},{"line_number":107,"context_line":"        raise exception.NotImplemented()"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def revoke_by_project_role_assignment(self, project_id, role_id):"},{"line_number":110,"context_line":"        event \u003d model.RevokeEvent(id\u003dmodel.EventIdentifier(),"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FAw%3D","line":107,"in_reply_to":"AAAAUH%2F%2B%2FJ0%3D","updated":"2014-01-20 04:15:53.000000000","message":"Nope, just hasn\u0027t been implemented yet.  Will add.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from keystone.common import dependency"},{"line_number":22,"context_line":"from keystone.common import extension"},{"line_number":23,"context_line":"from keystone.common import manager"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from keystone import config"},{"line_number":27,"context_line":"from keystone.contrib.revoke import model"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B7EQ%3D","line":24,"updated":"2014-01-20 18:09:40.000000000","message":"nit, extra line break here","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        \"\"\"return the revocation events, as a list of"},{"line_number":181,"context_line":"        model.RevokeEvent objects"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        :param filter:"},{"line_number":184,"context_line":"        :raises: keystone.exception,"},{"line_number":185,"context_line":"        :returns: Set of revocation events that match the filter."},{"line_number":186,"context_line":"                   If no filter is specified, returns all events"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B7Cs%3D","line":183,"updated":"2014-01-20 18:09:40.000000000","message":"ad description for filter","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1026228b95a6be6e6ea21d58afcdca39df747c42","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    def revoke(self, event):"},{"line_number":195,"context_line":"        \"\"\"return the revocation events,"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        :param revocation:"},{"line_number":198,"context_line":"        :raises: keystone.exception,"},{"line_number":199,"context_line":"        :returns: The revocatione_event with an updated values"},{"line_number":200,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B7Cw%3D","line":197,"updated":"2014-01-20 18:09:40.000000000","message":"add a description for revocation","commit_id":"e5413f2bf8752baf38287397b4ca13cabf49527c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c63f67fa80962b333bc2eff421336c16f5a3ec6","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                                  expires_at\u003dexpires_at)"},{"line_number":71,"context_line":"        self.driver.revoke(event)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def revoke_by_user(self, user_id):"},{"line_number":74,"context_line":"        event \u003d model.RevokeEvent(id\u003dmodel.EventIdentifier(),"},{"line_number":75,"context_line":"                                  user_id\u003duser_id)"},{"line_number":76,"context_line":"        self.driver.revoke(event)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5to%3D","line":73,"updated":"2014-01-21 04:55:07.000000000","message":"The rest of these need to add \"issued_before\" field.  THat is going to be implicitly created in the model object","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        self.driver.revoke(event)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def revoke_by_user_and_project(self, user_id, project_id):"},{"line_number":84,"context_line":"        event \u003d model.RevokeEvent(model.EventIdentifier(),"},{"line_number":85,"context_line":"                                  project_id\u003dproject_id,"},{"line_number":86,"context_line":"                                  user_id\u003duser_id)"},{"line_number":87,"context_line":"        self.driver.revoke(event)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5bo%3D","line":84,"updated":"2014-01-20 23:55:32.000000000","message":"suggest change \"model.EventIdentifier()\" to \"id\u003dmodel.EventIdentifier()\" for consistency ... this applies elsewhere too - line 91, 97, etc.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                                  user_id\u003duser_id)"},{"line_number":87,"context_line":"        self.driver.revoke(event)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    #TODO(ayoung): this needs a unit test"},{"line_number":90,"context_line":"    def revoke_by_user_and_domain(self, user_id, domain_id):"},{"line_number":91,"context_line":"        event \u003d model.RevokeEvent(model.EventIdentifier(),"},{"line_number":92,"context_line":"                                  domain_id\u003ddomain_id,"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5bs%3D","line":89,"updated":"2014-01-20 23:55:32.000000000","message":"did you want to do this for this commit or in a separate one?","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                                  consumer_id\u003dconsumer_id)"},{"line_number":123,"context_line":"        self.driver.revoke(event)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def check_token(self, token_values):"},{"line_number":126,"context_line":"        def revoke_matches(event, token_values):"},{"line_number":127,"context_line":"            #something has to match in order to revoke the token"},{"line_number":128,"context_line":"            matched \u003d False"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5bU%3D","line":125,"updated":"2014-01-20 23:55:32.000000000","message":"a docstring here would be useful for reviewers.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        events \u003d self.get_events(filter\u003dNone)"},{"line_number":168,"context_line":"        for event in events:"},{"line_number":169,"context_line":"            if revoke_matches(event, token_values):"},{"line_number":170,"context_line":"                #TODO(ayoung): I18N"},{"line_number":171,"context_line":"                raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5bc%3D","line":170,"updated":"2014-01-20 23:55:32.000000000","message":"this is already DONE","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":175,"context_line":"class Driver(object):"},{"line_number":176,"context_line":"    \"\"\"Interface description for Example driver.\"\"\""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    @abc.abstractmethod"},{"line_number":179,"context_line":"    def get_events(self, filter\u003dNone):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5ak%3D","line":176,"updated":"2014-01-20 23:55:32.000000000","message":"update the docstring.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        \"\"\"return the revocation events, as a list of"},{"line_number":181,"context_line":"           model.RevokeEvent objects"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        :param filter:   Not yet supported."},{"line_number":184,"context_line":"        :raises: keystone.exception,"},{"line_number":185,"context_line":"        :returns: Set of revocation events that match the filter."},{"line_number":186,"context_line":"                   If no filter is specified, returns all events"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5a4%3D","line":183,"updated":"2014-01-20 23:55:32.000000000","message":"suggest get rid of code related to features that aren\u0027t supported... add it when the function is supported.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":181,"context_line":"           model.RevokeEvent objects"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        :param filter:   Not yet supported."},{"line_number":184,"context_line":"        :raises: keystone.exception,"},{"line_number":185,"context_line":"        :returns: Set of revocation events that match the filter."},{"line_number":186,"context_line":"                   If no filter is specified, returns all events"},{"line_number":187,"context_line":"                   for tokens issued after the expiration cutoff."}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5aw%3D","line":184,"updated":"2014-01-20 23:55:32.000000000","message":"remove ,","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        :param filter:   Not yet supported."},{"line_number":184,"context_line":"        :raises: keystone.exception,"},{"line_number":185,"context_line":"        :returns: Set of revocation events that match the filter."},{"line_number":186,"context_line":"                   If no filter is specified, returns all events"},{"line_number":187,"context_line":"                   for tokens issued after the expiration cutoff."},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5as%3D","line":185,"updated":"2014-01-20 23:55:32.000000000","message":"I assume this is a list and not a set.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    def revoke(self, event):"},{"line_number":195,"context_line":"        \"\"\"register a revocation event"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        :param event: An instance keystone.contrib.revoke.model.RevocationEvent"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5ac%3D","line":197,"updated":"2014-01-20 23:55:32.000000000","message":"change \"instance\" to \"instance of\"","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f2d27140feb6804a1c436e2a5a869ebbf5ac8894","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from keystone import config"},{"line_number":25,"context_line":"from keystone.contrib.revoke import model"},{"line_number":26,"context_line":"from keystone import exception"},{"line_number":27,"context_line":"from keystone.openstack.common import log as logging"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"CONF \u003d config.CONF"},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1ro%3D","line":27,"updated":"2014-01-21 15:24:58.000000000","message":"Use: \n\n    from keystone.openstack.common import log \n\nmorganfainberg made that change so that it was consistent with the rest of Keystone: \n\nhttps://github.com/openstack/keystone/commit/559ba206d4e73d8011ec4093a41cbabf5a70b99f","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        self.driver.revoke(event)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def revoke_by_user_and_project(self, user_id, project_id):"},{"line_number":84,"context_line":"        event \u003d model.RevokeEvent(model.EventIdentifier(),"},{"line_number":85,"context_line":"                                  project_id\u003dproject_id,"},{"line_number":86,"context_line":"                                  user_id\u003duser_id)"},{"line_number":87,"context_line":"        self.driver.revoke(event)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1%2Bo%3D","line":84,"updated":"2014-01-21 14:39:11.000000000","message":"suggest change \"model.EventIdentifier()\" to \"id\u003dmodel.EventIdentifier()\" for consistency ... this applies elsewhere too - line 91, 97, etc.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                                  user_id\u003duser_id)"},{"line_number":87,"context_line":"        self.driver.revoke(event)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    #TODO(ayoung): this needs a unit test"},{"line_number":90,"context_line":"    def revoke_by_user_and_domain(self, user_id, domain_id):"},{"line_number":91,"context_line":"        event \u003d model.RevokeEvent(model.EventIdentifier(),"},{"line_number":92,"context_line":"                                  domain_id\u003ddomain_id,"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1%2BY%3D","line":89,"updated":"2014-01-21 14:39:11.000000000","message":"did you want to do this for this commit or in a separate one?","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                                  consumer_id\u003dconsumer_id)"},{"line_number":123,"context_line":"        self.driver.revoke(event)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def check_token(self, token_values):"},{"line_number":126,"context_line":"        def revoke_matches(event, token_values):"},{"line_number":127,"context_line":"            #something has to match in order to revoke the token"},{"line_number":128,"context_line":"            matched \u003d False"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1%2BQ%3D","line":125,"updated":"2014-01-21 14:39:11.000000000","message":"a docstring here would be useful for reviewers.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        events \u003d self.get_events(filter\u003dNone)"},{"line_number":168,"context_line":"        for event in events:"},{"line_number":169,"context_line":"            if revoke_matches(event, token_values):"},{"line_number":170,"context_line":"                #TODO(ayoung): I18N"},{"line_number":171,"context_line":"                raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1%2BE%3D","line":170,"updated":"2014-01-21 14:39:11.000000000","message":"this is already done","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":175,"context_line":"class Driver(object):"},{"line_number":176,"context_line":"    \"\"\"Interface description for Example driver.\"\"\""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    @abc.abstractmethod"},{"line_number":179,"context_line":"    def get_events(self, filter\u003dNone):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1%2BA%3D","line":176,"updated":"2014-01-21 14:39:11.000000000","message":"update the docstring.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        \"\"\"return the revocation events, as a list of"},{"line_number":181,"context_line":"           model.RevokeEvent objects"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        :param filter:   Not yet supported."},{"line_number":184,"context_line":"        :raises: keystone.exception,"},{"line_number":185,"context_line":"        :returns: Set of revocation events that match the filter."},{"line_number":186,"context_line":"                   If no filter is specified, returns all events"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B19w%3D","line":183,"updated":"2014-01-21 14:39:11.000000000","message":"suggest get rid of code related to features that aren\u0027t supported... add it when the function is supported.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":181,"context_line":"           model.RevokeEvent objects"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        :param filter:   Not yet supported."},{"line_number":184,"context_line":"        :raises: keystone.exception,"},{"line_number":185,"context_line":"        :returns: Set of revocation events that match the filter."},{"line_number":186,"context_line":"                   If no filter is specified, returns all events"},{"line_number":187,"context_line":"                   for tokens issued after the expiration cutoff."}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B19g%3D","line":184,"updated":"2014-01-21 14:39:11.000000000","message":"remove ,","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        :param filter:   Not yet supported."},{"line_number":184,"context_line":"        :raises: keystone.exception,"},{"line_number":185,"context_line":"        :returns: Set of revocation events that match the filter."},{"line_number":186,"context_line":"                   If no filter is specified, returns all events"},{"line_number":187,"context_line":"                   for tokens issued after the expiration cutoff."},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B19c%3D","line":185,"updated":"2014-01-21 14:39:11.000000000","message":"I assume this is a list and not a set.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    def revoke(self, event):"},{"line_number":195,"context_line":"        \"\"\"register a revocation event"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        :param event: An instance keystone.contrib.revoke.model.RevocationEvent"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        \"\"\""},{"line_number":200,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B19Q%3D","line":197,"updated":"2014-01-21 14:39:11.000000000","message":"change \"instance\" to \"instance of\"","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5fcd423317c2a89b283c8483619d13a671be979a","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    def check_token(self, token_values):"},{"line_number":161,"context_line":"        \"\"\"Checks the values from a token against the revocation list"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        :param  dictionary of values from a token,"},{"line_number":164,"context_line":"        normalized for differences between v2 and v3. The checked values are a"},{"line_number":165,"context_line":"         subset of the attributes of model.TokenEvent"},{"line_number":166,"context_line":"        :raises exception.TokenNotFound if the token is invalid"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUH%2F%2Bn5I%3D","line":163,"updated":"2014-01-23 19:52:24.000000000","message":"(NIT): would we be able to change this to \n\n    :param token_values: \u003cdescription\u003e\n\nhttp://docs.openstack.org/developer/hacking/#docstrings","commit_id":"a952a49787cfbaa045e1195a881e40c4a08d3b62"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5fcd423317c2a89b283c8483619d13a671be979a","unresolved":false,"context_lines":[{"line_number":168,"context_line":"         \"\"\""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        def revoke_matches(event, token_values):"},{"line_number":171,"context_line":"            #something has to match in order to revoke the token"},{"line_number":172,"context_line":"            matched \u003d False"},{"line_number":173,"context_line":"            if event.user_id is not None:"},{"line_number":174,"context_line":"                if event.user_id !\u003d token_values[\u0027user_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUH%2F%2Bn3Y%3D","line":171,"updated":"2014-01-23 19:52:24.000000000","message":"There is a lot of common code between the if checks here, what about breaking it out into a separate (probably private) check function, that way this can be handled in a loop. Thoughts?","commit_id":"a952a49787cfbaa045e1195a881e40c4a08d3b62"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dbe170f133eb4217d6cae488c3c3a96a3fcf7240","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"            Compare each attribute from the event with the corresponding"},{"line_number":174,"context_line":"            value from the token.  If the event does not have a value for"},{"line_number":175,"context_line":"            the attribute, a match is still possible.  If the even has a"},{"line_number":176,"context_line":"            value for the attribute, and it does not match the token, no match"},{"line_number":177,"context_line":"            is possible, so skip the remaining checks."},{"line_number":178,"context_line":"            \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAUH%2F%2BbVs%3D","line":175,"updated":"2014-01-27 00:02:25.000000000","message":"s/even/event/?","commit_id":"64e87cb2721a652aff1b3dc4ca4c9dc3cb66d17a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dbe170f133eb4217d6cae488c3c3a96a3fcf7240","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            value from the token.  If the event does not have a value for"},{"line_number":175,"context_line":"            the attribute, a match is still possible.  If the even has a"},{"line_number":176,"context_line":"            value for the attribute, and it does not match the token, no match"},{"line_number":177,"context_line":"            is possible, so skip the remaining checks."},{"line_number":178,"context_line":"            \"\"\""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"            #something has to match in order to revoke the token"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAUH%2F%2BbVE%3D","line":177,"updated":"2014-01-27 00:02:25.000000000","message":"(NIT): add doc strings and return values?","commit_id":"64e87cb2721a652aff1b3dc4ca4c9dc3cb66d17a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dbe170f133eb4217d6cae488c3c3a96a3fcf7240","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                        user_id_matched \u003d True"},{"line_number":189,"context_line":"                        break"},{"line_number":190,"context_line":"                if not user_id_matched:"},{"line_number":191,"context_line":"                    return False"},{"line_number":192,"context_line":"                else:"},{"line_number":193,"context_line":"                    matched \u003d True"},{"line_number":194,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAUH%2F%2BbVU%3D","line":191,"updated":"2014-01-27 00:02:25.000000000","message":"Just curious, why return False here to the caller instead of setting matched \u003d False? Maybe a small inline comment here?","commit_id":"64e87cb2721a652aff1b3dc4ca4c9dc3cb66d17a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dbe170f133eb4217d6cae488c3c3a96a3fcf7240","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                if getattr(event, attribute_name) is not None:"},{"line_number":200,"context_line":"                    if (getattr(event, attribute_name) !\u003d"},{"line_number":201,"context_line":"                            token_values[attribute_name]):"},{"line_number":202,"context_line":"                                return False"},{"line_number":203,"context_line":"                    else:"},{"line_number":204,"context_line":"                        matched \u003d True"},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAUH%2F%2BbVA%3D","line":202,"updated":"2014-01-27 00:02:25.000000000","message":"Same comment here as above?","commit_id":"64e87cb2721a652aff1b3dc4ca4c9dc3cb66d17a"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"89620422b12ae2d3d1c1c994c70176fcbc2cbf1f","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                        role_found \u003d True"},{"line_number":222,"context_line":"                        break"},{"line_number":223,"context_line":"                if role_found:"},{"line_number":224,"context_line":"                    matched \u003d True"},{"line_number":225,"context_line":"                else:"},{"line_number":226,"context_line":"                    return False"},{"line_number":227,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2BVX8%3D","line":224,"updated":"2014-01-27 22:47:03.000000000","message":"This needs to check issued_before.","commit_id":"0c9bf055e6a38578a24a6518c8817d90f561bb11"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fo0%3D","line":1,"updated":"2014-02-17 19:26:32.000000000","message":"remove","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cdd671a930fb6fce5886fc6bf1252f4125a2421f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BgE%3D","line":3,"updated":"2014-02-17 21:51:34.000000000","message":"Could update the year here or remove this line altogether and let someone from the foundation add it. This goes for every occurrence.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"EXTENSION_DATA \u003d {"},{"line_number":35,"context_line":"    \u0027name\u0027: \u0027OpenStack REVOKE API\u0027,"},{"line_number":36,"context_line":"    \u0027namespace\u0027: \u0027http://docs.openstack.org/identity/api/ext/\u0027"},{"line_number":37,"context_line":"                 \u0027OS-REVOKE/v1.0\u0027,"},{"line_number":38,"context_line":"    \u0027alias\u0027: \u0027OS-REVOKE\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fn4%3D","line":35,"updated":"2014-02-17 19:26:32.000000000","message":"change REVOKE to \"revoke\"? or use REVOKE consistently (e.g., in the configuration.rst)","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \u0027namespace\u0027: \u0027http://docs.openstack.org/identity/api/ext/\u0027"},{"line_number":37,"context_line":"                 \u0027OS-REVOKE/v1.0\u0027,"},{"line_number":38,"context_line":"    \u0027alias\u0027: \u0027OS-REVOKE\u0027,"},{"line_number":39,"context_line":"    \u0027updated\u0027: \u00272013-07-07T12:00:0-00:00\u0027,"},{"line_number":40,"context_line":"    \u0027description\u0027: \u0027OpenStack Revoked Token Reporting mechanism.\u0027,"},{"line_number":41,"context_line":"    \u0027links\u0027: ["},{"line_number":42,"context_line":"        {"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fmg%3D","line":39,"updated":"2014-02-17 19:26:32.000000000","message":"suggest pick a more recent date... maybe the planned date for icehouse.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \u0027namespace\u0027: \u0027http://docs.openstack.org/identity/api/ext/\u0027"},{"line_number":37,"context_line":"                 \u0027OS-REVOKE/v1.0\u0027,"},{"line_number":38,"context_line":"    \u0027alias\u0027: \u0027OS-REVOKE\u0027,"},{"line_number":39,"context_line":"    \u0027updated\u0027: \u00272013-07-07T12:00:0-00:00\u0027,"},{"line_number":40,"context_line":"    \u0027description\u0027: \u0027OpenStack Revoked Token Reporting mechanism.\u0027,"},{"line_number":41,"context_line":"    \u0027links\u0027: ["},{"line_number":42,"context_line":"        {"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Bcw%3D","line":39,"in_reply_to":"AAAAUX%2F%2B%2Fmg%3D","updated":"2014-02-17 22:00:23.000000000","message":"++ release date in april","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                 \u0027OS-REVOKE/v1.0\u0027,"},{"line_number":38,"context_line":"    \u0027alias\u0027: \u0027OS-REVOKE\u0027,"},{"line_number":39,"context_line":"    \u0027updated\u0027: \u00272013-07-07T12:00:0-00:00\u0027,"},{"line_number":40,"context_line":"    \u0027description\u0027: \u0027OpenStack Revoked Token Reporting mechanism.\u0027,"},{"line_number":41,"context_line":"    \u0027links\u0027: ["},{"line_number":42,"context_line":"        {"},{"line_number":43,"context_line":"            \u0027rel\u0027: \u0027describedby\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Flc%3D","line":40,"updated":"2014-02-17 19:26:32.000000000","message":"lowercase \"revoked token reporting mechanism.\"","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        {"},{"line_number":43,"context_line":"            \u0027rel\u0027: \u0027describedby\u0027,"},{"line_number":44,"context_line":"            \u0027type\u0027: \u0027text/html\u0027,"},{"line_number":45,"context_line":"            \u0027href\u0027: (\u0027https://github.com/openstack/identity-api/blob/master/\u0027 +"},{"line_number":46,"context_line":"                     \u0027openstack-identity-api/v3/src/markdown/\u0027 +"},{"line_number":47,"context_line":"                     \u0027identity-api-v3-os-revoke-ext.md\u0027),"},{"line_number":48,"context_line":"        }, {"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FlA%3D","line":45,"updated":"2014-02-17 19:26:32.000000000","message":"remove +","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            \u0027rel\u0027: \u0027describedby\u0027,"},{"line_number":44,"context_line":"            \u0027type\u0027: \u0027text/html\u0027,"},{"line_number":45,"context_line":"            \u0027href\u0027: (\u0027https://github.com/openstack/identity-api/blob/master/\u0027 +"},{"line_number":46,"context_line":"                     \u0027openstack-identity-api/v3/src/markdown/\u0027 +"},{"line_number":47,"context_line":"                     \u0027identity-api-v3-os-revoke-ext.md\u0027),"},{"line_number":48,"context_line":"        }, {"},{"line_number":49,"context_line":"            \u0027rel\u0027: \u0027LIST\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fk4%3D","line":46,"updated":"2014-02-17 19:26:32.000000000","message":"remove +","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        }, {"},{"line_number":49,"context_line":"            \u0027rel\u0027: \u0027LIST\u0027,"},{"line_number":50,"context_line":"            \u0027type\u0027: \u0027application/JSON\u0027,"},{"line_number":51,"context_line":"            \u0027href\u0027: (\u0027OS-REVOKE/events\u0027),"},{"line_number":52,"context_line":"        }"},{"line_number":53,"context_line":"    ]}"},{"line_number":54,"context_line":"extension.register_admin_extension(EXTENSION_DATA[\u0027alias\u0027], EXTENSION_DATA)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fjc%3D","line":51,"updated":"2014-02-17 19:26:32.000000000","message":"remove ()","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def _role_callback(self, service, resource_type, operation,"},{"line_number":75,"context_line":"                       payload):"},{"line_number":76,"context_line":"        self.driver.revoke("},{"line_number":77,"context_line":"            model.RevokeEvent(id\u003dmodel.EventIdentifier(),"},{"line_number":78,"context_line":"                              role_id\u003dpayload[\u0027resource_info\u0027]))"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _project_callback(self, service, resource_type, operation,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Ffo%3D","line":77,"updated":"2014-02-17 19:26:32.000000000","message":"would be nice if there was a default for RevokeEvent id argument so don\u0027t have to specify it all the time.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def _role_callback(self, service, resource_type, operation,"},{"line_number":75,"context_line":"                       payload):"},{"line_number":76,"context_line":"        self.driver.revoke("},{"line_number":77,"context_line":"            model.RevokeEvent(id\u003dmodel.EventIdentifier(),"},{"line_number":78,"context_line":"                              role_id\u003dpayload[\u0027resource_info\u0027]))"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _project_callback(self, service, resource_type, operation,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BWE%3D","line":77,"in_reply_to":"AAAAUX%2F%2B%2Ffo%3D","updated":"2014-02-17 22:00:23.000000000","message":"why do revoke events have ID\u0027s??","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                          payload):"},{"line_number":82,"context_line":"        self.driver.revoke("},{"line_number":83,"context_line":"            model.RevokeEvent(id\u003dmodel.EventIdentifier(),"},{"line_number":84,"context_line":"                              project_id\u003dpayload[\u0027resource_info\u0027]))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _domain_callback(self, service, resource_type, operation,"},{"line_number":87,"context_line":"                         payload):"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FeQ%3D","line":84,"updated":"2014-02-17 19:26:32.000000000","message":"there\u0027s a lot of duplicated code in this file... suggest provide a function:\n\n def _revoke(**kwargs):\n    event \u003d model.RevokeEvent(id\u003dmodel.EventIdentifier(), **kwargs)\n    self.driver.revoke(event)","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            model.RevokeEvent(id\u003dmodel.EventIdentifier(),"},{"line_number":108,"context_line":"                              access_token_id\u003dpayload[\u0027resource_info\u0027]))"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _register_listeners(self):"},{"line_number":111,"context_line":"        callbacks \u003d ["},{"line_number":112,"context_line":"            [\u0027deleted\u0027, \u0027OS-TRUST:trust\u0027, self._trust_callback],"},{"line_number":113,"context_line":"            [\u0027deleted\u0027, \u0027OS-OAUTH1:consumer\u0027, self._consumer_callback],"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BW4%3D","line":110,"updated":"2014-02-17 22:00:23.000000000","message":"this is the opposite of how \"callbacks\" normally work lol","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            [\u0027disabled\u0027, \u0027project\u0027, self._project_callback],"},{"line_number":121,"context_line":"            [\u0027disabled\u0027, \u0027domain\u0027, self._domain_callback]]"},{"line_number":122,"context_line":"        for cb in callbacks:"},{"line_number":123,"context_line":"            notifications.register_event_callback(cb[0], cb[1], cb[2])"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def revoke_by_user(self, user_id):"},{"line_number":126,"context_line":"        return self.driver.revoke(model.RevokeEvent(id\u003dmodel.EventIdentifier(),"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fhg%3D","line":123,"updated":"2014-02-17 19:26:32.000000000","message":"change \"cb[0], cb[1], cb[2]\" to \"*cb\"","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6653ec192fccf0f81645a6c9b188c42e7c11ac93","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                              domain_id\u003ddomain_id,"},{"line_number":142,"context_line":"                              project_id\u003dproject_id))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def revoke_by_user_and_project(self, user_id, project_id):"},{"line_number":145,"context_line":"        self.driver.revoke("},{"line_number":146,"context_line":"            model.RevokeEvent(id\u003dmodel.EventIdentifier(),"},{"line_number":147,"context_line":"                              project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FM8%3D","line":144,"updated":"2014-02-17 19:51:20.000000000","message":"there should be a unit test for this.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                              domain_id\u003ddomain_id,"},{"line_number":142,"context_line":"                              project_id\u003dproject_id))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def revoke_by_user_and_project(self, user_id, project_id):"},{"line_number":145,"context_line":"        self.driver.revoke("},{"line_number":146,"context_line":"            model.RevokeEvent(id\u003dmodel.EventIdentifier(),"},{"line_number":147,"context_line":"                              project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BWc%3D","line":144,"in_reply_to":"AAAAUX%2F%2B%2FM8%3D","updated":"2014-02-17 22:00:23.000000000","message":"i haven\u0027t reviewed that far, but i\u0027d rather see functional tests","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6653ec192fccf0f81645a6c9b188c42e7c11ac93","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                              project_id\u003dproject_id,"},{"line_number":148,"context_line":"                              user_id\u003duser_id))"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def revoke_by_project_role_assignment(self, project_id, role_id):"},{"line_number":151,"context_line":"        self.driver.revoke(model.RevokeEvent(id\u003dmodel.EventIdentifier(),"},{"line_number":152,"context_line":"                                             project_id\u003dproject_id,"},{"line_number":153,"context_line":"                                             role_id\u003drole_id))"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FMs%3D","line":150,"updated":"2014-02-17 19:51:20.000000000","message":"needs a unit test.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6653ec192fccf0f81645a6c9b188c42e7c11ac93","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                                             project_id\u003dproject_id,"},{"line_number":153,"context_line":"                                             role_id\u003drole_id))"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def revoke_by_domain_role_assignment(self, domain_id, role_id):"},{"line_number":156,"context_line":"        self.driver.revoke(model.RevokeEvent(id\u003dmodel.EventIdentifier(),"},{"line_number":157,"context_line":"                                             domain_id\u003ddomain_id,"},{"line_number":158,"context_line":"                                             role_id\u003drole_id))"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FMk%3D","line":155,"updated":"2014-02-17 19:51:20.000000000","message":"needs a unit test.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3ad253f22506aa7a41b5237d24fc9ccfc8b0541d","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    def check_token(self, token_values):"},{"line_number":161,"context_line":"        \"\"\"Checks the values from a token against the revocation list"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        :param  token_values dictionary of values from a token,"},{"line_number":164,"context_line":"        normalized for differences between v2 and v3. The checked values are a"},{"line_number":165,"context_line":"         subset of the attributes of model.TokenEvent"},{"line_number":166,"context_line":"        :raises exception.TokenNotFound if the token is invalid"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fc0%3D","line":163,"updated":"2014-02-17 19:16:33.000000000","message":"this docstring has incorrect structure, run tox -e docs","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":181,"context_line":"    def get_events(self, filter\u003dNone):"},{"line_number":182,"context_line":"        \"\"\"return the revocation events, as a list of  objects"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        :param filter:   Not yet supported."},{"line_number":185,"context_line":"        :raises: keystone.exception,"},{"line_number":186,"context_line":"        :returns: A list of keystone.contrib.revoke.model.RevokeEvent"},{"line_number":187,"context_line":"                  that match the filter."}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FuM%3D","line":184,"updated":"2014-02-17 19:26:32.000000000","message":"why is it there if it\u0027s not supported?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":181,"context_line":"    def get_events(self, filter\u003dNone):"},{"line_number":182,"context_line":"        \"\"\"return the revocation events, as a list of  objects"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        :param filter:   Not yet supported."},{"line_number":185,"context_line":"        :raises: keystone.exception,"},{"line_number":186,"context_line":"        :returns: A list of keystone.contrib.revoke.model.RevokeEvent"},{"line_number":187,"context_line":"                  that match the filter."}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BV0%3D","line":184,"in_reply_to":"AAAAUX%2F%2B%2FuM%3D","updated":"2014-02-17 22:00:23.000000000","message":"++","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        \"\"\"return the revocation events, as a list of  objects"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        :param filter:   Not yet supported."},{"line_number":185,"context_line":"        :raises: keystone.exception,"},{"line_number":186,"context_line":"        :returns: A list of keystone.contrib.revoke.model.RevokeEvent"},{"line_number":187,"context_line":"                  that match the filter."},{"line_number":188,"context_line":"                  If no filter is specified, returns all events"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BVg%3D","line":185,"updated":"2014-02-17 22:00:23.000000000","message":"remove","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        :raises: keystone.exception,"},{"line_number":186,"context_line":"        :returns: A list of keystone.contrib.revoke.model.RevokeEvent"},{"line_number":187,"context_line":"                  that match the filter."},{"line_number":188,"context_line":"                  If no filter is specified, returns all events"},{"line_number":189,"context_line":"                  for tokens issued after the expiration cutoff."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Ftw%3D","line":188,"updated":"2014-02-17 19:26:32.000000000","message":"it does the same thing even if filter is specified.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fsc%3D","line":1,"updated":"2014-02-22 19:17:19.000000000","message":"remove vim line","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"EXTENSION_DATA \u003d {"},{"line_number":35,"context_line":"    \u0027name\u0027: \u0027OpenStack REVOKE API\u0027,"},{"line_number":36,"context_line":"    \u0027namespace\u0027: \u0027http://docs.openstack.org/identity/api/ext/\u0027"},{"line_number":37,"context_line":"                 \u0027OS-REVOKE/v1.0\u0027,"},{"line_number":38,"context_line":"    \u0027alias\u0027: \u0027OS-REVOKE\u0027,"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FsY%3D","line":35,"updated":"2014-02-22 19:17:19.000000000","message":"change REVOKE to \"revoke\"? or use REVOKE consistently (e.g., in the configuration.rst)","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \u0027namespace\u0027: \u0027http://docs.openstack.org/identity/api/ext/\u0027"},{"line_number":37,"context_line":"                 \u0027OS-REVOKE/v1.0\u0027,"},{"line_number":38,"context_line":"    \u0027alias\u0027: \u0027OS-REVOKE\u0027,"},{"line_number":39,"context_line":"    \u0027updated\u0027: \u00272013-07-07T12:00:0-00:00\u0027,"},{"line_number":40,"context_line":"    \u0027description\u0027: \u0027OpenStack Revoked Token Reporting mechanism.\u0027,"},{"line_number":41,"context_line":"    \u0027links\u0027: ["},{"line_number":42,"context_line":"        {"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FsU%3D","line":39,"updated":"2014-02-22 19:17:19.000000000","message":"suggest pick a more recent date... maybe the planned date for icehouse.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                 \u0027OS-REVOKE/v1.0\u0027,"},{"line_number":38,"context_line":"    \u0027alias\u0027: \u0027OS-REVOKE\u0027,"},{"line_number":39,"context_line":"    \u0027updated\u0027: \u00272013-07-07T12:00:0-00:00\u0027,"},{"line_number":40,"context_line":"    \u0027description\u0027: \u0027OpenStack Revoked Token Reporting mechanism.\u0027,"},{"line_number":41,"context_line":"    \u0027links\u0027: ["},{"line_number":42,"context_line":"        {"},{"line_number":43,"context_line":"            \u0027rel\u0027: \u0027describedby\u0027,"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FsM%3D","line":40,"updated":"2014-02-22 19:17:19.000000000","message":"lowercase \"revoked token reporting mechanism.\"","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        {"},{"line_number":43,"context_line":"            \u0027rel\u0027: \u0027describedby\u0027,"},{"line_number":44,"context_line":"            \u0027type\u0027: \u0027text/html\u0027,"},{"line_number":45,"context_line":"            \u0027href\u0027: (\u0027https://github.com/openstack/identity-api/blob/master/\u0027 +"},{"line_number":46,"context_line":"                     \u0027openstack-identity-api/v3/src/markdown/\u0027 +"},{"line_number":47,"context_line":"                     \u0027identity-api-v3-os-revoke-ext.md\u0027),"},{"line_number":48,"context_line":"        }, {"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FsE%3D","line":45,"updated":"2014-02-22 19:17:19.000000000","message":"remove +","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            \u0027rel\u0027: \u0027describedby\u0027,"},{"line_number":44,"context_line":"            \u0027type\u0027: \u0027text/html\u0027,"},{"line_number":45,"context_line":"            \u0027href\u0027: (\u0027https://github.com/openstack/identity-api/blob/master/\u0027 +"},{"line_number":46,"context_line":"                     \u0027openstack-identity-api/v3/src/markdown/\u0027 +"},{"line_number":47,"context_line":"                     \u0027identity-api-v3-os-revoke-ext.md\u0027),"},{"line_number":48,"context_line":"        }, {"},{"line_number":49,"context_line":"            \u0027rel\u0027: \u0027LIST\u0027,"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FsA%3D","line":46,"updated":"2014-02-22 19:17:19.000000000","message":"remove +","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        }, {"},{"line_number":49,"context_line":"            \u0027rel\u0027: \u0027LIST\u0027,"},{"line_number":50,"context_line":"            \u0027type\u0027: \u0027application/JSON\u0027,"},{"line_number":51,"context_line":"            \u0027href\u0027: (\u0027OS-REVOKE/events\u0027),"},{"line_number":52,"context_line":"        }"},{"line_number":53,"context_line":"    ]}"},{"line_number":54,"context_line":"extension.register_admin_extension(EXTENSION_DATA[\u0027alias\u0027], EXTENSION_DATA)"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fr4%3D","line":51,"updated":"2014-02-22 19:17:19.000000000","message":"remove ()","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _user_callback(self, service, resource_type, operation,"},{"line_number":71,"context_line":"                       payload):"},{"line_number":72,"context_line":"        self.revoke_by_user(payload[\u0027resource_info\u0027])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _role_callback(self, service, resource_type, operation,"},{"line_number":75,"context_line":"                       payload):"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FoA%3D","line":72,"updated":"2014-02-22 19:58:28.000000000","message":"seems like lambdas would work just as well for all these one-liners.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _user_callback(self, service, resource_type, operation,"},{"line_number":71,"context_line":"                       payload):"},{"line_number":72,"context_line":"        self.revoke_by_user(payload[\u0027resource_info\u0027])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _role_callback(self, service, resource_type, operation,"},{"line_number":75,"context_line":"                       payload):"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2FvD0%3D","line":72,"in_reply_to":"AAAAU3%2F%2F%2FoA%3D","updated":"2014-02-25 02:26:45.000000000","message":"The code with all the stacked lambdas was getting hard to read.  I split them out for clarity.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            [\u0027disabled\u0027, \u0027project\u0027, self._project_callback],"},{"line_number":115,"context_line":"            [\u0027disabled\u0027, \u0027domain\u0027, self._domain_callback]]"},{"line_number":116,"context_line":"        for cb in callbacks:"},{"line_number":117,"context_line":"            notifications.register_event_callback(cb[0], cb[1], cb[2])"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def revoke_by_user(self, user_id):"},{"line_number":120,"context_line":"        return self.driver.revoke(model.RevokeEvent(user_id\u003duser_id))"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Frw%3D","line":117,"updated":"2014-02-22 19:17:19.000000000","message":"change \"cb[0], cb[1], cb[2]\" to \"*cb\"","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            [\u0027disabled\u0027, \u0027project\u0027, self._project_callback],"},{"line_number":115,"context_line":"            [\u0027disabled\u0027, \u0027domain\u0027, self._domain_callback]]"},{"line_number":116,"context_line":"        for cb in callbacks:"},{"line_number":117,"context_line":"            notifications.register_event_callback(cb[0], cb[1], cb[2])"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def revoke_by_user(self, user_id):"},{"line_number":120,"context_line":"        return self.driver.revoke(model.RevokeEvent(user_id\u003duser_id))"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2FvDY%3D","line":117,"in_reply_to":"AAAAU3%2F%2F%2Frw%3D","updated":"2014-02-25 02:26:45.000000000","message":"Done","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    def check_token(self, token_values):"},{"line_number":149,"context_line":"        \"\"\"Checks the values from a token against the revocation list"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        :param  token_values dictionary of values from a token,"},{"line_number":152,"context_line":"         normalized for differences between v2 and v3. The checked values are a"},{"line_number":153,"context_line":"         subset of the attributes of model.TokenEvent"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fn4%3D","line":151,"updated":"2014-02-22 19:58:28.000000000","message":"add : after token_values","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":152,"context_line":"         normalized for differences between v2 and v3. The checked values are a"},{"line_number":153,"context_line":"         subset of the attributes of model.TokenEvent"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        :raises exception.TokenNotFound if the token is invalid"},{"line_number":156,"context_line":"        :returns no value returned"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"         \"\"\""}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fnw%3D","line":155,"updated":"2014-02-22 19:58:28.000000000","message":"add : after TokenNotFound.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":167,"context_line":"class Driver(object):"},{"line_number":168,"context_line":"    \"\"\"Interface for recording and reporting revocation Events.\"\"\""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @abc.abstractmethod"},{"line_number":171,"context_line":"    def get_events(self, last_fetch\u003dNone):"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fng%3D","line":168,"updated":"2014-02-22 19:58:28.000000000","message":"change \"Events\" to \"events\"","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    \"\"\"Interface for recording and reporting revocation Events.\"\"\""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @abc.abstractmethod"},{"line_number":171,"context_line":"    def get_events(self, last_fetch\u003dNone):"},{"line_number":172,"context_line":"        \"\"\"return the revocation events, as a list of  objects"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        :param last_fetch:   Time of last fetch.  Return all events newer."}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FnU%3D","line":171,"updated":"2014-02-22 19:58:28.000000000","message":"suggest change the name from \"last_fetch\" to \"newer_than\" or something more obvious.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        \"\"\"return the revocation events, as a list of  objects"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        :param last_fetch:   Time of last fetch.  Return all events newer."},{"line_number":175,"context_line":"        :raises: keystone.exception,"},{"line_number":176,"context_line":"        :returns: A list of keystone.contrib.revoke.model.RevokeEvent"},{"line_number":177,"context_line":"                  newer than `last_fetch.`"},{"line_number":178,"context_line":"                  If no last_fetch is specified, returns all events"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FnY%3D","line":175,"updated":"2014-02-22 19:58:28.000000000","message":"keystone.exception is a module not an exception.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZRc%3D","line":1,"updated":"2014-02-26 22:05:50.000000000","message":"remove vim line","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdBs%3D","line":3,"updated":"2014-02-26 15:51:13.000000000","message":"Remove copyright?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import abc"},{"line_number":19,"context_line":"import six"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdCE%3D","line":17,"updated":"2014-02-26 15:51:13.000000000","message":"Extra newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import abc"},{"line_number":19,"context_line":"import six"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from keystone.common import dependency"},{"line_number":22,"context_line":"from keystone.common import extension"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdB4%3D","line":19,"updated":"2014-02-26 15:51:13.000000000","message":"Missing newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from keystone import exception"},{"line_number":27,"context_line":"from keystone import notifications"},{"line_number":28,"context_line":"from keystone.openstack.common import log"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"CONF \u003d config.CONF"},{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FdA4%3D","line":29,"updated":"2014-02-26 15:51:13.000000000","message":"Missing newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":167,"context_line":"class Driver(object):"},{"line_number":168,"context_line":"    \"\"\"Interface for recording and reporting revocation Events.\"\"\""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @abc.abstractmethod"},{"line_number":171,"context_line":"    def get_events(self, last_fetch\u003dNone):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZQc%3D","line":168,"updated":"2014-02-26 22:05:50.000000000","message":"change \"Events\" to \"events\"","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    \"\"\"Interface for recording and reporting revocation Events.\"\"\""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @abc.abstractmethod"},{"line_number":171,"context_line":"    def get_events(self, last_fetch\u003dNone):"},{"line_number":172,"context_line":"        \"\"\"return the revocation events, as a list of  objects"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        :param last_fetch:   Time of last fetch.  Return all events newer."}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZQM%3D","line":171,"updated":"2014-02-26 22:05:50.000000000","message":"suggest change the name from \"last_fetch\" to \"newer_than\" or something more obvious.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @abc.abstractmethod"},{"line_number":171,"context_line":"    def get_events(self, last_fetch\u003dNone):"},{"line_number":172,"context_line":"        \"\"\"return the revocation events, as a list of  objects"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        :param last_fetch:   Time of last fetch.  Return all events newer."},{"line_number":175,"context_line":"        :returns: A list of keystone.contrib.revoke.model.RevokeEvent"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FY7g%3D","line":172,"updated":"2014-02-26 22:05:50.000000000","message":"looks like there\u0027s an extra space before \"objects\"?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                  newer than `last_fetch.`"},{"line_number":177,"context_line":"                  If no last_fetch is specified, returns all events"},{"line_number":178,"context_line":"                  for tokens issued after the expiration cutoff."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        \"\"\""},{"line_number":182,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FY8E%3D","line":179,"updated":"2014-02-26 22:05:50.000000000","message":"remove one of these blank lines.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":164,"context_line":"class Driver(object):"},{"line_number":165,"context_line":"    \"\"\"Interface for recording and reporting revocation Events.\"\"\""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2BjQ%3D","line":164,"updated":"2014-02-27 02:22:07.000000000","message":"change \"Events\" to \"events\"","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":164,"context_line":"class Driver(object):"},{"line_number":165,"context_line":"    \"\"\"Interface for recording and reporting revocation Events.\"\"\""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @abc.abstractmethod"},{"line_number":168,"context_line":"    def get_events(self, last_fetch\u003dNone):"},{"line_number":169,"context_line":"        \"\"\"return the revocation events, as a list of  objects"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2BjM%3D","line":167,"updated":"2014-02-27 02:22:07.000000000","message":"suggest change the name from \"last_fetch\" to \"newer_than\" or something more obvious.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":165,"context_line":"    \"\"\"Interface for recording and reporting revocation Events.\"\"\""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @abc.abstractmethod"},{"line_number":168,"context_line":"    def get_events(self, last_fetch\u003dNone):"},{"line_number":169,"context_line":"        \"\"\"return the revocation events, as a list of  objects"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :param last_fetch:   Time of last fetch.  Return all events newer."}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2BjI%3D","line":168,"updated":"2014-02-27 02:22:07.000000000","message":"looks like there\u0027s an extra space before \"objects\"?","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        :returns: A list of keystone.contrib.revoke.model.RevokeEvent"},{"line_number":173,"context_line":"                  newer than `last_fetch.`"},{"line_number":174,"context_line":"                  If no last_fetch is specified, returns all events"},{"line_number":175,"context_line":"                  for tokens issued after the expiration cutoff."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2BjA%3D","line":175,"updated":"2014-02-27 02:22:07.000000000","message":"remove one of these blank lines.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def revoked_before_cutoff():"},{"line_number":58,"context_line":"    expire_delta \u003d datetime.timedelta("},{"line_number":59,"context_line":"        seconds\u003dCONF.token.expiration + (60 * 30))"},{"line_number":60,"context_line":"    oldest \u003d timeutils.utcnow() - expire_delta"},{"line_number":61,"context_line":"    return oldest"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F90Y%3D","line":59,"updated":"2014-02-27 04:59:37.000000000","message":"I think I commented on this before but we should explain the reason behind adding 1800 seconds to the configuration value. This *could* be misleading to the users?","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                     \u0027openstack-identity-api/v3/src/markdown/\u0027"},{"line_number":46,"context_line":"                     \u0027identity-api-v3-os-revoke-ext.md\u0027),"},{"line_number":47,"context_line":"        }, {"},{"line_number":48,"context_line":"            \u0027rel\u0027: \u0027LIST\u0027,"},{"line_number":49,"context_line":"            \u0027type\u0027: \u0027application/JSON\u0027,"},{"line_number":50,"context_line":"            \u0027href\u0027: \u0027OS-REVOKE/events\u0027,"},{"line_number":51,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft8Q%3D","line":48,"updated":"2014-02-28 20:21:47.000000000","message":"why is this uppercase?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        }, {"},{"line_number":48,"context_line":"            \u0027rel\u0027: \u0027LIST\u0027,"},{"line_number":49,"context_line":"            \u0027type\u0027: \u0027application/JSON\u0027,"},{"line_number":50,"context_line":"            \u0027href\u0027: \u0027OS-REVOKE/events\u0027,"},{"line_number":51,"context_line":"        }"},{"line_number":52,"context_line":"    ]}"},{"line_number":53,"context_line":"extension.register_admin_extension(EXTENSION_DATA[\u0027alias\u0027], EXTENSION_DATA)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft70%3D","line":50,"updated":"2014-02-28 20:21:47.000000000","message":"other hrefs are asolute","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        }, {"},{"line_number":48,"context_line":"            \u0027rel\u0027: \u0027LIST\u0027,"},{"line_number":49,"context_line":"            \u0027type\u0027: \u0027application/JSON\u0027,"},{"line_number":50,"context_line":"            \u0027href\u0027: \u0027OS-REVOKE/events\u0027,"},{"line_number":51,"context_line":"        }"},{"line_number":52,"context_line":"    ]}"},{"line_number":53,"context_line":"extension.register_admin_extension(EXTENSION_DATA[\u0027alias\u0027], EXTENSION_DATA)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Frh4%3D","line":50,"in_reply_to":"AAAAVX%2F%2Ft70%3D","updated":"2014-03-01 06:22:38.000000000","message":"Gone","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":54,"context_line":"extension.register_public_extension(EXTENSION_DATA[\u0027alias\u0027], EXTENSION_DATA)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def revoked_before_cutoff():"},{"line_number":58,"context_line":"    \"\"\"Calculate a 30 minute time buffer before dropping events"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"       There is no need to revoke tokens that are beyond their expiration"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft6s%3D","line":57,"updated":"2014-02-28 20:21:47.000000000","message":"this reads like it\u0027s going to return a boolean, and that it\u0027s a @property on an event object -- suggest renaming or moving","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    expire_delta \u003d datetime.timedelta("},{"line_number":67,"context_line":"        seconds\u003dCONF.token.expiration + (60 * 30))"},{"line_number":68,"context_line":"    oldest \u003d timeutils.utcnow() - expire_delta"},{"line_number":69,"context_line":"    return oldest"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft7M%3D","line":67,"updated":"2014-02-28 20:21:47.000000000","message":"seems like this should be configurable; if i can guarantee +/- 1s of clock skew, why would i bother holding onto so many extra events?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    expire_delta \u003d datetime.timedelta("},{"line_number":67,"context_line":"        seconds\u003dCONF.token.expiration + (60 * 30))"},{"line_number":68,"context_line":"    oldest \u003d timeutils.utcnow() - expire_delta"},{"line_number":69,"context_line":"    return oldest"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FrpE%3D","line":67,"in_reply_to":"AAAAVX%2F%2Ft7M%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        super(Manager, self).__init__(CONF.revoke.driver)"},{"line_number":82,"context_line":"        self._register_listeners()"},{"line_number":83,"context_line":"        self._revoke_map \u003d model.RevokeTree()"},{"line_number":84,"context_line":"        self._last_fetch \u003d None"},{"line_number":85,"context_line":"        self._current_events \u003d []"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _user_callback(self, service, resource_type, operation,"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft6E%3D","line":84,"updated":"2014-02-28 20:21:47.000000000","message":"this is very alarming -- why is a request attribute being assigned to an instance of a manager?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        #the Processor.  However, it is wasteful to have one copy of"},{"line_number":169,"context_line":"        #the map per greenthread, as it would require processing every"},{"line_number":170,"context_line":"        #event every time. The logic, if required, would look like the"},{"line_number":171,"context_line":"        #commands in comments:"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        #if timeout"},{"line_number":174,"context_line":"        #get lock"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ftxk%3D","line":171,"updated":"2014-02-28 21:04:05.000000000","message":"Based on IRC converstion, if this logic needs to be \"looked at\" or possibly \"added\" in, there should be an indication that we should evaluate. If it isn\u0027t needed, could this method merge with _update_revoke_map ?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            #release lock"},{"line_number":177,"context_line":"            #return"},{"line_number":178,"context_line":"        self._update_revoke_map()"},{"line_number":179,"context_line":"        #release lock"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _update_revoke_map(self):"},{"line_number":182,"context_line":"        cutoff \u003d revoked_before_cutoff()"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft5k%3D","line":179,"updated":"2014-02-28 20:21:47.000000000","message":"just use dogpile..?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            #release lock"},{"line_number":177,"context_line":"            #return"},{"line_number":178,"context_line":"        self._update_revoke_map()"},{"line_number":179,"context_line":"        #release lock"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _update_revoke_map(self):"},{"line_number":182,"context_line":"        cutoff \u003d revoked_before_cutoff()"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Frh8%3D","line":179,"in_reply_to":"AAAAVX%2F%2Ft5k%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        #release lock"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _update_revoke_map(self):"},{"line_number":182,"context_line":"        cutoff \u003d revoked_before_cutoff()"},{"line_number":183,"context_line":"        for e in self._current_events:"},{"line_number":184,"context_line":"            if e.revoked_at \u003c cutoff:"},{"line_number":185,"context_line":"                self._revoke_map.remove(e)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft44%3D","line":182,"updated":"2014-02-28 20:21:47.000000000","message":"if you\u0027re only using that method here, then just do the math here","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        #release lock"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _update_revoke_map(self):"},{"line_number":182,"context_line":"        cutoff \u003d revoked_before_cutoff()"},{"line_number":183,"context_line":"        for e in self._current_events:"},{"line_number":184,"context_line":"            if e.revoked_at \u003c cutoff:"},{"line_number":185,"context_line":"                self._revoke_map.remove(e)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FrpY%3D","line":182,"in_reply_to":"AAAAVX%2F%2Ft44%3D","updated":"2014-03-01 06:22:38.000000000","message":"Its also used in the backedn to calculcate when we can remove events from the backing store.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":13,"context_line":"import abc"},{"line_number":14,"context_line":"import datetime"},{"line_number":15,"context_line":"import six"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.common import dependency"},{"line_number":19,"context_line":"from keystone.common import extension"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F59Q%3D","line":16,"updated":"2014-03-03 15:23:04.000000000","message":"Remove newline here and put in right before \u0027import six\u0027.  six isn\u0027t in the stdlib.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":13,"context_line":"import abc"},{"line_number":14,"context_line":"import datetime"},{"line_number":15,"context_line":"import six"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.common import dependency"},{"line_number":19,"context_line":"from keystone.common import extension"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3S8%3D","line":16,"in_reply_to":"AAAAVn%2F%2F59Q%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        self._store.configure(backing_store\u003d_KVS_BACKEND, **kwargs)"},{"line_number":69,"context_line":"        self._last_fetch \u003d None"},{"line_number":70,"context_line":"        self._current_events \u003d []"},{"line_number":71,"context_line":"        self._revoke_map \u003d model.RevokeTree()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def synchronize_revoke_map(self, driver):"},{"line_number":74,"context_line":"        cutoff \u003d revoked_before_cutoff_time()"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5fU%3D","line":71,"updated":"2014-03-03 15:23:04.000000000","message":"This should not have a leading underscore since it is used outside of this class.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0af7b8d0bc91da6283895605b8a72bab27f547be","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self._register_listeners()"},{"line_number":100,"context_line":"        self._cache \u003d _Cache()"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _user_callback(self, service, resource_type, operation,"},{"line_number":103,"context_line":"                       payload):"},{"line_number":104,"context_line":"        self.revoke_by_user(payload[\u0027resource_info\u0027])"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzZA%3D","line":102,"updated":"2014-03-04 02:02:43.000000000","message":"++, this whole manager class is looking much better","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f86ffe8220f5723f6350f6105d791433ea3a2d7d","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self._register_listeners()"},{"line_number":100,"context_line":"        self._cache \u003d _Cache()"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _user_callback(self, service, resource_type, operation,"},{"line_number":103,"context_line":"                       payload):"},{"line_number":104,"context_line":"        self.revoke_by_user(payload[\u0027resource_info\u0027])"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVn%2F%2FzRA%3D","line":102,"in_reply_to":"AAAAVn%2F%2FzZA%3D","updated":"2014-03-04 02:28:09.000000000","message":"thanks","commit_id":"999fa927ed1da38a78624ddf09e117115fa61a89"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5f537921bb8214ceeaa07a9e52f8a112b7f2000c","unresolved":false,"context_lines":[{"line_number":185,"context_line":"         subset of the attributes of model.TokenEvent"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        :raises exception.TokenNotFound: if the token is invalid"},{"line_number":188,"context_line":"        :returns: no value returned"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"         \"\"\""},{"line_number":191,"context_line":"        self._cache.synchronize_revoke_map(self.driver)"}],"source_content_type":"text/x-python","patch_set":77,"id":"AAAAVn%2F%2Fyxg%3D","line":188,"updated":"2014-03-04 03:58:45.000000000","message":"remove the return docstring?","commit_id":"90b4e62889af4c714d1cd8c5a67b24482727cc2f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a43cd07f3004e5c7363c681c00d95850bd77bce1","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class _Cache(object):"},{"line_number":66,"context_line":"    def __init__(self, **kwargs):"},{"line_number":67,"context_line":"        self._store \u003d kvs.get_key_value_store(\u0027os-revoke-driver2\u0027)"},{"line_number":68,"context_line":"        self._store.configure(backing_store\u003d_KVS_BACKEND, **kwargs)"},{"line_number":69,"context_line":"        self._last_fetch \u003d None"},{"line_number":70,"context_line":"        self._current_events \u003d []"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FxUc%3D","line":67,"updated":"2014-03-04 07:50:11.000000000","message":"Suggest perhaps using \u0027os-revoke-syncronize\u0027 instead of \"...driver2\")","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"188cf4e83fca0cfd7411d800e3fc264d7c1a6b8a","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class _Cache(object):"},{"line_number":66,"context_line":"    def __init__(self, **kwargs):"},{"line_number":67,"context_line":"        self._store \u003d kvs.get_key_value_store(\u0027os-revoke-driver2\u0027)"},{"line_number":68,"context_line":"        self._store.configure(backing_store\u003d_KVS_BACKEND, **kwargs)"},{"line_number":69,"context_line":"        self._last_fetch \u003d None"},{"line_number":70,"context_line":"        self._current_events \u003d []"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2Fuis%3D","line":67,"in_reply_to":"AAAAVn%2F%2FxUc%3D","updated":"2014-03-04 13:52:56.000000000","message":"Done","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":51,"context_line":"extension.register_public_extension(EXTENSION_DATA[\u0027alias\u0027], EXTENSION_DATA)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def revoked_before_cutoff_time():"},{"line_number":55,"context_line":"    expire_delta \u003d datetime.timedelta("},{"line_number":56,"context_line":"        seconds\u003dCONF.token.expiration + CONF.revoke.expiration_buffer)"},{"line_number":57,"context_line":"    oldest \u003d timeutils.utcnow() - expire_delta"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FpMc%3D","line":54,"updated":"2014-03-04 23:26:37.000000000","message":"this really doesn\u0027t need to be a standalone method","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                              domain_id\u003ddomain_id,"},{"line_number":165,"context_line":"                              project_id\u003dproject_id))"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def revoke_by_user_and_project(self, user_id, project_id):"},{"line_number":168,"context_line":"        self.driver.revoke("},{"line_number":169,"context_line":"            model.RevokeEvent(project_id\u003dproject_id,"},{"line_number":170,"context_line":"                              user_id\u003duser_id))"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FpHk%3D","line":167,"updated":"2014-03-04 23:26:37.000000000","message":"this isn\u0027t used - remove it","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            model.RevokeEvent(project_id\u003dproject_id,"},{"line_number":170,"context_line":"                              user_id\u003duser_id))"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def revoke_by_project_role_assignment(self, project_id, role_id):"},{"line_number":173,"context_line":"        self.driver.revoke(model.RevokeEvent(project_id\u003dproject_id,"},{"line_number":174,"context_line":"                                             role_id\u003drole_id))"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FpH0%3D","line":172,"updated":"2014-03-04 23:26:37.000000000","message":"this isn\u0027t used - remove it","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        self.driver.revoke(model.RevokeEvent(project_id\u003dproject_id,"},{"line_number":174,"context_line":"                                             role_id\u003drole_id))"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def revoke_by_domain_role_assignment(self, domain_id, role_id):"},{"line_number":177,"context_line":"        self.driver.revoke(model.RevokeEvent(domain_id\u003ddomain_id,"},{"line_number":178,"context_line":"                                             role_id\u003drole_id))"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FpDw%3D","line":176,"updated":"2014-03-04 23:26:37.000000000","message":"this isn\u0027t used - remove it","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        :param  token_values: dictionary of values from a token,"},{"line_number":184,"context_line":"         normalized for differences between v2 and v3. The checked values are a"},{"line_number":185,"context_line":"         subset of the attributes of model.TokenEvent"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        :raises exception.TokenNotFound: if the token is invalid"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FpC4%3D","line":185,"updated":"2014-03-04 23:26:37.000000000","message":"the method signature of check_token should reflect the actual expected attributes, rather than just a dict","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"keystone/contrib/revoke/migrate_repo/migrate.cfg":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7b32013c0c4ebdb17d1ca50d4488ceac064742d1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[db_settings]"},{"line_number":2,"context_line":"# Used to identify which repository this database is versioned under."},{"line_number":3,"context_line":"# You can use the name of your project."},{"line_number":4,"context_line":"repository_id\u003dexample"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"# The name of the database table used to track the schema version."},{"line_number":7,"context_line":"# This name shouldn\u0027t already be used by your project."}],"source_content_type":"text/x-ttcn-cfg","patch_set":3,"id":"AAAATn%2F%2BETw%3D","line":4,"updated":"2013-12-02 21:44:33.000000000","message":"s/example/revoke","commit_id":"84ca2cf9f5a132e2715c31b65b74d9f6f7e07df2"}],"keystone/contrib/revoke/migrate_repo/versions/001_revoke_table.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F9z0%3D","line":1,"updated":"2014-02-27 04:59:37.000000000","message":"remove","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea202dfb5a0850a989ffb80930b8422444229457","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":61,"id":"AAAAVX%2F%2F9zw%3D","line":3,"updated":"2014-02-27 04:59:37.000000000","message":"remove","commit_id":"64f6ef77feffedc2c78622faa1469cd84a3a2beb"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":20,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    # catalog"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    service_table \u003d sql.Table("},{"line_number":25,"context_line":"        \u0027revocation_event\u0027,"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft4U%3D","line":22,"updated":"2014-02-28 20:21:47.000000000","message":"?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":20,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    # catalog"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    service_table \u003d sql.Table("},{"line_number":25,"context_line":"        \u0027revocation_event\u0027,"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Fruo%3D","line":22,"in_reply_to":"AAAAVX%2F%2Ft4U%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime()),"},{"line_number":35,"context_line":"        sql.Column(\u0027revoked_at\u0027, sql.DateTime(), nullable\u003dFalse))"},{"line_number":36,"context_line":"    service_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def downgrade(migrate_engine):"},{"line_number":40,"context_line":"    # Operations to reverse the above upgrade go here."}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F94g%3D","line":37,"updated":"2014-03-03 05:44:07.000000000","message":"you will want an index on at least revoked_at, descending.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime()),"},{"line_number":35,"context_line":"        sql.Column(\u0027revoked_at\u0027, sql.DateTime(), nullable\u003dFalse))"},{"line_number":36,"context_line":"    service_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def downgrade(migrate_engine):"},{"line_number":40,"context_line":"    # Operations to reverse the above upgrade go here."}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3Ro%3D","line":37,"in_reply_to":"AAAAVn%2F%2F94g%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done, although not \"descending\" as a quick informal poll deemed it not really necessary.   I didn\u0027t want to have to create the index name myself, as that is something that seems to be RDBMS specific.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"41aa85a3bde1d220096a74e205e25ac9ad1c097a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    tables \u003d [\u0027revocation_event\u0027]"},{"line_number":45,"context_line":"    for t in tables:"},{"line_number":46,"context_line":"        table \u003d sql.Table(t, meta, autoload\u003dTrue)"},{"line_number":47,"context_line":"        table.drop(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":78,"id":"AAAAVn%2F%2Fye8%3D","line":45,"updated":"2014-03-04 04:53:03.000000000","message":"nit: why loop over a list of 1 item?","commit_id":"0eba4e5da0221d154eb06965653e186c51c3b21f"}],"keystone/contrib/revoke/model.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2043bcc33dfb126ccb390f44629287b4f831c989","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class EventIdentifier():"},{"line_number":56,"context_line":"    def __init__(self, value\u003dNone):"},{"line_number":57,"context_line":"        if value is None:"},{"line_number":58,"context_line":"            self._value \u003d uuid.uuid4()"},{"line_number":59,"context_line":"        else:"},{"line_number":60,"context_line":"            self._value \u003d value"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B6Hc%3D","line":57,"updated":"2014-01-20 21:26:46.000000000","message":"self._value \u003d value or uuid.uuid4()?","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fe0b264b37876c2fdbf17e4476865d3eb7d441de","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class EventIdentifier():"},{"line_number":56,"context_line":"    def __init__(self, value\u003dNone):"},{"line_number":57,"context_line":"        if value is None:"},{"line_number":58,"context_line":"            self._value \u003d uuid.uuid4()"},{"line_number":59,"context_line":"        else:"},{"line_number":60,"context_line":"            self._value \u003d value"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B5vc%3D","line":57,"in_reply_to":"AAAAUH%2F%2B6Hc%3D","updated":"2014-01-20 22:25:24.000000000","message":"Done","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2043bcc33dfb126ccb390f44629287b4f831c989","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            self._value \u003d value"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __str__(self):"},{"line_number":63,"context_line":"        return self._value.__str__()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B6Ho%3D","line":63,"updated":"2014-01-20 21:26:46.000000000","message":"return str(self._value)?","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fe0b264b37876c2fdbf17e4476865d3eb7d441de","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            self._value \u003d value"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __str__(self):"},{"line_number":63,"context_line":"        return self._value.__str__()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B5vY%3D","line":63,"in_reply_to":"AAAAUH%2F%2B6Ho%3D","updated":"2014-01-20 22:25:24.000000000","message":"Done","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            setattr(self, k, v)"},{"line_number":36,"context_line":"        self.revoked_at \u003d timeutils.isotime()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def as_extenstion(self, event, key_name, extension_name):"},{"line_number":39,"context_line":"        trust_id \u003d event.get(key_name)"},{"line_number":40,"context_line":"        if trust_id is not None:"},{"line_number":41,"context_line":"            event.pop(key_name)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5Zw%3D","line":38,"updated":"2014-01-20 23:55:32.000000000","message":"change \"as_extenstion\" to \"as_extension\"","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        event \u003d dict((key, value) for key, value in self.__dict__.iteritems()"},{"line_number":46,"context_line":"                     if not callable(value) and"},{"line_number":47,"context_line":"                     not key.startswith(\u0027__\u0027) and"},{"line_number":48,"context_line":"                     not key \u003d\u003d \"self\")"},{"line_number":49,"context_line":"        event[\u0027id\u0027] \u003d self.id.__str__()"},{"line_number":50,"context_line":"        self.as_extenstion(event, \u0027trust_id\u0027, \u0027OS-TRUST\u0027)"},{"line_number":51,"context_line":"        self.as_extenstion(event, \u0027consumer_id\u0027, \u0027OS-OAUTH1\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5aE%3D","line":48,"updated":"2014-01-20 23:55:32.000000000","message":"use \u0027 for strings for consistency","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        return event"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class EventIdentifier():"},{"line_number":56,"context_line":"    def __init__(self, value\u003dNone):"},{"line_number":57,"context_line":"        self._value \u003d value or uuid.uuid4()"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5aY%3D","line":55,"updated":"2014-01-20 23:55:32.000000000","message":"suggest derive from object","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cdd671a930fb6fce5886fc6bf1252f4125a2421f","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import uuid"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BfQ%3D","line":20,"updated":"2014-02-17 21:51:34.000000000","message":"do we only need one line between imports? \n\n    import uuid \n    \n    from keystone.openstack.common import timeutils","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                 project_id\u003dNone,"},{"line_number":32,"context_line":"                 trust_id\u003dNone,"},{"line_number":33,"context_line":"                 consumer_id\u003dNone,"},{"line_number":34,"context_line":"                 access_token_id\u003dNone):"},{"line_number":35,"context_line":"        for k, v in locals().copy().iteritems():"},{"line_number":36,"context_line":"            setattr(self, k, v)"},{"line_number":37,"context_line":"        self.revoked_at \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BTA%3D","line":34,"updated":"2014-02-17 22:00:23.000000000","message":"please use all 79 char","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6653ec192fccf0f81645a6c9b188c42e7c11ac93","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        for k, v in locals().copy().iteritems():"},{"line_number":36,"context_line":"            setattr(self, k, v)"},{"line_number":37,"context_line":"        self.revoked_at \u003d timeutils.utcnow()"},{"line_number":38,"context_line":"        if issued_before is None:"},{"line_number":39,"context_line":"            self.issued_before \u003d self.revoked_at"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def to_dict(self):"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FMI%3D","line":38,"updated":"2014-02-17 19:51:20.000000000","message":"there should be a unit test for this.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cdd671a930fb6fce5886fc6bf1252f4125a2421f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        if issued_before is None:"},{"line_number":39,"context_line":"            self.issued_before \u003d self.revoked_at"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def to_dict(self):"},{"line_number":42,"context_line":"        keys \u003d [\u0027user_id\u0027,"},{"line_number":43,"context_line":"                \u0027role_id\u0027,"},{"line_number":44,"context_line":"                \u0027domain_id\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Be0%3D","line":41,"updated":"2014-02-17 21:51:34.000000000","message":"Doc strings and return values?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                \u0027domain_id\u0027,"},{"line_number":45,"context_line":"                \u0027project_id\u0027]"},{"line_number":46,"context_line":"        event \u003d dict((key, self.__dict__[key]) for key in keys)"},{"line_number":47,"context_line":"        event[\u0027id\u0027] \u003d self.id.__str__()"},{"line_number":48,"context_line":"        if self.trust_id is not None:"},{"line_number":49,"context_line":"            event[\u0027OS-TRUST:trust_id\u0027] \u003d self.trust_id"},{"line_number":50,"context_line":"        if self.consumer_id is not None:"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BSk%3D","line":47,"updated":"2014-02-17 22:00:23.000000000","message":"events don\u0027t have IDs","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                \u0027domain_id\u0027,"},{"line_number":45,"context_line":"                \u0027project_id\u0027]"},{"line_number":46,"context_line":"        event \u003d dict((key, self.__dict__[key]) for key in keys)"},{"line_number":47,"context_line":"        event[\u0027id\u0027] \u003d self.id.__str__()"},{"line_number":48,"context_line":"        if self.trust_id is not None:"},{"line_number":49,"context_line":"            event[\u0027OS-TRUST:trust_id\u0027] \u003d self.trust_id"},{"line_number":50,"context_line":"        if self.consumer_id is not None:"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B8Fk%3D","line":47,"in_reply_to":"AAAAUX%2F%2B%2BSk%3D","updated":"2014-02-19 18:41:05.000000000","message":"This is not intended to be exported to the outside world, but is necessary for SQL.  SQL requires a unique primary key.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6653ec192fccf0f81645a6c9b188c42e7c11ac93","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        if self.trust_id is not None:"},{"line_number":49,"context_line":"            event[\u0027OS-TRUST:trust_id\u0027] \u003d self.trust_id"},{"line_number":50,"context_line":"        if self.consumer_id is not None:"},{"line_number":51,"context_line":"            event[\u0027OS-OAUTH1:consumer_id\u0027] \u003d self.consumer_id"},{"line_number":52,"context_line":"        if self.consumer_id is not None:"},{"line_number":53,"context_line":"            event[\u0027OS-OAUTH1:access_token_id\u0027] \u003d self.access_token_id"},{"line_number":54,"context_line":"        if self.expires_at is not None:"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FMA%3D","line":51,"updated":"2014-02-17 19:51:20.000000000","message":"there should be a unit test for this.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6653ec192fccf0f81645a6c9b188c42e7c11ac93","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        if self.consumer_id is not None:"},{"line_number":51,"context_line":"            event[\u0027OS-OAUTH1:consumer_id\u0027] \u003d self.consumer_id"},{"line_number":52,"context_line":"        if self.consumer_id is not None:"},{"line_number":53,"context_line":"            event[\u0027OS-OAUTH1:access_token_id\u0027] \u003d self.access_token_id"},{"line_number":54,"context_line":"        if self.expires_at is not None:"},{"line_number":55,"context_line":"            event[\u0027expires_at\u0027] \u003d timeutils.isotime(self.expires_at,"},{"line_number":56,"context_line":"                                                    subsecond\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FL8%3D","line":53,"updated":"2014-02-17 19:51:20.000000000","message":"needs a unit test.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                                                       subsecond\u003dTrue)"},{"line_number":60,"context_line":"        return event"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def matches(self, token_values):"},{"line_number":63,"context_line":"        \"\"\"See if the token matches the revocation self."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        Compare each attribute from the self with the corresponding"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BTI%3D","line":62,"updated":"2014-02-17 22:00:23.000000000","message":"i\u0027m curious as to why any of this logic is on the service side...","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                                                       subsecond\u003dTrue)"},{"line_number":60,"context_line":"        return event"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def matches(self, token_values):"},{"line_number":63,"context_line":"        \"\"\"See if the token matches the revocation self."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        Compare each attribute from the self with the corresponding"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B8DY%3D","line":62,"in_reply_to":"AAAAUX%2F%2B%2BTI%3D","updated":"2014-02-19 18:41:05.000000000","message":"It is actually not necessary anymore.  It is only ever executed by test code, to ensure that the logic from \"revoke by events\" patch is still valid.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        return event"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def matches(self, token_values):"},{"line_number":63,"context_line":"        \"\"\"See if the token matches the revocation self."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        Compare each attribute from the self with the corresponding"},{"line_number":66,"context_line":"        value from the token.  If the self does not have a value for"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FcI%3D","line":63,"updated":"2014-02-17 19:26:32.000000000","message":"change \"self\" to \"event\"","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def matches(self, token_values):"},{"line_number":63,"context_line":"        \"\"\"See if the token matches the revocation self."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        Compare each attribute from the self with the corresponding"},{"line_number":66,"context_line":"        value from the token.  If the self does not have a value for"},{"line_number":67,"context_line":"        the attribute, a match is still possible.  If the self has a"},{"line_number":68,"context_line":"        value for the attribute, and it does not match the token, no match"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FcA%3D","line":65,"updated":"2014-02-17 19:26:32.000000000","message":"change \"the self\" to \"this object\". This applies throughout this paragraph.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        value for the attribute, and it does not match the token, no match"},{"line_number":69,"context_line":"        is possible, so skip the remaining checks."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        :param self one revocation self to match"},{"line_number":72,"context_line":"        :param token_values dictionary with set of values taken from the"},{"line_number":73,"context_line":"        token"},{"line_number":74,"context_line":"        :returns if the token matches the revocation self, indicating the"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fb8%3D","line":71,"updated":"2014-02-17 19:26:32.000000000","message":"remove this.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        is possible, so skip the remaining checks."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        :param self one revocation self to match"},{"line_number":72,"context_line":"        :param token_values dictionary with set of values taken from the"},{"line_number":73,"context_line":"        token"},{"line_number":74,"context_line":"        :returns if the token matches the revocation self, indicating the"},{"line_number":75,"context_line":"        token has been revoked"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fb4%3D","line":72,"updated":"2014-02-17 19:26:32.000000000","message":"add : after \"token_values\".","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        :param self one revocation self to match"},{"line_number":72,"context_line":"        :param token_values dictionary with set of values taken from the"},{"line_number":73,"context_line":"        token"},{"line_number":74,"context_line":"        :returns if the token matches the revocation self, indicating the"},{"line_number":75,"context_line":"        token has been revoked"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fb0%3D","line":74,"updated":"2014-02-17 19:26:32.000000000","message":"add : after \"returns\"","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        #The token has three attributes that can match the user_id"},{"line_number":82,"context_line":"        if self.user_id is not None:"},{"line_number":83,"context_line":"            user_id_matched \u003d False"},{"line_number":84,"context_line":"            for attribute_name in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":85,"context_line":"                if self.user_id \u003d\u003d token_values[attribute_name]:"},{"line_number":86,"context_line":"                    user_id_matched \u003d True"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fbk%3D","line":83,"updated":"2014-02-17 19:26:32.000000000","message":"suggest use the existing \"matched\" variable instead of introducing a new one for the same thing.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        #The token has three attributes that can match the user_id"},{"line_number":82,"context_line":"        if self.user_id is not None:"},{"line_number":83,"context_line":"            user_id_matched \u003d False"},{"line_number":84,"context_line":"            for attribute_name in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":85,"context_line":"                if self.user_id \u003d\u003d token_values[attribute_name]:"},{"line_number":86,"context_line":"                    user_id_matched \u003d True"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B8CU%3D","line":83,"in_reply_to":"AAAAUX%2F%2B%2Fbk%3D","updated":"2014-02-19 18:41:05.000000000","message":"Can\u0027t.  Has a different meaning, and we can\u0027t reset matched at this point.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            else:"},{"line_number":91,"context_line":"                matched \u003d True"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        #The token has two attributes that can match the domain_id"},{"line_number":94,"context_line":"        if self.domain_id is not None:"},{"line_number":95,"context_line":"            dom_id_matched \u003d False"},{"line_number":96,"context_line":"            for attribute_name in [\u0027user_domain_id\u0027, \u0027project_domain_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BTQ%3D","line":93,"updated":"2014-02-17 22:00:23.000000000","message":"there\u0027s actually 3","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6653ec192fccf0f81645a6c9b188c42e7c11ac93","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            dom_id_matched \u003d False"},{"line_number":96,"context_line":"            for attribute_name in [\u0027user_domain_id\u0027, \u0027project_domain_id\u0027]:"},{"line_number":97,"context_line":"                if self.domain_id \u003d\u003d token_values[attribute_name]:"},{"line_number":98,"context_line":"                    dom_id_matched \u003d True"},{"line_number":99,"context_line":"                    break"},{"line_number":100,"context_line":"            if not dom_id_matched:"},{"line_number":101,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FL0%3D","line":98,"updated":"2014-02-17 19:51:20.000000000","message":"this isn\u0027t covered by unit tests.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return matched"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class EventIdentifier(object):"},{"line_number":137,"context_line":"    def __init__(self, value\u003dNone):"},{"line_number":138,"context_line":"        self._value \u003d value or uuid.uuid4()"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BUI%3D","line":136,"updated":"2014-02-17 22:00:23.000000000","message":"i have yet to see a purpose for this - suggest deleting the class","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return matched"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class EventIdentifier(object):"},{"line_number":137,"context_line":"    def __init__(self, value\u003dNone):"},{"line_number":138,"context_line":"        self._value \u003d value or uuid.uuid4()"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B760%3D","line":136,"in_reply_to":"AAAAUX%2F%2B%2BUI%3D","updated":"2014-02-19 18:41:05.000000000","message":"It encapsulates the logic for defaulting from uuid but allows the id to be set if explicit.  We should be using this pattern elsewhere.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f62defc57d9c647bfe5d8d3567122ba7f425548","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class EventIdentifier(object):"},{"line_number":137,"context_line":"    def __init__(self, value\u003dNone):"},{"line_number":138,"context_line":"        self._value \u003d value or uuid.uuid4()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def __str__(self):"},{"line_number":141,"context_line":"        return str(self._value)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BTk%3D","line":138,"updated":"2014-02-17 22:00:23.000000000","message":"fwiw, this will produce different UUID\u0027s than we normally use","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class EventIdentifier(object):"},{"line_number":137,"context_line":"    def __init__(self, value\u003dNone):"},{"line_number":138,"context_line":"        self._value \u003d value or uuid.uuid4()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def __str__(self):"},{"line_number":141,"context_line":"        return str(self._value)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B76c%3D","line":138,"in_reply_to":"AAAAUX%2F%2B%2BTk%3D","updated":"2014-02-19 18:41:05.000000000","message":"Done.  ah, yeah, should add hex.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import uuid"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.openstack.common import timeutils"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fc%2FU%3D","line":13,"updated":"2014-02-26 15:51:13.000000000","message":"Extra newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":21,"context_line":"                 user_id\u003dNone, role_id\u003dNone, issued_before\u003dNone,"},{"line_number":22,"context_line":"                 expires_at\u003dNone, domain_id\u003dNone, project_id\u003dNone,"},{"line_number":23,"context_line":"                 trust_id\u003dNone, consumer_id\u003dNone, access_token_id\u003dNone):"},{"line_number":24,"context_line":"        for k, v in locals().copy().iteritems():"},{"line_number":25,"context_line":"            setattr(self, k, v)"},{"line_number":26,"context_line":"        self.revoked_at \u003d timeutils.utcnow()"},{"line_number":27,"context_line":"        if issued_before is None:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fc%2B0%3D","line":24,"updated":"2014-02-26 15:51:13.000000000","message":"Suggest six.iteritems for Python3 compat","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":21,"context_line":"                 user_id\u003dNone, role_id\u003dNone, issued_before\u003dNone,"},{"line_number":22,"context_line":"                 expires_at\u003dNone, domain_id\u003dNone, project_id\u003dNone,"},{"line_number":23,"context_line":"                 trust_id\u003dNone, consumer_id\u003dNone, access_token_id\u003dNone):"},{"line_number":24,"context_line":"        for k, v in locals().copy().iteritems():"},{"line_number":25,"context_line":"            setattr(self, k, v)"},{"line_number":26,"context_line":"        self.revoked_at \u003d timeutils.utcnow()"},{"line_number":27,"context_line":"        if issued_before is None:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fa4E%3D","line":24,"in_reply_to":"AAAAU3%2F%2Fc%2B0%3D","updated":"2014-02-26 21:54:53.000000000","message":"Done","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9e384c82b6742bbfd0cea1a7873b0d09774fbba7","unresolved":false,"context_lines":[{"line_number":23,"context_line":"                 trust_id\u003dNone, consumer_id\u003dNone, access_token_id\u003dNone):"},{"line_number":24,"context_line":"        for k, v in locals().copy().iteritems():"},{"line_number":25,"context_line":"            setattr(self, k, v)"},{"line_number":26,"context_line":"        self.revoked_at \u003d timeutils.utcnow()"},{"line_number":27,"context_line":"        if issued_before is None:"},{"line_number":28,"context_line":"            self.issued_before \u003d self.revoked_at"},{"line_number":29,"context_line":"        if self.id is None:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FbDI%3D","line":26,"updated":"2014-02-26 19:06:56.000000000","message":"do we used revoked_at anywhere other than use it to set issued_before?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":23,"context_line":"                 trust_id\u003dNone, consumer_id\u003dNone, access_token_id\u003dNone):"},{"line_number":24,"context_line":"        for k, v in locals().copy().iteritems():"},{"line_number":25,"context_line":"            setattr(self, k, v)"},{"line_number":26,"context_line":"        self.revoked_at \u003d timeutils.utcnow()"},{"line_number":27,"context_line":"        if issued_before is None:"},{"line_number":28,"context_line":"            self.issued_before \u003d self.revoked_at"},{"line_number":29,"context_line":"        if self.id is None:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZB4%3D","line":26,"in_reply_to":"AAAAU3%2F%2FbDI%3D","updated":"2014-02-26 21:54:53.000000000","message":"In the sql backend it is used for ordering.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                \u0027role_id\u0027,"},{"line_number":35,"context_line":"                \u0027domain_id\u0027,"},{"line_number":36,"context_line":"                \u0027project_id\u0027]"},{"line_number":37,"context_line":"        event \u003d dict((key, self.__dict__[key]) for key in keys)"},{"line_number":38,"context_line":"        if with_id:"},{"line_number":39,"context_line":"            event[\u0027id\u0027] \u003d self.id.__str__()"},{"line_number":40,"context_line":"        if self.trust_id is not None:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fc9Q%3D","line":37,"updated":"2014-02-26 15:51:13.000000000","message":"Why do the magic here if it doesn\u0027t really save you any space?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                \u0027project_id\u0027]"},{"line_number":37,"context_line":"        event \u003d dict((key, self.__dict__[key]) for key in keys)"},{"line_number":38,"context_line":"        if with_id:"},{"line_number":39,"context_line":"            event[\u0027id\u0027] \u003d self.id.__str__()"},{"line_number":40,"context_line":"        if self.trust_id is not None:"},{"line_number":41,"context_line":"            event[\u0027OS-TRUST:trust_id\u0027] \u003d self.trust_id"},{"line_number":42,"context_line":"        if self.consumer_id is not None:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fc%2BU%3D","line":39,"updated":"2014-02-26 15:51:13.000000000","message":"Suggest: str(self.id)","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        return event"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"#TODO(ayoung)  This code should be moved to the unit  test code once"},{"line_number":56,"context_line":"#revoke_by_tree has replaced it as the way to test token revocation."},{"line_number":57,"context_line":"def matches(event, token_values):"},{"line_number":58,"context_line":"    \"\"\"See if the token matches the revocation event."}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fc%2BE%3D","line":55,"updated":"2014-02-26 15:51:13.000000000","message":"Space after #","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    \"\"\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    #something has to match in order to revoke the token"},{"line_number":75,"context_line":"    matched \u003d False"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    #The token has three attributes that can match the user_id"},{"line_number":78,"context_line":"    if event.user_id is not None:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fc4Y%3D","line":75,"updated":"2014-02-26 15:51:13.000000000","message":"Is this useful? At each step if there is no match you return False.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    \"\"\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    #something has to match in order to revoke the token"},{"line_number":75,"context_line":"    matched \u003d False"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    #The token has three attributes that can match the user_id"},{"line_number":78,"context_line":"    if event.user_id is not None:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fa20%3D","line":75,"in_reply_to":"AAAAU3%2F%2Fc4Y%3D","updated":"2014-02-26 21:54:53.000000000","message":"This is subtle.  You don not want to default to true, as that would let a rule where nothing matched actually revoke a token.  All of the if blocks might have been skipped, and that would have the effect of creating a rule that accidentally revoked tokens.  If nothing at all matches, the rule is not applied.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9e384c82b6742bbfd0cea1a7873b0d09774fbba7","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    \"\"\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    #something has to match in order to revoke the token"},{"line_number":75,"context_line":"    matched \u003d False"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    #The token has three attributes that can match the user_id"},{"line_number":78,"context_line":"    if event.user_id is not None:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fa54%3D","line":75,"in_reply_to":"AAAAU3%2F%2Fc4Y%3D","updated":"2014-02-26 19:06:56.000000000","message":"matched is used at the end. Seem like it should be set to True and saved a bunch of code","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9e384c82b6742bbfd0cea1a7873b0d09774fbba7","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    if event.user_id is not None:"},{"line_number":79,"context_line":"        user_id_matched \u003d False"},{"line_number":80,"context_line":"        for attribute_name in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":81,"context_line":"            if event.user_id \u003d\u003d token_values[attribute_name]:"},{"line_number":82,"context_line":"                user_id_matched \u003d True"},{"line_number":83,"context_line":"                break"},{"line_number":84,"context_line":"        if not user_id_matched:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fa9U%3D","line":81,"updated":"2014-02-26 19:06:56.000000000","message":"token_values.get(attribute_name)\n\nunless we are expecting token_values is going to always contain those attributes. Moreover, if you can document what in the token_values in docstring that would be awesome.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    if event.user_id is not None:"},{"line_number":79,"context_line":"        user_id_matched \u003d False"},{"line_number":80,"context_line":"        for attribute_name in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":81,"context_line":"            if event.user_id \u003d\u003d token_values[attribute_name]:"},{"line_number":82,"context_line":"                user_id_matched \u003d True"},{"line_number":83,"context_line":"                break"},{"line_number":84,"context_line":"        if not user_id_matched:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZBY%3D","line":81,"in_reply_to":"AAAAU3%2F%2Fa9U%3D","updated":"2014-02-26 21:54:53.000000000","message":"yes, these values are always set.  See the code in the provider","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9e384c82b6742bbfd0cea1a7873b0d09774fbba7","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    #The token has two attributes that can match the domain_id"},{"line_number":90,"context_line":"    if event.domain_id is not None:"},{"line_number":91,"context_line":"        dom_id_matched \u003d False"},{"line_number":92,"context_line":"        for attribute_name in [\u0027user_domain_id\u0027, \u0027project_domain_id\u0027]:"},{"line_number":93,"context_line":"            if event.domain_id \u003d\u003d token_values[attribute_name]:"},{"line_number":94,"context_line":"                dom_id_matched \u003d True"},{"line_number":95,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fa7s%3D","line":92,"updated":"2014-02-26 19:06:56.000000000","message":"for attribute_name in [\u0027user_domain_id\u0027, \u0027project_domain_id\u0027, \u0027domain_id\u0027]\n\nneed to account for domain-scoped tokens","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9e384c82b6742bbfd0cea1a7873b0d09774fbba7","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    if event.domain_id is not None:"},{"line_number":91,"context_line":"        dom_id_matched \u003d False"},{"line_number":92,"context_line":"        for attribute_name in [\u0027user_domain_id\u0027, \u0027project_domain_id\u0027]:"},{"line_number":93,"context_line":"            if event.domain_id \u003d\u003d token_values[attribute_name]:"},{"line_number":94,"context_line":"                dom_id_matched \u003d True"},{"line_number":95,"context_line":"                break"},{"line_number":96,"context_line":"        if not dom_id_matched:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fa60%3D","line":93,"updated":"2014-02-26 19:06:56.000000000","message":"token_values.get(attribute_name)","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9e384c82b6742bbfd0cea1a7873b0d09774fbba7","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        if not dom_id_matched:"},{"line_number":97,"context_line":"            return False"},{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            matched \u003d True"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    #If any one check does not match, the while token does"},{"line_number":102,"context_line":"    #not match the event. The numerous return False indicate"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FayM%3D","line":99,"updated":"2014-02-26 19:06:56.000000000","message":"should just skip to line 127 from here. matched is not going to set to False from this point on.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                       \u0027expires_at\u0027, \u0027trust_id\u0027, \u0027consumer_id\u0027,"},{"line_number":107,"context_line":"                       \u0027access_token_id\u0027]"},{"line_number":108,"context_line":"    for attribute_name in attribute_names:"},{"line_number":109,"context_line":"        if getattr(event, attribute_name) is not None:"},{"line_number":110,"context_line":"            if (getattr(event, attribute_name) !\u003d"},{"line_number":111,"context_line":"                    token_values[attribute_name]):"},{"line_number":112,"context_line":"                        return False"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fc3w%3D","line":109,"updated":"2014-02-26 15:51:13.000000000","message":"Why not store the value instead of doing a getattr twice?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9e384c82b6742bbfd0cea1a7873b0d09774fbba7","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    for attribute_name in attribute_names:"},{"line_number":109,"context_line":"        if getattr(event, attribute_name) is not None:"},{"line_number":110,"context_line":"            if (getattr(event, attribute_name) !\u003d"},{"line_number":111,"context_line":"                    token_values[attribute_name]):"},{"line_number":112,"context_line":"                        return False"},{"line_number":113,"context_line":"            else:"},{"line_number":114,"context_line":"                matched \u003d True"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fa50%3D","line":111,"updated":"2014-02-26 19:06:56.000000000","message":"token_values.get(attribute_name)","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":1091,"name":"Arun Kant","email":"arukant@cisco.com","username":"arunkant-uws"},"change_message_id":"e3a668c1f24b92ee4ade560fd1ab2fabe7b7b876","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        if role_found:"},{"line_number":124,"context_line":"            matched \u003d True"},{"line_number":125,"context_line":"        else:"},{"line_number":126,"context_line":"            return False"},{"line_number":127,"context_line":"    matched \u003d (matched and"},{"line_number":128,"context_line":"               event.issued_before \u003e token_values[\u0027issued_at\u0027])"},{"line_number":129,"context_line":"    return matched"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAVX%2F%2F%2B0o%3D","line":126,"updated":"2014-02-27 01:36:35.000000000","message":"How about a shorter version for line 117-125,\n\n\n          if event.role_id in token_values[\u0027roles\u0027]:\n              matched \u003d True\n           else:\n               return False","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                \u0027project_id\u0027]"},{"line_number":73,"context_line":"        event \u003d dict((key, self.__dict__[key]) for key in keys)"},{"line_number":74,"context_line":"        if with_id:"},{"line_number":75,"context_line":"            event[\u0027id\u0027] \u003d self.id.__str__()"},{"line_number":76,"context_line":"        if self.trust_id is not None:"},{"line_number":77,"context_line":"            event[\u0027OS-TRUST:trust_id\u0027] \u003d self.trust_id"},{"line_number":78,"context_line":"        if self.consumer_id is not None:"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft18%3D","line":75,"updated":"2014-02-28 20:21:47.000000000","message":"why is this conditional? remove it","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                \u0027project_id\u0027]"},{"line_number":73,"context_line":"        event \u003d dict((key, self.__dict__[key]) for key in keys)"},{"line_number":74,"context_line":"        if with_id:"},{"line_number":75,"context_line":"            event[\u0027id\u0027] \u003d self.id.__str__()"},{"line_number":76,"context_line":"        if self.trust_id is not None:"},{"line_number":77,"context_line":"            event[\u0027OS-TRUST:trust_id\u0027] \u003d self.trust_id"},{"line_number":78,"context_line":"        if self.consumer_id is not None:"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Fs14%3D","line":75,"in_reply_to":"AAAAVX%2F%2Ft18%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    return map(event.key_for_name, _NAMES)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"def matches(event, token_values):"},{"line_number":99,"context_line":"    \"\"\"See if the token matches the revocation event."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Fs1w%3D","line":98,"updated":"2014-03-01 06:22:38.000000000","message":"This whole function is moved to tests.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    #The token has two attributes that can match the domain_id"},{"line_number":131,"context_line":"    if event.domain_id is not None:"},{"line_number":132,"context_line":"        dom_id_matched \u003d False"},{"line_number":133,"context_line":"        for attribute_name in [\u0027user_domain_id\u0027, \u0027project_domain_id\u0027]:"},{"line_number":134,"context_line":"            if event.domain_id \u003d\u003d token_values[attribute_name]:"},{"line_number":135,"context_line":"                dom_id_matched \u003d True"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft1c%3D","line":132,"updated":"2014-02-28 20:21:47.000000000","message":"i assume \"dom\" is \"domain\"? can you just spell it out","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        if role_found:"},{"line_number":165,"context_line":"            matched \u003d True"},{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            return False"},{"line_number":168,"context_line":"    matched \u003d (matched and"},{"line_number":169,"context_line":"               event.issued_before \u003e token_values[\u0027issued_at\u0027])"},{"line_number":170,"context_line":"    return matched"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft00%3D","line":167,"updated":"2014-02-28 20:21:47.000000000","message":"simplify!\n\n  if event.role_id is not None and event.role_id not in token_values[\u0027roles\u0027]:\n    return False","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            return False"},{"line_number":168,"context_line":"    matched \u003d (matched and"},{"line_number":169,"context_line":"               event.issued_before \u003e token_values[\u0027issued_at\u0027])"},{"line_number":170,"context_line":"    return matched"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class RevokeTree(object):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ft0k%3D","line":170,"updated":"2014-02-28 20:21:47.000000000","message":"i don\u0027t see a need to track \u0027matched\u0027 throughout this whole method... it looks like if you get this far it\u0027s always going to be true, so just return False early on mismatches instead","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    return matched"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class RevokeTree(object):"},{"line_number":174,"context_line":"    def __init__(self, revoke_events\u003d[]):"},{"line_number":175,"context_line":"        self.revoke_map \u003d dict()"},{"line_number":176,"context_line":"        self.add_events(revoke_events)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtzY%3D","line":173,"updated":"2014-02-28 20:21:47.000000000","message":"this is a lot of unprecedented code completely lacking doc strings -- i\u0027m not reviewing it","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        revoke_map \u003d self.revoke_map"},{"line_number":180,"context_line":"        for key in attr_keys(event):"},{"line_number":181,"context_line":"            revoke_map \u003d revoke_map.setdefault(key, {})"},{"line_number":182,"context_line":"        revoke_map[\u0027issued_before\u0027] \u003d event.issued_before"},{"line_number":183,"context_line":"        return event"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def remove_event(self, event):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtxA%3D","line":182,"updated":"2014-02-28 21:04:05.000000000","message":"As discussed in IRC, this is a bit too trusting, make sure only the latest of the \"timestamps\" is used.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        revoke_map \u003d self.revoke_map"},{"line_number":180,"context_line":"        for key in attr_keys(event):"},{"line_number":181,"context_line":"            revoke_map \u003d revoke_map.setdefault(key, {})"},{"line_number":182,"context_line":"        revoke_map[\u0027issued_before\u0027] \u003d event.issued_before"},{"line_number":183,"context_line":"        return event"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def remove_event(self, event):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FuAo%3D","line":182,"updated":"2014-03-01 06:22:38.000000000","message":"Make sure that an earlier event cannot replace a later one.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    def add_events(self, revoke_events):"},{"line_number":203,"context_line":"        map(self.add_event, revoke_events)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def is_revoked(self, token_data):"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        #Compare each level of the tree with the values from the token,"},{"line_number":208,"context_line":"        #taking into account the attributes that have alternative keys."}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtuU%3D","line":205,"updated":"2014-02-28 21:04:05.000000000","message":"Example of what is expected in token_data might be useful.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        alternatives \u003d {"},{"line_number":212,"context_line":"            \"user_id\": [\"user_id\", \"trustor_id\", \"trustee_id\"],"},{"line_number":213,"context_line":"            \"domain_id\": [\"user_domain_id\", \"project_domain_id\"]}"},{"line_number":214,"context_line":"        subnode \u003d [self.revoke_map]"},{"line_number":215,"context_line":"        for name in _NAMES:"},{"line_number":216,"context_line":"            bundle \u003d []"},{"line_number":217,"context_line":"            any_key \u003d \"%s\u003d*\" % (name,)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Fth4%3D","line":214,"updated":"2014-02-28 21:04:05.000000000","message":"If the revoke_map hasn\u0027t changed, do you need to regenerate the tree each time? Could the _syncronize map code be aware if anything changed and if nothing change, use a pre-built tree?\n\nAwesome way of checking revocations, but could be more efficient if you didn\u0027t have to do all the work each time (not sure if the trade off is worth it)","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"123e2a9492acb7806b33cc2eddb1f461b90354c3","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        alternatives \u003d {"},{"line_number":212,"context_line":"            \"user_id\": [\"user_id\", \"trustor_id\", \"trustee_id\"],"},{"line_number":213,"context_line":"            \"domain_id\": [\"user_domain_id\", \"project_domain_id\"]}"},{"line_number":214,"context_line":"        subnode \u003d [self.revoke_map]"},{"line_number":215,"context_line":"        for name in _NAMES:"},{"line_number":216,"context_line":"            bundle \u003d []"},{"line_number":217,"context_line":"            any_key \u003d \"%s\u003d*\" % (name,)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtXg%3D","line":214,"in_reply_to":"AAAAVX%2F%2Fth4%3D","updated":"2014-02-28 21:16:19.000000000","message":"In either case (cached tree or building every time), extracting the tree-building code specifically out would likely make this code a bit more straight forward","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        subnode \u003d [self.revoke_map]"},{"line_number":215,"context_line":"        for name in _NAMES:"},{"line_number":216,"context_line":"            bundle \u003d []"},{"line_number":217,"context_line":"            any_key \u003d \"%s\u003d*\" % (name,)"},{"line_number":218,"context_line":"            for tree in subnode:"},{"line_number":219,"context_line":"                bundle.append(tree.get(any_key))"},{"line_number":220,"context_line":"                if name \u003d\u003d \"role_id\":"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ftlk%3D","line":217,"updated":"2014-02-28 21:04:05.000000000","message":"Suggest naming \"any_key\" something that indicates it\u0027s the wildcard match, yes kleene_closure is fine (based on IRC), but \"any_key\" is a bad descriptor. Alternatively, a NOTE: any_key is the wildcard match, readup on kleene closure / kleene star for information on what this means.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f21be75e0695fe2b45458a3352a3c2d4ee9477a1","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                    for role_id in token_data.get(\"roles\", []):"},{"line_number":222,"context_line":"                        bundle.append(tree.get(\"role_id\u003d%s\" % (role_id,)))"},{"line_number":223,"context_line":"                else:"},{"line_number":224,"context_line":"                        for alt_name in alternatives.get(name, [name]):"},{"line_number":225,"context_line":"                            bundle.append("},{"line_number":226,"context_line":"                                tree.get(\"%s\u003d%s\" % (name,"},{"line_number":227,"context_line":"                                                    token_data[alt_name])))"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtaI%3D","line":224,"updated":"2014-02-28 21:07:12.000000000","message":"over indent","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b1dc040e2dad225fa5cc03d1e53b13d5a29f87e9","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"class RevokeTree(object):"},{"line_number":93,"context_line":"    \"\"\"Fast Revocation Checking Tree Structure"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    The Tree is an index to quickly match tokens against events."},{"line_number":96,"context_line":"    Each node is a hashtable of key\u003dvalue combinations from revocation events."}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3W0%3D","line":93,"updated":"2014-03-03 18:42:34.000000000","message":"Do Not Just Rename The Class With Something More Verbose\n\nActually provide a one-line summary of the scope and purpose.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b1dc040e2dad225fa5cc03d1e53b13d5a29f87e9","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    The Tree is an index to quickly match tokens against events."},{"line_number":96,"context_line":"    Each node is a hashtable of key\u003dvalue combinations from revocation events."},{"line_number":97,"context_line":"    The"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    \"\"\""},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3XM%3D","line":97,"updated":"2014-03-03 18:42:34.000000000","message":"The what?","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    \"\"\""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def __init__(self, revoke_events\u003d[]):"},{"line_number":102,"context_line":"        self.revoke_map \u003d dict()"},{"line_number":103,"context_line":"        self.add_events(revoke_events)"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5tY%3D","line":101,"updated":"2014-03-03 15:23:04.000000000","message":"A mutable as a default arg is probably not what you want to do. Better to just default to None and use \u0027revoke_events or []\u0027 in the method body.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    \"\"\""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def __init__(self, revoke_events\u003d[]):"},{"line_number":102,"context_line":"        self.revoke_map \u003d dict()"},{"line_number":103,"context_line":"        self.add_events(revoke_events)"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4VA%3D","line":101,"in_reply_to":"AAAAVn%2F%2F5tY%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        :returns:  the event that was passed in."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        def later(first, second):"},{"line_number":118,"context_line":"            #returns the later of two dates."},{"line_number":119,"context_line":"            if first \u003e second:"},{"line_number":120,"context_line":"                return first"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F93E%3D","line":117,"updated":"2014-03-03 05:44:07.000000000","message":"http://docs.python.org/2/library/functions.html#max","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        :returns:  the event that was passed in."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        def later(first, second):"},{"line_number":118,"context_line":"            #returns the later of two dates."},{"line_number":119,"context_line":"            if first \u003e second:"},{"line_number":120,"context_line":"                return first"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4SQ%3D","line":117,"in_reply_to":"AAAAVn%2F%2F93E%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        stack \u003d []"},{"line_number":143,"context_line":"        revoke_map \u003d self.revoke_map"},{"line_number":144,"context_line":"        for name in _NAMES:"},{"line_number":145,"context_line":"            key \u003d event.key_for_name(name)"},{"line_number":146,"context_line":"            nxt \u003d revoke_map.get(key)"},{"line_number":147,"context_line":"            if nxt is None:"},{"line_number":148,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F92c%3D","line":145,"updated":"2014-03-03 05:44:07.000000000","message":"no attr_keys() here?","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        stack \u003d []"},{"line_number":143,"context_line":"        revoke_map \u003d self.revoke_map"},{"line_number":144,"context_line":"        for name in _NAMES:"},{"line_number":145,"context_line":"            key \u003d event.key_for_name(name)"},{"line_number":146,"context_line":"            nxt \u003d revoke_map.get(key)"},{"line_number":147,"context_line":"            if nxt is None:"},{"line_number":148,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4P0%3D","line":145,"in_reply_to":"AAAAVn%2F%2F92c%3D","updated":"2014-03-03 21:12:49.000000000","message":"No, the key_for_name is in the form \u0027userid\u003dABCD123\"  and attr_keys is not.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            nxt \u003d revoke_map.get(key)"},{"line_number":147,"context_line":"            if nxt is None:"},{"line_number":148,"context_line":"                break"},{"line_number":149,"context_line":"            stack.append((revoke_map, key, nxt))"},{"line_number":150,"context_line":"            revoke_map \u003d nxt"},{"line_number":151,"context_line":"        else:"},{"line_number":152,"context_line":"            if event.issued_before \u003d\u003d revoke_map[\u0027issued_before\u0027]:"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F91c%3D","line":149,"updated":"2014-03-03 05:44:07.000000000","message":"nit: not sure you get anything by having nxt in the stack","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            nxt \u003d revoke_map.get(key)"},{"line_number":147,"context_line":"            if nxt is None:"},{"line_number":148,"context_line":"                break"},{"line_number":149,"context_line":"            stack.append((revoke_map, key, nxt))"},{"line_number":150,"context_line":"            revoke_map \u003d nxt"},{"line_number":151,"context_line":"        else:"},{"line_number":152,"context_line":"            if event.issued_before \u003d\u003d revoke_map[\u0027issued_before\u0027]:"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4N4%3D","line":149,"in_reply_to":"AAAAVn%2F%2F91c%3D","updated":"2014-03-03 21:12:49.000000000","message":"Has to be there.  The stack gets reversed and then all items popped in line 154 (nit: maybe this should be done FIFO instead of LIFO) and if the  nxt object is not in there we don\u0027t have it to delete.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                del parent[key]"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def add_events(self, revoke_events):"},{"line_number":159,"context_line":"        map(self.add_event, revoke_events)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def is_revoked(self, token_data):"},{"line_number":162,"context_line":"        \"\"\"Check if a token matches the revocation event"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F91M%3D","line":159,"updated":"2014-03-03 05:44:07.000000000","message":"return this","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                del parent[key]"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def add_events(self, revoke_events):"},{"line_number":159,"context_line":"        map(self.add_event, revoke_events)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def is_revoked(self, token_data):"},{"line_number":162,"context_line":"        \"\"\"Check if a token matches the revocation event"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4Ic%3D","line":159,"in_reply_to":"AAAAVn%2F%2F91M%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        \"\"\"Check if a token matches the revocation event"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        Compare the values for each level of the tree with the values from"},{"line_number":165,"context_line":"        the token, taking accounting for attributes that have alternative"},{"line_number":166,"context_line":"        keys, and for wildcard matches."},{"line_number":167,"context_line":"        if there is a match, continue down the tree."},{"line_number":168,"context_line":"        if there is no match, exit early."}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F908%3D","line":165,"updated":"2014-03-03 05:44:07.000000000","message":"\"taking account of\" or remove taking","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        \"\"\"Check if a token matches the revocation event"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        Compare the values for each level of the tree with the values from"},{"line_number":165,"context_line":"        the token, taking accounting for attributes that have alternative"},{"line_number":166,"context_line":"        keys, and for wildcard matches."},{"line_number":167,"context_line":"        if there is a match, continue down the tree."},{"line_number":168,"context_line":"        if there is no match, exit early."}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4MA%3D","line":165,"in_reply_to":"AAAAVn%2F%2F908%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        if there is no match, exit early."},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        token_data is a map based on a flattened view of token."},{"line_number":171,"context_line":"        The required fields areL"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"           \u0027expires_at\u0027,\u0027user_id\u0027, \u0027project_id\u0027, \u0027identity_domain_id\u0027,"},{"line_number":174,"context_line":"           \u0027assignment_domain_id\u0027, \u0027trust_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F900%3D","line":171,"updated":"2014-03-03 05:44:07.000000000","message":"s/L/:","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        if there is no match, exit early."},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        token_data is a map based on a flattened view of token."},{"line_number":171,"context_line":"        The required fields areL"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"           \u0027expires_at\u0027,\u0027user_id\u0027, \u0027project_id\u0027, \u0027identity_domain_id\u0027,"},{"line_number":174,"context_line":"           \u0027assignment_domain_id\u0027, \u0027trust_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4L8%3D","line":171,"in_reply_to":"AAAAVn%2F%2F900%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b1dc040e2dad225fa5cc03d1e53b13d5a29f87e9","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        The required fields areL"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"           \u0027expires_at\u0027,\u0027user_id\u0027, \u0027project_id\u0027, \u0027identity_domain_id\u0027,"},{"line_number":174,"context_line":"           \u0027assignment_domain_id\u0027, \u0027trust_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027"},{"line_number":175,"context_line":"           \u0027consumer_id\u0027, \u0027access_token_id\u0027"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3Vc%3D","line":174,"updated":"2014-03-03 18:42:34.000000000","message":"why are assignment_domain_id and identity_domain_id separate here?","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        \"\"\""},{"line_number":178,"context_line":"        alternatives \u003d {"},{"line_number":179,"context_line":"            \"user_id\": [\"user_id\", \"trustor_id\", \"trustee_id\"],"},{"line_number":180,"context_line":"            \"domain_id\": [\"identity_domain_id\", \"assignment_domain_id\"]}"},{"line_number":181,"context_line":"        subnode \u003d [self.revoke_map]"},{"line_number":182,"context_line":"        for name in _NAMES:"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F90k%3D","line":179,"updated":"2014-03-03 05:44:07.000000000","message":"\u0027 for strings all through here","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        \"\"\""},{"line_number":178,"context_line":"        alternatives \u003d {"},{"line_number":179,"context_line":"            \"user_id\": [\"user_id\", \"trustor_id\", \"trustee_id\"],"},{"line_number":180,"context_line":"            \"domain_id\": [\"identity_domain_id\", \"assignment_domain_id\"]}"},{"line_number":181,"context_line":"        subnode \u003d [self.revoke_map]"},{"line_number":182,"context_line":"        for name in _NAMES:"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4L4%3D","line":179,"in_reply_to":"AAAAVn%2F%2F90k%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            wildcard \u003d \"%s\u003d*\" % (name,)"},{"line_number":185,"context_line":"            for tree in subnode:"},{"line_number":186,"context_line":"                bundle.append(tree.get(wildcard))"},{"line_number":187,"context_line":"                if name \u003d\u003d \"role_id\":"},{"line_number":188,"context_line":"                    for role_id in token_data.get(\"roles\", []):"},{"line_number":189,"context_line":"                        bundle.append(tree.get(\"role_id\u003d%s\" % (role_id,)))"},{"line_number":190,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F90E%3D","line":187,"updated":"2014-03-03 05:44:07.000000000","message":"feels like you could do this with something similar to a generic function, but that\u0027s an optimization that can be left for when we have more things to add here.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                bundle.append(tree.get(wildcard))"},{"line_number":187,"context_line":"                if name \u003d\u003d \"role_id\":"},{"line_number":188,"context_line":"                    for role_id in token_data.get(\"roles\", []):"},{"line_number":189,"context_line":"                        bundle.append(tree.get(\"role_id\u003d%s\" % (role_id,)))"},{"line_number":190,"context_line":"                else:"},{"line_number":191,"context_line":"                        for alt_name in alternatives.get(name, [name]):"},{"line_number":192,"context_line":"                            bundle.append("}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F90M%3D","line":189,"updated":"2014-03-03 05:44:07.000000000","message":"why the single tuple? (role_id,)","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                bundle.append(tree.get(wildcard))"},{"line_number":187,"context_line":"                if name \u003d\u003d \"role_id\":"},{"line_number":188,"context_line":"                    for role_id in token_data.get(\"roles\", []):"},{"line_number":189,"context_line":"                        bundle.append(tree.get(\"role_id\u003d%s\" % (role_id,)))"},{"line_number":190,"context_line":"                else:"},{"line_number":191,"context_line":"                        for alt_name in alternatives.get(name, [name]):"},{"line_number":192,"context_line":"                            bundle.append("}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4Ig%3D","line":189,"in_reply_to":"AAAAVn%2F%2F90M%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                    for role_id in token_data.get(\"roles\", []):"},{"line_number":189,"context_line":"                        bundle.append(tree.get(\"role_id\u003d%s\" % (role_id,)))"},{"line_number":190,"context_line":"                else:"},{"line_number":191,"context_line":"                        for alt_name in alternatives.get(name, [name]):"},{"line_number":192,"context_line":"                            bundle.append("},{"line_number":193,"context_line":"                                tree.get(\"%s\u003d%s\" % (name,"},{"line_number":194,"context_line":"                                                    token_data[alt_name])))"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F90Y%3D","line":191,"updated":"2014-03-03 05:44:07.000000000","message":"over indented","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                    for role_id in token_data.get(\"roles\", []):"},{"line_number":189,"context_line":"                        bundle.append(tree.get(\"role_id\u003d%s\" % (role_id,)))"},{"line_number":190,"context_line":"                else:"},{"line_number":191,"context_line":"                        for alt_name in alternatives.get(name, [name]):"},{"line_number":192,"context_line":"                            bundle.append("},{"line_number":193,"context_line":"                                tree.get(\"%s\u003d%s\" % (name,"},{"line_number":194,"context_line":"                                                    token_data[alt_name])))"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4Ik%3D","line":191,"in_reply_to":"AAAAVn%2F%2F90Y%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                if not bundle:"},{"line_number":197,"context_line":"                    return False"},{"line_number":198,"context_line":"                subnode \u003d bundle"},{"line_number":199,"context_line":"            else:"},{"line_number":200,"context_line":"                for leaf in subnode:"},{"line_number":201,"context_line":"                    issued_before \u003d leaf.get(\u0027issued_before\u0027)"},{"line_number":202,"context_line":"                    if issued_before is not None:"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F9zw%3D","line":199,"updated":"2014-03-03 05:44:07.000000000","message":"Do you need the else? there are no break statements above that can fall out early","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                if not bundle:"},{"line_number":197,"context_line":"                    return False"},{"line_number":198,"context_line":"                subnode \u003d bundle"},{"line_number":199,"context_line":"            else:"},{"line_number":200,"context_line":"                for leaf in subnode:"},{"line_number":201,"context_line":"                    issued_before \u003d leaf.get(\u0027issued_before\u0027)"},{"line_number":202,"context_line":"                    if issued_before is not None:"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4Jk%3D","line":199,"in_reply_to":"AAAAVn%2F%2F9zw%3D","updated":"2014-03-03 21:12:49.000000000","message":"Heh.  else on a for loop is a Pythonism.  It means \"if nothing in the loop did a break\"   http://docs.python.org/2/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        token_values[\u0027trustor_id\u0027] \u003d trust[\u0027trustor_user\u0027][\u0027id\u0027]"},{"line_number":285,"context_line":"        token_values[\u0027trustee_id\u0027] \u003d trust[\u0027trustee_user\u0027][\u0027id\u0027]"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    oauth1 \u003d token_data.get(\u0027OS-OAUTH1\u0027)"},{"line_number":288,"context_line":"    if oauth1 is None:"},{"line_number":289,"context_line":"        token_values[\u0027consumer_id\u0027] \u003d None"},{"line_number":290,"context_line":"        token_values[\u0027access_token_id\u0027] \u003d None"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F9zY%3D","line":287,"updated":"2014-03-03 05:44:07.000000000","message":"we need to come up with a means of doing hooks, this pattern of extensions is going to be unsustainable","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        token_values[\u0027trustor_id\u0027] \u003d trust[\u0027trustor_user\u0027][\u0027id\u0027]"},{"line_number":285,"context_line":"        token_values[\u0027trustee_id\u0027] \u003d trust[\u0027trustee_user\u0027][\u0027id\u0027]"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    oauth1 \u003d token_data.get(\u0027OS-OAUTH1\u0027)"},{"line_number":288,"context_line":"    if oauth1 is None:"},{"line_number":289,"context_line":"        token_values[\u0027consumer_id\u0027] \u003d None"},{"line_number":290,"context_line":"        token_values[\u0027access_token_id\u0027] \u003d None"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4Is%3D","line":287,"in_reply_to":"AAAAVn%2F%2F9zY%3D","updated":"2014-03-03 21:12:49.000000000","message":"Yep.  However, once we get rid of the two token formats, the  build_token_values_v2 function can go away.  At that point, it probably makes sense to redo the tree  using a \"flatten\" approach and the data from the actual token.  It is a pretty significant rework, but it means that the token format will be unmodified.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"41aa85a3bde1d220096a74e205e25ac9ad1c097a","unresolved":false,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    role_list \u003d []"},{"line_number":234,"context_line":"    roles \u003d token_data.get(\u0027metadata\u0027, {}).get(\u0027roles\u0027, [])"},{"line_number":235,"context_line":"    if roles is not None:"},{"line_number":236,"context_line":"        for role in roles:"},{"line_number":237,"context_line":"            role_list.append(role[\u0027id\u0027])"},{"line_number":238,"context_line":"    token_values[\u0027roles\u0027] \u003d role_list"}],"source_content_type":"text/x-python","patch_set":78,"id":"AAAAVn%2F%2Fydg%3D","line":235,"updated":"2014-03-04 04:53:03.000000000","message":"Can roles be None?","commit_id":"0eba4e5da0221d154eb06965653e186c51c3b21f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"41aa85a3bde1d220096a74e205e25ac9ad1c097a","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        token_values[\u0027assignment_domain_id\u0027] \u003d None"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    role_list \u003d []"},{"line_number":266,"context_line":"    roles \u003d token_data.get(\u0027roles\u0027)"},{"line_number":267,"context_line":"    if roles is not None:"},{"line_number":268,"context_line":"        for role in roles:"},{"line_number":269,"context_line":"            role_list.append(role[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":78,"id":"AAAAVn%2F%2FydY%3D","line":266,"updated":"2014-03-04 04:53:03.000000000","message":"Why not default to empty list like above?","commit_id":"0eba4e5da0221d154eb06965653e186c51c3b21f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a43cd07f3004e5c7363c681c00d95850bd77bce1","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                bundle \u003d filter(None, bundle)"},{"line_number":191,"context_line":"                if not bundle:"},{"line_number":192,"context_line":"                    return False"},{"line_number":193,"context_line":"                subnode \u003d bundle"},{"line_number":194,"context_line":"            else:"},{"line_number":195,"context_line":"                for leaf in subnode:"},{"line_number":196,"context_line":"                    issued_before \u003d leaf.get(\u0027issued_before\u0027)"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FxSc%3D","line":193,"updated":"2014-03-04 07:50:11.000000000","message":"I still feel that a lot of this logic could be moved out of \"is_revoked\" and limit the need to build the tree every time if nothing has changed.\n\nPerhaps when add_event or remove event is called a timestamp is set and the revoke event tree is only run specifically when that occurs... maybe this rebuild should occur in the syncronize call if a change has occurred.\n\nIt seems a bit heavy handed to build this every time if it can be avoided.","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"7cb89a390a7b72539e75e862b729060a3e8ab1c0","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                bundle \u003d filter(None, bundle)"},{"line_number":191,"context_line":"                if not bundle:"},{"line_number":192,"context_line":"                    return False"},{"line_number":193,"context_line":"                subnode \u003d bundle"},{"line_number":194,"context_line":"            else:"},{"line_number":195,"context_line":"                for leaf in subnode:"},{"line_number":196,"context_line":"                    issued_before \u003d leaf.get(\u0027issued_before\u0027)"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2Fq70%3D","line":193,"in_reply_to":"AAAAVn%2F%2FsVM%3D","updated":"2014-03-04 18:49:41.000000000","message":"I\u0027m convinced this could be simplified and reduce the \"collection\" logic on every single call.  It\u0027s not -1 worthy... There is potential this code is hit a fair amount.  We just need to keep an eye on it as a potential bottleneck.","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"656d4bcccf51de070056856546fa35d89f65ad86","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                bundle \u003d filter(None, bundle)"},{"line_number":191,"context_line":"                if not bundle:"},{"line_number":192,"context_line":"                    return False"},{"line_number":193,"context_line":"                subnode \u003d bundle"},{"line_number":194,"context_line":"            else:"},{"line_number":195,"context_line":"                for leaf in subnode:"},{"line_number":196,"context_line":"                    issued_before \u003d leaf.get(\u0027issued_before\u0027)"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FsVM%3D","line":193,"in_reply_to":"AAAAVn%2F%2FxSc%3D","updated":"2014-03-04 17:28:38.000000000","message":"Building the  tree *is* guarded by the syncronize call.  This code is just traversing the tree.  The \"bundle\" can be thought of like the stack, so that this is done in a single method instead of recursively.  It keeps track of position in the tree:  it is a bundle of branches, but the branches are not created here, just collected.","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"60bb240bcd1866c3b3618b3e1f9a88f9bebb3a19","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                bundle \u003d filter(None, bundle)"},{"line_number":191,"context_line":"                if not bundle:"},{"line_number":192,"context_line":"                    return False"},{"line_number":193,"context_line":"                subnode \u003d bundle"},{"line_number":194,"context_line":"            else:"},{"line_number":195,"context_line":"                for leaf in subnode:"},{"line_number":196,"context_line":"                    issued_before \u003d leaf.get(\u0027issued_before\u0027)"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAWH%2F%2FlQU%3D","line":193,"updated":"2014-03-16 07:39:32.000000000","message":"This line and lines below it should be 4 spaces to the left.","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"keystone/contrib/revoke/routers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"bbf7a946b96d644f55d472ace679b4acacb8678d","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        mapper.connect(self.PATH_PREFIX,"},{"line_number":33,"context_line":"                       controller\u003drevoke_controller,"},{"line_number":34,"context_line":"                       action\u003d\u0027describe\u0027,"},{"line_number":35,"context_line":"                       conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BQ0%3D","line":35,"updated":"2014-02-17 22:01:27.000000000","message":"this second method is not a part of the API spec","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        mapper.connect(self.PATH_PREFIX,"},{"line_number":33,"context_line":"                       controller\u003drevoke_controller,"},{"line_number":34,"context_line":"                       action\u003d\u0027describe\u0027,"},{"line_number":35,"context_line":"                       conditions\u003ddict(method\u003d[\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B75M%3D","line":35,"in_reply_to":"AAAAUX%2F%2B%2BQ0%3D","updated":"2014-02-19 18:41:05.000000000","message":"No, and it does not need to be.  It is for self documenting the extension.  Note the version info for the server is not in the API spec, either.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FnE%3D","line":1,"updated":"2014-02-22 19:58:28.000000000","message":"remove vim line","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from keystone.common import wsgi"},{"line_number":15,"context_line":"from keystone.contrib.revoke import controllers"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fc3I%3D","line":13,"updated":"2014-02-26 15:51:13.000000000","message":"Extra newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"}],"keystone/exception.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":292,"context_line":""},{"line_number":293,"context_line":"class Gone(Error):"},{"line_number":294,"context_line":"    message_format \u003d _(\"The service you have requested is no\""},{"line_number":295,"context_line":"                       \" longer avaiable on this server.\")"},{"line_number":296,"context_line":"    code \u003d 410"},{"line_number":297,"context_line":"    title \u003d \u0027Gone\u0027"},{"line_number":298,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2BiE%3D","line":295,"updated":"2014-02-27 02:22:07.000000000","message":"change \"avaiable\" to \"available\"","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"}],"keystone/identity/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efbdab75ac7906fd5eb8ae6c7e6d339ebbab9d3e","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                                                          domain_scope)]"},{"line_number":433,"context_line":"            self.token_api.delete_tokens_for_users(user_ids)"},{"line_number":434,"context_line":"        for grant in self.assignment_api.list_grants(group_id\u003dgroup_id):"},{"line_number":435,"context_line":"            if (domain_scope):"},{"line_number":436,"context_line":"                self.revoke_api.revoke_by_domain_assignment("},{"line_number":437,"context_line":"                    domain_id\u003dgrant[\u0027domain_id\u0027],"},{"line_number":438,"context_line":"                    role_id\u003dgrant[\u0027role_id\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FJu8%3D","line":435,"updated":"2014-01-16 23:03:10.000000000","message":"(NIT): any reason to wrap \u0027domain_scope\u0027 in ()?","commit_id":"06d60b533dd6f1d189ce5c4b05ccbceda76a67c3"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        return ref"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    @notifications.deleted(\u0027group\u0027)"},{"line_number":428,"context_line":"    @domains_configured"},{"line_number":429,"context_line":"    def revoke_tokens_for_group(self, group_id, domain_scope):"},{"line_number":430,"context_line":"        #TODO(ayoung): revoke based on group and roleids instead"},{"line_number":431,"context_line":"        user_ids \u003d []"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FIU%3D","line":428,"updated":"2014-01-20 03:15:47.000000000","message":"You\u0027ve injected your new method and grabbed the \"delete_group\" decorators.  Your method needs to be above 427.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"de58f753817d406d046914a53cad6863cbbc1a13","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        return ref"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    @notifications.deleted(\u0027group\u0027)"},{"line_number":428,"context_line":"    @domains_configured"},{"line_number":429,"context_line":"    def revoke_tokens_for_group(self, group_id, domain_scope):"},{"line_number":430,"context_line":"        #TODO(ayoung): revoke based on group and roleids instead"},{"line_number":431,"context_line":"        user_ids \u003d []"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FAs%3D","line":428,"in_reply_to":"AAAAUH%2F%2B%2FIU%3D","updated":"2014-01-20 04:15:53.000000000","message":"Done","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":193,"context_line":""},{"line_number":194,"context_line":"@dependency.provider(\u0027identity_api\u0027)"},{"line_number":195,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027credential_api\u0027, \u0027token_api\u0027,"},{"line_number":196,"context_line":"                     \u0027revoke_api\u0027)"},{"line_number":197,"context_line":"class Manager(manager.Manager):"},{"line_number":198,"context_line":"    \"\"\"Default pivot point for the Identity backend."},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5Zc%3D","line":196,"updated":"2014-01-20 23:55:32.000000000","message":"keep these in alphabetical order.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":427,"context_line":"    def remove_user_from_group(self, user_id, group_id, domain_scope\u003dNone):"},{"line_number":428,"context_line":"        domain_id, driver \u003d self._get_domain_id_and_driver(domain_scope)"},{"line_number":429,"context_line":"        driver.remove_user_from_group(user_id, group_id)"},{"line_number":430,"context_line":"        #TODO(ayoung) revoking all tokens for a user based on group membership"},{"line_number":431,"context_line":"        #is Overkill, as we only would need to revoke tokens that had role"},{"line_number":432,"context_line":"        #assignments via the group.  Calculating those assingments would"},{"line_number":433,"context_line":"        #have to be done by the assignment backend."}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Faw%3D","line":430,"updated":"2014-02-17 19:26:32.000000000","message":"please keep a consistent format for comments in this file -- add a space after #.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        return ref"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def revoke_tokens_for_group(self, group_id, domain_scope):"},{"line_number":394,"context_line":"        #TODO(ayoung): revoke based on group and roleids instead"},{"line_number":395,"context_line":"        user_ids \u003d []"},{"line_number":396,"context_line":"        for u in self.list_users_in_group(group_id, domain_scope):"},{"line_number":397,"context_line":"            user_ids.append(u[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fm8%3D","line":394,"updated":"2014-02-22 19:58:28.000000000","message":"add a space after # to match the format for comments used throughout this file.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        domain_id, driver \u003d self._get_domain_id_and_driver(domain_scope)"},{"line_number":405,"context_line":"        # As well as deleting the group, we need to invalidate"},{"line_number":406,"context_line":"        # any tokens for the users who are members of the group."},{"line_number":407,"context_line":"        # We get the list of users before we attempt the group"},{"line_number":408,"context_line":"        # deletion, so that we can remove these tokens after we know"},{"line_number":409,"context_line":"        # the group deletion succeeded."},{"line_number":410,"context_line":"        self.revoke_tokens_for_group(group_id, domain_scope)"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fmo%3D","line":407,"updated":"2014-02-22 19:58:28.000000000","message":"this method isn\u0027t getting the list of users anymore, so this part of the comment should be moved into revoke_tokens_for_group.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        domain_id, driver \u003d self._get_domain_id_and_driver(domain_scope)"},{"line_number":405,"context_line":"        # As well as deleting the group, we need to invalidate"},{"line_number":406,"context_line":"        # any tokens for the users who are members of the group."},{"line_number":407,"context_line":"        # We get the list of users before we attempt the group"},{"line_number":408,"context_line":"        # deletion, so that we can remove these tokens after we know"},{"line_number":409,"context_line":"        # the group deletion succeeded."},{"line_number":410,"context_line":"        self.revoke_tokens_for_group(group_id, domain_scope)"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2FvBY%3D","line":407,"in_reply_to":"AAAAU3%2F%2F%2Fmo%3D","updated":"2014-02-25 02:26:45.000000000","message":"Done","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        domain_id, driver \u003d self._get_domain_id_and_driver(domain_scope)"},{"line_number":422,"context_line":"        driver.remove_user_from_group(user_id, group_id)"},{"line_number":423,"context_line":"        # TODO(ayoung) revoking all tokens for a user based on group"},{"line_number":424,"context_line":"        # membership is Overkill, as we only would need to revoke tokens"},{"line_number":425,"context_line":"        # that had role assignments via the group.  Calculating those"},{"line_number":426,"context_line":"        # assignments would have to be done by the assignment backend."},{"line_number":427,"context_line":"        self.revoke_api.revoke_by_user(user_id)"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fmk%3D","line":424,"updated":"2014-02-22 19:58:28.000000000","message":"change \"Overkill\" to \"overkill\"","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9e384c82b6742bbfd0cea1a7873b0d09774fbba7","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        return ref"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def revoke_tokens_for_group(self, group_id, domain_scope):"},{"line_number":394,"context_line":"        # We get the list of users before we attempt the group"},{"line_number":395,"context_line":"        # deletion, so that we can remove these tokens after we know"},{"line_number":396,"context_line":"        # the group deletion succeeded."},{"line_number":397,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FatE%3D","line":394,"updated":"2014-02-26 19:06:56.000000000","message":"this one is debatable. Adding/removing group member, yes. Deleting the group itself, debatable. Problem is group information is not on the token. This cause all user tokens to be revoked.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        return ref"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def revoke_tokens_for_group(self, group_id, domain_scope):"},{"line_number":394,"context_line":"        # We get the list of users before we attempt the group"},{"line_number":395,"context_line":"        # deletion, so that we can remove these tokens after we know"},{"line_number":396,"context_line":"        # the group deletion succeeded."},{"line_number":397,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZAQ%3D","line":394,"in_reply_to":"AAAAU3%2F%2FatE%3D","updated":"2014-02-26 21:54:53.000000000","message":"I know. And with later code that gets all role assignments for a group, we can probably do something more focused.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        # membership is overkill, as we only would need to revoke tokens"},{"line_number":426,"context_line":"        # that had role assignments via the group.  Calculating those"},{"line_number":427,"context_line":"        # assignments would have to be done by the assignment backend."},{"line_number":428,"context_line":"        self.revoke_api.revoke_by_user(user_id)"},{"line_number":429,"context_line":"        self.token_api.delete_tokens_for_user(user_id)"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    @manager.response_truncated"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fc2A%3D","line":428,"updated":"2014-02-26 15:51:13.000000000","message":"So removing a user from a group revokes all of their tokens?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d8b2f831c22cf0d8e1b14e35ea36e1f4d99a21dc","unresolved":false,"context_lines":[{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        # TODO(ayoung): revoke based on group and roleids instead"},{"line_number":399,"context_line":"        user_ids \u003d []"},{"line_number":400,"context_line":"        for u in self.list_users_in_group(group_id, domain_scope):"},{"line_number":401,"context_line":"            user_ids.append(u[\u0027id\u0027])"},{"line_number":402,"context_line":"            self.revoke_api.revoke_by_user(u[\u0027id\u0027])"},{"line_number":403,"context_line":"        self.token_api.delete_tokens_for_users(user_ids)"}],"source_content_type":"text/x-python","patch_set":77,"id":"AAAAVn%2F%2FzAk%3D","line":400,"updated":"2014-03-04 03:24:16.000000000","message":"suggest \u0027user\u0027 instead of \u0027u\u0027, no need to cut it down","commit_id":"90b4e62889af4c714d1cd8c5a67b24482727cc2f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d8b2f831c22cf0d8e1b14e35ea36e1f4d99a21dc","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    def add_user_to_group(self, user_id, group_id, domain_scope\u003dNone):"},{"line_number":416,"context_line":"        domain_id, driver \u003d self._get_domain_id_and_driver(domain_scope)"},{"line_number":417,"context_line":"        driver.add_user_to_group(user_id, group_id)"},{"line_number":418,"context_line":"        self.token_api.delete_tokens_for_user(user_id)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"    @domains_configured"},{"line_number":421,"context_line":"    def remove_user_from_group(self, user_id, group_id, domain_scope\u003dNone):"}],"source_content_type":"text/x-python","patch_set":77,"id":"AAAAVn%2F%2Fy8Y%3D","line":418,"updated":"2014-03-04 03:24:16.000000000","message":"why do we not revoke tokens here?","commit_id":"90b4e62889af4c714d1cd8c5a67b24482727cc2f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5f537921bb8214ceeaa07a9e52f8a112b7f2000c","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    def add_user_to_group(self, user_id, group_id, domain_scope\u003dNone):"},{"line_number":416,"context_line":"        domain_id, driver \u003d self._get_domain_id_and_driver(domain_scope)"},{"line_number":417,"context_line":"        driver.add_user_to_group(user_id, group_id)"},{"line_number":418,"context_line":"        self.token_api.delete_tokens_for_user(user_id)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"    @domains_configured"},{"line_number":421,"context_line":"    def remove_user_from_group(self, user_id, group_id, domain_scope\u003dNone):"}],"source_content_type":"text/x-python","patch_set":77,"id":"AAAAVn%2F%2Fyvg%3D","line":418,"in_reply_to":"AAAAVn%2F%2Fy8Y%3D","updated":"2014-03-04 03:58:45.000000000","message":"because the user is gaining access? A comment would be helpful here.","commit_id":"90b4e62889af4c714d1cd8c5a67b24482727cc2f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a43cd07f3004e5c7363c681c00d95850bd77bce1","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"@dependency.provider(\u0027identity_api\u0027)"},{"line_number":193,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027credential_api\u0027,"},{"line_number":194,"context_line":"                     \u0027revoke_api\u0027, \u0027token_api\u0027)"},{"line_number":195,"context_line":"class Manager(manager.Manager):"},{"line_number":196,"context_line":"    \"\"\"Default pivot point for the Identity backend."},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FxMY%3D","line":194,"updated":"2014-03-04 07:50:11.000000000","message":"revoke api should be optional here since it is optional in assignment.","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"656d4bcccf51de070056856546fa35d89f65ad86","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"@dependency.provider(\u0027identity_api\u0027)"},{"line_number":193,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027credential_api\u0027,"},{"line_number":194,"context_line":"                     \u0027revoke_api\u0027, \u0027token_api\u0027)"},{"line_number":195,"context_line":"class Manager(manager.Manager):"},{"line_number":196,"context_line":"    \"\"\"Default pivot point for the Identity backend."},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FsPk%3D","line":194,"in_reply_to":"AAAAVn%2F%2FxMY%3D","updated":"2014-03-04 17:28:38.000000000","message":"Done","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":391,"context_line":"            ref \u003d self._set_domain_id(ref, domain_id)"},{"line_number":392,"context_line":"        return ref"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    def revoke_tokens_for_group(self, group_id, domain_scope):"},{"line_number":395,"context_line":"        # We get the list of users before we attempt the group"},{"line_number":396,"context_line":"        # deletion, so that we can remove these tokens after we know"},{"line_number":397,"context_line":"        # the group deletion succeeded."}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FozA%3D","line":394,"updated":"2014-03-04 23:26:37.000000000","message":"this doesn\u0027t look like it should be it\u0027s own public method","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"keystone/middleware/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        try:"},{"line_number":226,"context_line":"            token_ref \u003d self.token_api.get_token(token_id)"},{"line_number":227,"context_line":"            #TODO(ayoung): These two functions return the token in different"},{"line_number":228,"context_line":"            #formats instead of two calls, only make one.  However, the call"},{"line_number":229,"context_line":"            #to get_token hits the caching layer, and does not validate the"},{"line_number":230,"context_line":"            #token.  Reduce to one call"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fao%3D","line":227,"updated":"2014-02-17 19:26:32.000000000","message":"consistent format for comments.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            # token.  Reduce to one call"},{"line_number":229,"context_line":"            if not CONF.token.revoke_by_id:"},{"line_number":230,"context_line":"                (self.token_api.token_provider_api."},{"line_number":231,"context_line":"                 validate_token(context[\u0027token_id\u0027]))"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"            # TODO(gyee): validate_token_bind should really be its own"},{"line_number":234,"context_line":"            # middleware"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ftyc%3D","line":231,"updated":"2014-02-28 20:21:47.000000000","message":"please don\u0027t use this line break style - it\u0027s terrible for readability and you\u0027re the only one that uses it","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            # token.  Reduce to one call"},{"line_number":229,"context_line":"            if not CONF.token.revoke_by_id:"},{"line_number":230,"context_line":"                (self.token_api.token_provider_api."},{"line_number":231,"context_line":"                 validate_token(context[\u0027token_id\u0027]))"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"            # TODO(gyee): validate_token_bind should really be its own"},{"line_number":234,"context_line":"            # middleware"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FrqE%3D","line":231,"in_reply_to":"AAAAVX%2F%2Ftyc%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            # token.  Reduce to one call"},{"line_number":229,"context_line":"            if not CONF.token.revoke_by_id:"},{"line_number":230,"context_line":"                (self.token_api.token_provider_api."},{"line_number":231,"context_line":"                 validate_token(context[\u0027token_id\u0027]))"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"            # TODO(gyee): validate_token_bind should really be its own"},{"line_number":234,"context_line":"            # middleware"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ftek%3D","line":231,"in_reply_to":"AAAAVX%2F%2Ftyc%3D","updated":"2014-02-28 21:04:05.000000000","message":"Suggest:\n\n    self.token_api.token_provider_api.validate_token(\n         context[\u0027token_id\u0027]))","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c0d02fd98c7814f6d281a138ecd0a80167dda6f2","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            # TODO(ayoung): These two functions return the token in different"},{"line_number":226,"context_line":"            # formats instead of two calls, only make one.  However, the call"},{"line_number":227,"context_line":"            # to get_token hits the caching layer, and does not validate the"},{"line_number":228,"context_line":"            # token.  Reduce to one call"},{"line_number":229,"context_line":"            if not CONF.token.revoke_by_id:"},{"line_number":230,"context_line":"                self.token_api.token_provider_api.validate_token("},{"line_number":231,"context_line":"                    context[\u0027token_id\u0027])"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F%2Bnk%3D","line":228,"updated":"2014-03-03 02:01:10.000000000","message":"redundant from the first sentence. Also from the first sentence which \u0027two functions return the token in different formats\u0027?","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            # TODO(ayoung): These two functions return the token in different"},{"line_number":226,"context_line":"            # formats instead of two calls, only make one.  However, the call"},{"line_number":227,"context_line":"            # to get_token hits the caching layer, and does not validate the"},{"line_number":228,"context_line":"            # token.  Reduce to one call"},{"line_number":229,"context_line":"            if not CONF.token.revoke_by_id:"},{"line_number":230,"context_line":"                self.token_api.token_provider_api.validate_token("},{"line_number":231,"context_line":"                    context[\u0027token_id\u0027])"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4VU%3D","line":228,"in_reply_to":"AAAAVn%2F%2F%2Bnk%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"}],"keystone/routers.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    def add_routes(self, mapper):"},{"line_number":55,"context_line":"        extensions_controller \u003d self.controller"},{"line_number":56,"context_line":"        mapper.connect(\u0027/extensions\u0027,"},{"line_number":57,"context_line":"                       controller\u003dextensions_controller,"},{"line_number":58,"context_line":"                       action\u003d\u0027get_extensions_info\u0027,"},{"line_number":59,"context_line":"                       conditions\u003ddict(method\u003d[\u0027GET\u0027]))"},{"line_number":60,"context_line":"        mapper.connect(\u0027/extensions/{extension_alias}\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9f2o%3D","line":57,"updated":"2013-12-10 22:23:38.000000000","message":"Any reason not to just use self.controller here and in the statement below?","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                       conditions\u003ddict(method\u003d[\u0027GET\u0027]))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class ExtensionV3(wsgi.ComposableRouter):"},{"line_number":51,"context_line":"    def __init__(self, is_admin\u003dTrue):"},{"line_number":52,"context_line":"        self.controller \u003d controllers.V3Extensions()"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5Y0%3D","line":50,"updated":"2014-01-20 23:55:32.000000000","message":"this really should be a separate commit.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class ExtensionV3(wsgi.ComposableRouter):"},{"line_number":51,"context_line":"    def __init__(self, is_admin\u003dTrue):"},{"line_number":52,"context_line":"        self.controller \u003d controllers.V3Extensions()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def add_routes(self, mapper):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5Y4%3D","line":51,"updated":"2014-01-20 23:55:32.000000000","message":"is_admin isn\u0027t used... why is it here?","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c63f67fa80962b333bc2eff421336c16f5a3ec6","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class ExtensionV3(wsgi.ComposableRouter):"},{"line_number":51,"context_line":"    def __init__(self, is_admin\u003dTrue):"},{"line_number":52,"context_line":"        self.controller \u003d controllers.V3Extensions()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def add_routes(self, mapper):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B45w%3D","line":51,"in_reply_to":"AAAAUH%2F%2B5Y4%3D","updated":"2014-01-21 04:55:07.000000000","message":"Its ignored, but will be passed in when called to distinguish between admin and public routes","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                       conditions\u003ddict(method\u003d[\u0027GET\u0027]))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class ExtensionV3(wsgi.ComposableRouter):"},{"line_number":51,"context_line":"    def __init__(self, is_admin\u003dTrue):"},{"line_number":52,"context_line":"        self.controller \u003d controllers.V3Extensions()"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B18w%3D","line":50,"updated":"2014-01-21 14:39:11.000000000","message":"this really should be a separate commit.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class ExtensionV3(wsgi.ComposableRouter):"},{"line_number":51,"context_line":"    def __init__(self, is_admin\u003dTrue):"},{"line_number":52,"context_line":"        self.controller \u003d controllers.V3Extensions()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def add_routes(self, mapper):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B18c%3D","line":51,"updated":"2014-01-21 14:39:11.000000000","message":"it would be helpful to add comment why is_admin is not used.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"}],"keystone/service.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        catalog_api\u003dcatalog.Manager(),"},{"line_number":56,"context_line":"        credential_api\u003dcredential.Manager(),"},{"line_number":57,"context_line":"        endpoint_filter_api\u003dendpoint_filter.Manager(),"},{"line_number":58,"context_line":"        revoke_api\u003drevoke.Manager(),"},{"line_number":59,"context_line":"        identity_api\u003d_IDENTITY_API,"},{"line_number":60,"context_line":"        policy_api\u003dpolicy.Manager(),"},{"line_number":61,"context_line":"        token_api\u003dtoken.Manager(),"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FIM%3D","line":58,"updated":"2014-01-20 03:15:47.000000000","message":"NIT: These should be alphabetical.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"de58f753817d406d046914a53cad6863cbbc1a13","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        catalog_api\u003dcatalog.Manager(),"},{"line_number":56,"context_line":"        credential_api\u003dcredential.Manager(),"},{"line_number":57,"context_line":"        endpoint_filter_api\u003dendpoint_filter.Manager(),"},{"line_number":58,"context_line":"        revoke_api\u003drevoke.Manager(),"},{"line_number":59,"context_line":"        identity_api\u003d_IDENTITY_API,"},{"line_number":60,"context_line":"        policy_api\u003dpolicy.Manager(),"},{"line_number":61,"context_line":"        token_api\u003dtoken.Manager(),"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FAg%3D","line":58,"in_reply_to":"AAAAUH%2F%2B%2FIM%3D","updated":"2014-01-20 04:15:53.000000000","message":"Done","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"}],"keystone/tests/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    if os.path.exists(db):"},{"line_number":158,"context_line":"        os.unlink(db)"},{"line_number":159,"context_line":"    if not os.path.exists(pristine):"},{"line_number":160,"context_line":"        migration.db_sync((migration_helpers.find_migrate_repo()))"},{"line_number":161,"context_line":"        migration_helpers.sync_database_to_version(extension\u003d\u0027revoke\u0027)"},{"line_number":162,"context_line":"        shutil.copyfile(db, pristine)"},{"line_number":163,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Fotc%3D","line":160,"updated":"2014-03-04 23:26:37.000000000","message":"extra parens here","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":314,"context_line":"    _config_file_list \u003d [dirs.etc(\u0027keystone.conf.sample\u0027),"},{"line_number":315,"context_line":"                         dirs.tests(\u0027test_overrides.conf\u0027)]"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def config_files(self):"},{"line_number":318,"context_line":"        return copy.copy(self._config_file_list)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FotA%3D","line":317,"updated":"2014-03-04 23:26:37.000000000","message":"(out of scope) but should this be a @property?","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"keystone/tests/test_auth.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.empty_context \u003d {\u0027environment\u0027: {}}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        self.controller \u003d token.controllers.Auth()"},{"line_number":80,"context_line":"        environment.use_eventlet(monkeypatch_thread\u003dFalse)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def assertEqualTokens(self, a, b):"},{"line_number":83,"context_line":"        \"\"\"Assert that two tokens are equal."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FH4%3D","line":80,"updated":"2014-01-20 03:15:47.000000000","message":"Out of curiosity, why this change? It seems to stand out compared to the rest of the patchset.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.empty_context \u003d {\u0027environment\u0027: {}}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        self.controller \u003d token.controllers.Auth()"},{"line_number":80,"context_line":"        environment.use_eventlet(monkeypatch_thread\u003dFalse)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def assertEqualTokens(self, a, b):"},{"line_number":83,"context_line":"        \"\"\"Assert that two tokens are equal."}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5Yo%3D","line":80,"updated":"2014-01-20 23:55:32.000000000","message":"don\u0027t we do this in tests/core.py? Otherwise, make this change in a separate commit... what does it have to do with revocation events?","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        #that will be used to run the CMS command.  These tests were"},{"line_number":82,"context_line":"        #passing only due to the global nature of the call.  If the"},{"line_number":83,"context_line":"        #tests in this file are run alone, API calls return unauthorized."},{"line_number":84,"context_line":"        environment.use_eventlet(monkeypatch_thread\u003dFalse)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def assertEqualTokens(self, a, b):"},{"line_number":87,"context_line":"        \"\"\"Assert that two tokens are equal."}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B168%3D","line":84,"updated":"2014-01-21 14:39:11.000000000","message":"suggest make this a separate commit because it\u0027s not related to revocation events.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"}],"keystone/tests/test_content_types.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":1297,"context_line":"        cfg_list.append(tests.dirs.tests(\u0027test_revoke_kvs.conf\u0027))"},{"line_number":1298,"context_line":"        return cfg_list"},{"line_number":1299,"context_line":""},{"line_number":1300,"context_line":"    def setUp(self):"},{"line_number":1301,"context_line":"        super(RevokeApiJsonTestCase, self).setUp()"},{"line_number":1302,"context_line":""},{"line_number":1303,"context_line":"    def test_fetch_revocation_list_admin_200(self):"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5zs%3D","line":1300,"updated":"2014-03-03 15:23:04.000000000","message":"If you don\u0027t have any custom setup you can remove this method.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":1297,"context_line":"        cfg_list.append(tests.dirs.tests(\u0027test_revoke_kvs.conf\u0027))"},{"line_number":1298,"context_line":"        return cfg_list"},{"line_number":1299,"context_line":""},{"line_number":1300,"context_line":"    def setUp(self):"},{"line_number":1301,"context_line":"        super(RevokeApiJsonTestCase, self).setUp()"},{"line_number":1302,"context_line":""},{"line_number":1303,"context_line":"    def test_fetch_revocation_list_admin_200(self):"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F2OM%3D","line":1300,"in_reply_to":"AAAAVn%2F%2F5zs%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":1301,"context_line":"        super(RevokeApiJsonTestCase, self).setUp()"},{"line_number":1302,"context_line":""},{"line_number":1303,"context_line":"    def test_fetch_revocation_list_admin_200(self):"},{"line_number":1304,"context_line":"        #Not a skip as this will never be alid in this configuration."},{"line_number":1305,"context_line":"        pass"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F9y0%3D","line":1304,"updated":"2014-03-03 05:44:07.000000000","message":"s/alid/allowed","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":1301,"context_line":"        super(RevokeApiJsonTestCase, self).setUp()"},{"line_number":1302,"context_line":""},{"line_number":1303,"context_line":"    def test_fetch_revocation_list_admin_200(self):"},{"line_number":1304,"context_line":"        #Not a skip as this will never be alid in this configuration."},{"line_number":1305,"context_line":"        pass"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F2OE%3D","line":1304,"in_reply_to":"AAAAVn%2F%2F9y0%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            self.tenant_service[\u0027id\u0027],"},{"line_number":202,"context_line":"            self.role_service[\u0027id\u0027])"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        token \u003d self.get_scoped_token(tenant_id\u003d\u0027service\u0027)"},{"line_number":205,"context_line":"        r \u003d self.admin_request("},{"line_number":206,"context_line":"            path\u003d\u0027/v2.0/tokens/%s\u0027 % token,"},{"line_number":207,"context_line":"            token\u003dtoken)"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FosI%3D","line":204,"updated":"2014-03-04 23:26:37.000000000","message":"pass in self.tenant_service[\u0027id\u0027] instead","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":1675,"context_line":"            self.tenant_service[\u0027id\u0027],"},{"line_number":1676,"context_line":"            self.role_service[\u0027id\u0027])"},{"line_number":1677,"context_line":""},{"line_number":1678,"context_line":"        # TODO(ayoung): test fails due to XML problem"},{"line_number":1679,"context_line":"#        r \u003d self.admin_request("},{"line_number":1680,"context_line":"#            path\u003d\u0027/v2.0/tokens/%s\u0027 % token,"},{"line_number":1681,"context_line":"#            token\u003dtoken,"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Forg%3D","line":1678,"updated":"2014-03-04 23:26:37.000000000","message":"more detail would be nice; if it\u0027s a pre-existing bug then it should be filed and referenced here with a Related-Bug in this commit message","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"keystone/tests/test_revoke.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        self.assertEqual(2, len(self.revoke_api.get_events()))"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def assertSortedByScopeId(self, events):"},{"line_number":49,"context_line":"        cur \u003d 0"},{"line_number":50,"context_line":"        nxt \u003d 1"},{"line_number":51,"context_line":"        while nxt \u003c len(events):"},{"line_number":52,"context_line":"            self.assertLess(events[cur].scope_id, events[nxt].scope_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9f2I%3D","line":49,"updated":"2013-12-10 22:23:38.000000000","message":"Could you replace this implementation with a simpler on like:\n\n  expected_order \u003d list(sorted(events, key\u003dlambda x: x.scope_id))\n  self.assertThat(events, matchers.Equal(expected_order))","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        start_count \u003d len(events)"},{"line_number":60,"context_line":"        for id in range(0, 8):"},{"line_number":61,"context_line":"            self.revoke_api.revoke(revoke.RevokeEvent("},{"line_number":62,"context_line":"                id\u003d\"%d\" % id,"},{"line_number":63,"context_line":"                scope_id\u003duuid.uuid4().__str__(),"},{"line_number":64,"context_line":"                scope_type\u003d1,"},{"line_number":65,"context_line":"                valid_until\u003dvalid_until))"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9f00%3D","line":62,"updated":"2013-12-10 22:23:38.000000000","message":"Is it possible that these ids will collide with ids from existing events? If so what would happen?","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        for id in range(0, 8):"},{"line_number":61,"context_line":"            self.revoke_api.revoke(revoke.RevokeEvent("},{"line_number":62,"context_line":"                id\u003d\"%d\" % id,"},{"line_number":63,"context_line":"                scope_id\u003duuid.uuid4().__str__(),"},{"line_number":64,"context_line":"                scope_type\u003d1,"},{"line_number":65,"context_line":"                valid_until\u003dvalid_until))"},{"line_number":66,"context_line":"        count \u003d id + 1"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9f0c%3D","line":63,"updated":"2013-12-10 22:23:38.000000000","message":"str(uuid.uuid4())","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                scope_id\u003duuid.uuid4().__str__(),"},{"line_number":64,"context_line":"                scope_type\u003d1,"},{"line_number":65,"context_line":"                valid_until\u003dvalid_until))"},{"line_number":66,"context_line":"        count \u003d id + 1"},{"line_number":67,"context_line":"        count +\u003d start_count"},{"line_number":68,"context_line":"        events \u003d self.revoke_api.get_events()"},{"line_number":69,"context_line":"        self.assertEqual(count, len(events))"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9f0E%3D","line":66,"updated":"2013-12-10 22:23:38.000000000","message":"Isn\u0027t this just a fancy was of saying `count \u003d 8`?  What about making it a \"const\" that is used here and in line 60?","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2043bcc33dfb126ccb390f44629287b4f831c989","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.assertEqual(1, len(self.revoke_api.get_events()))"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def assertSortedByScopeId(self, events):"},{"line_number":56,"context_line":"        cur \u003d 0"},{"line_number":57,"context_line":"        nxt \u003d 1"},{"line_number":58,"context_line":"        while nxt \u003c len(events):"},{"line_number":59,"context_line":"            self.assertLess(events[cur].scope_id, events[nxt].scope_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B5%2FQ%3D","line":56,"updated":"2014-01-20 21:26:46.000000000","message":"This seems like is can be a one-liner like:\n\nself.assertEqual(events, sorted(events, key\u003ditemgetter(\u0027scope_id\u0027)))","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fe0b264b37876c2fdbf17e4476865d3eb7d441de","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.assertEqual(1, len(self.revoke_api.get_events()))"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def assertSortedByScopeId(self, events):"},{"line_number":56,"context_line":"        cur \u003d 0"},{"line_number":57,"context_line":"        nxt \u003d 1"},{"line_number":58,"context_line":"        while nxt \u003c len(events):"},{"line_number":59,"context_line":"            self.assertLess(events[cur].scope_id, events[nxt].scope_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B5uk%3D","line":56,"in_reply_to":"AAAAUH%2F%2B5%2FQ%3D","updated":"2014-01-20 22:25:24.000000000","message":"removing.  Test is not going to be performed yet.","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2043bcc33dfb126ccb390f44629287b4f831c989","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.load_backends()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.revoke_api \u003d revoke.Manager()"},{"line_number":73,"context_line":"        self.revoke_api.driver._clear()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B5%2BM%3D","line":73,"updated":"2014-01-20 21:26:46.000000000","message":"Not sure I like this, but I don\u0027t have anything to suggest right now.","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fe0b264b37876c2fdbf17e4476865d3eb7d441de","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.load_backends()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.revoke_api \u003d revoke.Manager()"},{"line_number":73,"context_line":"        self.revoke_api.driver._clear()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B5vA%3D","line":73,"in_reply_to":"AAAAUH%2F%2B5%2BM%3D","updated":"2014-01-20 22:25:24.000000000","message":"The SQL version was chopped out.  The difference between the two of them is just the setup.","commit_id":"cd06db0d361004b7a7a3454a10567c6dead1e528"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self.load_backends()"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        self.revoke_api \u003d revoke.Manager()"},{"line_number":65,"context_line":"        self.revoke_api.driver._clear()"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5YI%3D","line":65,"updated":"2014-01-20 23:55:32.000000000","message":"this was just created, so why does it need to be cleared? add a comment... also, should clear in a cleanup?","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5fcd423317c2a89b283c8483619d13a671be979a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUH%2F%2Bn10%3D","line":3,"updated":"2014-01-23 19:52:24.000000000","message":"update copyright year since this is a new file?","commit_id":"a952a49787cfbaa045e1195a881e40c4a08d3b62"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2Fak%3D","line":1,"updated":"2014-02-17 19:26:32.000000000","message":"remove","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B8BE%3D","line":3,"updated":"2014-02-18 04:42:19.000000000","message":"remove","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d config.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class RevokeTests(object):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def test_list(self):"},{"line_number":33,"context_line":"        self.revoke_api.revoke_by_user(user_id\u003d1)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B8Ac%3D","line":30,"updated":"2014-02-18 04:42:19.000000000","message":"Shouldn\u0027t this extend a tests.TestCase? not object?\n\nWhy not just move these tests to KvsRevokeTests?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d config.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class RevokeTests(object):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def test_list(self):"},{"line_number":33,"context_line":"        self.revoke_api.revoke_by_user(user_id\u003d1)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B71A%3D","line":30,"in_reply_to":"AAAAUX%2F%2B8Ac%3D","updated":"2014-02-19 18:41:05.000000000","message":"No, this is a mix in.  The KVS implementation will be joined by a SQL one in a later patch.  That is the class that needs to extend testcase","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FrI%3D","line":1,"updated":"2014-02-22 19:17:19.000000000","message":"remove vim line.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def _future_time():"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    expire_delta \u003d datetime.timedelta(seconds\u003d1000)"},{"line_number":33,"context_line":"    future_time \u003d timeutils.utcnow() + expire_delta"},{"line_number":34,"context_line":"    return future_time"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FmY%3D","line":31,"updated":"2014-02-22 19:58:28.000000000","message":"remove blank line.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import datetime"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common import dependency"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fc1o%3D","line":13,"updated":"2014-02-26 15:51:13.000000000","message":"Extra newline","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"CONF \u003d config.CONF"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def _future_time():"},{"line_number":27,"context_line":"    expire_delta \u003d datetime.timedelta(seconds\u003d1000)"},{"line_number":28,"context_line":"    future_time \u003d timeutils.utcnow() + expire_delta"},{"line_number":29,"context_line":"    return future_time"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fcxw%3D","line":26,"updated":"2014-02-26 15:51:13.000000000","message":"I don\u0027t think this is ever used.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _new_id():"},{"line_number":29,"context_line":"    return uuid.uuid4()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def _future_time():"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtyE%3D","line":29,"updated":"2014-02-28 20:21:47.000000000","message":".hex ?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8e8c1fd737ed3975495c60c7bf1c3e56fc0ebdce","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _new_id():"},{"line_number":29,"context_line":"    return uuid.uuid4()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def _future_time():"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtdA%3D","line":29,"in_reply_to":"AAAAVX%2F%2FtyE%3D","updated":"2014-02-28 21:04:05.000000000","message":"++","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _new_id():"},{"line_number":29,"context_line":"    return uuid.uuid4()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def _future_time():"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtYA%3D","line":29,"in_reply_to":"AAAAVX%2F%2FtyE%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        future \u003d timeutils.utcnow() + datetime.timedelta(seconds\u003d1000)"},{"line_number":129,"context_line":"        self.assertEqual(0, len(self.revoke_api.get_events(future)))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _past_time(self):"},{"line_number":132,"context_line":"        expire_delta \u003d datetime.timedelta(days\u003d-1000)"},{"line_number":133,"context_line":"        past_time \u003d timeutils.utcnow() + expire_delta"},{"line_number":134,"context_line":"        return past_time"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5yc%3D","line":131,"updated":"2014-03-03 15:23:04.000000000","message":"Why redefine this? You have a module function above.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        future \u003d timeutils.utcnow() + datetime.timedelta(seconds\u003d1000)"},{"line_number":129,"context_line":"        self.assertEqual(0, len(self.revoke_api.get_events(future)))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _past_time(self):"},{"line_number":132,"context_line":"        expire_delta \u003d datetime.timedelta(days\u003d-1000)"},{"line_number":133,"context_line":"        past_time \u003d timeutils.utcnow() + expire_delta"},{"line_number":134,"context_line":"        return past_time"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4sE%3D","line":131,"in_reply_to":"AAAAVn%2F%2F5yc%3D","updated":"2014-03-03 21:12:49.000000000","message":"Gone.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":146,"context_line":"class SqlRevokeTests(test_backend_sql.SqlTests, RevokeTests):"},{"line_number":147,"context_line":"    def setUp(self):"},{"line_number":148,"context_line":"        super(SqlRevokeTests, self).setUp()"},{"line_number":149,"context_line":"        pass"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"class KvsRevokeTests(tests.TestCase, RevokeTests):"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F9yo%3D","line":149,"updated":"2014-03-03 05:44:07.000000000","message":"redundant","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":146,"context_line":"class SqlRevokeTests(test_backend_sql.SqlTests, RevokeTests):"},{"line_number":147,"context_line":"    def setUp(self):"},{"line_number":148,"context_line":"        super(SqlRevokeTests, self).setUp()"},{"line_number":149,"context_line":"        pass"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"class KvsRevokeTests(tests.TestCase, RevokeTests):"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4qM%3D","line":149,"in_reply_to":"AAAAVn%2F%2F9yo%3D","updated":"2014-03-03 21:12:49.000000000","message":"Meant to add in the explicit SQL config.  It wasn\u0027t necessary when SQL was the default. With it, changing the default doesn\u0027t affect this test.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def tearDown(self):"},{"line_number":208,"context_line":"        super(RevokeTreeTests, self).tearDown()"},{"line_number":209,"context_line":"        pass"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def _assertTokenRevoked(self, token_data):"},{"line_number":212,"context_line":"        self.assertTrue(any([_matches(e, token_data) for e in self.events]))"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F9yw%3D","line":209,"updated":"2014-03-03 05:44:07.000000000","message":"redundant","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def tearDown(self):"},{"line_number":208,"context_line":"        super(RevokeTreeTests, self).tearDown()"},{"line_number":209,"context_line":"        pass"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def _assertTokenRevoked(self, token_data):"},{"line_number":212,"context_line":"        self.assertTrue(any([_matches(e, token_data) for e in self.events]))"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4o0%3D","line":209,"in_reply_to":"AAAAVn%2F%2F5xw%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def tearDown(self):"},{"line_number":208,"context_line":"        super(RevokeTreeTests, self).tearDown()"},{"line_number":209,"context_line":"        pass"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def _assertTokenRevoked(self, token_data):"},{"line_number":212,"context_line":"        self.assertTrue(any([_matches(e, token_data) for e in self.events]))"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5xw%3D","line":209,"in_reply_to":"AAAAVn%2F%2F9yw%3D","updated":"2014-03-03 15:23:04.000000000","message":"If you don\u0027t have any custom tear down logic this should be deleted.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                                       [\u0027trust_id\u003d*\u0027]"},{"line_number":368,"context_line":"                                       [\u0027consumer_id\u003d*\u0027]"},{"line_number":369,"context_line":"                                       [\u0027access_token_id\u003d*\u0027]))"},{"line_number":370,"context_line":"    #two different functions add  domain_ids, +1 for None"},{"line_number":371,"context_line":"        self.assertEqual(2 * turn + 1, len(self.tree.revoke_map"},{"line_number":372,"context_line":"                                           [\u0027trust_id\u003d*\u0027]"},{"line_number":373,"context_line":"                                           [\u0027consumer_id\u003d*\u0027]"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5ws%3D","line":370,"updated":"2014-03-03 15:23:04.000000000","message":"Indent and add space after #","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":373,"context_line":"                                           [\u0027consumer_id\u003d*\u0027]"},{"line_number":374,"context_line":"                                           [\u0027access_token_id\u003d*\u0027]"},{"line_number":375,"context_line":"                                           [\u0027expires_at\u003d*\u0027]))"},{"line_number":376,"context_line":"    #two different functions add  project_ids, +1 for None"},{"line_number":377,"context_line":"        self.assertEqual(2 * turn + 1, len(self.tree.revoke_map"},{"line_number":378,"context_line":"                                           [\u0027trust_id\u003d*\u0027]"},{"line_number":379,"context_line":"                                           [\u0027consumer_id\u003d*\u0027]"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5wg%3D","line":376,"updated":"2014-03-03 15:23:04.000000000","message":"Same","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":380,"context_line":"                                           [\u0027access_token_id\u003d*\u0027]"},{"line_number":381,"context_line":"                                           [\u0027expires_at\u003d*\u0027]"},{"line_number":382,"context_line":"                                           [\u0027domain_id\u003d*\u0027]))"},{"line_number":383,"context_line":"    #10 users added"},{"line_number":384,"context_line":"        self.assertEqual(turn, len(self.tree.revoke_map"},{"line_number":385,"context_line":"                                   [\u0027trust_id\u003d*\u0027]"},{"line_number":386,"context_line":"                                   [\u0027consumer_id\u003d*\u0027]"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5wY%3D","line":383,"updated":"2014-03-03 15:23:04.000000000","message":"Same","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def _past_time():"},{"line_number":39,"context_line":"    expire_delta \u003d datetime.timedelta(days\u003d-1000)"},{"line_number":40,"context_line":"    past_time \u003d timeutils.utcnow() + expire_delta"},{"line_number":41,"context_line":"    return past_time"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Foq8%3D","line":39,"updated":"2014-03-04 23:26:37.000000000","message":"a narrower window would make this a stronger test; same with the above","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                dom_id_matched \u003d True"},{"line_number":83,"context_line":"                break"},{"line_number":84,"context_line":"        if not dom_id_matched:"},{"line_number":85,"context_line":"            return False"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    # If any one check does not match, the while token does"},{"line_number":88,"context_line":"    # not match the event. The numerous return False indicate"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Folw%3D","line":85,"updated":"2014-03-04 23:26:37.000000000","message":"why not use a for/else here too?","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                role_found \u003d True"},{"line_number":106,"context_line":"                break"},{"line_number":107,"context_line":"        if not role_found:"},{"line_number":108,"context_line":"            return False"},{"line_number":109,"context_line":"    if token_values[\u0027issued_at\u0027] \u003e event.issued_before:"},{"line_number":110,"context_line":"        return False"},{"line_number":111,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Fols%3D","line":108,"updated":"2014-03-04 23:26:37.000000000","message":"same","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        return self.assertTrue(self.tree.is_revoked(token_data),"},{"line_number":207,"context_line":"                               \u0027Token should be revoked\u0027)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def _assertTokenNotRevoked(self, token_data):"},{"line_number":210,"context_line":"        self.assertFalse(any([_matches(e, token_data) for e in self.events]))"},{"line_number":211,"context_line":"        return self.assertFalse(self.tree.is_revoked(token_data),"},{"line_number":212,"context_line":"                                \u0027Token should not be revoked\u0027)"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Fojs%3D","line":209,"updated":"2014-03-04 23:26:37.000000000","message":"these don\u0027t need to be _private","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"keystone/tests/test_v3.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    #override this to sepcify the complete list of configuration files"},{"line_number":46,"context_line":"    def config_files(self):"},{"line_number":47,"context_line":"        return copy.copy(self._config_file_list)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def setup_database(self):"},{"line_number":50,"context_line":"        tests.setup_database()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FHY%3D","line":47,"updated":"2014-01-20 03:15:47.000000000","message":"Suggest a comment why this is needed (I\u0027m fairly sure I\u0027ve seen this elsewhere and we dont use similar copy.copy).","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                         tests.dirs.tests(\u0027backend_sql_disk.conf\u0027)]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    #override this to specify the complete list of configuration files"},{"line_number":46,"context_line":"    #Make a copy of the original values, otherwise additional tests can"},{"line_number":47,"context_line":"    #end up appending to them and corrupting other tests."},{"line_number":48,"context_line":"    def config_files(self):"},{"line_number":49,"context_line":"        return copy.copy(self._config_file_list)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5YE%3D","line":46,"updated":"2014-01-20 23:55:32.000000000","message":"could make this change in a separate commit.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                         tests.dirs.tests(\u0027backend_sql_disk.conf\u0027)]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    #override this to specify the complete list of configuration files"},{"line_number":46,"context_line":"    #Make a copy of the original values, otherwise additional tests can"},{"line_number":47,"context_line":"    #end up appending to them and corrupting other tests."},{"line_number":48,"context_line":"    def config_files(self):"},{"line_number":49,"context_line":"        return copy.copy(self._config_file_list)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B16w%3D","line":46,"updated":"2014-01-21 14:39:11.000000000","message":"could make this change in a separate commit.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"}],"keystone/tests/test_v3_auth.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def setUp(self):"},{"line_number":334,"context_line":"        super(TestPKITokenAPIs, self).setUp()"},{"line_number":335,"context_line":"        self.doSetUp()"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"class TestUUIDTokenAPIs(test_v3.RestfulTestCase, TokenAPITests):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5Xk%3D","line":335,"updated":"2014-01-20 23:55:32.000000000","message":"there\u0027s something very wrong with test structure if we need to do these contortions.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c63f67fa80962b333bc2eff421336c16f5a3ec6","unresolved":false,"context_lines":[{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def setUp(self):"},{"line_number":334,"context_line":"        super(TestPKITokenAPIs, self).setUp()"},{"line_number":335,"context_line":"        self.doSetUp()"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"class TestUUIDTokenAPIs(test_v3.RestfulTestCase, TokenAPITests):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B424%3D","line":335,"in_reply_to":"AAAAUH%2F%2B5Xk%3D","updated":"2014-01-21 04:55:07.000000000","message":"Yes, there is, but it is due to the fact that we are about 4 deep in the inheritance chain here, and the base class that has the tests should not be directly executed.  It is a vestige of treating PKI as a subclass of UUID tokens (they are not) that the original setup ever made sense.  The doSetup code is common to both types of token, but would otherwise never get called.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":721,"context_line":"          well as its existing role1 on projectA"},{"line_number":722,"context_line":"        - User4 has role2 on Project C"},{"line_number":723,"context_line":"        - User6 has role1 on projectA and domainA"},{"line_number":724,"context_line":"    - This allows us to create 5 tokens by virtue of different types of"},{"line_number":725,"context_line":"      role assignment:"},{"line_number":726,"context_line":"      - user1, scoped to ProjectA by virtue of user role1 assignment"},{"line_number":727,"context_line":"      - user5, scoped to ProjectB by virtue of group role1 assignment"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5XY%3D","line":724,"updated":"2014-01-20 23:55:32.000000000","message":"indentation is off here.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":1165,"context_line":"        self.delete(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d204)"},{"line_number":1166,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1167,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1168,"context_line":"        self.assertEqual(1, len(events))"},{"line_number":1169,"context_line":""},{"line_number":1170,"context_line":""},{"line_number":1171,"context_line":"class TestAuthExternalDisabled(test_v3.RestfulTestCase):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5XA%3D","line":1168,"updated":"2014-01-20 23:55:32.000000000","message":"seems like there\u0027s more that could be asserted about the event.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c9508821c284ebef49af620714a81da2e21497ba","unresolved":false,"context_lines":[{"line_number":710,"context_line":""},{"line_number":711,"context_line":"    def test_deleting_role_revokes_token(self):"},{"line_number":712,"context_line":"        \"\"\"Test deleting a role revokes token.\"\"\""},{"line_number":713,"context_line":""},{"line_number":714,"context_line":"        \"\"\" Add some additional test data, namely:"},{"line_number":715,"context_line":"        - A third project (project C)"},{"line_number":716,"context_line":"        - Three additional users - user4 owned by domainB and user5 and 6"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1nw%3D","line":713,"updated":"2014-01-21 15:37:32.000000000","message":"Two sets of doc string comments? Can these be combined?","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c9508821c284ebef49af620714a81da2e21497ba","unresolved":false,"context_lines":[{"line_number":1134,"context_line":"            \u0027test_token_provider_revoke_by_id_false.conf\u0027))"},{"line_number":1135,"context_line":"        return conf_files"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"    def assertProjectInList(self, events, project_id):"},{"line_number":1138,"context_line":"        found \u003d False"},{"line_number":1139,"context_line":"        for event in events:"},{"line_number":1140,"context_line":"            if event[\u0027project_id\u0027] \u003d\u003d project_id:"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1mo%3D","line":1137,"updated":"2014-01-21 15:37:32.000000000","message":"Should this, assertDomainInList, and assertUserAndExpiryInList be refactored to follow the \u0027assert_domain_in_list\u0027 naming convention instead of camelCase?","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c9508821c284ebef49af620714a81da2e21497ba","unresolved":false,"context_lines":[{"line_number":2404,"context_line":"        self.assertEqual(r.result[\u0027token\u0027][\u0027project\u0027][\u0027name\u0027],"},{"line_number":2405,"context_line":"                         self.project[\u0027name\u0027])"},{"line_number":2406,"context_line":""},{"line_number":2407,"context_line":"    def assertTrustTokensRevoked(self, trust_id):"},{"line_number":2408,"context_line":"        revocation_response \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":2409,"context_line":"                                       expected_status\u003d200)"},{"line_number":2410,"context_line":"        revocation_events \u003d revocation_response.json_body[\u0027events\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1mc%3D","line":2407,"updated":"2014-01-21 15:37:32.000000000","message":"Same comment here as above","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5fcd423317c2a89b283c8483619d13a671be979a","unresolved":false,"context_lines":[{"line_number":733,"context_line":"        - role1 is then deleted"},{"line_number":734,"context_line":"        - Check the tokens on Project A and B, and DomainA are revoked,"},{"line_number":735,"context_line":"          but not the one for Project C"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    \"\"\""},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"        self.role_data_fixtures()"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAUH%2F%2Bn1g%3D","line":736,"updated":"2014-01-23 19:52:24.000000000","message":"Nested doc strings? Can this just be one set of doc strings?","commit_id":"a952a49787cfbaa045e1195a881e40c4a08d3b62"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":760,"context_line":"    def test_deleting_role_revokes_token(self):"},{"line_number":761,"context_line":"        \"\"\"Test deleting a role revokes token."},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"          Add some additional test data, namely:"},{"line_number":764,"context_line":"        - A third project (project C)"},{"line_number":765,"context_line":"        - Three additional users - user4 owned by domainB and user5 and 6"},{"line_number":766,"context_line":"          owned by domainA (different domain ownership should not affect"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FaA%3D","line":763,"updated":"2014-02-17 19:26:32.000000000","message":"add a blank line after this for rst.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":781,"context_line":"        - Check the tokens on Project A and B, and DomainA are revoked,"},{"line_number":782,"context_line":"          but not the one for Project C"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"    \"\"\""},{"line_number":785,"context_line":""},{"line_number":786,"context_line":"        self.role_data_fixtures()"},{"line_number":787,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FaM%3D","line":784,"updated":"2014-02-17 19:26:32.000000000","message":"this should be indented more.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"class TestTokenRevokeApi(TestTokenRevokeById):"},{"line_number":1179,"context_line":"    \"\"\"Test token revocation on the v3 Identity API.\"\"\""},{"line_number":1180,"context_line":"    def config_files(self):"},{"line_number":1181,"context_line":"        conf_files \u003d super(TestTokenRevokeApi, self).config_files()"},{"line_number":1182,"context_line":"        conf_files.append(tests.dirs.tests("},{"line_number":1183,"context_line":"            \u0027test_token_provider_revoke_by_id_false.conf\u0027))"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B79o%3D","line":1180,"updated":"2014-02-18 04:42:19.000000000","message":"This is already called in testtokenrevokebyId. strongly suggest putting this somewhere where are tests can access it, like restful_v3_testcase","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cdd671a930fb6fce5886fc6bf1252f4125a2421f","unresolved":false,"context_lines":[{"line_number":1224,"context_line":"        self.assertDomainInList(events, self.domainA[\u0027id\u0027])"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    def assertUserAndExpiryInList(self, events, user_id, expires_at):"},{"line_number":1227,"context_line":"        found \u003d False"},{"line_number":1228,"context_line":"        for e in events:"},{"line_number":1229,"context_line":"            if e[\u0027user_id\u0027] \u003d\u003d user_id and e[\u0027expires_at\u0027] \u003d\u003d expires_at:"},{"line_number":1230,"context_line":"                found \u003d True"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BbU%3D","line":1227,"updated":"2014-02-17 21:51:34.000000000","message":"(NIT): move this up with assertDominInList and assertProjectInList","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":1235,"context_line":"        self.role_data_fixtures()"},{"line_number":1236,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1237,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1238,"context_line":"        self.assertEqual(0, len(events))"},{"line_number":1239,"context_line":""},{"line_number":1240,"context_line":"        scoped_token \u003d self.get_scoped_token()"},{"line_number":1241,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: scoped_token}"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B7%2BI%3D","line":1238,"updated":"2014-02-18 04:42:19.000000000","message":"assertEqual(events, [])","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":2109,"context_line":""},{"line_number":2110,"context_line":""},{"line_number":2111,"context_line":"class TestTrustAuth(TestAuthInfo):"},{"line_number":2112,"context_line":"    def config_files(self):"},{"line_number":2113,"context_line":"        conf_files \u003d super(TestTrustAuth, self).config_files()"},{"line_number":2114,"context_line":"        conf_files.append(tests.dirs.tests("},{"line_number":2115,"context_line":"            \u0027test_token_provider_revoke_by_id_false.conf\u0027))"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B7%2BY%3D","line":2112,"updated":"2014-02-18 04:42:19.000000000","message":"This change is in a lot of spots, can\u0027t you add it to a common setup?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":2453,"context_line":"        self.assertEqual(r.result[\u0027token\u0027][\u0027project\u0027][\u0027name\u0027],"},{"line_number":2454,"context_line":"                         self.project[\u0027name\u0027])"},{"line_number":2455,"context_line":""},{"line_number":2456,"context_line":"    def assertTrustTokensRevoked(self, trust_id):"},{"line_number":2457,"context_line":"        revocation_response \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":2458,"context_line":"                                       expected_status\u003d200)"},{"line_number":2459,"context_line":"        revocation_events \u003d revocation_response.json_body[\u0027events\u0027]"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B7%2B0%3D","line":2456,"updated":"2014-02-18 04:42:19.000000000","message":"These tests can probably go in another patch later on .. they seem outside the scope of the patch","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"        self.head(\u0027/auth/tokens\u0027,"},{"line_number":1090,"context_line":"                  headers\u003d{\u0027X-Subject-Token\u0027: token2},"},{"line_number":1091,"context_line":"                  expected_status\u003d204)"},{"line_number":1092,"context_line":"        # Adding user2 to a group should not invalidate token"},{"line_number":1093,"context_line":"        self.put(\u0027/groups/%(group_id)s/users/%(user_id)s\u0027 % {"},{"line_number":1094,"context_line":"            \u0027group_id\u0027: self.group2[\u0027id\u0027],"},{"line_number":1095,"context_line":"            \u0027user_id\u0027: self.user2[\u0027id\u0027]})"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FmI%3D","line":1092,"updated":"2014-02-22 19:58:28.000000000","message":"what changed this behavior?","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"        self.head(\u0027/auth/tokens\u0027,"},{"line_number":1090,"context_line":"                  headers\u003d{\u0027X-Subject-Token\u0027: token2},"},{"line_number":1091,"context_line":"                  expected_status\u003d204)"},{"line_number":1092,"context_line":"        # Adding user2 to a group should not invalidate token"},{"line_number":1093,"context_line":"        self.put(\u0027/groups/%(group_id)s/users/%(user_id)s\u0027 % {"},{"line_number":1094,"context_line":"            \u0027group_id\u0027: self.group2[\u0027id\u0027],"},{"line_number":1095,"context_line":"            \u0027user_id\u0027: self.user2[\u0027id\u0027]})"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2FvAU%3D","line":1092,"in_reply_to":"AAAAU3%2F%2F%2FmI%3D","updated":"2014-02-25 02:26:45.000000000","message":"Adding a user to a  group is no longer considered an act that revokes a token.  The new API does not enforce it.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"        for event in events:"},{"line_number":1189,"context_line":"            if event[\u0027project_id\u0027] \u003d\u003d project_id:"},{"line_number":1190,"context_line":"                found \u003d True"},{"line_number":1191,"context_line":"        self.assertTrue(found)"},{"line_number":1192,"context_line":""},{"line_number":1193,"context_line":"    def assertDomainInList(self, events, domain_id):"},{"line_number":1194,"context_line":"        found \u003d False"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fl8%3D","line":1191,"updated":"2014-02-22 19:58:28.000000000","message":"suggest provide a fail message","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":1195,"context_line":"        for event in events:"},{"line_number":1196,"context_line":"            if event[\u0027domain_id\u0027] \u003d\u003d domain_id:"},{"line_number":1197,"context_line":"                found \u003d True"},{"line_number":1198,"context_line":"        self.assertTrue(found)"},{"line_number":1199,"context_line":""},{"line_number":1200,"context_line":"    def test_list_delete_project_shows_in_event_list(self):"},{"line_number":1201,"context_line":"        self.role_data_fixtures()"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fl4%3D","line":1198,"updated":"2014-02-22 19:58:28.000000000","message":"suggest provide a fail message","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":1201,"context_line":"        self.role_data_fixtures()"},{"line_number":1202,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1203,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1204,"context_line":"        self.assertEqual(0, len(events))"},{"line_number":1205,"context_line":"        self.delete("},{"line_number":1206,"context_line":"            \u0027/projects/%(project_id)s\u0027 % {\u0027project_id\u0027: self.projectA[\u0027id\u0027]})"},{"line_number":1207,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FmA%3D","line":1204,"updated":"2014-02-22 19:58:28.000000000","message":"suggest use self.assertEqual([], events) then will get nicer output if it doesn\u0027t match.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"813c755593d6bacb849bec6089129eff687b6754","unresolved":false,"context_lines":[{"line_number":1201,"context_line":"        self.role_data_fixtures()"},{"line_number":1202,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1203,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1204,"context_line":"        self.assertEqual(0, len(events))"},{"line_number":1205,"context_line":"        self.delete("},{"line_number":1206,"context_line":"            \u0027/projects/%(project_id)s\u0027 % {\u0027project_id\u0027: self.projectA[\u0027id\u0027]})"},{"line_number":1207,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2Fu%2FQ%3D","line":1204,"in_reply_to":"AAAAU3%2F%2F%2FmA%3D","updated":"2014-02-25 02:26:45.000000000","message":"Done","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":1212,"context_line":"    def test_disable_domain_shows_in_event_list(self):"},{"line_number":1213,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1214,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1215,"context_line":"        self.assertEqual(0, len(events))"},{"line_number":1216,"context_line":"        disable_body \u003d {\"domain\": {\"enabled\": False}}"},{"line_number":1217,"context_line":"        self.patch("},{"line_number":1218,"context_line":"            \u0027/domains/%(project_id)s\u0027 % {\u0027project_id\u0027: self.domainA[\u0027id\u0027]},"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fl0%3D","line":1215,"updated":"2014-02-22 19:58:28.000000000","message":"suggest use\n\n self.assertEqual([], events)","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1214,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1215,"context_line":"        self.assertEqual(0, len(events))"},{"line_number":1216,"context_line":"        disable_body \u003d {\"domain\": {\"enabled\": False}}"},{"line_number":1217,"context_line":"        self.patch("},{"line_number":1218,"context_line":"            \u0027/domains/%(project_id)s\u0027 % {\u0027project_id\u0027: self.domainA[\u0027id\u0027]},"},{"line_number":1219,"context_line":"            body\u003ddisable_body)"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Flg%3D","line":1216,"updated":"2014-02-22 19:58:28.000000000","message":"use \u0027 for strings consistently.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":1228,"context_line":"        for e in events:"},{"line_number":1229,"context_line":"            if e[\u0027user_id\u0027] \u003d\u003d user_id and e[\u0027expires_at\u0027] \u003d\u003d expires_at:"},{"line_number":1230,"context_line":"                found \u003d True"},{"line_number":1231,"context_line":"        self.assertTrue(found)"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    def test_list_delete_token_shows_in_event_list(self):"},{"line_number":1234,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Flc%3D","line":1231,"updated":"2014-02-22 19:58:28.000000000","message":"suggest provide a failure message.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":1235,"context_line":"        self.role_data_fixtures()"},{"line_number":1236,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1237,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1238,"context_line":"        self.assertEqual(0, len(events))"},{"line_number":1239,"context_line":""},{"line_number":1240,"context_line":"        scoped_token \u003d self.get_scoped_token()"},{"line_number":1241,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: scoped_token}"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FlY%3D","line":1238,"updated":"2014-02-22 19:58:28.000000000","message":"suggest use\n\n self.assertEqual([], events)","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":2461,"context_line":"        for event in revocation_events:"},{"line_number":2462,"context_line":"            if event.get(\u0027OS-TRUST:trust_id\u0027) \u003d\u003d trust_id:"},{"line_number":2463,"context_line":"                found \u003d True"},{"line_number":2464,"context_line":"        self.assertTrue(found)"},{"line_number":2465,"context_line":""},{"line_number":2466,"context_line":"    def test_delete_trust_revokes_tokens(self):"},{"line_number":2467,"context_line":"        ref \u003d self.new_trust_ref("}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FlQ%3D","line":2464,"updated":"2014-02-22 19:58:28.000000000","message":"suggest provide a failure message.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"class TokenAPITests(object):"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def doSetUp(self):"},{"line_number":98,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":99,"context_line":"            username\u003dself.user[\u0027name\u0027],"},{"line_number":100,"context_line":"            user_domain_id\u003dself.domain_id,"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FcrE%3D","line":97,"updated":"2014-02-26 15:51:13.000000000","message":"Did this not work as setUp?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"class TokenAPITests(object):"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def doSetUp(self):"},{"line_number":98,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":99,"context_line":"            username\u003dself.user[\u0027name\u0027],"},{"line_number":100,"context_line":"            user_domain_id\u003dself.domain_id,"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZPs%3D","line":97,"in_reply_to":"AAAAU3%2F%2FcrE%3D","updated":"2014-02-26 21:54:53.000000000","message":"Its not a test subclass, it is done as a mixin, so it is called by the setup from the actual classes.  It has to do with how deep in the inheritance hierarchy the tests themselves are defined.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"006dd09ac164253c9891e3590ea2bf24e4d6414d","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1214,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1215,"context_line":"        self.assertEqual([], events)"},{"line_number":1216,"context_line":"        disable_body \u003d {\"domain\": {\"enabled\": False}}"},{"line_number":1217,"context_line":"        self.patch("},{"line_number":1218,"context_line":"            \u0027/domains/%(project_id)s\u0027 % {\u0027project_id\u0027: self.domainA[\u0027id\u0027]},"},{"line_number":1219,"context_line":"            body\u003ddisable_body)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZOQ%3D","line":1216,"updated":"2014-02-26 22:05:50.000000000","message":"use \u0027 for strings consistently.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fc7e937f8441b406e8b5e98e6b819db26b7de339","unresolved":false,"context_lines":[{"line_number":1216,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1217,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1218,"context_line":"        self.assertEqual([], events)"},{"line_number":1219,"context_line":"        disable_body \u003d {\"domain\": {\"enabled\": False}}"},{"line_number":1220,"context_line":"        self.patch("},{"line_number":1221,"context_line":"            \u0027/domains/%(project_id)s\u0027 % {\u0027project_id\u0027: self.domainA[\u0027id\u0027]},"},{"line_number":1222,"context_line":"            body\u003ddisable_body)"}],"source_content_type":"text/x-python","patch_set":60,"id":"AAAAVX%2F%2F%2Bhs%3D","line":1219,"updated":"2014-02-27 02:22:07.000000000","message":"use \u0027 for strings consistently.","commit_id":"58afd0eb3d3163ec91db6c025e208b1d08ff7922"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":5,"context_line":"# a copy of the License at"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F9xw%3D","side":"PARENT","line":2,"updated":"2014-03-03 05:44:07.000000000","message":"probably shouldnt remove that","commit_id":"42e23753f082afd2048b358af67750c2bd252f49"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import datetime"},{"line_number":15,"context_line":"import json"},{"line_number":16,"context_line":"import uuid"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F9x0%3D","line":13,"updated":"2014-03-03 05:44:07.000000000","message":"nit: whitespacce","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import datetime"},{"line_number":15,"context_line":"import json"},{"line_number":16,"context_line":"import uuid"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F2NI%3D","line":13,"in_reply_to":"AAAAVn%2F%2F9x0%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"bb77e7971a7eb2dcf7880683278794d8c5347f08","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class TokenAPITests(object):"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def doSetUp(self):"},{"line_number":100,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":101,"context_line":"            username\u003dself.user[\u0027name\u0027],"},{"line_number":102,"context_line":"            user_domain_id\u003dself.domain_id,"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F9wg%3D","line":99,"updated":"2014-03-03 05:44:07.000000000","message":"i\u0027m not sure why this can\u0027t remain as setUp()","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class TokenAPITests(object):"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def doSetUp(self):"},{"line_number":100,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":101,"context_line":"            username\u003dself.user[\u0027name\u0027],"},{"line_number":102,"context_line":"            user_domain_id\u003dself.domain_id,"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4xU%3D","line":99,"in_reply_to":"AAAAVn%2F%2F5ZY%3D","updated":"2014-03-03 21:12:49.000000000","message":"It can\u0027t.  This is not a test class itself, and it does not get called.  If I make  TokenAPITests a subclass of the testcase, it gets called by the enumerate-tests-in-file code.  As (Object) It has no super class that can be called from this file.  In cases like \"restful test case\" we can get away with it because there are no embedded test_* functions.  I\u0027ll explain this in a comment.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class TokenAPITests(object):"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def doSetUp(self):"},{"line_number":100,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":101,"context_line":"            username\u003dself.user[\u0027name\u0027],"},{"line_number":102,"context_line":"            user_domain_id\u003dself.domain_id,"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5ZY%3D","line":99,"in_reply_to":"AAAAVn%2F%2F9wg%3D","updated":"2014-03-03 15:23:04.000000000","message":"Yes, this should just be setUp.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        conf_files.append(tests.dirs.tests(\u0027test_pki_token_provider.conf\u0027))"},{"line_number":380,"context_line":"        return conf_files"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def setUp(self):"},{"line_number":383,"context_line":"        super(TestPKITokenAPIs, self).setUp()"},{"line_number":384,"context_line":"        self.doSetUp()"},{"line_number":385,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5ZQ%3D","line":382,"updated":"2014-03-03 15:23:04.000000000","message":"This can be deleted.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"35765e35f7608bf59bbe46438bffa98ad6a349e7","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        conf_files.append(tests.dirs.tests(\u0027test_uuid_token_provider.conf\u0027))"},{"line_number":391,"context_line":"        return conf_files"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def setUp(self):"},{"line_number":394,"context_line":"        super(TestUUIDTokenAPIs, self).setUp()"},{"line_number":395,"context_line":"        self.doSetUp()"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5ZI%3D","line":393,"updated":"2014-03-03 15:23:04.000000000","message":"This can be deleted.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b1dc040e2dad225fa5cc03d1e53b13d5a29f87e9","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: self.get_scoped_token()}"},{"line_number":1175,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d204)"},{"line_number":1176,"context_line":"        self.delete(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d204)"},{"line_number":1177,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d404)"},{"line_number":1178,"context_line":""},{"line_number":1179,"context_line":"    def get_v2_token(self, tenant_id\u003dNone):"},{"line_number":1180,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3Rw%3D","line":1177,"updated":"2014-03-03 18:42:34.000000000","message":"but you\u0027re not going to test the resulting revocation event?","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b1dc040e2dad225fa5cc03d1e53b13d5a29f87e9","unresolved":false,"context_lines":[{"line_number":1193,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: token}"},{"line_number":1194,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d204)"},{"line_number":1195,"context_line":"        self.delete(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d204)"},{"line_number":1196,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d404)"},{"line_number":1197,"context_line":""},{"line_number":1198,"context_line":""},{"line_number":1199,"context_line":"class TestTokenRevokeApi(TestTokenRevokeById):"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3RU%3D","line":1196,"updated":"2014-03-03 18:42:34.000000000","message":"same","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":1193,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: token}"},{"line_number":1194,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d204)"},{"line_number":1195,"context_line":"        self.delete(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d204)"},{"line_number":1196,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d404)"},{"line_number":1197,"context_line":""},{"line_number":1198,"context_line":""},{"line_number":1199,"context_line":"class TestTokenRevokeApi(TestTokenRevokeById):"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F2PU%3D","line":1196,"in_reply_to":"AAAAVn%2F%2F3RU%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b1dc040e2dad225fa5cc03d1e53b13d5a29f87e9","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1232,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"        self.assertProjectInList(events, self.projectA[\u0027id\u0027])"},{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"    def test_disable_domain_shows_in_event_list(self):"},{"line_number":1237,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3QE%3D","line":1234,"updated":"2014-03-03 18:42:34.000000000","message":"this isn\u0027t sufficiently tested -- every project could be in the list, or the scope could be overly narrowed (for example, it could include a specific project_id + user_id pair)","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1232,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"        self.assertProjectInList(events, self.projectA[\u0027id\u0027])"},{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"    def test_disable_domain_shows_in_event_list(self):"},{"line_number":1237,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3EU%3D","line":1234,"in_reply_to":"AAAAVn%2F%2F3QE%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b1dc040e2dad225fa5cc03d1e53b13d5a29f87e9","unresolved":false,"context_lines":[{"line_number":1245,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1246,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1247,"context_line":""},{"line_number":1248,"context_line":"        self.assertDomainInList(events, self.domainA[\u0027id\u0027])"},{"line_number":1249,"context_line":""},{"line_number":1250,"context_line":"    def assertUserAndExpiryInList(self, events, user_id, expires_at):"},{"line_number":1251,"context_line":"        found \u003d False"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3P4%3D","line":1248,"updated":"2014-03-03 18:42:34.000000000","message":"same -- you should be able to assertEqual quite easily on the entire /events response","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":1245,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":1246,"context_line":"                          expected_status\u003d200).json_body[\u0027events\u0027]"},{"line_number":1247,"context_line":""},{"line_number":1248,"context_line":"        self.assertDomainInList(events, self.domainA[\u0027id\u0027])"},{"line_number":1249,"context_line":""},{"line_number":1250,"context_line":"    def assertUserAndExpiryInList(self, events, user_id, expires_at):"},{"line_number":1251,"context_line":"        found \u003d False"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F3EI%3D","line":1248,"in_reply_to":"AAAAVn%2F%2F3P4%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5f537921bb8214ceeaa07a9e52f8a112b7f2000c","unresolved":false,"context_lines":[{"line_number":786,"context_line":"             - Check the tokens on Project A and B, and DomainA are revoked,"},{"line_number":787,"context_line":"               but not the one for Project C"},{"line_number":788,"context_line":""},{"line_number":789,"context_line":"           \"\"\""},{"line_number":790,"context_line":""},{"line_number":791,"context_line":"        self.role_data_fixtures()"},{"line_number":792,"context_line":""}],"source_content_type":"text/x-python","patch_set":77,"id":"AAAAVn%2F%2FyxA%3D","line":789,"updated":"2014-03-04 03:58:45.000000000","message":"Fix this indentation","commit_id":"90b4e62889af4c714d1cd8c5a67b24482727cc2f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"class TokenAPITests(object):"},{"line_number":99,"context_line":"    # Why is this not just setUP? Because TokenAPITests is not a test class"},{"line_number":100,"context_line":"    # itself. If TokenAPITests became a subclass of the testcase, it would get"},{"line_number":101,"context_line":"    # called by the enumerate-tests-in-file code. The way the functions get"},{"line_number":102,"context_line":"    # resolved in Python for multiple inheritance means that a setUp in this"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Foi8%3D","line":99,"updated":"2014-03-04 23:26:37.000000000","message":"setUp","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    # itself. If TokenAPITests became a subclass of the testcase, it would get"},{"line_number":101,"context_line":"    # called by the enumerate-tests-in-file code. The way the functions get"},{"line_number":102,"context_line":"    # resolved in Python for multiple inheritance means that a setUp in this"},{"line_number":103,"context_line":"    # would get skipped by the testrunner."},{"line_number":104,"context_line":"    def doSetUp(self):"},{"line_number":105,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":106,"context_line":"            username\u003dself.user[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Foio%3D","line":103,"updated":"2014-03-04 23:26:37.000000000","message":"this should be a \"\"\"docstr\"\"\" on setUp\n\nand it actually *could* be called setUp... but that\u0027s out of scope","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":1193,"context_line":"        self.assertEqual(project_id, events[0][\u0027project_id\u0027])"},{"line_number":1194,"context_line":"        self.assertIsNotNone(events[0][\u0027issued_before\u0027])"},{"line_number":1195,"context_line":"        self.assertIsNotNone(events_response[\u0027links\u0027])"},{"line_number":1196,"context_line":"        del (events_response[\u0027events\u0027][0][\u0027issued_before\u0027])"},{"line_number":1197,"context_line":"        del (events_response[\u0027links\u0027])"},{"line_number":1198,"context_line":"        expected_response \u003d {\u0027events\u0027: [{\u0027project_id\u0027: project_id}]}"},{"line_number":1199,"context_line":"        self.assertEqual(expected_response, events_response)"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FohE%3D","line":1196,"updated":"2014-03-04 23:26:37.000000000","message":"don\u0027t need outer parens on this, even in py3... do you?","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":1194,"context_line":"        self.assertIsNotNone(events[0][\u0027issued_before\u0027])"},{"line_number":1195,"context_line":"        self.assertIsNotNone(events_response[\u0027links\u0027])"},{"line_number":1196,"context_line":"        del (events_response[\u0027events\u0027][0][\u0027issued_before\u0027])"},{"line_number":1197,"context_line":"        del (events_response[\u0027links\u0027])"},{"line_number":1198,"context_line":"        expected_response \u003d {\u0027events\u0027: [{\u0027project_id\u0027: project_id}]}"},{"line_number":1199,"context_line":"        self.assertEqual(expected_response, events_response)"},{"line_number":1200,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Fog4%3D","line":1197,"updated":"2014-03-04 23:26:37.000000000","message":"works for me! thanks for the extra assertions","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":1201,"context_line":"    def assertDomainInList(self, events_response, domain_id):"},{"line_number":1202,"context_line":"        events \u003d events_response[\u0027events\u0027]"},{"line_number":1203,"context_line":"        self.assertEqual(1, len(events))"},{"line_number":1204,"context_line":"        self.assertEqual(domain_id, events[0][\u0027domain_id\u0027])"},{"line_number":1205,"context_line":"        self.assertIsNotNone(events[0][\u0027issued_before\u0027])"},{"line_number":1206,"context_line":"        self.assertIsNotNone(events_response[\u0027links\u0027])"},{"line_number":1207,"context_line":"        del (events_response[\u0027events\u0027][0][\u0027issued_before\u0027])"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Fogk%3D","line":1204,"updated":"2014-03-04 23:26:37.000000000","message":"these first two assertions are redundant with 1209 and 1210 for example, but i like have them because the feedback on failed tests will be better with them...","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":1317,"context_line":""},{"line_number":1318,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d204)"},{"line_number":1319,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders2, expected_status\u003d204)"},{"line_number":1320,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders3, expected_status\u003d204)"},{"line_number":1321,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders_unrevoked,"},{"line_number":1322,"context_line":"                  expected_status\u003d204)"},{"line_number":1323,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Foeo%3D","line":1320,"updated":"2014-03-04 23:26:37.000000000","message":"these tests would be easier to read if you just built the headers dicts right here","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"keystone/tests/test_v3_oauth1.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class OAuth1Tests(test_v3.RestfulTestCase):"},{"line_number":37,"context_line":"    EXTENSION_NAME \u003d \u0027oauth1\u0027"},{"line_number":38,"context_line":"    EXTENSION_TO_ADD \u003d \u0027oauth_extension\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def setup_database(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5W8%3D","line":37,"updated":"2014-01-20 23:55:32.000000000","message":"revert whitespace change on previous line.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c9508821c284ebef49af620714a81da2e21497ba","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    EXTENSION_TO_ADD \u003d \u0027oauth_extension\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def setup_database(self):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        super(OAuth1Tests, self).setup_database()"},{"line_number":43,"context_line":"        package_name \u003d \"%s.%s.migrate_repo\" % (contrib.__name__,"},{"line_number":44,"context_line":"                                               self.EXTENSION_NAME)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1kc%3D","line":41,"updated":"2014-01-21 15:37:32.000000000","message":"Why the newline here?","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class OAuth1Tests(test_v3.RestfulTestCase):"},{"line_number":38,"context_line":"    EXTENSION_NAME \u003d \u0027oauth1\u0027"},{"line_number":39,"context_line":"    EXTENSION_TO_ADD \u003d \u0027oauth1_extension\u0027"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def setup_database(self):"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FZ4%3D","line":38,"updated":"2014-02-17 19:26:32.000000000","message":"revert whitespace change on previous line.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def setup_database(self):"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        super(OAuth1Tests, self).setup_database()"},{"line_number":44,"context_line":"        package_name \u003d \"%s.%s.migrate_repo\" % (contrib.__name__,"},{"line_number":45,"context_line":"                                               self.EXTENSION_NAME)"},{"line_number":46,"context_line":"        package \u003d importutils.import_module(package_name)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FZ0%3D","line":43,"updated":"2014-02-17 19:26:32.000000000","message":"revert whitespace change on previous line.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":323,"context_line":""},{"line_number":324,"context_line":"class AuthTokenTests(OAuthFlowTests):"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def config_files(self):"},{"line_number":327,"context_line":"        conf_files \u003d super(AuthTokenTests, self).config_files()"},{"line_number":328,"context_line":"        conf_files.append(tests.dirs.tests("},{"line_number":329,"context_line":"            \u0027test_token_provider_revoke_by_id_false.conf\u0027))"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B8JY%3D","line":326,"updated":"2014-02-18 04:42:19.000000000","message":"i\u0027m not sure why this change is here at all?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3e647e8b607748b7f3878def38766a16d9a04443","unresolved":false,"context_lines":[{"line_number":448,"context_line":"                                     consumer_id\u003dself.consumer[\u0027key\u0027])"},{"line_number":449,"context_line":"        self.assertRaises(exception.TokenNotFound, self.token_api.get_token,"},{"line_number":450,"context_line":"                          self.keystone_token_id)"},{"line_number":451,"context_line":"        CONF.token.revoke_by_id \u003d True"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"class MaliciousOAuth1Tests(OAuth1Tests):"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2FZs%3D","line":451,"updated":"2014-02-17 19:26:32.000000000","message":"what is this for?","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":355,"context_line":""},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"class AuthTokenTests(OAuthFlowTests):"},{"line_number":358,"context_line":"    def test_keystone_token_is_valid(self):"},{"line_number":359,"context_line":"        self.test_oauth_flow()"},{"line_number":360,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: self.keystone_token_id,"},{"line_number":361,"context_line":"                   \u0027X-Auth-Token\u0027: self.keystone_token_id}"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FlI%3D","line":358,"updated":"2014-02-22 19:58:28.000000000","message":"revert whitespace change on previous line.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ac83dbb5ab0cfd0b7f52cdc060df305cfad1dbdd","unresolved":false,"context_lines":[{"line_number":474,"context_line":"                                     consumer_id\u003dself.consumer[\u0027key\u0027])"},{"line_number":475,"context_line":"        self.assertRaises(exception.TokenNotFound, self.token_api.get_token,"},{"line_number":476,"context_line":"                          self.keystone_token_id)"},{"line_number":477,"context_line":"        CONF.token.revoke_by_id \u003d True"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"class MaliciousOAuth1Tests(OAuth1Tests):"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fq4%3D","line":477,"updated":"2014-02-22 19:17:19.000000000","message":"what is this for?","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"}],"keystone/tests/test_v3_os_revoke.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        resp \u003d self.get(\u0027/OS-REVOKE/events?since\u003d%s\u0027 % _future_time_string())"},{"line_number":108,"context_line":"        events \u003d resp.json_body[\u0027events\u0027]"},{"line_number":109,"context_line":"        self.assertEqual(len(events), 0)"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2FlA%3D","line":109,"updated":"2014-02-22 19:58:28.000000000","message":"suggest use\n\n self.assertEqual([], events)","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ftvs%3D","line":1,"updated":"2014-02-28 20:21:47.000000000","message":"an API call to actually result in a token revocation event would be nice here (like disable domain, for example)","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        events \u003d resp.json_body[\u0027events\u0027]"},{"line_number":52,"context_line":"        self.assertEqual(len(events), 1)"},{"line_number":53,"context_line":"        event \u003d events[0]"},{"line_number":54,"context_line":"        sample[\u0027issued_before\u0027] \u003d event[\u0027issued_before\u0027]"},{"line_number":55,"context_line":"        self.assertEqual(sample, event)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_disabled_project_in_list(self):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ftw0%3D","line":54,"updated":"2014-02-28 20:21:47.000000000","message":"this seems to be defeating the point of having tests","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        events \u003d resp.json_body[\u0027events\u0027]"},{"line_number":52,"context_line":"        self.assertEqual(len(events), 1)"},{"line_number":53,"context_line":"        event \u003d events[0]"},{"line_number":54,"context_line":"        sample[\u0027issued_before\u0027] \u003d event[\u0027issued_before\u0027]"},{"line_number":55,"context_line":"        self.assertEqual(sample, event)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_disabled_project_in_list(self):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Frq8%3D","line":54,"in_reply_to":"AAAAVX%2F%2Ftw0%3D","updated":"2014-03-01 06:22:38.000000000","message":"The issued_before time will be set by creating the event.  I can\u0027t guarantee exactly what value it will get.  I\u0027ll write a clearer assert that also confirms the time is reasonable","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        events \u003d resp.json_body[\u0027events\u0027]"},{"line_number":67,"context_line":"        self.assertEqual(len(events), 1)"},{"line_number":68,"context_line":"        event \u003d events[0]"},{"line_number":69,"context_line":"        sample[\u0027issued_before\u0027] \u003d event[\u0027issued_before\u0027]"},{"line_number":70,"context_line":"        self.assertEqual(event, sample)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_disabled_domain_in_list(self):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ftww%3D","line":69,"updated":"2014-02-28 20:21:47.000000000","message":"?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        events \u003d resp.json_body[\u0027events\u0027]"},{"line_number":82,"context_line":"        self.assertEqual(len(events), 1)"},{"line_number":83,"context_line":"        event \u003d events[0]"},{"line_number":84,"context_line":"        sample[\u0027issued_before\u0027] \u003d event[\u0027issued_before\u0027]"},{"line_number":85,"context_line":"        self.assertEqual(event, sample)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_list_since_invalid(self):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ftws%3D","line":84,"updated":"2014-02-28 20:21:47.000000000","message":"?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c0d02fd98c7814f6d281a138ecd0a80167dda6f2","unresolved":false,"context_lines":[{"line_number":8,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":9,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import datetime"},{"line_number":14,"context_line":"import uuid"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F%2Bl4%3D","line":11,"updated":"2014-03-03 02:01:10.000000000","message":"(NIT): could rename this module to test_v3_revoke, to be consistent with other extension test modules (tests.test_v3_federation.py)","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":8,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":9,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import datetime"},{"line_number":14,"context_line":"import uuid"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4%2FI%3D","line":11,"in_reply_to":"AAAAVn%2F%2F%2Bl4%3D","updated":"2014-03-03 21:12:49.000000000","message":"true, but this was the suggested name. I like the idea of keeping the extension name clear.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c0d02fd98c7814f6d281a138ecd0a80167dda6f2","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        return {unicode(\u0027domain_id\u0027): None, unicode(\u0027user_id\u0027): None,"},{"line_number":40,"context_line":"                unicode(\u0027project_id\u0027): None, unicode(\u0027role_id\u0027): None}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    #The two values ill be the same with the exception of"},{"line_number":43,"context_line":"    #\u0027issued_before\u0027 which is set when the event is recorded"},{"line_number":44,"context_line":"    def assertReporteEventMatchesRecorded(self, event, sample, before_time):"},{"line_number":45,"context_line":"        after_time \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F%2Bl0%3D","line":42,"updated":"2014-03-03 02:01:10.000000000","message":"s/ill/will/","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        return {unicode(\u0027domain_id\u0027): None, unicode(\u0027user_id\u0027): None,"},{"line_number":40,"context_line":"                unicode(\u0027project_id\u0027): None, unicode(\u0027role_id\u0027): None}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    #The two values ill be the same with the exception of"},{"line_number":43,"context_line":"    #\u0027issued_before\u0027 which is set when the event is recorded"},{"line_number":44,"context_line":"    def assertReporteEventMatchesRecorded(self, event, sample, before_time):"},{"line_number":45,"context_line":"        after_time \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F4%2Bs%3D","line":42,"in_reply_to":"AAAAVn%2F%2F%2Bl0%3D","updated":"2014-03-03 21:12:49.000000000","message":"Done","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"}],"keystone/tests/test_versions.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        self._paste_in_port(v3_only_response[\u0027versions\u0027][\u0027values\u0027][0],"},{"line_number":235,"context_line":"                            \u0027http://localhost:%s/v3/\u0027 % CONF.public_port)"},{"line_number":236,"context_line":"        resp \u003d client.get(\u0027/\u0027)"},{"line_number":237,"context_line":"        #self.assertEqual(resp.status_int, 300)"},{"line_number":238,"context_line":"        data \u003d jsonutils.loads(resp.body)"},{"line_number":239,"context_line":"        #self.assertEqual(data, v3_only_response)"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9fzs%3D","line":237,"updated":"2013-12-10 22:23:38.000000000","message":"Are these two commented out lines not longer true?  Should they be replace or removed?","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efbdab75ac7906fd5eb8ae6c7e6d339ebbab9d3e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        },"},{"line_number":98,"context_line":"        {"},{"line_number":99,"context_line":"            \"rel\": \"extensions\","},{"line_number":100,"context_line":"            \"href\": \"/extensions\""},{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    ],"},{"line_number":103,"context_line":"    \"media-types\": v3_MEDIA_TYPES"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FJtk%3D","line":100,"updated":"2014-01-16 23:03:10.000000000","message":"missing a comma after \"/extensions\"","commit_id":"06d60b533dd6f1d189ce5c4b05ccbceda76a67c3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efbdab75ac7906fd5eb8ae6c7e6d339ebbab9d3e","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        resp \u003d client.get(\u0027/\u0027)"},{"line_number":237,"context_line":"        #self.assertEqual(resp.status_int, 300)"},{"line_number":238,"context_line":"        data \u003d jsonutils.loads(resp.body)"},{"line_number":239,"context_line":"        #self.assertEqual(data, v3_only_response)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def test_v3_disabled(self):"},{"line_number":242,"context_line":"        self.stubs.Set(controllers, \u0027_VERSIONS\u0027, [\u0027v2.0\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FJtY%3D","line":239,"updated":"2014-01-16 23:03:10.000000000","message":"Remove these?","commit_id":"06d60b533dd6f1d189ce5c4b05ccbceda76a67c3"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        self._paste_in_port(v3_only_response[\u0027versions\u0027][\u0027values\u0027][0],"},{"line_number":235,"context_line":"                            \u0027http://localhost:%s/v3/\u0027 % CONF.public_port)"},{"line_number":236,"context_line":"        resp \u003d client.get(\u0027/\u0027)"},{"line_number":237,"context_line":"        #self.assertEqual(resp.status_int, 300)"},{"line_number":238,"context_line":"        data \u003d jsonutils.loads(resp.body)"},{"line_number":239,"context_line":"        #self.assertEqual(data, v3_only_response)"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FGQ%3D","line":237,"updated":"2014-01-20 03:15:47.000000000","message":"If this is really no longer used, suggest removing the line.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"de58f753817d406d046914a53cad6863cbbc1a13","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        self._paste_in_port(v3_only_response[\u0027versions\u0027][\u0027values\u0027][0],"},{"line_number":235,"context_line":"                            \u0027http://localhost:%s/v3/\u0027 % CONF.public_port)"},{"line_number":236,"context_line":"        resp \u003d client.get(\u0027/\u0027)"},{"line_number":237,"context_line":"        #self.assertEqual(resp.status_int, 300)"},{"line_number":238,"context_line":"        data \u003d jsonutils.loads(resp.body)"},{"line_number":239,"context_line":"        #self.assertEqual(data, v3_only_response)"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FAc%3D","line":237,"in_reply_to":"AAAAUH%2F%2B%2FGQ%3D","updated":"2014-01-20 04:15:53.000000000","message":"Nah, this is bogus.  Reinstating.","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1d9a5bb97bc5e51f8176db063a3bef4314b986c7","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        resp \u003d client.get(\u0027/\u0027)"},{"line_number":237,"context_line":"        #self.assertEqual(resp.status_int, 300)"},{"line_number":238,"context_line":"        data \u003d jsonutils.loads(resp.body)"},{"line_number":239,"context_line":"        #self.assertEqual(data, v3_only_response)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def test_v3_disabled(self):"},{"line_number":242,"context_line":"        self.stubs.Set(controllers, \u0027_VERSIONS\u0027, [\u0027v2.0\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2B%2FGI%3D","line":239,"updated":"2014-01-20 03:15:47.000000000","message":"Same as 237","commit_id":"6d1ae54c42fec3963dbfddeedfd1c515e7436e4e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c9508821c284ebef49af620714a81da2e21497ba","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        },"},{"line_number":98,"context_line":"        {"},{"line_number":99,"context_line":"            \"rel\": \"extensions\","},{"line_number":100,"context_line":"            \"href\": \"/extensions\""},{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    ],"},{"line_number":103,"context_line":"    \"media-types\": v3_MEDIA_TYPES"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B1kQ%3D","line":100,"updated":"2014-01-21 15:37:32.000000000","message":"missing \u0027,\u0027 after \"/extensions\"","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"}],"keystone/token/backends/kvs.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    def _list_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":301,"context_line":"                     consumer_id\u003dNone):"},{"line_number":302,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":303,"context_line":"            return []"},{"line_number":304,"context_line":"        tokens \u003d []"},{"line_number":305,"context_line":"        user_key \u003d self._prefix_user_id(user_id)"},{"line_number":306,"context_line":"        token_list \u003d self._get_user_token_list_with_expiry(user_key)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B79A%3D","line":303,"updated":"2014-02-18 04:42:19.000000000","message":"huh?\n\napparently this is in all the backends, can you please add a comment for what\u0027s going on here? It\u0027s super unclear to me right now.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    def _list_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":301,"context_line":"                     consumer_id\u003dNone):"},{"line_number":302,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":303,"context_line":"            return []"},{"line_number":304,"context_line":"        tokens \u003d []"},{"line_number":305,"context_line":"        user_key \u003d self._prefix_user_id(user_id)"},{"line_number":306,"context_line":"        token_list \u003d self._get_user_token_list_with_expiry(user_key)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2Bsqc%3D","line":303,"in_reply_to":"AAAAUX%2F%2B79A%3D","updated":"2014-02-19 18:41:05.000000000","message":"Done","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def _list_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":301,"context_line":"                     consumer_id\u003dNone):"},{"line_number":302,"context_line":"        #This function is used to generate the list of tokens that should be"},{"line_number":303,"context_line":"        #revoked when revoking by token identifiers.  This approach will be"},{"line_number":304,"context_line":"        #deprecated soon, probably in the Juno release.  Setting revoke_by_id"},{"line_number":305,"context_line":"        #to False indicates that this kind of recording should not be"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fk8%3D","line":302,"updated":"2014-02-22 19:58:28.000000000","message":"add a space after # so that the format matches what\u0027s used with other comments throughout this file.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"}],"keystone/token/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5f537921bb8214ceeaa07a9e52f8a112b7f2000c","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def _list_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone,"},{"line_number":170,"context_line":"                     consumer_id\u003dNone):"},{"line_number":171,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":172,"context_line":"            return []"},{"line_number":173,"context_line":"        if trust_id:"},{"line_number":174,"context_line":"            return self._list_tokens_for_trust(trust_id)"}],"source_content_type":"text/x-python","patch_set":77,"id":"AAAAVn%2F%2FywY%3D","line":171,"updated":"2014-03-04 03:58:45.000000000","message":"Is this something that can be brought up to the manager/controller layer? Right now the same check is in the same method for both the kvs and sql backends","commit_id":"90b4e62889af4c714d1cd8c5a67b24482727cc2f"}],"keystone/token/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027catalog_api\u0027, \u0027identity_api\u0027,"},{"line_number":41,"context_line":"                     \u0027token_api\u0027, \u0027token_provider_api\u0027, \u0027trust_api\u0027,"},{"line_number":42,"context_line":"                     \u0027revoke_api\u0027)"},{"line_number":43,"context_line":"class Auth(controller.V2Controller):"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @controller.v2_deprecated"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5Ws%3D","line":42,"updated":"2014-01-20 23:55:32.000000000","message":"keep in alphabetical order.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027catalog_api\u0027, \u0027identity_api\u0027,"},{"line_number":41,"context_line":"                     \u0027token_api\u0027, \u0027token_provider_api\u0027, \u0027revoke_api\u0027,"},{"line_number":42,"context_line":"                     \u0027trust_api\u0027)"},{"line_number":43,"context_line":"class Auth(controller.V2Controller):"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B16g%3D","line":41,"updated":"2014-01-21 14:39:11.000000000","message":"keep in alphabetical order.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        Identical to ``validate_token``, except does not return a response."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        \"\"\""},{"line_number":412,"context_line":"        #TODO(ayoung) validate against revocation API"},{"line_number":413,"context_line":"        belongs_to \u003d context[\u0027query_string\u0027].get(\u0027belongsTo\u0027)"},{"line_number":414,"context_line":"        self.token_provider_api.check_v2_token(token_id, belongs_to)"},{"line_number":415,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fk0%3D","line":412,"updated":"2014-02-22 19:58:28.000000000","message":"add a space after # to match the format for comments used throughout this file.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        # TODO(termie): this stuff should probably be moved to middleware"},{"line_number":434,"context_line":"        self.assert_admin(context)"},{"line_number":435,"context_line":"        token_ref \u003d self.token_api.get_token(token_id)"},{"line_number":436,"context_line":"        #TODO(ayoung) what if we get a V3 Token?"},{"line_number":437,"context_line":"        #Move this to the token provider for unified logic"},{"line_number":438,"context_line":"        self.revoke_api.revoke_by_expiration(token_ref[\u0027user_id\u0027],"},{"line_number":439,"context_line":"                                             token_ref[\u0027expires\u0027])"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fk4%3D","line":436,"updated":"2014-02-22 19:58:28.000000000","message":"add a space after # to match the format for comments used throughout this file.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a43cd07f3004e5c7363c681c00d95850bd77bce1","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027catalog_api\u0027, \u0027identity_api\u0027,"},{"line_number":40,"context_line":"                     \u0027token_api\u0027, \u0027token_provider_api\u0027, \u0027revoke_api\u0027,"},{"line_number":41,"context_line":"                     \u0027trust_api\u0027)"},{"line_number":42,"context_line":"class Auth(controller.V2Controller):"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FxKU%3D","line":40,"updated":"2014-03-04 07:50:11.000000000","message":"revoke api should be optional (if possible) since it is optional elsewhere.","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"656d4bcccf51de070056856546fa35d89f65ad86","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027catalog_api\u0027, \u0027identity_api\u0027,"},{"line_number":40,"context_line":"                     \u0027token_api\u0027, \u0027token_provider_api\u0027, \u0027revoke_api\u0027,"},{"line_number":41,"context_line":"                     \u0027trust_api\u0027)"},{"line_number":42,"context_line":"class Auth(controller.V2Controller):"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FsMc%3D","line":40,"in_reply_to":"AAAAVn%2F%2FxKU%3D","updated":"2014-03-04 17:28:38.000000000","message":"Done","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"}],"keystone/token/controllers.py.orig":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f4eb2420cfdd385dfd2af98650d3ba0e69ad59ea","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def _authenticate_token(self, context, auth):"},{"line_number":134,"context_line":"        \"\"\"Try to authenticate using an already existing token."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        Returns auth_token_data, (user_ref, tenant_ref, metadata_ref)"},{"line_number":137,"context_line":"        \"\"\""},{"line_number":138,"context_line":"        if \u0027token\u0027 not in auth:"},{"line_number":139,"context_line":"            raise exception.ValidationError("}],"source_content_type":"application/octet-stream","patch_set":78,"id":"AAAAVn%2F%2FygY%3D","line":136,"updated":"2014-03-04 04:45:00.000000000","message":"proper docstrings?\n\n    :returns: auth_token_data ...","commit_id":"0eba4e5da0221d154eb06965653e186c51c3b21f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f4eb2420cfdd385dfd2af98650d3ba0e69ad59ea","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        wsgi.validate_token_bind(context, old_token_ref)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        #A trust token cannot be used to get another token"},{"line_number":159,"context_line":"        if \u0027trust\u0027 in old_token_ref:"},{"line_number":160,"context_line":"            raise exception.Forbidden()"},{"line_number":161,"context_line":"        if \u0027trust_id\u0027 in old_token_ref[\u0027metadata\u0027]:"}],"source_content_type":"application/octet-stream","patch_set":78,"id":"AAAAVn%2F%2FygU%3D","line":158,"updated":"2014-03-04 04:45:00.000000000","message":"I must have missed this one","commit_id":"0eba4e5da0221d154eb06965653e186c51c3b21f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f4eb2420cfdd385dfd2af98650d3ba0e69ad59ea","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        if \u0027REMOTE_USER\u0027 not in context.get(\u0027environment\u0027, {}):"},{"line_number":287,"context_line":"            raise ExternalAuthNotApplicable()"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        #NOTE(jamielennox): xml and json differ and get confused about what"},{"line_number":290,"context_line":"        # empty auth should look like so just reset it."},{"line_number":291,"context_line":"        if not auth:"},{"line_number":292,"context_line":"            auth \u003d {}"}],"source_content_type":"application/octet-stream","patch_set":78,"id":"AAAAVn%2F%2FygI%3D","line":289,"updated":"2014-03-04 04:45:00.000000000","message":"and this one","commit_id":"0eba4e5da0221d154eb06965653e186c51c3b21f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f4eb2420cfdd385dfd2af98650d3ba0e69ad59ea","unresolved":false,"context_lines":[{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        \"\"\""},{"line_number":407,"context_line":"        belongs_to \u003d context[\u0027query_string\u0027].get(\u0027belongsTo\u0027)"},{"line_number":408,"context_line":"        #TODO(ayoung) validate against revocation API"},{"line_number":409,"context_line":"        return self.token_provider_api.validate_v2_token(token_id, belongs_to)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    @controller.v2_deprecated"}],"source_content_type":"application/octet-stream","patch_set":78,"id":"AAAAVn%2F%2FygA%3D","line":408,"updated":"2014-03-04 04:45:00.000000000","message":"any this one","commit_id":"0eba4e5da0221d154eb06965653e186c51c3b21f"}],"keystone/token/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027identity_api\u0027, \u0027token_provider_api\u0027,"},{"line_number":99,"context_line":"                     \u0027trust_api\u0027, \u0027revoke_api\u0027)"},{"line_number":100,"context_line":"@dependency.provider(\u0027token_api\u0027)"},{"line_number":101,"context_line":"class Manager(manager.Manager):"},{"line_number":102,"context_line":"    \"\"\"Default pivot point for the Token backend."}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5Wk%3D","line":99,"updated":"2014-01-20 23:55:32.000000000","message":"keep in alphabetical order.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a69495391cd9667c33dcd014e55aeb4419891d3b","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        return ret"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def delete_token(self, token_id):"},{"line_number":169,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":170,"context_line":"            return"},{"line_number":171,"context_line":"        unique_id \u003d self.unique_id(token_id)"},{"line_number":172,"context_line":"        self.driver.delete_token(unique_id)"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B76Y%3D","line":169,"updated":"2014-02-18 04:42:19.000000000","message":"I really need a comment here for any one of these.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cdd671a930fb6fce5886fc6bf1252f4125a2421f","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        \"\"\"Delete all tokens for a given domain.\"\"\""},{"line_number":201,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":202,"context_line":"            return"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        projects \u003d self.assignment_api.list_projects()"},{"line_number":205,"context_line":"        for project in projects:"},{"line_number":206,"context_line":"            if project[\u0027domain_id\u0027] \u003d\u003d domain_id:"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BaI%3D","line":203,"updated":"2014-02-17 21:51:34.000000000","message":"Extra line here","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cdd671a930fb6fce5886fc6bf1252f4125a2421f","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        trusts in the caller\u0027s logic."},{"line_number":218,"context_line":"        \"\"\""},{"line_number":219,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":220,"context_line":"            return"},{"line_number":221,"context_line":"        self.delete_tokens(user_id, tenant_id\u003dproject_id)"},{"line_number":222,"context_line":"        for trust in self.trust_api.list_trusts_for_trustee(user_id):"},{"line_number":223,"context_line":"            # Ensure we revoke tokens associated to the trust / project"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BZQ%3D","line":220,"updated":"2014-02-17 21:51:34.000000000","message":"There is a lot of duplicate code here. Is there a way this could be done once maybe before we reach the manager or as a wrapper function? \n\nJust thinking of the case were a method gets refactored and by accident this check goes with it.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"2350aaaef6e7ff0c9239e66bcc80f2776256f219","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        trusts in the caller\u0027s logic."},{"line_number":218,"context_line":"        \"\"\""},{"line_number":219,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":220,"context_line":"            return"},{"line_number":221,"context_line":"        self.delete_tokens(user_id, tenant_id\u003dproject_id)"},{"line_number":222,"context_line":"        for trust in self.trust_api.list_trusts_for_trustee(user_id):"},{"line_number":223,"context_line":"            # Ensure we revoke tokens associated to the trust / project"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2Bsog%3D","line":220,"in_reply_to":"AAAAUX%2F%2B%2BZQ%3D","updated":"2014-02-19 18:41:05.000000000","message":"The code that this check avoids will be deprecated and removed in Juno or later.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cdd671a930fb6fce5886fc6bf1252f4125a2421f","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        \"\"\""},{"line_number":248,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":249,"context_line":"            return"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        for user_id in user_ids:"},{"line_number":252,"context_line":"            self.delete_tokens_for_user(user_id, project_id\u003dproject_id)"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BY0%3D","line":250,"updated":"2014-02-17 21:51:34.000000000","message":"Extra line here","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027identity_api\u0027, \u0027revoke_api\u0027,"},{"line_number":101,"context_line":"                     \u0027token_provider_api\u0027, \u0027trust_api\u0027)"},{"line_number":102,"context_line":"@dependency.provider(\u0027token_api\u0027)"},{"line_number":103,"context_line":"class Manager(manager.Manager):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fcls%3D","line":100,"updated":"2014-02-26 15:51:13.000000000","message":"I don\u0027t see revoke_api being used anywhere","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        return ret"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def delete_token(self, token_id):"},{"line_number":167,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":168,"context_line":"            return"},{"line_number":169,"context_line":"        unique_id \u003d self.unique_id(token_id)"},{"line_number":170,"context_line":"        self.driver.delete_token(unique_id)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FcmY%3D","line":167,"updated":"2014-02-26 15:51:13.000000000","message":"Does this change the expectation of the caller that doesn\u0027t have this set?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c0d02fd98c7814f6d281a138ecd0a80167dda6f2","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        :param project_id: optional project identifier"},{"line_number":244,"context_line":"        \"\"\""},{"line_number":245,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":246,"context_line":"            return"},{"line_number":247,"context_line":"        for user_id in user_ids:"},{"line_number":248,"context_line":"            self.delete_tokens_for_user(user_id, project_id\u003dproject_id)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F%2Bk4%3D","line":246,"updated":"2014-03-03 02:01:10.000000000","message":"what if all these checks could be turned into a decorator function that just wraps the methods instead of copying the same code in each?","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        :param project_id: optional project identifier"},{"line_number":244,"context_line":"        \"\"\""},{"line_number":245,"context_line":"        if not CONF.token.revoke_by_id:"},{"line_number":246,"context_line":"            return"},{"line_number":247,"context_line":"        for user_id in user_ids:"},{"line_number":248,"context_line":"            self.delete_tokens_for_user(user_id, project_id\u003dproject_id)"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5BE%3D","line":246,"in_reply_to":"AAAAVn%2F%2F%2Bk4%3D","updated":"2014-03-03 21:12:49.000000000","message":"Actually, since the check is done at the start of  delete_tokens_for_user  it doesn\u0027t need to be here.  This just keeps it from executing an empty loop.  This approach lets the check be inside the function, not just at the top, and we can remove when we move to ephemeral tokens.","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"}],"keystone/token/provider.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efbdab75ac7906fd5eb8ae6c7e6d339ebbab9d3e","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    def _is_valid_token(self, token):"},{"line_number":176,"context_line":"         # Verify the token has not expired."},{"line_number":177,"context_line":"        current_time \u003d timeutils.normalize_time(timeutils.utcnow())"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        try:"},{"line_number":180,"context_line":"            # Get the data we need from the correct location (V2 and V3 tokens"},{"line_number":181,"context_line":"            # differ in structure, Try V3 first, fall back to V2 second)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FJtU%3D","side":"PARENT","line":178,"updated":"2014-01-16 23:03:10.000000000","message":"Any reason to remove the whitespace here?","commit_id":"0d2c21eefadc74c574ad65b055f6d711a6c6e2c1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    pass"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"@dependency.requires(\u0027token_api\u0027, \u0027revoke_api\u0027)"},{"line_number":53,"context_line":"@dependency.provider(\u0027token_provider_api\u0027)"},{"line_number":54,"context_line":"class Manager(manager.Manager):"},{"line_number":55,"context_line":"    \"\"\"Default pivot point for the token provider backend."}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5Wg%3D","line":52,"updated":"2014-01-20 23:55:32.000000000","message":"keep in alphabetical order.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            return token_values"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        token_data \u003d token.get(\u0027token\u0027)"},{"line_number":183,"context_line":"        #Only here to prevent test breakage."},{"line_number":184,"context_line":"        if token_data is None:"},{"line_number":185,"context_line":"            return"},{"line_number":186,"context_line":"        token_values \u003d build_token_values(token_data)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5WY%3D","line":183,"updated":"2014-01-20 23:55:32.000000000","message":"is there something wrong with the tests? suggest add a TODO.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c63f67fa80962b333bc2eff421336c16f5a3ec6","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            return token_values"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        token_data \u003d token.get(\u0027token\u0027)"},{"line_number":183,"context_line":"        #Only here to prevent test breakage."},{"line_number":184,"context_line":"        if token_data is None:"},{"line_number":185,"context_line":"            return"},{"line_number":186,"context_line":"        token_values \u003d build_token_values(token_data)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B4mI%3D","line":183,"in_reply_to":"AAAAUH%2F%2B5WY%3D","updated":"2014-01-21 04:55:07.000000000","message":"Some tests submit bogus tokens. Done","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":237,"context_line":"    def _is_valid_token(self, token):"},{"line_number":238,"context_line":"         # Verify the token has not expired."},{"line_number":239,"context_line":"        current_time \u003d timeutils.normalize_time(timeutils.utcnow())"},{"line_number":240,"context_line":"        try:"},{"line_number":241,"context_line":"            # Get the data we need from the correct location (V2 and V3 tokens"},{"line_number":242,"context_line":"            # differ in structure, Try V3 first, fall back to V2 second)"},{"line_number":243,"context_line":"            token_data \u003d token.get(\u0027token\u0027, token.get(\u0027access\u0027))"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5WU%3D","line":240,"updated":"2014-01-20 23:55:32.000000000","message":"revert whitespace change on previous line.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":253,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        if current_time \u003c expiry:"},{"line_number":256,"context_line":"            self.check_revocation(token)"},{"line_number":257,"context_line":"            # Token is has not expired and has not been revoked."},{"line_number":258,"context_line":"            return None"},{"line_number":259,"context_line":"        raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5WA%3D","line":256,"updated":"2014-01-20 23:55:32.000000000","message":"suggest add a comment that this will raise if the token is revoked.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        if current_time \u003c expiry:"},{"line_number":256,"context_line":"            self.check_revocation(token)"},{"line_number":257,"context_line":"            # Token is has not expired and has not been revoked."},{"line_number":258,"context_line":"            return None"},{"line_number":259,"context_line":"        raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":260,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5WI%3D","line":257,"updated":"2014-01-20 23:55:32.000000000","message":"change \"is has\" to \"has\"","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        if current_time \u003c expiry:"},{"line_number":256,"context_line":"            self.check_revocation(token)"},{"line_number":257,"context_line":"            # Token is has not expired and has not been revoked."},{"line_number":258,"context_line":"            return None"},{"line_number":259,"context_line":"        raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        # FIXME(morganfainberg): This error message needs to be updated to"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5WE%3D","line":258,"updated":"2014-01-20 23:55:32.000000000","message":"suggest remove \"None\" since callers of this function aren\u0027t expecting a return value anyways.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            LOG.exception(_(\u0027Unexpected error or malformed token determining \u0027"},{"line_number":253,"context_line":"                            \u0027token expiry: %s\u0027), token)"},{"line_number":254,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        if current_time \u003c expiry:"},{"line_number":257,"context_line":"            self.check_revocation(token)"},{"line_number":258,"context_line":"            # Token is has not expired and has not been revoked."}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B158%3D","line":255,"updated":"2014-01-21 14:39:11.000000000","message":"suggest add a comment that this will raise if the token is revoked.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                            \u0027token expiry: %s\u0027), token)"},{"line_number":254,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        if current_time \u003c expiry:"},{"line_number":257,"context_line":"            self.check_revocation(token)"},{"line_number":258,"context_line":"            # Token is has not expired and has not been revoked."},{"line_number":259,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B154%3D","line":256,"updated":"2014-01-21 14:39:11.000000000","message":"change \"is has\" to \"has\"","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":254,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        if current_time \u003c expiry:"},{"line_number":257,"context_line":"            self.check_revocation(token)"},{"line_number":258,"context_line":"            # Token is has not expired and has not been revoked."},{"line_number":259,"context_line":"            return None"},{"line_number":260,"context_line":"        raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B150%3D","line":257,"updated":"2014-01-21 14:39:11.000000000","message":"suggest remove \"None\" since callers of this function aren\u0027t expecting a return value anyways.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cdd671a930fb6fce5886fc6bf1252f4125a2421f","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            self.check_revocation(token)"},{"line_number":289,"context_line":"            # Token is has not expired and has not been revoked."},{"line_number":290,"context_line":"            return None"},{"line_number":291,"context_line":"        raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        # FIXME(morganfainberg): This error message needs to be updated to"},{"line_number":294,"context_line":"        # reflect the token couldn\u0027t be found, but this change needs to wait"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUX%2F%2B%2BXc%3D","line":291,"updated":"2014-02-17 21:51:34.000000000","message":"should: \n\n    raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))\n\nbe in an else statement or a finally statement, for the sake of readability.","commit_id":"a5bf3f870076058c09714889abe7f05300640f6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            return token_values"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        token_data \u003d token.get(\u0027token\u0027)"},{"line_number":212,"context_line":"        #TODO(ayoung) fix tests that submit (now) invalid bogus tokens."},{"line_number":213,"context_line":"        #This check is only here to prevent test breakage."},{"line_number":214,"context_line":"        if token_data is None:"},{"line_number":215,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fks%3D","line":212,"updated":"2014-02-22 19:58:28.000000000","message":"add a space after # to match the format for comments used throughout this file.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54ddbfaec0ca2fd1acd493e13c3a0880dbee6f7e","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        \"\"\"Verify the token is valid format and has not expired.\"\"\""},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        current_time \u003d timeutils.normalize_time(timeutils.utcnow())"},{"line_number":271,"context_line":"        try:"},{"line_number":272,"context_line":"            # Get the data we need from the correct location (V2 and V3 tokens"},{"line_number":273,"context_line":"            # differ in structure, Try V3 first, fall back to V2 second)"},{"line_number":274,"context_line":"            token_data \u003d token.get(\u0027token\u0027, token.get(\u0027access\u0027))"}],"source_content_type":"text/x-python","patch_set":55,"id":"AAAAU3%2F%2F%2Fkw%3D","line":271,"updated":"2014-02-22 19:58:28.000000000","message":"revert whitespace change on previous line.","commit_id":"91352648c940c5fe8f66f6e914784173974bb33e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        return token"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def check_revocation_v2(self, token):"},{"line_number":119,"context_line":"        def build_token_values(token_data):"},{"line_number":120,"context_line":"            token_values \u003d {"},{"line_number":121,"context_line":"                \u0027expires_at\u0027: timeutils.normalize_time("},{"line_number":122,"context_line":"                    timeutils.parse_isotime(token_data[\u0027expires\u0027]))}"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FrrI%3D","line":119,"updated":"2014-03-01 06:22:38.000000000","message":"This was moved to model.py","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        return token"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def check_revocation(self, token):"},{"line_number":162,"context_line":"        def build_token_values(token_data):"},{"line_number":163,"context_line":"            token_values \u003d {"},{"line_number":164,"context_line":"                \u0027expires_at\u0027: timeutils.normalize_time("},{"line_number":165,"context_line":"                    timeutils.parse_isotime(token_data[\u0027expires_at\u0027])),"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FrrM%3D","line":162,"updated":"2014-03-01 06:22:38.000000000","message":"This was moved to model.py","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        token_data \u003d token.get(\u0027token\u0027)"},{"line_number":212,"context_line":"        # TODO(ayoung) fix tests that submit (now) invalid bogus tokens."},{"line_number":213,"context_line":"        # This check is only here to prevent test breakage."},{"line_number":214,"context_line":"        if token_data is None:"},{"line_number":215,"context_line":"            return"},{"line_number":216,"context_line":"        token_values \u003d build_token_values(token_data)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Ftug%3D","line":213,"updated":"2014-02-28 20:21:47.000000000","message":"remove this prior to merging","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        token_data \u003d token.get(\u0027token\u0027)"},{"line_number":212,"context_line":"        # TODO(ayoung) fix tests that submit (now) invalid bogus tokens."},{"line_number":213,"context_line":"        # This check is only here to prevent test breakage."},{"line_number":214,"context_line":"        if token_data is None:"},{"line_number":215,"context_line":"            return"},{"line_number":216,"context_line":"        token_values \u003d build_token_values(token_data)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FrrQ%3D","line":213,"in_reply_to":"AAAAVX%2F%2Ftug%3D","updated":"2014-03-01 06:22:38.000000000","message":"Done","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c0d02fd98c7814f6d281a138ecd0a80167dda6f2","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            # Token has not expired and has not been revoked."},{"line_number":226,"context_line":"            return None"},{"line_number":227,"context_line":"        else:"},{"line_number":228,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _token_belongs_to(self, token, belongs_to):"},{"line_number":231,"context_line":"        \"\"\"Check if the token belongs to the right tenant."}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F%2Bks%3D","line":228,"updated":"2014-03-03 02:01:10.000000000","message":"Maybe throw a token expired error here instead","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f77f18b378ca197038042573d8eaf95448b429cb","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            # Token has not expired and has not been revoked."},{"line_number":226,"context_line":"            return None"},{"line_number":227,"context_line":"        else:"},{"line_number":228,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _token_belongs_to(self, token, belongs_to):"},{"line_number":231,"context_line":"        \"\"\"Check if the token belongs to the right tenant."}],"source_content_type":"text/x-python","patch_set":71,"id":"AAAAVn%2F%2F5FI%3D","line":228,"in_reply_to":"AAAAVn%2F%2F%2Bks%3D","updated":"2014-03-03 21:12:49.000000000","message":"No such exception.  This matches Dolph\u0027s advice:  \"raise not found from the backend, and recast as 401 if emitting in response to auth\"","commit_id":"e14f892b03c92dbe7f9c0cc678bbd59968f12a4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        token_values \u003d revoke_model.build_token_values_v2("},{"line_number":128,"context_line":"            token_data, CONF.identity.default_domain_id)"},{"line_number":129,"context_line":"        if self.revoke_api is not None:"},{"line_number":130,"context_line":"            self.revoke_api.check_token(token_values)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def validate_v2_token(self, token_id, belongs_to\u003dNone):"},{"line_number":133,"context_line":"        unique_id \u003d self.token_api.unique_id(token_id)"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2FobA%3D","line":130,"updated":"2014-03-04 23:26:37.000000000","message":"i\u0027m assuming this would raise an exception if it wasn\u0027t valid...","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5131d5ba6d172e07dde43bf6652a5dc675a6d085","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":147,"context_line":"        token_values \u003d revoke_model.build_token_values(token_data)"},{"line_number":148,"context_line":"        if self.revoke_api is not None:"},{"line_number":149,"context_line":"            self.revoke_api.check_token(token_values)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def check_revocation(self, token):"},{"line_number":152,"context_line":"        version \u003d self.driver.get_token_version(token)"}],"source_content_type":"text/x-python","patch_set":82,"id":"AAAAVn%2F%2Foa8%3D","line":149,"updated":"2014-03-04 23:26:37.000000000","message":"same","commit_id":"2e51473138de46a4c735ce81a4a53c374206a86e"}],"keystone/token/providers/common.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"@dependency.optional(\u0027oauth_api\u0027)"},{"line_number":329,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027catalog_api\u0027, \u0027identity_api\u0027,"},{"line_number":330,"context_line":"                     \u0027token_api\u0027, \u0027trust_api\u0027, \u0027revoke_api\u0027)"},{"line_number":331,"context_line":"class BaseProvider(provider.Provider):"},{"line_number":332,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":333,"context_line":"        super(BaseProvider, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5V8%3D","line":330,"updated":"2014-01-20 23:55:32.000000000","message":"keep the list in alphabetical order.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33383acdfda23d040e528100b1e9f325f60c92ec","unresolved":false,"context_lines":[{"line_number":557,"context_line":"            token_data \u003d self._validate_v3_token_ref(token_ref)"},{"line_number":558,"context_line":"            return token_data"},{"line_number":559,"context_line":"        except (exception.ValidationError, exception.UserNotFound):"},{"line_number":560,"context_line":"            raise exception.TokenNotFound(token_id)"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"    def _validate_v3_token_ref(self, token_ref):"},{"line_number":563,"context_line":"        # FIXME(gyee): performance or correctness? Should we return the"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B5V0%3D","line":560,"updated":"2014-01-20 23:55:32.000000000","message":"is this fixing a bug?","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8c63f67fa80962b333bc2eff421336c16f5a3ec6","unresolved":false,"context_lines":[{"line_number":557,"context_line":"            token_data \u003d self._validate_v3_token_ref(token_ref)"},{"line_number":558,"context_line":"            return token_data"},{"line_number":559,"context_line":"        except (exception.ValidationError, exception.UserNotFound):"},{"line_number":560,"context_line":"            raise exception.TokenNotFound(token_id)"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"    def _validate_v3_token_ref(self, token_ref):"},{"line_number":563,"context_line":"        # FIXME(gyee): performance or correctness? Should we return the"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUH%2F%2B4k8%3D","line":560,"in_reply_to":"AAAAUH%2F%2B5V0%3D","updated":"2014-01-21 04:55:07.000000000","message":"It was returning without returning a value (see line 558 above) which means the semantics were wrong for the signature.  Throwing the exception kept the behavior the same.  Also, the log message is unnecessary: we are spamming the log on invalid token checks.  It would be OK to have it as a debug message.  That message should be  injected by the exception  handler now.","commit_id":"f352130a8fbd93ffa1f7b8523e0072cbaeb2ecc2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1df7706a76cd8114dc5df9d78f6869d53bf6c2e8","unresolved":false,"context_lines":[{"line_number":556,"context_line":"            token_ref \u003d self._verify_token(token_id)"},{"line_number":557,"context_line":"            token_data \u003d self._validate_v3_token_ref(token_ref)"},{"line_number":558,"context_line":"            return token_data"},{"line_number":559,"context_line":"        except (exception.ValidationError, exception.UserNotFound):"},{"line_number":560,"context_line":"            raise exception.TokenNotFound(token_id)"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"    def _validate_v3_token_ref(self, token_ref):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F%2B15Y%3D","line":559,"updated":"2014-01-21 14:39:11.000000000","message":"seems like this change should be in a separate commit.","commit_id":"d242ff72a28ffc5775d534c16d62fa46f02fa1c8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2dddf4c4c051f79707fcdd08d9ba83ee6ec36f0d","unresolved":false,"context_lines":[{"line_number":559,"context_line":"            token_data \u003d self._validate_v3_token_ref(token_ref)"},{"line_number":560,"context_line":"            return token_data"},{"line_number":561,"context_line":"        except (exception.ValidationError, exception.UserNotFound):"},{"line_number":562,"context_line":"            raise exception.TokenNotFound(token_id)"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"    def _validate_v3_token_ref(self, token_ref):"},{"line_number":565,"context_line":"        # FIXME(gyee): performance or correctness? Should we return the"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2Fcgg%3D","line":562,"updated":"2014-02-26 15:51:13.000000000","message":"Do those errors really mean the token is not found and does this break the contract with the callers now that invalid tokens will raise an exception?","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7fa13085c7fcc86e39858bb4ade11ee1fe99dd2c","unresolved":false,"context_lines":[{"line_number":559,"context_line":"            token_data \u003d self._validate_v3_token_ref(token_ref)"},{"line_number":560,"context_line":"            return token_data"},{"line_number":561,"context_line":"        except (exception.ValidationError, exception.UserNotFound):"},{"line_number":562,"context_line":"            raise exception.TokenNotFound(token_id)"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"    def _validate_v3_token_ref(self, token_ref):"},{"line_number":565,"context_line":"        # FIXME(gyee): performance or correctness? Should we return the"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAU3%2F%2FZNM%3D","line":562,"in_reply_to":"AAAAU3%2F%2Fcgg%3D","updated":"2014-02-26 21:54:53.000000000","message":"No, this is how they were treated later on as well, just pushing the logic here to make things consistent. Note that this returns token_data if successful, but was neither throwing not returning if there was an exception.   This keeps the old logic the same, but makes the function usable by a wider array of callers.","commit_id":"4b76765edead7149c3281ebde551e0f154adc435"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":464,"context_line":""},{"line_number":465,"context_line":"    def revoke_token(self, token_id):"},{"line_number":466,"context_line":"        token \u003d self.token_api.get_token(token_id)"},{"line_number":467,"context_line":"        self.revoke_api.revoke_by_expiration(user_id\u003dtoken[\u0027user\u0027][\u0027id\u0027],"},{"line_number":468,"context_line":"                                             expires_at\u003dtoken[\u0027expires\u0027])"},{"line_number":469,"context_line":"        if CONF.token.revoke_by_id:"},{"line_number":470,"context_line":"            self.token_api.delete_token(token_id\u003dtoken_id)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtvQ%3D","line":467,"updated":"2014-02-28 20:21:47.000000000","message":"we talked about having as many attributes as possible in the case of revoke token, to narrow the scope of impact as much as possible","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":464,"context_line":""},{"line_number":465,"context_line":"    def revoke_token(self, token_id):"},{"line_number":466,"context_line":"        token \u003d self.token_api.get_token(token_id)"},{"line_number":467,"context_line":"        self.revoke_api.revoke_by_expiration(user_id\u003dtoken[\u0027user\u0027][\u0027id\u0027],"},{"line_number":468,"context_line":"                                             expires_at\u003dtoken[\u0027expires\u0027])"},{"line_number":469,"context_line":"        if CONF.token.revoke_by_id:"},{"line_number":470,"context_line":"            self.token_api.delete_token(token_id\u003dtoken_id)"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2Fru0%3D","line":467,"in_reply_to":"AAAAVX%2F%2FtvQ%3D","updated":"2014-03-01 06:22:38.000000000","message":"This is the right scope:  revoking a token means that we should revoke all tokens for that user that have the same expiration, as that means all fruit from the same tree:  anything more narrow and we miss tokens that should be revoked.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bad2061bd0b29164b2f73f6146e9cfe45c89948","unresolved":false,"context_lines":[{"line_number":466,"context_line":"        token \u003d self.token_api.get_token(token_id)"},{"line_number":467,"context_line":"        self.revoke_api.revoke_by_expiration(user_id\u003dtoken[\u0027user\u0027][\u0027id\u0027],"},{"line_number":468,"context_line":"                                             expires_at\u003dtoken[\u0027expires\u0027])"},{"line_number":469,"context_line":"        if CONF.token.revoke_by_id:"},{"line_number":470,"context_line":"            self.token_api.delete_token(token_id\u003dtoken_id)"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    def _assert_default_domain(self, token_ref):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FtvI%3D","line":469,"updated":"2014-02-28 20:21:47.000000000","message":"seems like you should call delete token either way -- why make it conditional?","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e0f6c7008a373bd7118b881e2b575aa2c3ad061a","unresolved":false,"context_lines":[{"line_number":466,"context_line":"        token \u003d self.token_api.get_token(token_id)"},{"line_number":467,"context_line":"        self.revoke_api.revoke_by_expiration(user_id\u003dtoken[\u0027user\u0027][\u0027id\u0027],"},{"line_number":468,"context_line":"                                             expires_at\u003dtoken[\u0027expires\u0027])"},{"line_number":469,"context_line":"        if CONF.token.revoke_by_id:"},{"line_number":470,"context_line":"            self.token_api.delete_token(token_id\u003dtoken_id)"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    def _assert_default_domain(self, token_ref):"}],"source_content_type":"text/x-python","patch_set":63,"id":"AAAAVX%2F%2FrvE%3D","line":469,"in_reply_to":"AAAAVX%2F%2FtvI%3D","updated":"2014-03-01 06:22:38.000000000","message":"This is necessary to enforce that the revocation events are actually doing their job.  If the token is deleted from the back end, it won\u0027t be found when user attempts to authenticate, making the revocation events untestable.","commit_id":"812295a431c49708fe93ebf5bd9c7ac4c74aa6e8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a43cd07f3004e5c7363c681c00d95850bd77bce1","unresolved":false,"context_lines":[{"line_number":356,"context_line":""},{"line_number":357,"context_line":"@dependency.optional(\u0027oauth_api\u0027)"},{"line_number":358,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027catalog_api\u0027, \u0027identity_api\u0027,"},{"line_number":359,"context_line":"                     \u0027revoke_api\u0027, \u0027token_api\u0027, \u0027trust_api\u0027)"},{"line_number":360,"context_line":"class BaseProvider(provider.Provider):"},{"line_number":361,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":362,"context_line":"        super(BaseProvider, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FxJY%3D","line":359,"updated":"2014-03-04 07:50:11.000000000","message":"revoke api should be optional if at all possible (it is optional elsewhere)","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"656d4bcccf51de070056856546fa35d89f65ad86","unresolved":false,"context_lines":[{"line_number":356,"context_line":""},{"line_number":357,"context_line":"@dependency.optional(\u0027oauth_api\u0027)"},{"line_number":358,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027catalog_api\u0027, \u0027identity_api\u0027,"},{"line_number":359,"context_line":"                     \u0027revoke_api\u0027, \u0027token_api\u0027, \u0027trust_api\u0027)"},{"line_number":360,"context_line":"class BaseProvider(provider.Provider):"},{"line_number":361,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":362,"context_line":"        super(BaseProvider, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2FsHA%3D","line":359,"in_reply_to":"AAAAVn%2F%2FxJY%3D","updated":"2014-03-04 17:28:38.000000000","message":"Gone.  Moved the logic to the provider where it belongs","commit_id":"815d5e955850d9084f484b1b8ba462d27fda776f"}],"requirements.txt":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# keystone dependencies"},{"line_number":2,"context_line":"enum34"},{"line_number":3,"context_line":"pbr\u003e\u003d0.5.21,\u003c1.0"},{"line_number":4,"context_line":"pam\u003e\u003d0.1.4"},{"line_number":5,"context_line":"WebOb\u003e\u003d1.2.3,\u003c1.3"}],"source_content_type":"text/plain","patch_set":6,"id":"AAAATn%2F9fzU%3D","line":2,"updated":"2013-12-10 22:23:38.000000000","message":"Does this need to be added to the openstack/requirements project too?","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"190b5cb5a8fcfac5dcbe7df627f1245d324773f0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"Babel\u003e\u003d1.3"},{"line_number":21,"context_line":"oauth2"},{"line_number":22,"context_line":"dogpile.cache\u003e\u003d0.5.0"},{"line_number":23,"context_line":""}],"source_content_type":"text/plain","patch_set":6,"id":"AAAATn%2F9fzg%3D","line":23,"updated":"2013-12-10 22:23:38.000000000","message":"Extra space?","commit_id":"76abfd8f7a58a5d99f78e71a25285fb8b23c1809"}]}
