)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6763,"name":"jingliuqing","email":"jing.liuqing@99cloud.net","username":"jing"},"change_message_id":"3e5ee7a4d8321535fe8aded845c214bbd299554f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Luis Daniel Castellanos \u003cluis.daniel.castellanos@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-05-10 13:54:14 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Stop memoising on request arguments in nova api"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The request parameter is a django.http.HttpRequest instance object"},{"line_number":10,"context_line":"which contains metadata about the request. This object is a new instance of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"dab17558_9bb90ecf","line":7,"range":{"start_line":7,"start_character":5,"end_line":7,"end_character":14},"updated":"2016-05-11 10:00:35.000000000","message":"typo? memoizing","commit_id":"50d19ca686ba3c6ebb6960c970244fff703d37e3"},{"author":{"_account_id":8674,"name":"Yves-Gwenael Bourhis","email":"ygbourhis@gmail.com","username":"yves"},"change_message_id":"a894ea0b6777cdc60901c7e97b88faa162cd2dfe","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Luis Daniel Castellanos \u003cluis.daniel.castellanos@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-05-10 13:54:14 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Stop memoising on request arguments in nova api"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The request parameter is a django.http.HttpRequest instance object"},{"line_number":10,"context_line":"which contains metadata about the request. This object is a new instance of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"dab17558_7f24d1c5","line":7,"range":{"start_line":7,"start_character":5,"end_line":7,"end_character":14},"in_reply_to":"dab17558_9bb90ecf","updated":"2016-05-12 11:45:01.000000000","message":"Good catch, thanks\n\nDone","commit_id":"50d19ca686ba3c6ebb6960c970244fff703d37e3"}],"horizon/test/tests/utils.py":[{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"713a223a966214355e55f325481772bfdf920e42","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        leader \u003d \u0027Joan Jett\u0027"},{"line_number":388,"context_line":"        group \u003d \u0027Blackhearts\u0027"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        for position in six.moves.xrange(len(chorus)):"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"            changed_args \u003d False"},{"line_number":393,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_8774e9fd","line":390,"updated":"2016-03-15 14:03:13.000000000","message":"for position, chorus_line in enumerate(chorus):","commit_id":"c24014d93e219564164beafe39860252f4e70999"},{"author":{"_account_id":8674,"name":"Yves-Gwenael Bourhis","email":"ygbourhis@gmail.com","username":"yves"},"change_message_id":"3310bb71c2d4c3ca8ea76020f1202326272be88e","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        leader \u003d \u0027Joan Jett\u0027"},{"line_number":388,"context_line":"        group \u003d \u0027Blackhearts\u0027"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        for position in six.moves.xrange(len(chorus)):"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"            changed_args \u003d False"},{"line_number":393,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_1612c0b4","line":390,"in_reply_to":"1af94dfe_8774e9fd","updated":"2016-03-15 16:10:20.000000000","message":"Done","commit_id":"c24014d93e219564164beafe39860252f4e70999"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"713a223a966214355e55f325481772bfdf920e42","unresolved":false,"context_lines":[{"line_number":403,"context_line":"            def some_other_func(*args):"},{"line_number":404,"context_line":"                return args"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"            chorus_copy \u003d chorus[:]"},{"line_number":407,"context_line":"            # check chorus_copy[position] is replaced by some_func\u0027s"},{"line_number":408,"context_line":"            # output"},{"line_number":409,"context_line":"            output1 \u003d some_other_func(*chorus_copy)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_07ed798b","line":406,"updated":"2016-03-15 14:03:13.000000000","message":"chorus_copy \u003d list(chorus)","commit_id":"c24014d93e219564164beafe39860252f4e70999"},{"author":{"_account_id":8674,"name":"Yves-Gwenael Bourhis","email":"ygbourhis@gmail.com","username":"yves"},"change_message_id":"3310bb71c2d4c3ca8ea76020f1202326272be88e","unresolved":false,"context_lines":[{"line_number":403,"context_line":"            def some_other_func(*args):"},{"line_number":404,"context_line":"                return args"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"            chorus_copy \u003d chorus[:]"},{"line_number":407,"context_line":"            # check chorus_copy[position] is replaced by some_func\u0027s"},{"line_number":408,"context_line":"            # output"},{"line_number":409,"context_line":"            output1 \u003d some_other_func(*chorus_copy)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_560c4894","line":406,"in_reply_to":"1af94dfe_07ed798b","updated":"2016-03-15 16:10:20.000000000","message":"Done","commit_id":"c24014d93e219564164beafe39860252f4e70999"}],"horizon/utils/memoized.py":[{"author":{"_account_id":8674,"name":"Yves-Gwenael Bourhis","email":"ygbourhis@gmail.com","username":"yves"},"change_message_id":"03cf23a235df198bea2648e7398935ebd590ebaa","unresolved":false,"context_lines":[{"line_number":106,"context_line":"memoized_method \u003d memoized"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def memoized_with_request(request_func, request_index\u003d0):"},{"line_number":110,"context_line":"    \"\"\"Decorator for caching functions which receive a request argument"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    memoized functions with a request argument are memoized only during the"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_24914853","line":109,"range":{"start_line":109,"start_character":55,"end_line":109,"end_character":57},"updated":"2016-03-02 10:51:36.000000000","message":"To be honest, I think I could rename \"memoized_with_request\" to something else.\nIndeed, this decorator can be used to memoize anything else and replace a specific argument by a call to another function.\nI just don\u0027t know how to give it a more generic name apart from \"memoize_by_replacing_one_arg_with_function_call\" :-/  (too long and sounds horrible), so if any one has an idea, it would be welcomed :-)","commit_id":"b3313a49ce38f4d05d2ae63916eabce0060b433a"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"c54ff934a808c5cd116a7ab86c0e86e8d3b477da","unresolved":false,"context_lines":[{"line_number":106,"context_line":"memoized_method \u003d memoized"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def memoized_with_request(request_func, request_index\u003d0):"},{"line_number":110,"context_line":"    \"\"\"Decorator for caching functions which receive a request argument"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    memoized functions with a request argument are memoized only during the"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_07424e10","line":109,"range":{"start_line":109,"start_character":55,"end_line":109,"end_character":57},"in_reply_to":"7af24918_24914853","updated":"2016-03-02 11:05:45.000000000","message":"\"memoize_deluxe\" ;-)\n\nDo we actually have another use case for this? Because generalizing just for the sake of generalizing doesn\u0027t always pay off.","commit_id":"b3313a49ce38f4d05d2ae63916eabce0060b433a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"6c68a2e222f8085cc44e52f912ae3225165e72a5","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    See openstack_dashboard.api.nova for a complete example."},{"line_number":150,"context_line":"    \"\"\""},{"line_number":151,"context_line":"    def wrapper(func):"},{"line_number":152,"context_line":"        memoized_func \u003d memoized(func)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        @functools.wraps(func)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_5f737680","line":151,"updated":"2016-03-02 13:55:00.000000000","message":"Add test cases to this warpper, some thing like:\nhorizon/test/tests/utils.py:MemoizedTests","commit_id":"b3313a49ce38f4d05d2ae63916eabce0060b433a"},{"author":{"_account_id":12071,"name":"Richard Jones","email":"r1chardj0n3s@gmail.com","username":"richard"},"change_message_id":"5d4641d4b838e92f1b731841f09ca353ce2f654e","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    instance on each view."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    If you want a function to be memoized for multiple views use this"},{"line_number":117,"context_line":"    decorator."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    You need a seperate function which will receive the request argument."},{"line_number":120,"context_line":"    your memoized function will instead receive request_func(request)"}],"source_content_type":"text/x-python","patch_set":23,"id":"9abb7d3a_5c08c12d","line":117,"updated":"2016-05-30 06:24:27.000000000","message":"Suggest adding \"It replaces the request argument in the call to the decorated function with the result of calling request_func on that request object.\"","commit_id":"70834be1f2a4141cdc556741bc2fa6ca3bb4f92f"},{"author":{"_account_id":20509,"name":"Daniel Castellanos","email":"luis.daniel.castellanos@intel.com","username":"lcastell"},"change_message_id":"b30f51a7fff3d27d4f3b949a9cfc2457b8a59892","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    instance on each view."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    If you want a function to be memoized for multiple views use this"},{"line_number":117,"context_line":"    decorator."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    You need a seperate function which will receive the request argument."},{"line_number":120,"context_line":"    your memoized function will instead receive request_func(request)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7aa08908_00d199cd","line":117,"in_reply_to":"9abb7d3a_5c08c12d","updated":"2016-06-10 18:28:31.000000000","message":"Done","commit_id":"70834be1f2a4141cdc556741bc2fa6ca3bb4f92f"},{"author":{"_account_id":12071,"name":"Richard Jones","email":"r1chardj0n3s@gmail.com","username":"richard"},"change_message_id":"5d4641d4b838e92f1b731841f09ca353ce2f654e","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    If you want a function to be memoized for multiple views use this"},{"line_number":117,"context_line":"    decorator."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    You need a seperate function which will receive the request argument."},{"line_number":120,"context_line":"    your memoized function will instead receive request_func(request)"},{"line_number":121,"context_line":"    passed as argument at the request_index."},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9abb7d3a_1c7119e1","line":119,"updated":"2016-05-30 06:24:27.000000000","message":"\"separate\"\n\nI would re-write this to refer specifically to the argument above:\n\n\"request_func is a function which will...\"\n\n\"request_index indicates which argument of the decorated function is the request object to pass in to request_func, which will also be replaced by the result of request_func being called.\"","commit_id":"70834be1f2a4141cdc556741bc2fa6ca3bb4f92f"},{"author":{"_account_id":20509,"name":"Daniel Castellanos","email":"luis.daniel.castellanos@intel.com","username":"lcastell"},"change_message_id":"b30f51a7fff3d27d4f3b949a9cfc2457b8a59892","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    If you want a function to be memoized for multiple views use this"},{"line_number":117,"context_line":"    decorator."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    You need a seperate function which will receive the request argument."},{"line_number":120,"context_line":"    your memoized function will instead receive request_func(request)"},{"line_number":121,"context_line":"    passed as argument at the request_index."},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7aa08908_e0d3add3","line":119,"in_reply_to":"9abb7d3a_1c7119e1","updated":"2016-06-10 18:28:31.000000000","message":"Done","commit_id":"70834be1f2a4141cdc556741bc2fa6ca3bb4f92f"},{"author":{"_account_id":12071,"name":"Richard Jones","email":"r1chardj0n3s@gmail.com","username":"richard"},"change_message_id":"5d4641d4b838e92f1b731841f09ca353ce2f654e","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    You need a seperate function which will receive the request argument."},{"line_number":120,"context_line":"    your memoized function will instead receive request_func(request)"},{"line_number":121,"context_line":"    passed as argument at the request_index."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    short example:"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9abb7d3a_dc667128","line":121,"updated":"2016-05-30 06:24:27.000000000","message":"I suggest adding \"The intent of that function is to extract the information needed from the request, and thus the memoizing will operate just on that part of the request that is relevant to the function being memoized.\"","commit_id":"70834be1f2a4141cdc556741bc2fa6ca3bb4f92f"},{"author":{"_account_id":20509,"name":"Daniel Castellanos","email":"luis.daniel.castellanos@intel.com","username":"lcastell"},"change_message_id":"b30f51a7fff3d27d4f3b949a9cfc2457b8a59892","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    You need a seperate function which will receive the request argument."},{"line_number":120,"context_line":"    your memoized function will instead receive request_func(request)"},{"line_number":121,"context_line":"    passed as argument at the request_index."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    short example:"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7aa08908_20d655c3","line":121,"in_reply_to":"9abb7d3a_dc667128","updated":"2016-06-10 18:28:31.000000000","message":"Done","commit_id":"70834be1f2a4141cdc556741bc2fa6ca3bb4f92f"}],"openstack_dashboard/api/nova.py":[{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"f9bca75b3ba62b94dbd494dac29c03d8f4e55c03","unresolved":false,"context_lines":[{"line_number":549,"context_line":"        flavor\u003dflavor, tenant\u003dtenant)"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"def _flavor_get_extras(nova_api, flavor_id, raw\u003dFalse, flavor\u003dNone):"},{"line_number":553,"context_line":"    \"\"\"Get flavor extra specs.\"\"\""},{"line_number":554,"context_line":"    if flavor is None:"},{"line_number":555,"context_line":"        flavor \u003d nova_api.flavors.get(flavor_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_65cb7354","line":552,"updated":"2015-11-10 08:17:54.000000000","message":"you forgot @memoize here?","commit_id":"d0a35bda7f65022b8c631678c19f24def7c74925"},{"author":{"_account_id":8674,"name":"Yves-Gwenael Bourhis","email":"ygbourhis@gmail.com","username":"yves"},"change_message_id":"37a6e5002c93730d65b124e703a00a525c65dd07","unresolved":false,"context_lines":[{"line_number":549,"context_line":"        flavor\u003dflavor, tenant\u003dtenant)"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"def _flavor_get_extras(nova_api, flavor_id, raw\u003dFalse, flavor\u003dNone):"},{"line_number":553,"context_line":"    \"\"\"Get flavor extra specs.\"\"\""},{"line_number":554,"context_line":"    if flavor is None:"},{"line_number":555,"context_line":"        flavor \u003d nova_api.flavors.get(flavor_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_4e920b59","line":552,"in_reply_to":"da85f559_65cb7354","updated":"2015-11-10 09:46:39.000000000","message":"Oops! Thanks Radomir :-)\n\nDone","commit_id":"d0a35bda7f65022b8c631678c19f24def7c74925"},{"author":{"_account_id":12281,"name":"Itxaka","email":"igarcia@suse.com","username":"itxaka"},"change_message_id":"2aa12a391c43989b27745353340a25aea6e7b6f7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"VOLUME_STATE_AVAILABLE \u003d \"available\""},{"line_number":56,"context_line":"DEFAULT_QUOTA_NAME \u003d \u0027default\u0027"},{"line_number":57,"context_line":"INSECURE \u003d getattr(settings, \u0027OPENSTACK_SSL_NO_VERIFY\u0027, False)"},{"line_number":58,"context_line":"CACERT \u003d getattr(settings, \u0027OPENSTACK_SSL_CACERT\u0027, None)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class VNCConsole(base.APIDictWrapper):"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa69d971_0f4e57c1","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":56},"updated":"2016-01-08 10:34:03.000000000","message":"Maybe Im blind, but I cant see where this 2 values are used?","commit_id":"4ec7d9ebe135a24202e9b7f327fcf4cfb30c444f"},{"author":{"_account_id":8674,"name":"Yves-Gwenael Bourhis","email":"ygbourhis@gmail.com","username":"yves"},"change_message_id":"dfa412cc90b10d551915c498ad9a96e99ca0d9ae","unresolved":false,"context_lines":[{"line_number":55,"context_line":"VOLUME_STATE_AVAILABLE \u003d \"available\""},{"line_number":56,"context_line":"DEFAULT_QUOTA_NAME \u003d \u0027default\u0027"},{"line_number":57,"context_line":"INSECURE \u003d getattr(settings, \u0027OPENSTACK_SSL_NO_VERIFY\u0027, False)"},{"line_number":58,"context_line":"CACERT \u003d getattr(settings, \u0027OPENSTACK_SSL_CACERT\u0027, None)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class VNCConsole(base.APIDictWrapper):"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa69d971_31905995","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":56},"in_reply_to":"fa69d971_0f4e57c1","updated":"2016-01-08 12:52:15.000000000","message":"It was to avoid evaluating it at each function call lines 454 455, so I declared it at module level, but forgot to use it... silly me.\n\nThanks for noticing :-)","commit_id":"4ec7d9ebe135a24202e9b7f327fcf4cfb30c444f"},{"author":{"_account_id":5623,"name":"David Lyle","email":"dklyle0@gmail.com","username":"david-lyle"},"change_message_id":"e489562f8bff417d2c7f81e56503c4cf3a82771d","unresolved":false,"context_lines":[{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"@memoized"},{"line_number":1003,"context_line":"def _extension_supported(extension_name, nova_api):"},{"line_number":1004,"context_line":"    extensions \u003d _list_extensions(nova_api)"},{"line_number":1005,"context_line":"    for extension in extensions:"},{"line_number":1006,"context_line":"        if extension.name \u003d\u003d extension_name:"},{"line_number":1007,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_14317eec","line":1004,"updated":"2016-01-21 21:54:25.000000000","message":"this circumvents the blacklist provided in list_extention(), is that intentional? why?","commit_id":"eda5d1bba16f021982fa9d4f3c37a4f97758b08d"},{"author":{"_account_id":8674,"name":"Yves-Gwenael Bourhis","email":"ygbourhis@gmail.com","username":"yves"},"change_message_id":"046b534681a05626bac8d4b531b8df657be1779e","unresolved":false,"context_lines":[{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"@memoized"},{"line_number":1003,"context_line":"def _extension_supported(extension_name, nova_api):"},{"line_number":1004,"context_line":"    extensions \u003d _list_extensions(nova_api)"},{"line_number":1005,"context_line":"    for extension in extensions:"},{"line_number":1006,"context_line":"        if extension.name \u003d\u003d extension_name:"},{"line_number":1007,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_2959b6fe","line":1004,"in_reply_to":"9a68dd71_14317eec","updated":"2016-01-22 09:27:19.000000000","message":"Thanks David for catching this one.\nThe blacklist was added way after my first patch set, and I didn\u0027t see this because it did not conflict after rebasing.","commit_id":"eda5d1bba16f021982fa9d4f3c37a4f97758b08d"},{"author":{"_account_id":8040,"name":"Timur Sufiev","email":"tsufiev@gmail.com","username":"tsufiev"},"change_message_id":"b751a4c12cf1ba735bf1daf9115e2fbde6e014f9","unresolved":false,"context_lines":[{"line_number":527,"context_line":"    return flavors"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"def flavor_list(request, is_public\u003dTrue, get_extras\u003dFalse):"},{"line_number":531,"context_line":"    \"\"\"Get the list of available instance sizes (flavors).\"\"\""},{"line_number":532,"context_line":"    return _flavor_list(novaclient(request), is_public, get_extras)"},{"line_number":533,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5a5ae5dd_6fa061a6","line":530,"updated":"2016-02-09 12:00:26.000000000","message":"What do you think of providing the following decorator:\n\n  def memoized_novaclient(func):\n    memoized_func \u003d memoized(func)\n\n    @functools.wraps(memoized_func)\n    def wrapper(request, *args, **kwargs):\n        client \u003d novaclient(request)\n        return memoized_func(client, *args, **kwargs)\n\n    return wrapper\n\nThen the following 2 functions (and all the similar cases below) could be collapsed into one:\n\n  @memoized_novaclient\n  def flavor_list(novaclient, is_public\u003dTrue, get_extras\u003dFalse):\n    flavors \u003d novaclient.flavors.list(is_public\u003dis_public)\n    if get_extras:\n        for flavor in flavors:\n            flavor.extras \u003d _flavor_get_extras(\n                novaclient, flavor.id, True, flavor)\n    return flavors\n\nThis approach could be generalized even more with @memoized_client({novaclient,cinderclient,keystoneclient})(func)","commit_id":"9be065e4031be123c801068baff83b7d73bdab02"},{"author":{"_account_id":12071,"name":"Richard Jones","email":"r1chardj0n3s@gmail.com","username":"richard"},"change_message_id":"5d4641d4b838e92f1b731841f09ca353ce2f654e","unresolved":false,"context_lines":[{"line_number":454,"context_line":"        return True"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"def get_auth_params_from_request(request):"},{"line_number":458,"context_line":"    return ("},{"line_number":459,"context_line":"        request.user.username,"},{"line_number":460,"context_line":"        request.user.token.id,"}],"source_content_type":"text/x-python","patch_set":23,"id":"9abb7d3a_90696dc1","line":457,"updated":"2016-05-30 06:24:27.000000000","message":"I suggest adding a comment or docstring here indicating what the purpose of this function is. Something like \"Extract the properties from the request object needed by the novaclient call below. These will be used to memoize the calls to novaclient().\"","commit_id":"70834be1f2a4141cdc556741bc2fa6ca3bb4f92f"},{"author":{"_account_id":20509,"name":"Daniel Castellanos","email":"luis.daniel.castellanos@intel.com","username":"lcastell"},"change_message_id":"b30f51a7fff3d27d4f3b949a9cfc2457b8a59892","unresolved":false,"context_lines":[{"line_number":454,"context_line":"        return True"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"def get_auth_params_from_request(request):"},{"line_number":458,"context_line":"    return ("},{"line_number":459,"context_line":"        request.user.username,"},{"line_number":460,"context_line":"        request.user.token.id,"}],"source_content_type":"text/x-python","patch_set":23,"id":"7aa08908_a0c9a527","line":457,"in_reply_to":"9abb7d3a_90696dc1","updated":"2016-06-10 18:28:31.000000000","message":"Done","commit_id":"70834be1f2a4141cdc556741bc2fa6ca3bb4f92f"}]}
