)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"b1860413b546514fc01a552b5a9deab42e662b6a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"[1]https://etherpad.openstack.org/p/icehouse-summit-qa-coverage-tooling"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"blueprint: list-tested-apis"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Id8ca66380f83478a335982dcf11ec9498cf223a4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAATn%2F%2FJPI%3D","line":17,"updated":"2013-11-13 21:01:42.000000000","message":"I couldn\u0027t find any BP by this name, let alone an approved one","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"848f9f9b1bb9df6779061c055a5edb259c745f10","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"[1]https://etherpad.openstack.org/p/icehouse-summit-qa-coverage-tooling"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"blueprint: list-tested-apis"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Id8ca66380f83478a335982dcf11ec9498cf223a4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAATn%2F%2B7bY%3D","line":17,"in_reply_to":"AAAATn%2F%2FJPI%3D","updated":"2013-11-18 13:59:32.000000000","message":"This BP:\nhttps://blueprints.launchpad.net/nova/+spec/list-tested-apis .\nHowever, this description is a little bit old. So I\u0027ll propose another one.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":15,"context_line":"TODO:"},{"line_number":16,"context_line":" * More cleanup"},{"line_number":17,"context_line":" * Add unit tests"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"[1]https://etherpad.openstack.org/p/icehouse-summit-qa-coverage-tooling"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint: list-tested-apis"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAATn%2F%2BDBc%3D","line":18,"updated":"2013-12-03 04:01:36.000000000","message":"DocImpact flag is needed.","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"f67f42c1c171199baf336a0133a380c6431da86c","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"[1] https://etherpad.openstack.org/p/icehouse-summit-qa-coverage-tooling"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"blueprint: list-tested-apis"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Id8ca66380f83478a335982dcf11ec9498cf223a4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAATn%2F8%2BCY%3D","line":17,"updated":"2013-12-18 10:01:38.000000000","message":"DocImpact tag is needed here.","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"47715749d03db1dc9f3ce2315fb46e2b3e3757f1","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"[1] https://etherpad.openstack.org/p/icehouse-summit-qa-coverage-tooling"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"blueprint: list-tested-apis"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Id8ca66380f83478a335982dcf11ec9498cf223a4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAATn%2F84tw%3D","line":17,"in_reply_to":"AAAATn%2F8%2BCY%3D","updated":"2013-12-19 06:56:04.000000000","message":"will fix","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"}],"etc/nova/api-paste.ini":[{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"95876ca0162b5c11dcd92ed1810ae16c58e10e92","unresolved":false,"context_lines":[{"line_number":74,"context_line":"use \u003d call:nova.api.auth:pipeline_factory"},{"line_number":75,"context_line":"noauth \u003d faultwrap sizelimit noauth_v3 ratelimit_v3 osapi_compute_app_v3"},{"line_number":76,"context_line":"keystone \u003d faultwrap sizelimit authtoken keystonecontext ratelimit_v3 osapi_compute_app_v3"},{"line_number":77,"context_line":"keystone_nolimit \u003d faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v3"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"[filter:faultwrap]"},{"line_number":80,"context_line":"paste.filter_factory \u003d nova.api.openstack:FaultWrapper.factory"}],"source_content_type":"text/x-properties","patch_set":6,"id":"AAAATn%2F%2FQvQ%3D","line":77,"updated":"2013-11-12 04:04:40.000000000","message":"I think you\u0027ll need a v3 version here","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"848f9f9b1bb9df6779061c055a5edb259c745f10","unresolved":false,"context_lines":[{"line_number":74,"context_line":"use \u003d call:nova.api.auth:pipeline_factory"},{"line_number":75,"context_line":"noauth \u003d faultwrap sizelimit noauth_v3 ratelimit_v3 osapi_compute_app_v3"},{"line_number":76,"context_line":"keystone \u003d faultwrap sizelimit authtoken keystonecontext ratelimit_v3 osapi_compute_app_v3"},{"line_number":77,"context_line":"keystone_nolimit \u003d faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v3"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"[filter:faultwrap]"},{"line_number":80,"context_line":"paste.filter_factory \u003d nova.api.openstack:FaultWrapper.factory"}],"source_content_type":"text/x-properties","patch_set":6,"id":"AAAATn%2F%2B7bE%3D","line":77,"in_reply_to":"AAAATn%2F%2FQvQ%3D","updated":"2013-11-18 13:59:32.000000000","message":"Sure. However, as Ken\u0027ichi said in apicoverage.py, I think this patch is the first step for V2. So I\u0027ll leave it for now.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"}],"nova/api/auth.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2fa48481f6ec4a0778a2dbfcf72b7caf5339af3d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                help\u003d\u0027whether to use per-user rate limiting for the api.\u0027),"},{"line_number":36,"context_line":"    cfg.BoolOpt(\u0027api_coverage\u0027,"},{"line_number":37,"context_line":"                default\u003dTrue,"},{"line_number":38,"context_line":"                help\u003d\u0027whether to enable API analysis\u0027),"},{"line_number":39,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027,"},{"line_number":40,"context_line":"               default\u003d\u0027noauth\u0027,"},{"line_number":41,"context_line":"               help\u003d\u0027The strategy to use for auth: noauth or keystone.\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FQ8s%3D","line":38,"updated":"2013-11-12 02:40:34.000000000","message":"This function is only for analysis, so I don\u0027t think this function is enable in default.","commit_id":"e57ef24c65bbbcffd4c233f4730ead8ee3dfae66"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"9b35f26a5f1f10c26f5e4834bd05471bb76ed07a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                help\u003d\u0027whether to use per-user rate limiting for the api.\u0027),"},{"line_number":36,"context_line":"    cfg.BoolOpt(\u0027api_coverage\u0027,"},{"line_number":37,"context_line":"                default\u003dTrue,"},{"line_number":38,"context_line":"                help\u003d\u0027whether to enable API analysis\u0027),"},{"line_number":39,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027,"},{"line_number":40,"context_line":"               default\u003d\u0027noauth\u0027,"},{"line_number":41,"context_line":"               help\u003d\u0027The strategy to use for auth: noauth or keystone.\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FQ7U%3D","line":38,"in_reply_to":"AAAATn%2F%2FQ8s%3D","updated":"2013-11-12 02:52:18.000000000","message":"Sure. You\u0027re right. I\u0027ll change to False by default.","commit_id":"e57ef24c65bbbcffd4c233f4730ead8ee3dfae66"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5524a08c4562bd7e51ece19b1ae088c737a861c5","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    pipeline_name \u003d CONF.auth_strategy"},{"line_number":58,"context_line":"    if not CONF.api_rate_limit:"},{"line_number":59,"context_line":"        pipeline_name \u003d pipeline_name + \u0027_nolimit\u0027"},{"line_number":60,"context_line":"    if CONF.api_coverage:"},{"line_number":61,"context_line":"        pipeline_name \u003d pipeline_name + \u0027_apicoverage\u0027"},{"line_number":62,"context_line":"    pipeline \u003d local_conf.get(pipeline_name, pipeline)"},{"line_number":63,"context_line":"    pipeline \u003d pipeline.split()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2BiE0%3D","line":60,"updated":"2013-11-25 02:49:39.000000000","message":"nit, this is only support when api_rate_limit\u003d\u003dfalse","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"1c10b9807b4b06cdd1f16fc71462f8b1f2625339","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    pipeline_name \u003d CONF.auth_strategy"},{"line_number":58,"context_line":"    if not CONF.api_rate_limit:"},{"line_number":59,"context_line":"        pipeline_name \u003d pipeline_name + \u0027_nolimit\u0027"},{"line_number":60,"context_line":"    if CONF.api_coverage:"},{"line_number":61,"context_line":"        pipeline_name \u003d pipeline_name + \u0027_apicoverage\u0027"},{"line_number":62,"context_line":"    pipeline \u003d local_conf.get(pipeline_name, pipeline)"},{"line_number":63,"context_line":"    pipeline \u003d pipeline.split()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2BNh0%3D","line":60,"in_reply_to":"AAAATn%2F%2BiE0%3D","updated":"2013-12-10 02:07:44.000000000","message":"I\u0027ll fix to support when api_rate_limit\u003d\u003dfalse only here.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"8f7b598d8927b4c48f77ffcbf72645f831073b3a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                      \u0027is removed from v3 api.\u0027)),"},{"line_number":36,"context_line":"    cfg.BoolOpt(\u0027api_coverage\u0027,"},{"line_number":37,"context_line":"                default\u003dFalse,"},{"line_number":38,"context_line":"                help\u003d\u0027Whether to enable API analysis.\u0027),"},{"line_number":39,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027,"},{"line_number":40,"context_line":"               default\u003d\u0027noauth\u0027,"},{"line_number":41,"context_line":"               help\u003d\u0027The strategy to use for auth: noauth or keystone.\u0027),"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAU3%2F%2FfGA%3D","line":38,"updated":"2014-02-26 10:53:06.000000000","message":"I\u0027m not really convinced we should be polluting nova.conf with config parameters that are only intended for our automated test harnesses.","commit_id":"974cd4337a2a6fdfe2ce091704ea76675aefe72f"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"b1c1cb8ebcab443adc4a97e3a1357fa0cadfb45e","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                      \u0027is removed from v3 api.\u0027)),"},{"line_number":36,"context_line":"    cfg.BoolOpt(\u0027api_coverage\u0027,"},{"line_number":37,"context_line":"                default\u003dFalse,"},{"line_number":38,"context_line":"                help\u003d\u0027Whether to enable API analysis.\u0027),"},{"line_number":39,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027,"},{"line_number":40,"context_line":"               default\u003d\u0027noauth\u0027,"},{"line_number":41,"context_line":"               help\u003d\u0027The strategy to use for auth: noauth or keystone.\u0027),"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F%2BOQ%3D","line":38,"in_reply_to":"AAAAU3%2F%2FfGA%3D","updated":"2014-02-27 03:37:13.000000000","message":"I think we should have the way of on/off switch for this function. Because if it\u0027s always enabled, performance degrade will occur.\nIs there any switch except nova.conf?","commit_id":"974cd4337a2a6fdfe2ce091704ea76675aefe72f"}],"nova/api/openstack/apicoverage.py":[{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"a60cdad7f83fc2adc73b05bbd4714812d75b491a","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#   under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import json"},{"line_number":19,"context_line":"from lxml import etree"},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":"import routes"},{"line_number":22,"context_line":"import tempfile"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FQnQ%3D","line":19,"updated":"2013-11-12 05:12:58.000000000","message":"the third party lib import should goes into it\u0027s own section. see http://docs.openstack.org/developer/hacking/#imports","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"848f9f9b1bb9df6779061c055a5edb259c745f10","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#   under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import json"},{"line_number":19,"context_line":"from lxml import etree"},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":"import routes"},{"line_number":22,"context_line":"import tempfile"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2B7ac%3D","line":19,"in_reply_to":"AAAATn%2F%2FQnQ%3D","updated":"2013-11-18 13:59:32.000000000","message":"Sure. I\u0027ll fix it.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"4c6b5ae1272724bd84bd9c7d153a9419e3bc74f1","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":"import routes"},{"line_number":22,"context_line":"import tempfile"},{"line_number":23,"context_line":"import webob.dec"},{"line_number":24,"context_line":"from webob import exc"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from nova.api import openstack as base_api"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2BjsA%3D","line":23,"updated":"2013-11-23 16:38:35.000000000","message":"webob is a third party import","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"95876ca0162b5c11dcd92ed1810ae16c58e10e92","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    # TODO(myamazaki) Controllers below have \u0027action\u0027 methods and"},{"line_number":43,"context_line":"    # each action API is branched from the methods."},{"line_number":44,"context_line":"    # The actions are hard-coded below because they are not implemented by"},{"line_number":45,"context_line":"    # thiers names nor registered to wsgi_action in Resource object but"},{"line_number":46,"context_line":"    # they should be removed."},{"line_number":47,"context_line":"    action_hard_coded \u003d {"},{"line_number":48,"context_line":"        \u0027nova.api.openstack.compute.contrib.coverage_ext.CoverageController\u0027: ["}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FQvo%3D","line":45,"updated":"2013-11-12 04:04:40.000000000","message":"\"thiers\" -\u003e \"their\"\n\nAlso maybe add that this happens because they are implmented using a generic action function which then manually interprets the body for the action to select.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"848f9f9b1bb9df6779061c055a5edb259c745f10","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    # TODO(myamazaki) Controllers below have \u0027action\u0027 methods and"},{"line_number":43,"context_line":"    # each action API is branched from the methods."},{"line_number":44,"context_line":"    # The actions are hard-coded below because they are not implemented by"},{"line_number":45,"context_line":"    # thiers names nor registered to wsgi_action in Resource object but"},{"line_number":46,"context_line":"    # they should be removed."},{"line_number":47,"context_line":"    action_hard_coded \u003d {"},{"line_number":48,"context_line":"        \u0027nova.api.openstack.compute.contrib.coverage_ext.CoverageController\u0027: ["}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2B7VY%3D","line":45,"in_reply_to":"AAAATn%2F%2FQvo%3D","updated":"2013-11-18 13:59:32.000000000","message":"Thanks. I\u0027ll fix a typo and consider more smart resolution such as Ken\u0027ichi\u0027s comment.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"95876ca0162b5c11dcd92ed1810ae16c58e10e92","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":60,"context_line":"        self.data_path \u003d tempfile.mkdtemp(prefix\u003d\u0027api-coverage_\u0027)"},{"line_number":61,"context_line":"        self.map \u003d base_api.compute.APIRouter().map"},{"line_number":62,"context_line":"        self._started \u003d False"},{"line_number":63,"context_line":"        self._coverage_apis \u003d []"},{"line_number":64,"context_line":"        super(APICoverageController, self).__init__(**kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FQvU%3D","line":61,"updated":"2013-11-12 04:04:40.000000000","message":"We need to handle both v2 and V3","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5524a08c4562bd7e51ece19b1ae088c737a861c5","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":60,"context_line":"        self.data_path \u003d tempfile.mkdtemp(prefix\u003d\u0027api-coverage_\u0027)"},{"line_number":61,"context_line":"        self.map \u003d base_api.compute.APIRouter().map"},{"line_number":62,"context_line":"        self._started \u003d False"},{"line_number":63,"context_line":"        self._coverage_apis \u003d []"},{"line_number":64,"context_line":"        super(APICoverageController, self).__init__(**kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bh%2Bs%3D","line":61,"updated":"2013-11-25 02:49:39.000000000","message":"We needn\u0027t create instance of APIRouter, we can get from middleware APICoverage. The parameter \u0027application\u0027 is the APIRouter we can get the mapping from it.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"1c10b9807b4b06cdd1f16fc71462f8b1f2625339","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":60,"context_line":"        self.data_path \u003d tempfile.mkdtemp(prefix\u003d\u0027api-coverage_\u0027)"},{"line_number":61,"context_line":"        self.map \u003d base_api.compute.APIRouter().map"},{"line_number":62,"context_line":"        self._started \u003d False"},{"line_number":63,"context_line":"        self._coverage_apis \u003d []"},{"line_number":64,"context_line":"        super(APICoverageController, self).__init__(**kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9xAU%3D","line":61,"in_reply_to":"AAAATn%2F%2Bh%2Bs%3D","updated":"2013-12-10 02:07:44.000000000","message":"@Alex: Thank you for your information. I\u0027ll try to get the mapping from the \u0027application\u0027.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"aea4cb892577903ca6472feb6493505e399a0198","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":60,"context_line":"        self.data_path \u003d tempfile.mkdtemp(prefix\u003d\u0027api-coverage_\u0027)"},{"line_number":61,"context_line":"        self.map \u003d base_api.compute.APIRouter().map"},{"line_number":62,"context_line":"        self._started \u003d False"},{"line_number":63,"context_line":"        self._coverage_apis \u003d []"},{"line_number":64,"context_line":"        super(APICoverageController, self).__init__(**kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FQlY%3D","line":61,"in_reply_to":"AAAATn%2F%2FQvU%3D","updated":"2013-11-12 05:35:06.000000000","message":"Hi Chris,\n\nYou are right, we need to implement this of V3 in the future.\nHowever I guess we will be able to implement this of V3 after moving v3 to Pecan, because Pecan has its specific API router.\n\nI think it is enough to implement this for V2 API as the first step for v2 coverage.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5524a08c4562bd7e51ece19b1ae088c737a861c5","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                    info \u003d dict(method\u003dmethod,"},{"line_number":120,"context_line":"                                path\u003droutepath,"},{"line_number":121,"context_line":"                                request_action\u003dNone)"},{"line_number":122,"context_line":"                    api_list.append(info)"},{"line_number":123,"context_line":"        return api_list"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _is_started_coverage(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bh6k%3D","line":122,"updated":"2013-11-25 02:49:39.000000000","message":"Can we use \"nova.api.openstack.wsgi.Resource.get_method\" to get \"request_action\"?","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"1c10b9807b4b06cdd1f16fc71462f8b1f2625339","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                    info \u003d dict(method\u003dmethod,"},{"line_number":120,"context_line":"                                path\u003droutepath,"},{"line_number":121,"context_line":"                                request_action\u003dNone)"},{"line_number":122,"context_line":"                    api_list.append(info)"},{"line_number":123,"context_line":"        return api_list"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _is_started_coverage(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9wPo%3D","line":122,"in_reply_to":"AAAATn%2F%2Bh6k%3D","updated":"2013-12-10 02:07:44.000000000","message":"I\u0027ve tried to use it. But I couldn\u0027t.\nI think map.matchlist is not suitable for the \"Resource.get_method\".","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"a60cdad7f83fc2adc73b05bbd4714812d75b491a","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        if \u0027file\u0027 in body.keys():"},{"line_number":144,"context_line":"            path \u003d body[\u0027file\u0027]"},{"line_number":145,"context_line":"            if path !\u003d os.path.basename(path):"},{"line_number":146,"context_line":"                msg \u003d _(\"Invalid path\")"},{"line_number":147,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":148,"context_line":"            path \u003d os.path.join(self.data_path, path)"},{"line_number":149,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FQnI%3D","line":146,"updated":"2013-11-12 05:12:58.000000000","message":"we\u0027d better to log path here for debugging purpose.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"848f9f9b1bb9df6779061c055a5edb259c745f10","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        if \u0027file\u0027 in body.keys():"},{"line_number":144,"context_line":"            path \u003d body[\u0027file\u0027]"},{"line_number":145,"context_line":"            if path !\u003d os.path.basename(path):"},{"line_number":146,"context_line":"                msg \u003d _(\"Invalid path\")"},{"line_number":147,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":148,"context_line":"            path \u003d os.path.join(self.data_path, path)"},{"line_number":149,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2B7Y8%3D","line":146,"in_reply_to":"AAAATn%2F%2FQnI%3D","updated":"2013-11-18 13:59:32.000000000","message":"Thanks. I\u0027ll add it.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"4c6b5ae1272724bd84bd9c7d153a9419e3bc74f1","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        result \u003d self.map.routematch(environ\u003dreq.environ)"},{"line_number":187,"context_line":"        if not result:"},{"line_number":188,"context_line":"            msg \u003d _(\"API NOT Found. %(method) %(path_url)\\n\")"},{"line_number":189,"context_line":"            LOG.debug(msg % {\"method\": req.method, \"path_url\": req.path_url})"},{"line_number":190,"context_line":"            return"},{"line_number":191,"context_line":"        route \u003d result[1]"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bjr8%3D","line":189,"updated":"2013-11-23 16:38:35.000000000","message":"can you use , instead of %","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"1c10b9807b4b06cdd1f16fc71462f8b1f2625339","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        result \u003d self.map.routematch(environ\u003dreq.environ)"},{"line_number":187,"context_line":"        if not result:"},{"line_number":188,"context_line":"            msg \u003d _(\"API NOT Found. %(method) %(path_url)\\n\")"},{"line_number":189,"context_line":"            LOG.debug(msg % {\"method\": req.method, \"path_url\": req.path_url})"},{"line_number":190,"context_line":"            return"},{"line_number":191,"context_line":"        route \u003d result[1]"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9www%3D","line":189,"in_reply_to":"AAAATn%2F%2Bjr8%3D","updated":"2013-12-10 02:07:44.000000000","message":"I\u0027ll fix it.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5524a08c4562bd7e51ece19b1ae088c737a861c5","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                request_action \u003d xml_body.tag.replace("},{"line_number":204,"context_line":"                    \"{%s}\" % wsgi.XMLNS_V11, \"\")"},{"line_number":205,"context_line":"            except etree.XMLSyntaxError:"},{"line_number":206,"context_line":"                request_action \u003d json.loads(req.body).keys()[0]"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        for api in self._coverage_apis:"},{"line_number":209,"context_line":"            if api[\u0027method\u0027] \u003d\u003d method and api[\u0027path\u0027] \u003d\u003d path\\"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bh8g%3D","line":206,"updated":"2013-11-25 02:49:39.000000000","message":"How about use nova.api.openstack.wsgi.action_peek_xml/action_peek_json?","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"1c10b9807b4b06cdd1f16fc71462f8b1f2625339","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                request_action \u003d xml_body.tag.replace("},{"line_number":204,"context_line":"                    \"{%s}\" % wsgi.XMLNS_V11, \"\")"},{"line_number":205,"context_line":"            except etree.XMLSyntaxError:"},{"line_number":206,"context_line":"                request_action \u003d json.loads(req.body).keys()[0]"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        for api in self._coverage_apis:"},{"line_number":209,"context_line":"            if api[\u0027method\u0027] \u003d\u003d method and api[\u0027path\u0027] \u003d\u003d path\\"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9wQY%3D","line":206,"in_reply_to":"AAAATn%2F%2Bh8g%3D","updated":"2013-12-10 02:07:44.000000000","message":"Sure. I\u0027ll try to replace it as you said.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5524a08c4562bd7e51ece19b1ae088c737a861c5","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        for api in self._coverage_apis:"},{"line_number":209,"context_line":"            if api[\u0027method\u0027] \u003d\u003d method and api[\u0027path\u0027] \u003d\u003d path\\"},{"line_number":210,"context_line":"               and api[\u0027request_action\u0027] \u003d\u003d request_action:"},{"line_number":211,"context_line":"                api[\u0027called\u0027] \u003d api[\u0027called\u0027] + 1"},{"line_number":212,"context_line":"                msg \u003d _(\"API Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":213,"context_line":"                LOG.debug(msg % {\"method\": method, \"path\": path,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bh%2BE%3D","line":210,"updated":"2013-11-25 02:49:39.000000000","message":"Maybe we can use \"(api[\u0027method\u0027], api[\u0027path], api[\u0027request_action])\" as the key, and make self._coverage_apis to be a dict. And we perfer use \u0027()\u0027, not \u0027\\\u0027 for splited the line.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"1c10b9807b4b06cdd1f16fc71462f8b1f2625339","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        for api in self._coverage_apis:"},{"line_number":209,"context_line":"            if api[\u0027method\u0027] \u003d\u003d method and api[\u0027path\u0027] \u003d\u003d path\\"},{"line_number":210,"context_line":"               and api[\u0027request_action\u0027] \u003d\u003d request_action:"},{"line_number":211,"context_line":"                api[\u0027called\u0027] \u003d api[\u0027called\u0027] + 1"},{"line_number":212,"context_line":"                msg \u003d _(\"API Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":213,"context_line":"                LOG.debug(msg % {\"method\": method, \"path\": path,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9wuw%3D","line":210,"in_reply_to":"AAAATn%2F%2Bh%2BE%3D","updated":"2013-12-10 02:07:44.000000000","message":"Sure. Maybe you\u0027re right. I\u0027ll try to change this as you said. And, I\u0027ll fix to use \u0027()\u0027.","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"4c6b5ae1272724bd84bd9c7d153a9419e3bc74f1","unresolved":false,"context_lines":[{"line_number":210,"context_line":"               and api[\u0027request_action\u0027] \u003d\u003d request_action:"},{"line_number":211,"context_line":"                api[\u0027called\u0027] \u003d api[\u0027called\u0027] + 1"},{"line_number":212,"context_line":"                msg \u003d _(\"API Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":213,"context_line":"                LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":214,"context_line":"                    \"request_action\": request_action})"},{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bjr4%3D","line":213,"updated":"2013-11-23 16:38:35.000000000","message":"ditto","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"1c10b9807b4b06cdd1f16fc71462f8b1f2625339","unresolved":false,"context_lines":[{"line_number":210,"context_line":"               and api[\u0027request_action\u0027] \u003d\u003d request_action:"},{"line_number":211,"context_line":"                api[\u0027called\u0027] \u003d api[\u0027called\u0027] + 1"},{"line_number":212,"context_line":"                msg \u003d _(\"API Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":213,"context_line":"                LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":214,"context_line":"                    \"request_action\": request_action})"},{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9k%2Bw%3D","line":213,"in_reply_to":"AAAATn%2F%2Bjr4%3D","updated":"2013-12-10 02:07:44.000000000","message":"Done","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"4c6b5ae1272724bd84bd9c7d153a9419e3bc74f1","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                    \"request_action\": request_action})"},{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":217,"context_line":"        LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":218,"context_line":"            \"request_action\": request_action})"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def action(self, req, body\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bjr0%3D","line":217,"updated":"2013-11-23 16:38:35.000000000","message":"ditto","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"1c10b9807b4b06cdd1f16fc71462f8b1f2625339","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                    \"request_action\": request_action})"},{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":217,"context_line":"        LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":218,"context_line":"            \"request_action\": request_action})"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def action(self, req, body\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9k98%3D","line":217,"in_reply_to":"AAAATn%2F%2Bjr0%3D","updated":"2013-12-10 02:07:44.000000000","message":"Done","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5524a08c4562bd7e51ece19b1ae088c737a861c5","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                \u0027report\u0027: self._report_coverage,"},{"line_number":224,"context_line":"                \u0027reset\u0027: self._reset_coverage,"},{"line_number":225,"context_line":"        }"},{"line_number":226,"context_line":"        for action, data in body.iteritems():"},{"line_number":227,"context_line":"            if action \u003d\u003d \u0027start\u0027 or action \u003d\u003d \u0027reset\u0027:"},{"line_number":228,"context_line":"                return _actions[action](req)"},{"line_number":229,"context_line":"            elif action \u003d\u003d \u0027report\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bh90%3D","line":226,"updated":"2013-11-25 02:49:39.000000000","message":"do we need ensure body is dict?","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"1c10b9807b4b06cdd1f16fc71462f8b1f2625339","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                \u0027report\u0027: self._report_coverage,"},{"line_number":224,"context_line":"                \u0027reset\u0027: self._reset_coverage,"},{"line_number":225,"context_line":"        }"},{"line_number":226,"context_line":"        for action, data in body.iteritems():"},{"line_number":227,"context_line":"            if action \u003d\u003d \u0027start\u0027 or action \u003d\u003d \u0027reset\u0027:"},{"line_number":228,"context_line":"                return _actions[action](req)"},{"line_number":229,"context_line":"            elif action \u003d\u003d \u0027report\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9k9w%3D","line":226,"in_reply_to":"AAAATn%2F%2Bh90%3D","updated":"2013-12-10 02:07:44.000000000","message":"Done","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5524a08c4562bd7e51ece19b1ae088c737a861c5","unresolved":false,"context_lines":[{"line_number":272,"context_line":"    def _dispatch(req):"},{"line_number":273,"context_line":"        match \u003d req.environ[\u0027wsgiorg.routing_args\u0027][1]"},{"line_number":274,"context_line":"        if not match:"},{"line_number":275,"context_line":"            return req.environ[\u0027extended.app\u0027]"},{"line_number":276,"context_line":"        app \u003d match[\u0027controller\u0027]"},{"line_number":277,"context_line":"        return app"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bh%2BA%3D","line":275,"updated":"2013-11-25 02:49:39.000000000","message":"Can we return self.application directly at here? Why use \u0027req.environ[\u0027extended.app\u0027]\u0027","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"1c10b9807b4b06cdd1f16fc71462f8b1f2625339","unresolved":false,"context_lines":[{"line_number":272,"context_line":"    def _dispatch(req):"},{"line_number":273,"context_line":"        match \u003d req.environ[\u0027wsgiorg.routing_args\u0027][1]"},{"line_number":274,"context_line":"        if not match:"},{"line_number":275,"context_line":"            return req.environ[\u0027extended.app\u0027]"},{"line_number":276,"context_line":"        app \u003d match[\u0027controller\u0027]"},{"line_number":277,"context_line":"        return app"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9wvM%3D","line":275,"in_reply_to":"AAAATn%2F%2Bh%2BA%3D","updated":"2013-12-10 02:07:44.000000000","message":"This _dispatch() is a static method. So I think we can\u0027t use \u0027self\u0027 here. Do I miss something?","commit_id":"041b92c59f7d326f1ddc5918afcf9b42f7348730"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import json"},{"line_number":19,"context_line":"from lxml import etree"},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":"import routes"},{"line_number":22,"context_line":"import tempfile"},{"line_number":23,"context_line":"import webob.dec"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BDA8%3D","line":20,"updated":"2013-12-03 04:01:36.000000000","message":"please comply with the best practice of the lib imports, json and os should goes into it\u0027s own section as the sys lib, see http://docs.openstack.org/developer/hacking/#imports","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import json"},{"line_number":19,"context_line":"from lxml import etree"},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":"import routes"},{"line_number":22,"context_line":"import tempfile"},{"line_number":23,"context_line":"import webob.dec"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9xBU%3D","line":20,"in_reply_to":"AAAATn%2F%2BDA8%3D","updated":"2013-12-10 02:09:24.000000000","message":"Thank you for your comment.\nDone.","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    # TODO(myamazaki) Controllers below have \u0027action\u0027 methods and"},{"line_number":43,"context_line":"    # each action API is branched from the methods."},{"line_number":44,"context_line":"    # The actions are hard-coded below because they are not implemented by"},{"line_number":45,"context_line":"    # thiers names nor registered to wsgi_action in Resource object but"},{"line_number":46,"context_line":"    # they should be removed."},{"line_number":47,"context_line":"    action_hard_coded \u003d {"},{"line_number":48,"context_line":"        \u0027nova.api.openstack.compute.contrib.coverage_ext.CoverageController\u0027: ["}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BDAw%3D","line":45,"updated":"2013-12-03 04:01:36.000000000","message":"type their","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    # TODO(myamazaki) Controllers below have \u0027action\u0027 methods and"},{"line_number":43,"context_line":"    # each action API is branched from the methods."},{"line_number":44,"context_line":"    # The actions are hard-coded below because they are not implemented by"},{"line_number":45,"context_line":"    # thiers names nor registered to wsgi_action in Resource object but"},{"line_number":46,"context_line":"    # they should be removed."},{"line_number":47,"context_line":"    action_hard_coded \u003d {"},{"line_number":48,"context_line":"        \u0027nova.api.openstack.compute.contrib.coverage_ext.CoverageController\u0027: ["}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9wRM%3D","line":45,"in_reply_to":"AAAATn%2F%2BDAw%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    # The actions are hard-coded below because they are not implemented by"},{"line_number":45,"context_line":"    # thiers names nor registered to wsgi_action in Resource object but"},{"line_number":46,"context_line":"    # they should be removed."},{"line_number":47,"context_line":"    action_hard_coded \u003d {"},{"line_number":48,"context_line":"        \u0027nova.api.openstack.compute.contrib.coverage_ext.CoverageController\u0027: ["},{"line_number":49,"context_line":"            \u0027start\u0027, \u0027stop\u0027, \u0027report\u0027"},{"line_number":50,"context_line":"        ],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BC%2B4%3D","line":47,"updated":"2013-12-03 04:01:36.000000000","message":"state the reason for hard_coded in comments is sufficient enough, so this name looks odd IMHO.","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    # The actions are hard-coded below because they are not implemented by"},{"line_number":45,"context_line":"    # thiers names nor registered to wsgi_action in Resource object but"},{"line_number":46,"context_line":"    # they should be removed."},{"line_number":47,"context_line":"    action_hard_coded \u003d {"},{"line_number":48,"context_line":"        \u0027nova.api.openstack.compute.contrib.coverage_ext.CoverageController\u0027: ["},{"line_number":49,"context_line":"            \u0027start\u0027, \u0027stop\u0027, \u0027report\u0027"},{"line_number":50,"context_line":"        ],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9wxQ%3D","line":47,"in_reply_to":"AAAATn%2F%2BC%2B4%3D","updated":"2013-12-10 02:09:24.000000000","message":"Hmm, if the name is changed to \u0027action\u0027, I think we will misunderstand it in the below code. So I\u0027ll leave it here.","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            routepath \u003d route.routepath"},{"line_number":87,"context_line":"            if \u0027.:(format)\u0027 in routepath:"},{"line_number":88,"context_line":"                continue"},{"line_number":89,"context_line":"            action \u003d route.defaults.get(\u0027action\u0027, None)"},{"line_number":90,"context_line":"            resource \u003d route.defaults.get(\u0027controller\u0027, None)"},{"line_number":91,"context_line":"            if isinstance(resource, wsgi.Resource):"},{"line_number":92,"context_line":"                controller \u003d resource.controller"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BDAc%3D","line":89,"updated":"2013-12-03 04:01:36.000000000","message":"nit: by default get method return None, we don\u0027t need explicitly define it.","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            routepath \u003d route.routepath"},{"line_number":87,"context_line":"            if \u0027.:(format)\u0027 in routepath:"},{"line_number":88,"context_line":"                continue"},{"line_number":89,"context_line":"            action \u003d route.defaults.get(\u0027action\u0027, None)"},{"line_number":90,"context_line":"            resource \u003d route.defaults.get(\u0027controller\u0027, None)"},{"line_number":91,"context_line":"            if isinstance(resource, wsgi.Resource):"},{"line_number":92,"context_line":"                controller \u003d resource.controller"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9lEM%3D","line":89,"in_reply_to":"AAAATn%2F%2BDAc%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            if \u0027.:(format)\u0027 in routepath:"},{"line_number":88,"context_line":"                continue"},{"line_number":89,"context_line":"            action \u003d route.defaults.get(\u0027action\u0027, None)"},{"line_number":90,"context_line":"            resource \u003d route.defaults.get(\u0027controller\u0027, None)"},{"line_number":91,"context_line":"            if isinstance(resource, wsgi.Resource):"},{"line_number":92,"context_line":"                controller \u003d resource.controller"},{"line_number":93,"context_line":"                wsgi_actions \u003d resource.wsgi_actions"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BDAQ%3D","line":90,"updated":"2013-12-03 04:01:36.000000000","message":"ditto","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            if \u0027.:(format)\u0027 in routepath:"},{"line_number":88,"context_line":"                continue"},{"line_number":89,"context_line":"            action \u003d route.defaults.get(\u0027action\u0027, None)"},{"line_number":90,"context_line":"            resource \u003d route.defaults.get(\u0027controller\u0027, None)"},{"line_number":91,"context_line":"            if isinstance(resource, wsgi.Resource):"},{"line_number":92,"context_line":"                controller \u003d resource.controller"},{"line_number":93,"context_line":"                wsgi_actions \u003d resource.wsgi_actions"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9lEI%3D","line":90,"in_reply_to":"AAAATn%2F%2BDAQ%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        if \u0027file\u0027 in body.keys():"},{"line_number":144,"context_line":"            path \u003d body[\u0027file\u0027]"},{"line_number":145,"context_line":"            if path !\u003d os.path.basename(path):"},{"line_number":146,"context_line":"                msg \u003d _(\"Invalid path\")"},{"line_number":147,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":148,"context_line":"            path \u003d os.path.join(self.data_path, path)"},{"line_number":149,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BC%2BU%3D","line":146,"updated":"2013-12-03 04:01:36.000000000","message":"log the path here will be helpful for debugging purpose.","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        if \u0027file\u0027 in body.keys():"},{"line_number":144,"context_line":"            path \u003d body[\u0027file\u0027]"},{"line_number":145,"context_line":"            if path !\u003d os.path.basename(path):"},{"line_number":146,"context_line":"                msg \u003d _(\"Invalid path\")"},{"line_number":147,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":148,"context_line":"            path \u003d os.path.join(self.data_path, path)"},{"line_number":149,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9lAQ%3D","line":146,"in_reply_to":"AAAATn%2F%2BC%2BU%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            if len(api[\u0027path\u0027]) \u003e max_path_len:"},{"line_number":159,"context_line":"                max_path_len \u003d len(api[\u0027path\u0027])"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        fout \u003d open(path, \"wb\")"},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            path_format \u003d \"{0:\u003c%s}\" % max_path_len"},{"line_number":164,"context_line":"            fout.write(\"Tested API: %d/%d\\n\" % (called_total,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BC9w%3D","line":161,"updated":"2013-12-03 04:01:36.000000000","message":"suggest to use with statement here","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            if len(api[\u0027path\u0027]) \u003e max_path_len:"},{"line_number":159,"context_line":"                max_path_len \u003d len(api[\u0027path\u0027])"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        fout \u003d open(path, \"wb\")"},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            path_format \u003d \"{0:\u003c%s}\" % max_path_len"},{"line_number":164,"context_line":"            fout.write(\"Tested API: %d/%d\\n\" % (called_total,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9k%2Fc%3D","line":161,"in_reply_to":"AAAATn%2F%2BC9w%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            path_format \u003d \"{0:\u003c%s}\" % max_path_len"},{"line_number":164,"context_line":"            fout.write(\"Tested API: %d/%d\\n\" % (called_total,"},{"line_number":165,"context_line":"                       len(self._coverage_apis)))"},{"line_number":166,"context_line":"            fout.write(\"Tested No  Method %s Action\\n\" %"},{"line_number":167,"context_line":"                       path_format.format(\"Path\"))"},{"line_number":168,"context_line":"            for api in self._coverage_apis:"},{"line_number":169,"context_line":"                index \u003d self._coverage_apis.index(api)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BC%2BE%3D","line":166,"updated":"2013-12-03 04:01:36.000000000","message":"nit: extra space between No and Nethod","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            path_format \u003d \"{0:\u003c%s}\" % max_path_len"},{"line_number":164,"context_line":"            fout.write(\"Tested API: %d/%d\\n\" % (called_total,"},{"line_number":165,"context_line":"                       len(self._coverage_apis)))"},{"line_number":166,"context_line":"            fout.write(\"Tested No  Method %s Action\\n\" %"},{"line_number":167,"context_line":"                       path_format.format(\"Path\"))"},{"line_number":168,"context_line":"            for api in self._coverage_apis:"},{"line_number":169,"context_line":"                index \u003d self._coverage_apis.index(api)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9k%2Fg%3D","line":166,"in_reply_to":"AAAATn%2F%2BC%2BE%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        \u0027\u0027\u0027each called apis are checked in this method.\u0027\u0027\u0027"},{"line_number":186,"context_line":"        result \u003d self.map.routematch(environ\u003dreq.environ)"},{"line_number":187,"context_line":"        if not result:"},{"line_number":188,"context_line":"            msg \u003d _(\"API NOT Found. %(method) %(path_url)\\n\")"},{"line_number":189,"context_line":"            LOG.debug(msg % {\"method\": req.method, \"path_url\": req.path_url})"},{"line_number":190,"context_line":"            return"},{"line_number":191,"context_line":"        route \u003d result[1]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BC9g%3D","line":188,"updated":"2013-12-03 04:01:36.000000000","message":"%(method)s and %(path_url)s","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        \u0027\u0027\u0027each called apis are checked in this method.\u0027\u0027\u0027"},{"line_number":186,"context_line":"        result \u003d self.map.routematch(environ\u003dreq.environ)"},{"line_number":187,"context_line":"        if not result:"},{"line_number":188,"context_line":"            msg \u003d _(\"API NOT Found. %(method) %(path_url)\\n\")"},{"line_number":189,"context_line":"            LOG.debug(msg % {\"method\": req.method, \"path_url\": req.path_url})"},{"line_number":190,"context_line":"            return"},{"line_number":191,"context_line":"        route \u003d result[1]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9k%2FU%3D","line":188,"in_reply_to":"AAAATn%2F%2BC9g%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        result \u003d self.map.routematch(environ\u003dreq.environ)"},{"line_number":187,"context_line":"        if not result:"},{"line_number":188,"context_line":"            msg \u003d _(\"API NOT Found. %(method) %(path_url)\\n\")"},{"line_number":189,"context_line":"            LOG.debug(msg % {\"method\": req.method, \"path_url\": req.path_url})"},{"line_number":190,"context_line":"            return"},{"line_number":191,"context_line":"        route \u003d result[1]"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BC9k%3D","line":189,"updated":"2013-12-03 04:01:36.000000000","message":"for multi variable format, we prefer , rather than %","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        result \u003d self.map.routematch(environ\u003dreq.environ)"},{"line_number":187,"context_line":"        if not result:"},{"line_number":188,"context_line":"            msg \u003d _(\"API NOT Found. %(method) %(path_url)\\n\")"},{"line_number":189,"context_line":"            LOG.debug(msg % {\"method\": req.method, \"path_url\": req.path_url})"},{"line_number":190,"context_line":"            return"},{"line_number":191,"context_line":"        route \u003d result[1]"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9k%2FQ%3D","line":189,"in_reply_to":"AAAATn%2F%2BC9k%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":210,"context_line":"               and api[\u0027request_action\u0027] \u003d\u003d request_action:"},{"line_number":211,"context_line":"                api[\u0027called\u0027] \u003d api[\u0027called\u0027] + 1"},{"line_number":212,"context_line":"                msg \u003d _(\"API Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":213,"context_line":"                LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":214,"context_line":"                    \"request_action\": request_action})"},{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BC9Y%3D","line":213,"updated":"2013-12-03 04:01:36.000000000","message":"ditto","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":210,"context_line":"               and api[\u0027request_action\u0027] \u003d\u003d request_action:"},{"line_number":211,"context_line":"                api[\u0027called\u0027] \u003d api[\u0027called\u0027] + 1"},{"line_number":212,"context_line":"                msg \u003d _(\"API Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":213,"context_line":"                LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":214,"context_line":"                    \"request_action\": request_action})"},{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9k%2Bo%3D","line":213,"in_reply_to":"AAAATn%2F%2BC9Y%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                api[\u0027called\u0027] \u003d api[\u0027called\u0027] + 1"},{"line_number":212,"context_line":"                msg \u003d _(\"API Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":213,"context_line":"                LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":214,"context_line":"                    \"request_action\": request_action})"},{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":217,"context_line":"        LOG.debug(msg % {\"method\": method, \"path\": path,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BC9I%3D","line":214,"updated":"2013-12-03 04:01:36.000000000","message":"allignment","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                api[\u0027called\u0027] \u003d api[\u0027called\u0027] + 1"},{"line_number":212,"context_line":"                msg \u003d _(\"API Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":213,"context_line":"                LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":214,"context_line":"                    \"request_action\": request_action})"},{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":217,"context_line":"        LOG.debug(msg % {\"method\": method, \"path\": path,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9k%2Bc%3D","line":214,"in_reply_to":"AAAATn%2F%2BC9I%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                    \"request_action\": request_action})"},{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":217,"context_line":"        LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":218,"context_line":"            \"request_action\": request_action})"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def action(self, req, body\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BC9Q%3D","line":217,"updated":"2013-12-03 04:01:36.000000000","message":"ditto","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                    \"request_action\": request_action})"},{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":217,"context_line":"        LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":218,"context_line":"            \"request_action\": request_action})"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def action(self, req, body\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9k%2BI%3D","line":217,"in_reply_to":"AAAATn%2F%2BC9Q%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"67f6f1d3e4019cc1ce80774b1f1c5c267e4e55df","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":217,"context_line":"        LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":218,"context_line":"            \"request_action\": request_action})"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def action(self, req, body\u003dNone):"},{"line_number":221,"context_line":"        _actions \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BC9M%3D","line":218,"updated":"2013-12-03 04:01:36.000000000","message":"allignment","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"59666a5deed0f5a31d824fb50e38b5b494477fd0","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                return"},{"line_number":216,"context_line":"        msg \u003d _(\"API NOT Found: %(method)s %(path)s %(request_action)s\\n\")"},{"line_number":217,"context_line":"        LOG.debug(msg % {\"method\": method, \"path\": path,"},{"line_number":218,"context_line":"            \"request_action\": request_action})"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def action(self, req, body\u003dNone):"},{"line_number":221,"context_line":"        _actions \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9k%2BM%3D","line":218,"in_reply_to":"AAAATn%2F%2BC9M%3D","updated":"2013-12-10 02:09:24.000000000","message":"Done","commit_id":"7191805e7c2396664ccf6a13586078262dd810d9"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"bb5d9e58487e3fa82df12b0768dfa85aac8afa74","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    # each action API is branched from the methods."},{"line_number":43,"context_line":"    # The actions are hard-coded below because they are not implemented by"},{"line_number":44,"context_line":"    # their names nor registered to wsgi_action in Resource object but"},{"line_number":45,"context_line":"    # they should be removed."},{"line_number":46,"context_line":"    action_hard_coded \u003d {"},{"line_number":47,"context_line":"        \u0027nova.api.openstack.compute.contrib.fixed_ips.FixedIPController\u0027: ["},{"line_number":48,"context_line":"            \u0027reserve\u0027, \u0027unreserve\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9FAQ%3D","line":45,"updated":"2013-12-17 02:41:54.000000000","message":"This is not TODO now, because this TODO has been solved with Nova v3 API and I guess this should be just NOTE for v2 API(their API have been implemented with @wsgi.action() decorator in v3 API.)\n\nand also better to change here to:\n\n Note: The following controllers have some action methods, and the\n routers of their action methods are implemented by themselves\n without @wsgi.action() decorator. Then, their methods are not\n registered to wsgi_action in Resource object and it is necessary\n to hard-code their method names here.","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"47715749d03db1dc9f3ce2315fb46e2b3e3757f1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    # each action API is branched from the methods."},{"line_number":43,"context_line":"    # The actions are hard-coded below because they are not implemented by"},{"line_number":44,"context_line":"    # their names nor registered to wsgi_action in Resource object but"},{"line_number":45,"context_line":"    # they should be removed."},{"line_number":46,"context_line":"    action_hard_coded \u003d {"},{"line_number":47,"context_line":"        \u0027nova.api.openstack.compute.contrib.fixed_ips.FixedIPController\u0027: ["},{"line_number":48,"context_line":"            \u0027reserve\u0027, \u0027unreserve\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F85e4%3D","line":45,"in_reply_to":"AAAATn%2F9FAQ%3D","updated":"2013-12-19 06:56:04.000000000","message":"Thank very much for your kindness!\nI\u0027ll use this.","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"bb5d9e58487e3fa82df12b0768dfa85aac8afa74","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self._coverage_apis \u003d {}"},{"line_number":60,"context_line":"        super(APICoverageController, self).__init__(**kwargs)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _controller(self, controller_obj):"},{"line_number":63,"context_line":"        \u0027\u0027\u0027Retrieve controller name.\u0027\u0027\u0027"},{"line_number":64,"context_line":"        controller \u003d controller_obj.__str__()"},{"line_number":65,"context_line":"        if controller.startswith(\"\u003cbound method\"):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9Eqg%3D","line":62,"updated":"2013-12-17 02:41:54.000000000","message":"better to rename _retrieve_controller_path() for showing its behavior clearly.","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"47715749d03db1dc9f3ce2315fb46e2b3e3757f1","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self._coverage_apis \u003d {}"},{"line_number":60,"context_line":"        super(APICoverageController, self).__init__(**kwargs)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _controller(self, controller_obj):"},{"line_number":63,"context_line":"        \u0027\u0027\u0027Retrieve controller name.\u0027\u0027\u0027"},{"line_number":64,"context_line":"        controller \u003d controller_obj.__str__()"},{"line_number":65,"context_line":"        if controller.startswith(\"\u003cbound method\"):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F85d8%3D","line":62,"in_reply_to":"AAAATn%2F9Eqg%3D","updated":"2013-12-19 06:56:04.000000000","message":"will fix","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"bb5d9e58487e3fa82df12b0768dfa85aac8afa74","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        super(APICoverageController, self).__init__(**kwargs)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _controller(self, controller_obj):"},{"line_number":63,"context_line":"        \u0027\u0027\u0027Retrieve controller name.\u0027\u0027\u0027"},{"line_number":64,"context_line":"        controller \u003d controller_obj.__str__()"},{"line_number":65,"context_line":"        if controller.startswith(\"\u003cbound method\"):"},{"line_number":66,"context_line":"            return controller.split(\" \")[4][1:]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9EqY%3D","line":63,"updated":"2013-12-17 02:41:54.000000000","message":"s/name/path/","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"47715749d03db1dc9f3ce2315fb46e2b3e3757f1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        super(APICoverageController, self).__init__(**kwargs)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _controller(self, controller_obj):"},{"line_number":63,"context_line":"        \u0027\u0027\u0027Retrieve controller name.\u0027\u0027\u0027"},{"line_number":64,"context_line":"        controller \u003d controller_obj.__str__()"},{"line_number":65,"context_line":"        if controller.startswith(\"\u003cbound method\"):"},{"line_number":66,"context_line":"            return controller.split(\" \")[4][1:]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F85do%3D","line":63,"in_reply_to":"AAAATn%2F9EqY%3D","updated":"2013-12-19 06:56:04.000000000","message":"will fix","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"bb5d9e58487e3fa82df12b0768dfa85aac8afa74","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _controller(self, controller_obj):"},{"line_number":63,"context_line":"        \u0027\u0027\u0027Retrieve controller name.\u0027\u0027\u0027"},{"line_number":64,"context_line":"        controller \u003d controller_obj.__str__()"},{"line_number":65,"context_line":"        if controller.startswith(\"\u003cbound method\"):"},{"line_number":66,"context_line":"            return controller.split(\" \")[4][1:]"},{"line_number":67,"context_line":"        elif controller.startswith(\"\u003c\"):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9EqU%3D","line":64,"updated":"2013-12-17 02:41:54.000000000","message":"better to rename \"controller\" to \"controller_name\" because the name \"controller\" seems an object.","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"47715749d03db1dc9f3ce2315fb46e2b3e3757f1","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _controller(self, controller_obj):"},{"line_number":63,"context_line":"        \u0027\u0027\u0027Retrieve controller name.\u0027\u0027\u0027"},{"line_number":64,"context_line":"        controller \u003d controller_obj.__str__()"},{"line_number":65,"context_line":"        if controller.startswith(\"\u003cbound method\"):"},{"line_number":66,"context_line":"            return controller.split(\" \")[4][1:]"},{"line_number":67,"context_line":"        elif controller.startswith(\"\u003c\"):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F85dc%3D","line":64,"in_reply_to":"AAAATn%2F9EqU%3D","updated":"2013-12-19 06:56:04.000000000","message":"will fix","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"f67f42c1c171199baf336a0133a380c6431da86c","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                else:"},{"line_number":104,"context_line":"                    # Api actions are registered in Resource object."},{"line_number":105,"context_line":"                    for wsgi_action in wsgi_actions:"},{"line_number":106,"context_line":"                        if wsgi_action in routes.mapper.COLLECTION_ACTIONS or\\"},{"line_number":107,"context_line":"                           wsgi_action in routes.mapper.MEMBER_ACTIONS:"},{"line_number":108,"context_line":"                            continue"},{"line_number":109,"context_line":"                        info \u003d dict(method\u003dmethod,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F897c%3D","line":106,"updated":"2013-12-18 10:01:38.000000000","message":"in if statement we could use parenthesis to avoid using \\","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"47715749d03db1dc9f3ce2315fb46e2b3e3757f1","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                else:"},{"line_number":104,"context_line":"                    # Api actions are registered in Resource object."},{"line_number":105,"context_line":"                    for wsgi_action in wsgi_actions:"},{"line_number":106,"context_line":"                        if wsgi_action in routes.mapper.COLLECTION_ACTIONS or\\"},{"line_number":107,"context_line":"                           wsgi_action in routes.mapper.MEMBER_ACTIONS:"},{"line_number":108,"context_line":"                            continue"},{"line_number":109,"context_line":"                        info \u003d dict(method\u003dmethod,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F85dE%3D","line":106,"in_reply_to":"AAAATn%2F897c%3D","updated":"2013-12-19 06:56:04.000000000","message":"will fix","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"bb5d9e58487e3fa82df12b0768dfa85aac8afa74","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    def _stop_coverage(self, req):"},{"line_number":129,"context_line":"        self._started \u003d False"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _report_coverage(self, req, body):"},{"line_number":132,"context_line":"        self._stop_coverage(req)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        body \u003d body[\u0027report\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9EpE%3D","line":131,"updated":"2013-12-17 02:41:54.000000000","message":"just one idea, here is not because of my -1.\n\nHow about reporting the coverage result with a response instead of storing to a file?\n\nIf doing it, we can get the coverage more easily.","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"47715749d03db1dc9f3ce2315fb46e2b3e3757f1","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    def _stop_coverage(self, req):"},{"line_number":129,"context_line":"        self._started \u003d False"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _report_coverage(self, req, body):"},{"line_number":132,"context_line":"        self._stop_coverage(req)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        body \u003d body[\u0027report\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F84q0%3D","line":131,"in_reply_to":"AAAATn%2F9EpE%3D","updated":"2013-12-19 06:56:04.000000000","message":"Sure. I agree with you.\nI\u0027ll change this to with a response as you said.","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"8f7b598d8927b4c48f77ffcbf72645f831073b3a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class APICoverageController(wsgi.Controller):"},{"line_number":37,"context_line":"    \u0027\u0027\u0027The API-Coverage report API controller for the OpenStack API.\u0027\u0027\u0027"},{"line_number":38,"context_line":"    # Note: The following controllers have some action methods, and the"},{"line_number":39,"context_line":"    # routers of their action methods are implemented by themselves"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAU3%2F%2FfFY%3D","line":36,"updated":"2014-02-26 10:53:06.000000000","message":"I\u0027m tend to expect this to be under the nova/tests/ directory somewhere since this is for test suite usage only IIUC.","commit_id":"974cd4337a2a6fdfe2ce091704ea76675aefe72f"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"b1c1cb8ebcab443adc4a97e3a1357fa0cadfb45e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class APICoverageController(wsgi.Controller):"},{"line_number":37,"context_line":"    \u0027\u0027\u0027The API-Coverage report API controller for the OpenStack API.\u0027\u0027\u0027"},{"line_number":38,"context_line":"    # Note: The following controllers have some action methods, and the"},{"line_number":39,"context_line":"    # routers of their action methods are implemented by themselves"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F%2BMU%3D","line":36,"in_reply_to":"AAAAU3%2F%2FfFY%3D","updated":"2014-02-27 03:37:13.000000000","message":"hmm, I think nova/tests directory is for *unit test* of Nova. But this APICoverageController is not for unit test but for verifying *Tempest test* API coverage mainly. So I\u0027m not sure it\u0027s good to move this to nova/tests.\nHow about tools/ or plugins/ if this shouldn\u0027t be in nova/api/openstack?","commit_id":"974cd4337a2a6fdfe2ce091704ea76675aefe72f"}],"nova/tests/api/openstack/test_apicoverage.py":[{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"f67f42c1c171199baf336a0133a380c6431da86c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from nova.tests.api.openstack import fakes"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class APICoverageControllerTest(test.TestCase):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def setUp(self):"},{"line_number":30,"context_line":"        super(APICoverageControllerTest, self).setUp()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F89%2FA%3D","line":27,"updated":"2013-12-18 10:01:38.000000000","message":"NoDBTestCase will get better performance for unittest running.","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"47715749d03db1dc9f3ce2315fb46e2b3e3757f1","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from nova.tests.api.openstack import fakes"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class APICoverageControllerTest(test.TestCase):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def setUp(self):"},{"line_number":30,"context_line":"        super(APICoverageControllerTest, self).setUp()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F84ts%3D","line":27,"in_reply_to":"AAAATn%2F89%2FA%3D","updated":"2013-12-19 06:56:04.000000000","message":"Thanks! will fix","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"f67f42c1c171199baf336a0133a380c6431da86c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                          body)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class APICoverageTest(test.TestCase):"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def setUp(self):"},{"line_number":66,"context_line":"        super(APICoverageTest, self).setUp()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F89%2B8%3D","line":63,"updated":"2013-12-18 10:01:38.000000000","message":"ditto","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"47715749d03db1dc9f3ce2315fb46e2b3e3757f1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                          body)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class APICoverageTest(test.TestCase):"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def setUp(self):"},{"line_number":66,"context_line":"        super(APICoverageTest, self).setUp()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F84to%3D","line":63,"in_reply_to":"AAAATn%2F89%2B8%3D","updated":"2013-12-19 06:56:04.000000000","message":"will fix","commit_id":"812e1513751d6fedfafa6f8102d693cb95e2bd5d"}]}
