)]}'
{"keystone/api/common/controller.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b4dc1024d5bb35b8d2dc9d0ae6bafd5f4e3fa68c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                         \u0027application/xml\u0027,"},{"line_number":36,"context_line":"                         \u0027text/xml\u0027,"},{"line_number":37,"context_line":"                         \u0027text/html\u0027]:  # text/html is default if none given"},{"line_number":38,"context_line":"        template_f \u003d pecan.expose(template\u003d\u0027keystone:%s\u0027 % content_type,"},{"line_number":39,"context_line":"                                  content_type\u003dcontent_type,"},{"line_number":40,"context_line":"                                  generic\u003dFalse)"},{"line_number":41,"context_line":"        template_f(f)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2F6I8%3D","line":38,"updated":"2014-02-24 06:04:15.000000000","message":"so for folks who are not as familiar with pecan, it would be hugely helpful to comment this line. I think you want to describe the parameters to expose so folks don\u0027t have to search. Something like:\n\n:param template: The path to a template, relative to the base template\n                 directory.\n:param content_type: The content-type to use for this template.\n:param generic: A boolean which flags this as a \"generic\" controller,\n                which uses generic functions based upon ``simplegeneric``\n                generic functions.  Allows you to split a single\n                controller into multiple paths based upon HTTP method.\n\nwould really help with reviewers that are new to pecan (like me :-) )   Also what\u0027s tricky if you are new to pecan is understanding the options and syntax for the template.  To move to this we all need to understand or see some decent examples","commit_id":"b8e429313cc3073eeddf7ea3e23f8b3f2913cddc"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b4dc1024d5bb35b8d2dc9d0ae6bafd5f4e3fa68c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                                  generic\u003dFalse)"},{"line_number":41,"context_line":"        template_f(f)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    return f"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2F6GE%3D","line":43,"updated":"2014-02-24 06:04:15.000000000","message":"why do you return f and not template_f  ?  Is it because template_f is a returned decorator that sets some config stuff (e.g. cfg[\u0027content_type\u0027] \u003d content_type)  and once its done that its purpose is fulfilled and so we can just return the original f back?","commit_id":"b8e429313cc3073eeddf7ea3e23f8b3f2913cddc"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"ca2c3c38b1637ebc9efe1563e05440aacbf572c2","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                                  generic\u003dFalse)"},{"line_number":41,"context_line":"        template_f(f)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    return f"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2Fzo4%3D","line":43,"in_reply_to":"AAAAU3%2F%2F6GE%3D","updated":"2014-03-04 01:26:10.000000000","message":"actually it should be f \u003d template_f(f) but in practice it doesn\u0027t matter\n\npecan.expose is generally used as a decorator, but the decorator sets some attributes on the function and then returns the function itself so the return value isn\u0027t required. This isn\u0027t something to rely on though.","commit_id":"b8e429313cc3073eeddf7ea3e23f8b3f2913cddc"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5adf3070685beee986e7d4a467ff2c62482eb9a8","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                         \u0027application/xml\u0027,"},{"line_number":38,"context_line":"                         \u0027text/xml\u0027,"},{"line_number":39,"context_line":"                         \u0027text/html\u0027]:  # text/html is default if none given"},{"line_number":40,"context_line":"        # the template in use here is a custom one that uses the oslo json"},{"line_number":41,"context_line":"        # renderer so that everything produces the same output."},{"line_number":42,"context_line":"        template_f \u003d pecan.expose(template\u003d\u0027keystone:%s\u0027 % content_type,"},{"line_number":43,"context_line":"                                  content_type\u003dcontent_type,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXX%2F%2FzUA%3D","line":40,"updated":"2014-04-26 20:15:37.000000000","message":"++","commit_id":"3708527656a338509699eb76b2fb8a0b3bdd6415"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5adf3070685beee986e7d4a467ff2c62482eb9a8","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        return []"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @staticmethod"},{"line_number":62,"context_line":"    def get_identity_url(endpoint_type, version):"},{"line_number":63,"context_line":"        \"\"\"Returns a URL to keystone\u0027s own endpoint.\"\"\""},{"line_number":64,"context_line":"        url \u003d CONF[\u0027%s_endpoint\u0027 % endpoint_type]"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXX%2F%2FzT8%3D","line":62,"updated":"2014-04-26 20:15:37.000000000","message":"Could we make this something more geneirc, such that another project could pick it up and use it the same way, something like:  get_root_url?","commit_id":"3708527656a338509699eb76b2fb8a0b3bdd6415"},{"author":{"_account_id":8005,"name":"Ryan Petrello","email":"ryan@ryanpetrello.com","username":"ryanpetrello"},"change_message_id":"6c2cba558de24bfcfd1842dae268aec462963603","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        else:"},{"line_number":89,"context_line":"            raise webob.exc.HTTPNotFound()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if isinstance(resp, webob.Response):"},{"line_number":92,"context_line":"            # NOTE(jamielennox): Copy a webob response from old framework into"},{"line_number":93,"context_line":"            # the pecan response. You have to return the actual pecan response"},{"line_number":94,"context_line":"            # object to return webob directly from pecan."}],"source_content_type":"text/x-python","patch_set":19,"id":"7adec928_67887971","line":91,"updated":"2014-05-19 21:02:21.000000000","message":"You could avoid the copying with:\n\n`pecan.state.response \u003d resp`\n\nI should make it so that you can just return an explicit webob.Response manually, though.","commit_id":"3708527656a338509699eb76b2fb8a0b3bdd6415"},{"author":{"_account_id":8005,"name":"Ryan Petrello","email":"ryan@ryanpetrello.com","username":"ryanpetrello"},"change_message_id":"94ddc6fc6f5406d6f37fd58a1b2b4ce6453bd50b","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        else:"},{"line_number":89,"context_line":"            raise webob.exc.HTTPNotFound()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if isinstance(resp, webob.Response):"},{"line_number":92,"context_line":"            # NOTE(jamielennox): Copy a webob response from old framework into"},{"line_number":93,"context_line":"            # the pecan response. You have to return the actual pecan response"},{"line_number":94,"context_line":"            # object to return webob directly from pecan."}],"source_content_type":"text/x-python","patch_set":19,"id":"1ae5cdf2_381b0b1d","line":91,"in_reply_to":"7adec928_67887971","updated":"2014-06-27 19:56:21.000000000","message":"Not sure if this patch is still alive or not, but thought I\u0027d mention that:\n\nhttp://git.openstack.org/cgit/stackforge/pecan/commit/?id\u003d9cea1bb00943c89a6fc1e83434c39493a31ace9d\n\n...is going to be released in the next version pecan next week.","commit_id":"3708527656a338509699eb76b2fb8a0b3bdd6415"},{"author":{"_account_id":8005,"name":"Ryan Petrello","email":"ryan@ryanpetrello.com","username":"ryanpetrello"},"change_message_id":"ba96a8c2d26dbdb0433a9f409dc8624a157ba20e","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        # produces the same output."},{"line_number":44,"context_line":"        template_f \u003d pecan.expose(template\u003d\u0027keystone:%s\u0027 % content_type,"},{"line_number":45,"context_line":"                                  content_type\u003dcontent_type,"},{"line_number":46,"context_line":"                                  generic\u003dFalse)"},{"line_number":47,"context_line":"        f \u003d template_f(f)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    return f"}],"source_content_type":"text/x-python","patch_set":21,"id":"da9b358b_1aeab1ac","line":46,"updated":"2015-04-01 12:43:40.000000000","message":"`generic\u003dFalse` is already the default (and that\u0027s not going to change, given that it would break every pecan app in existence):\n\nhttps://github.com/stackforge/pecan/blob/master/pecan/decorators.py#L27","commit_id":"716c5ac9cd11d9f5b3937a2fe2bacbd35ce3af47"},{"author":{"_account_id":8005,"name":"Ryan Petrello","email":"ryan@ryanpetrello.com","username":"ryanpetrello"},"change_message_id":"ba96a8c2d26dbdb0433a9f409dc8624a157ba20e","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        elif (CONF.secure_proxy_ssl_header and"},{"line_number":74,"context_line":"              CONF.secure_proxy_ssl_header in pecan.request.environ):"},{"line_number":75,"context_line":"            # NOTE(jamielennox): handle HTTP_X_FORWARDED_PROTO manually. It"},{"line_number":76,"context_line":"            # would be good if pecan could do this for us as routes does."},{"line_number":77,"context_line":"            i \u003d urllib.parse.urlsplit(pecan.request.host_url)"},{"line_number":78,"context_line":"            scheme \u003d pecan.request.environ[CONF.secure_proxy_ssl_header]"},{"line_number":79,"context_line":"            url \u003d urllib.parse.urlunsplit((scheme,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da9b358b_5af5d954","line":76,"updated":"2015-04-01 12:43:40.000000000","message":"File a ticket https://bugs.launchpad.net/pecan and I\u0027ll come up with something :)","commit_id":"716c5ac9cd11d9f5b3937a2fe2bacbd35ce3af47"},{"author":{"_account_id":8005,"name":"Ryan Petrello","email":"ryan@ryanpetrello.com","username":"ryanpetrello"},"change_message_id":"6bf11ab7179f2bacd0d28149863a00aae874e4bb","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        elif (CONF.secure_proxy_ssl_header and"},{"line_number":74,"context_line":"              CONF.secure_proxy_ssl_header in pecan.request.environ):"},{"line_number":75,"context_line":"            # NOTE(jamielennox): handle HTTP_X_FORWARDED_PROTO manually. It"},{"line_number":76,"context_line":"            # would be good if pecan could do this for us as routes does."},{"line_number":77,"context_line":"            i \u003d urllib.parse.urlsplit(pecan.request.host_url)"},{"line_number":78,"context_line":"            scheme \u003d pecan.request.environ[CONF.secure_proxy_ssl_header]"},{"line_number":79,"context_line":"            url \u003d urllib.parse.urlunsplit((scheme,"}],"source_content_type":"text/x-python","patch_set":21,"id":"1aca2d91_c55a4f2a","line":76,"in_reply_to":"3ab451fb_267957fd","updated":"2015-05-07 20:46:51.000000000","message":"Looked into this, and it looks like webob already has some in-flight reviews that will implement this sort of thing, so I may want to hold off and see what they do.\n\nIn the meantime, given that Paste is already a Keystone dependency, have you considered just using http://pythonpaste.org/deploy/modules/config.html#paste.deploy.config.PrefixMiddleware ?","commit_id":"716c5ac9cd11d9f5b3937a2fe2bacbd35ce3af47"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"e12062a5057fc64b6611132a0794bae80ab69a76","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        elif (CONF.secure_proxy_ssl_header and"},{"line_number":74,"context_line":"              CONF.secure_proxy_ssl_header in pecan.request.environ):"},{"line_number":75,"context_line":"            # NOTE(jamielennox): handle HTTP_X_FORWARDED_PROTO manually. It"},{"line_number":76,"context_line":"            # would be good if pecan could do this for us as routes does."},{"line_number":77,"context_line":"            i \u003d urllib.parse.urlsplit(pecan.request.host_url)"},{"line_number":78,"context_line":"            scheme \u003d pecan.request.environ[CONF.secure_proxy_ssl_header]"},{"line_number":79,"context_line":"            url \u003d urllib.parse.urlunsplit((scheme,"}],"source_content_type":"text/x-python","patch_set":21,"id":"3ab451fb_267957fd","line":76,"in_reply_to":"da9b358b_5af5d954","updated":"2015-04-17 02:06:36.000000000","message":"https://bugs.launchpad.net/pecan/+bug/1445290","commit_id":"716c5ac9cd11d9f5b3937a2fe2bacbd35ce3af47"},{"author":{"_account_id":8005,"name":"Ryan Petrello","email":"ryan@ryanpetrello.com","username":"ryanpetrello"},"change_message_id":"ba96a8c2d26dbdb0433a9f409dc8624a157ba20e","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            pecan.request.context[\u0027v3_wsgi_controller\u0027] \u003d is_v3"},{"line_number":111,"context_line":"            return old_controller(pecan.request, pecaned\u003dTrue)"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            raise webob.exc.HTTPNotFound()"}],"source_content_type":"text/x-python","patch_set":21,"id":"da9b358b_7af09d67","line":113,"updated":"2015-04-01 12:43:40.000000000","message":"pecan.abort(404) is a nice shortcut","commit_id":"716c5ac9cd11d9f5b3937a2fe2bacbd35ce3af47"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"e12062a5057fc64b6611132a0794bae80ab69a76","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            pecan.request.context[\u0027v3_wsgi_controller\u0027] \u003d is_v3"},{"line_number":111,"context_line":"            return old_controller(pecan.request, pecaned\u003dTrue)"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            raise webob.exc.HTTPNotFound()"}],"source_content_type":"text/x-python","patch_set":21,"id":"3ab451fb_66775f03","line":113,"in_reply_to":"da9b358b_7af09d67","updated":"2015-04-17 02:06:36.000000000","message":"Done","commit_id":"716c5ac9cd11d9f5b3937a2fe2bacbd35ce3af47"}],"keystone/api/root/controllers/root.py":[{"author":{"_account_id":8005,"name":"Ryan Petrello","email":"ryan@ryanpetrello.com","username":"ryanpetrello"},"change_message_id":"ba96a8c2d26dbdb0433a9f409dc8624a157ba20e","unresolved":false,"context_lines":[{"line_number":23,"context_line":"           \u0027RootController\u0027]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class RootController(object):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    available_versions \u003d set()"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da9b358b_c58eaa78","line":26,"updated":"2015-04-01 12:43:40.000000000","message":"You may want to consider renaming this to e.g., RootControllerBase so it\u0027s clear that it\u0027s intended as an abstract class, not the *actual* root of pecan routing.","commit_id":"716c5ac9cd11d9f5b3937a2fe2bacbd35ce3af47"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"e12062a5057fc64b6611132a0794bae80ab69a76","unresolved":false,"context_lines":[{"line_number":23,"context_line":"           \u0027RootController\u0027]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class RootController(object):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    available_versions \u003d set()"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3ab451fb_a602073d","line":26,"in_reply_to":"da9b358b_c58eaa78","updated":"2015-04-17 02:06:36.000000000","message":"Done","commit_id":"716c5ac9cd11d9f5b3937a2fe2bacbd35ce3af47"}],"keystone/api/v3/root.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5adf3070685beee986e7d4a467ff2c62482eb9a8","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            \u0027links\u0027: ["},{"line_number":48,"context_line":"                {"},{"line_number":49,"context_line":"                    \u0027rel\u0027: \u0027self\u0027,"},{"line_number":50,"context_line":"                    \u0027href\u0027: cls.get_identity_url(endpoint_type, \u0027v3\u0027),"},{"line_number":51,"context_line":"                }"},{"line_number":52,"context_line":"            ],"},{"line_number":53,"context_line":"            \u0027media-types\u0027: ["}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXX%2F%2FzTU%3D","line":50,"updated":"2014-04-26 20:15:37.000000000","message":"I think that would be more reusable as \"root_url\"","commit_id":"3708527656a338509699eb76b2fb8a0b3bdd6415"}],"keystone/common/wsgi.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"05e6463b12a2b5977e4befe5cd4aed2e52e129cd","unresolved":false,"context_lines":[{"line_number":446,"context_line":"        \"\"\""},{"line_number":447,"context_line":"        return self._router"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"    @staticmethod"},{"line_number":450,"context_line":"    @webob.dec.wsgify(RequestClass\u003dRequest)"},{"line_number":451,"context_line":"    def _dispatch(req):"},{"line_number":452,"context_line":"        \"\"\"Dispatch the request to the appropriate controller."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Fvr8%3D","side":"PARENT","line":449,"updated":"2014-01-08 23:13:39.000000000","message":"oops, making this not a static method makes it much easier to debug - but wasn\u0027t supposed to be part of the patch","commit_id":"f33ec9e5bcd82e0debfa815c7ab551c79854f841"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4edb98752a6949546f1c0266812cf6bb58e0d17e","unresolved":false,"context_lines":[{"line_number":553,"context_line":""},{"line_number":554,"context_line":"    Traditionally keystone renders everything to JSON and then leaves the"},{"line_number":555,"context_line":"    conversion to XML or other type to middleware. To maintain compatability"},{"line_number":556,"context_line":"    this renderer will encode verything that is pointed at it to json."},{"line_number":557,"context_line":"    \"\"\""},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"    def __init__(self, path, extra_vars):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Fxws%3D","line":556,"updated":"2014-01-08 15:57:08.000000000","message":"s/verything/everything :)","commit_id":"663759cc17145f68511c9edcdc3b5dffb3e35124"}],"keystone/service.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b4dc1024d5bb35b8d2dc9d0ae6bafd5f4e3fa68c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    pecan.set_config({\u0027app\u0027: {}}, overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    kwargs[\u0027custom_renderers\u0027] \u003d {\u0027keystone\u0027: render.KeystoneRenderer}"},{"line_number":56,"context_line":"    kwargs.setdefault(\u0027hooks\u0027, []).append(hooks.ProcessHook())"},{"line_number":57,"context_line":"    return pecan.make_app(controller, **kwargs)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2F6Rk%3D","line":56,"updated":"2014-02-24 06:04:15.000000000","message":"what does this do?","commit_id":"b8e429313cc3073eeddf7ea3e23f8b3f2913cddc"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"ca2c3c38b1637ebc9efe1563e05440aacbf572c2","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    pecan.set_config({\u0027app\u0027: {}}, overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    kwargs[\u0027custom_renderers\u0027] \u003d {\u0027keystone\u0027: render.KeystoneRenderer}"},{"line_number":56,"context_line":"    kwargs.setdefault(\u0027hooks\u0027, []).append(hooks.ProcessHook())"},{"line_number":57,"context_line":"    return pecan.make_app(controller, **kwargs)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2FzoA%3D","line":56,"in_reply_to":"AAAAU3%2F%2F6Rk%3D","updated":"2014-03-04 01:26:10.000000000","message":"pecan allows you to hook in to the routing process at various points.\n\nlike on_route, on_error, etc. We can handle a lot of the things from the original controller through these hooks.","commit_id":"b8e429313cc3073eeddf7ea3e23f8b3f2913cddc"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b4dc1024d5bb35b8d2dc9d0ae6bafd5f4e3fa68c","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"@fail_gracefully"},{"line_number":83,"context_line":"def v3_app_factory(global_conf, **local_conf):"},{"line_number":84,"context_line":"    root.Controller.register_version(\u0027v3\u0027)"},{"line_number":85,"context_line":"    return make_app(v3.Controller())"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2F6SM%3D","line":84,"updated":"2014-02-24 06:04:15.000000000","message":"so far this certainly looks cleaner than ComposingRouter stuff","commit_id":"b8e429313cc3073eeddf7ea3e23f8b3f2913cddc"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5adf3070685beee986e7d4a467ff2c62482eb9a8","unresolved":false,"context_lines":[{"line_number":60,"context_line":"@fail_gracefully"},{"line_number":61,"context_line":"def public_app_factory(global_conf, **local_conf):"},{"line_number":62,"context_line":"    root.Controller.register_version(\u0027v2.0\u0027)"},{"line_number":63,"context_line":"    return make_app(v2.PublicController())"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"@fail_gracefully"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXX%2F%2FzTg%3D","line":63,"updated":"2014-04-26 20:15:37.000000000","message":"Much better.","commit_id":"3708527656a338509699eb76b2fb8a0b3bdd6415"}],"keystone/tests/test_versions.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5adf3070685beee986e7d4a467ff2c62482eb9a8","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    @mock.patch.object(controllers, \u0027_VERSIONS\u0027, [\u0027v3\u0027])"},{"line_number":248,"context_line":"    def test_v2_disabled(self):"},{"line_number":249,"context_line":"        client \u003d self.client(self.public_app)"},{"line_number":250,"context_line":"        # request to /v2.0 should fail"},{"line_number":251,"context_line":"        resp \u003d client.get(\u0027/v2.0/\u0027)"},{"line_number":252,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXX%2F%2FzTk%3D","side":"PARENT","line":250,"updated":"2014-04-26 20:15:37.000000000","message":"does not fail now?","commit_id":"22b734fa60ccc25749e318be4ced478fcdb8d23c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5adf3070685beee986e7d4a467ff2c62482eb9a8","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    @mock.patch.object(controllers, \u0027_VERSIONS\u0027, [\u0027v2.0\u0027])"},{"line_number":279,"context_line":"    def test_v3_disabled(self):"},{"line_number":280,"context_line":"        client \u003d self.client(self.public_app)"},{"line_number":281,"context_line":"        # request to /v3 should fail"},{"line_number":282,"context_line":"        resp \u003d client.get(\u0027/v3/\u0027)"},{"line_number":283,"context_line":"        self.assertEqual(resp.status_int, 404)"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXX%2F%2FzTo%3D","side":"PARENT","line":281,"updated":"2014-04-26 20:15:37.000000000","message":"why is this gone?","commit_id":"22b734fa60ccc25749e318be4ced478fcdb8d23c"}],"keystone/tests/unit/test_versions.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7b1ccafd107b41b214d9c12c5b4b9bb819ba28a7","unresolved":false,"context_lines":[{"line_number":634,"context_line":"class VersionTestCase(tests.TestCase):"},{"line_number":635,"context_line":"    def setUp(self):"},{"line_number":636,"context_line":"        super(VersionTestCase, self).setUp()"},{"line_number":637,"context_line":"        root.clear_versions()"},{"line_number":638,"context_line":"        self.load_backends()"},{"line_number":639,"context_line":"        self.public_app \u003d self.loadapp(\u0027keystone\u0027, \u0027main\u0027)"},{"line_number":640,"context_line":"        self.admin_app \u003d self.loadapp(\u0027keystone\u0027, \u0027admin\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a016987_7b2c92ab","line":637,"updated":"2015-05-14 14:25:49.000000000","message":"this should be done in tests.TestCase addCleanup so that all the tests clean up after themselves, then this test doesn\u0027t need to try to clean up after other tests.","commit_id":"8cfb74bf7657463d066db39d5252ba530409f6fa"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7b1ccafd107b41b214d9c12c5b4b9bb819ba28a7","unresolved":false,"context_lines":[{"line_number":914,"context_line":"        accept_types \u003d \u0027%s, %s;q\u003d0.5\u0027 % (JSON_HOME, JSON)"},{"line_number":915,"context_line":"        self.assertThat(make_request(accept_types), JSON_HOME_MATCHER)"},{"line_number":916,"context_line":""},{"line_number":917,"context_line":"        # If request some unknown mime-type, get JSON."},{"line_number":918,"context_line":"        self.assertThat(make_request(self.getUniqueString(),"},{"line_number":919,"context_line":"                                     \u0027406 Not Acceptable\u0027), JSON_MATCHER)"},{"line_number":920,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7a016987_1bb6be8a","line":917,"updated":"2015-05-14 14:25:49.000000000","message":"this is changing behavior in non-backwards compatible way.","commit_id":"8cfb74bf7657463d066db39d5252ba530409f6fa"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7b1ccafd107b41b214d9c12c5b4b9bb819ba28a7","unresolved":false,"context_lines":[{"line_number":919,"context_line":"                                     \u0027406 Not Acceptable\u0027), JSON_MATCHER)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"    def test_no_json_home_document_returned_when_v3_disabled(self):"},{"line_number":922,"context_line":"        root.clear_versions()"},{"line_number":923,"context_line":"        config \u003d tests.dirs.tests_conf(\u0027v2-only-paste.conf\u0027)"},{"line_number":924,"context_line":"        app \u003d self.loadapp(\u0027config:%s\u0027 % config, \u0027main\u0027)"},{"line_number":925,"context_line":"        exp_json_home_data \u003d {\u0027resources\u0027: {}}"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a016987_3e528814","line":922,"updated":"2015-05-14 14:25:49.000000000","message":"can this be split out to its own commit? I think we should do this even if we can\u0027t switch to pecan. Also, it\u0027ll make this patch smaller.","commit_id":"8cfb74bf7657463d066db39d5252ba530409f6fa"}],"keystone/token/controllers.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"b4dc1024d5bb35b8d2dc9d0ae6bafd5f4e3fa68c","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        cert_file \u003d open(CONF.signing.certfile, \u0027r\u0027)"},{"line_number":57,"context_line":"        data \u003d cert_file.read()"},{"line_number":58,"context_line":"        cert_file.close()"},{"line_number":59,"context_line":"        headerlist \u003d [(\u0027Content-Type\u0027, \u0027text/html; charset\u003dUTF-8\u0027)]"},{"line_number":60,"context_line":"        return webob.Response(body\u003ddata,"},{"line_number":61,"context_line":"                              status\u003d\u0027200 OK\u0027,"},{"line_number":62,"context_line":"                              headerlist\u003dheaderlist)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAU3%2F%2F6So%3D","line":59,"updated":"2014-02-24 06:04:15.000000000","message":"how were these headers set previously and why did it need to change?","commit_id":"b8e429313cc3073eeddf7ea3e23f8b3f2913cddc"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"ca2c3c38b1637ebc9efe1563e05440aacbf572c2","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        cert_file \u003d open(CONF.signing.certfile, \u0027r\u0027)"},{"line_number":57,"context_line":"        data \u003d cert_file.read()"},{"line_number":58,"context_line":"        cert_file.close()"},{"line_number":59,"context_line":"        headerlist \u003d [(\u0027Content-Type\u0027, \u0027text/html; charset\u003dUTF-8\u0027)]"},{"line_number":60,"context_line":"        return webob.Response(body\u003ddata,"},{"line_number":61,"context_line":"                              status\u003d\u0027200 OK\u0027,"},{"line_number":62,"context_line":"                              headerlist\u003dheaderlist)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAVn%2F%2Fzng%3D","line":59,"in_reply_to":"AAAAU3%2F%2F6So%3D","updated":"2014-03-04 01:26:10.000000000","message":"This was set by the poor way that the old controller handled returning a string.\n\nIf a string was returned it was automatically assumed that it was a text/html type and simply returned. Now that we handle things better i need to force set that old behaviour.","commit_id":"b8e429313cc3073eeddf7ea3e23f8b3f2913cddc"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5adf3070685beee986e7d4a467ff2c62482eb9a8","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        data \u003d ca_file.read()"},{"line_number":50,"context_line":"        ca_file.close()"},{"line_number":51,"context_line":"        # NOTE(jamielennox): it\u0027s dumb that we have to force set this to html"},{"line_number":52,"context_line":"        # but that is what the original implementation would return."},{"line_number":53,"context_line":"        headerlist \u003d [(\u0027Content-Type\u0027, \u0027text/html; charset\u003dUTF-8\u0027)]"},{"line_number":54,"context_line":"        return webob.Response(body\u003ddata,"},{"line_number":55,"context_line":"                              status\u003d\u0027200 OK\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXX%2F%2FzTw%3D","line":52,"updated":"2014-04-26 20:15:37.000000000","message":"probably should state what the appropriate content type is for a cert.  It is not HTML.","commit_id":"3708527656a338509699eb76b2fb8a0b3bdd6415"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2379a1495d4a1e4193d604ddd76e96314c87bcac","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        ca_file.close()"},{"line_number":51,"context_line":"        # NOTE(jamielennox): it\u0027s dumb that we have to force set this to html"},{"line_number":52,"context_line":"        # but that is what the original implementation would return."},{"line_number":53,"context_line":"        headerlist \u003d [(\u0027Content-Type\u0027, \u0027text/html; charset\u003dUTF-8\u0027)]"},{"line_number":54,"context_line":"        return webob.Response(body\u003ddata,"},{"line_number":55,"context_line":"                              status\u003d\u0027200 OK\u0027,"},{"line_number":56,"context_line":"                              headerlist\u003dheaderlist)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXH%2F%2FA1g%3D","line":53,"updated":"2014-09-08 19:55:15.000000000","message":"what\u0027s asserting that this has the wrong content type? fix it instead!","commit_id":"3708527656a338509699eb76b2fb8a0b3bdd6415"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7b1ccafd107b41b214d9c12c5b4b9bb819ba28a7","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        ca_file \u003d open(CONF.signing.ca_certs, \u0027r\u0027)"},{"line_number":52,"context_line":"        data \u003d ca_file.read()"},{"line_number":53,"context_line":"        ca_file.close()"},{"line_number":54,"context_line":"        pecan.override_template(None, content_type\u003d\u0027text/html\u0027)"},{"line_number":55,"context_line":"        return data"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @controller.v2_deprecated"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a016987_9ee73c40","line":54,"updated":"2015-05-14 14:25:49.000000000","message":"give a name to the None argument so we know what it\u0027s for.","commit_id":"8cfb74bf7657463d066db39d5252ba530409f6fa"}]}
