)]}'
{"ironic_python_agent/agent.py":[{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"b5fe7e80167d85e62147d9b7876c51eefcab4029","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        self.log \u003d log.getLogger(__name__)"},{"line_number":123,"context_line":"        self.started_at \u003d None"},{"line_number":124,"context_line":"        self.node \u003d None"},{"line_number":125,"context_line":"        self.ext_mgr \u003d extension.ExtensionManager("},{"line_number":126,"context_line":"            namespace\u003d\u0027ironic_python_agent.extensions\u0027,"},{"line_number":127,"context_line":"            invoke_on_load\u003dTrue,"},{"line_number":128,"context_line":"            propagate_map_exceptions\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAW3%2F%2Fw1w%3D","line":125,"updated":"2014-04-10 14:57:04.000000000","message":"forgot to use get_extension_manager() method","commit_id":"0fd8cae08ac306c73e9b51b990fc332292946c01"}],"ironic_python_agent/agent_utils.py":[{"author":{"_account_id":10626,"name":"Russell Haering","email":"russellhaering@gmail.com","username":"russell_h"},"change_message_id":"83460f18aacf3fe47ca7de1641e5ef75401f7203","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                    raise errors.CommandExecutionError(\u0027agent is busy\u0027)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"            try:"},{"line_number":67,"context_line":"                ext \u003d self.ext_mgr[extension_part].obj"},{"line_number":68,"context_line":"                result \u003d ext.execute(command_part, **kwargs)"},{"line_number":69,"context_line":"            except KeyError:"},{"line_number":70,"context_line":"                # Extension Not found"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2F5nA%3D","line":67,"updated":"2014-04-09 15:58:03.000000000","message":"Need to initialize self.ext_mgr in the ExecuteCommandMixin constructor","commit_id":"c3d09581d0d0baeed93bec27a17703ee976da80c"},{"author":{"_account_id":10626,"name":"Russell Haering","email":"russellhaering@gmail.com","username":"russell_h"},"change_message_id":"83460f18aacf3fe47ca7de1641e5ef75401f7203","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                    raise errors.CommandExecutionError(\u0027agent is busy\u0027)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"            try:"},{"line_number":67,"context_line":"                ext \u003d self.ext_mgr[extension_part].obj"},{"line_number":68,"context_line":"                result \u003d ext.execute(command_part, **kwargs)"},{"line_number":69,"context_line":"            except KeyError:"},{"line_number":70,"context_line":"                # Extension Not found"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2F5lI%3D","line":67,"updated":"2014-04-09 15:59:04.000000000","message":"Need to initialize self.ext_mgr in the ExecuteCommandMixin constructor","commit_id":"baef65aa04281e6fba16103de764313bd24edc0c"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"e1216928f7e16360ef72669e9911f81c56bc0b7b","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                    raise errors.CommandExecutionError(\u0027agent is busy\u0027)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"            try:"},{"line_number":67,"context_line":"                ext \u003d self.ext_mgr[extension_part].obj"},{"line_number":68,"context_line":"                result \u003d ext.execute(command_part, **kwargs)"},{"line_number":69,"context_line":"            except KeyError:"},{"line_number":70,"context_line":"                # Extension Not found"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2F38c%3D","line":67,"in_reply_to":"AAAAW3%2F%2F4RI%3D","updated":"2014-04-09 18:52:23.000000000","message":"Or we can just have here something like that\n\next \u003d self.get_ext_mgr()\n\nand have an abstract method here in mixin\n\ndef get_ext_mgr(self):\n    raise NotImplemented()\n\nand two different implementations of this method in IronicPythonAgent and FlowExtension","commit_id":"baef65aa04281e6fba16103de764313bd24edc0c"},{"author":{"_account_id":10626,"name":"Russell Haering","email":"russellhaering@gmail.com","username":"russell_h"},"change_message_id":"a1b89f1a0d0e561aab06f0ff0c984f978a0744e7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                    raise errors.CommandExecutionError(\u0027agent is busy\u0027)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"            try:"},{"line_number":67,"context_line":"                ext \u003d self.ext_mgr[extension_part].obj"},{"line_number":68,"context_line":"                result \u003d ext.execute(command_part, **kwargs)"},{"line_number":69,"context_line":"            except KeyError:"},{"line_number":70,"context_line":"                # Extension Not found"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2F4RI%3D","line":67,"in_reply_to":"AAAAW3%2F%2F5U4%3D","updated":"2014-04-09 18:14:38.000000000","message":"Can we pass an ExtensionManager into the ExecuteCommandMixin constructor, so we can instantiate the correct one depending on the context?","commit_id":"baef65aa04281e6fba16103de764313bd24edc0c"},{"author":{"_account_id":8003,"name":"Aleksandr Gordeev","email":"agordeev@mirantis.com","username":"agordeev"},"change_message_id":"8061ae0c584d4094963d3e7262c92d48371e19d4","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                    raise errors.CommandExecutionError(\u0027agent is busy\u0027)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"            try:"},{"line_number":67,"context_line":"                ext \u003d self.ext_mgr[extension_part].obj"},{"line_number":68,"context_line":"                result \u003d ext.execute(command_part, **kwargs)"},{"line_number":69,"context_line":"            except KeyError:"},{"line_number":70,"context_line":"                # Extension Not found"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2FyCA%3D","line":67,"in_reply_to":"AAAAW3%2F%2F5lI%3D","updated":"2014-04-10 13:06:10.000000000","message":"Done","commit_id":"baef65aa04281e6fba16103de764313bd24edc0c"},{"author":{"_account_id":8003,"name":"Aleksandr Gordeev","email":"agordeev@mirantis.com","username":"agordeev"},"change_message_id":"dc0346ab03069cd7d2876242d914810ce371206e","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                    raise errors.CommandExecutionError(\u0027agent is busy\u0027)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"            try:"},{"line_number":67,"context_line":"                ext \u003d self.ext_mgr[extension_part].obj"},{"line_number":68,"context_line":"                result \u003d ext.execute(command_part, **kwargs)"},{"line_number":69,"context_line":"            except KeyError:"},{"line_number":70,"context_line":"                # Extension Not found"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2F5U4%3D","line":67,"in_reply_to":"AAAAW3%2F%2F5lI%3D","updated":"2014-04-09 16:23:23.000000000","message":"IronicPythonAgent and FlowExtension use different extension managers. That makes that common initialization very tricky","commit_id":"baef65aa04281e6fba16103de764313bd24edc0c"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"e221ad42bfd1cbcad5cf3cefa67d96544f858392","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self.ext_mgr \u003d self.get_extension_manager()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def get_extension_manager(self):"},{"line_number":55,"context_line":"        raise NotImplementedError()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def execute_command(self, command_name, **kwargs):"},{"line_number":58,"context_line":"        \"\"\"Execute an agent command.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAW3%2F%2Fw70%3D","line":55,"updated":"2014-04-10 14:46:21.000000000","message":"It is better to set explicit message NotImplementedError(\u0027Extension manager should be implemented in successor class\u0027)","commit_id":"0fd8cae08ac306c73e9b51b990fc332292946c01"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"71960d9d42284a05225ae2e0b9b9a518555efbb2","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def execute(*cmd, **kwargs):"},{"line_number":30,"context_line":"    \"\"\"Convenience wrapper around oslo\u0027s execute() method.\"\"\""},{"line_number":31,"context_line":"    result \u003d processutils.execute(*cmd, **kwargs)"},{"line_number":32,"context_line":"    LOG.debug(gtu._(\u0027Execution completed, command line is \"%s\"\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAW3%2F%2Fq9M%3D","line":29,"updated":"2014-04-11 09:09:50.000000000","message":"And this method is about utils not agent_utils.","commit_id":"ec42576f33dc6e3d1cd8de5692f705ec19e74b7e"},{"author":{"_account_id":3009,"name":"Vladimir Kozhukalov","email":"kozhukalov@gmail.com","username":"kozhukalov"},"change_message_id":"71960d9d42284a05225ae2e0b9b9a518555efbb2","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    return result"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def split_command(command_name):"},{"line_number":40,"context_line":"    command_parts \u003d command_name.split(\u0027.\u0027, 1)"},{"line_number":41,"context_line":"    if len(command_parts) !\u003d 2:"},{"line_number":42,"context_line":"        raise errors.InvalidCommandError("}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAW3%2F%2Fq%2BA%3D","line":39,"updated":"2014-04-11 09:09:50.000000000","message":"Don\u0027t see any reasons why we need this method outside of ExecuteCommandMixin. It is too specific. I believe the problem of circular imports does not appear at all if this method is a part of ExecuteCommandMixin and ExecuteCommandMixin is placed in agent_utils. And frankly, I don\u0027t see a reason of having this file agent_utils.py. Why can not we just place ExecuteCommandMixin in ironic_python_agent/base.py?","commit_id":"ec42576f33dc6e3d1cd8de5692f705ec19e74b7e"}],"ironic_python_agent/base.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"d0842ce7f51b3caad422f770d5289223be334cdd","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                and cmd in ext_obj.command_map):"},{"line_number":144,"context_line":"            raise errors.InvalidCommandParamsError("},{"line_number":145,"context_line":"                \"Extension {0} doesn\u0027t provide {1} method\"."},{"line_number":146,"context_line":"                    format(ext, cmd))"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class ExecuteCommandMixin(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2Fnp8%3D","line":146,"updated":"2014-04-11 17:13:55.000000000","message":"nit: indentation appears off here","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"},{"author":{"_account_id":8003,"name":"Aleksandr Gordeev","email":"agordeev@mirantis.com","username":"agordeev"},"change_message_id":"4af8c8fef0abab90df7ffa3bc794c8a04b986898","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                and cmd in ext_obj.command_map):"},{"line_number":144,"context_line":"            raise errors.InvalidCommandParamsError("},{"line_number":145,"context_line":"                \"Extension {0} doesn\u0027t provide {1} method\"."},{"line_number":146,"context_line":"                    format(ext, cmd))"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class ExecuteCommandMixin(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FeGM%3D","line":146,"in_reply_to":"AAAAW3%2F%2Fnp8%3D","updated":"2014-04-14 12:05:53.000000000","message":"Done","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"d0842ce7f51b3caad422f770d5289223be334cdd","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def get_extension_manager(self):"},{"line_number":156,"context_line":"        raise NotImplementedError(\u0027get_extension_manager should be implemented\u0027"},{"line_number":157,"context_line":"                                  \u0027 in successor class\u0027)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def split_command(self, command_name):"},{"line_number":160,"context_line":"        command_parts \u003d command_name.split(\u0027.\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FnqE%3D","line":157,"updated":"2014-04-11 17:13:55.000000000","message":"nit: indentation is off here","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"},{"author":{"_account_id":8003,"name":"Aleksandr Gordeev","email":"agordeev@mirantis.com","username":"agordeev"},"change_message_id":"4af8c8fef0abab90df7ffa3bc794c8a04b986898","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def get_extension_manager(self):"},{"line_number":156,"context_line":"        raise NotImplementedError(\u0027get_extension_manager should be implemented\u0027"},{"line_number":157,"context_line":"                                  \u0027 in successor class\u0027)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def split_command(self, command_name):"},{"line_number":160,"context_line":"        command_parts \u003d command_name.split(\u0027.\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FeGk%3D","line":157,"in_reply_to":"AAAAW3%2F%2FnqE%3D","updated":"2014-04-14 12:05:53.000000000","message":"Done","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"d0842ce7f51b3caad422f770d5289223be334cdd","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                # Other errors are considered command execution errors, and are"},{"line_number":190,"context_line":"                # recorded as an"},{"line_number":191,"context_line":"                result \u003d SyncCommandResult(command_name, kwargs, False,"},{"line_number":192,"context_line":"                                           six.text_type(e))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"            self.command_results[result.id] \u003d result"},{"line_number":195,"context_line":"            return result"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2Fnoo%3D","line":192,"updated":"2014-04-11 17:13:55.000000000","message":"nit: indentation is off here","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"},{"author":{"_account_id":8003,"name":"Aleksandr Gordeev","email":"agordeev@mirantis.com","username":"agordeev"},"change_message_id":"4af8c8fef0abab90df7ffa3bc794c8a04b986898","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                # Other errors are considered command execution errors, and are"},{"line_number":190,"context_line":"                # recorded as an"},{"line_number":191,"context_line":"                result \u003d SyncCommandResult(command_name, kwargs, False,"},{"line_number":192,"context_line":"                                           six.text_type(e))"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"            self.command_results[result.id] \u003d result"},{"line_number":195,"context_line":"            return result"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FeGc%3D","line":192,"in_reply_to":"AAAAW3%2F%2Fnoo%3D","updated":"2014-04-14 12:05:53.000000000","message":"Done","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"}],"ironic_python_agent/tests/base.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"d0842ce7f51b3caad422f770d5289223be334cdd","unresolved":false,"context_lines":[{"line_number":23,"context_line":"if six.PY2:"},{"line_number":24,"context_line":"    OPEN_FUNCTION_NAME \u003d \u0027__builtin__.open\u0027"},{"line_number":25,"context_line":"else:"},{"line_number":26,"context_line":"    OPEN_FUNCTION_NAME \u003d \u0027builtins.open\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class FakeExtension(base.BaseAgentExtension):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2Fnpc%3D","line":26,"updated":"2014-04-11 17:13:55.000000000","message":"These constants are unused in this test.","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"},{"author":{"_account_id":8003,"name":"Aleksandr Gordeev","email":"agordeev@mirantis.com","username":"agordeev"},"change_message_id":"4af8c8fef0abab90df7ffa3bc794c8a04b986898","unresolved":false,"context_lines":[{"line_number":23,"context_line":"if six.PY2:"},{"line_number":24,"context_line":"    OPEN_FUNCTION_NAME \u003d \u0027__builtin__.open\u0027"},{"line_number":25,"context_line":"else:"},{"line_number":26,"context_line":"    OPEN_FUNCTION_NAME \u003d \u0027builtins.open\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class FakeExtension(base.BaseAgentExtension):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FeIg%3D","line":26,"in_reply_to":"AAAAW3%2F%2Fnpc%3D","updated":"2014-04-14 12:05:53.000000000","message":"Done","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"d0842ce7f51b3caad422f770d5289223be334cdd","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.agent.ext_mgr \u003d extension.ExtensionManager.\\"},{"line_number":54,"context_line":"            make_test_instance([extension.Extension(\u0027fake\u0027, None,"},{"line_number":55,"context_line":"                                                    FakeExtension,"},{"line_number":56,"context_line":"                                                    fake_extension)])"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.agent.execute_command(\u0027fake.do_something\u0027, foo\u003d\u0027bar\u0027)"},{"line_number":59,"context_line":"        do_something_impl.assert_called_once_with(\u0027do_something\u0027, foo\u003d\u0027bar\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FnpE%3D","line":56,"updated":"2014-04-11 17:13:55.000000000","message":"nit: indentation appears off here","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"},{"author":{"_account_id":8003,"name":"Aleksandr Gordeev","email":"agordeev@mirantis.com","username":"agordeev"},"change_message_id":"4af8c8fef0abab90df7ffa3bc794c8a04b986898","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.agent.ext_mgr \u003d extension.ExtensionManager.\\"},{"line_number":54,"context_line":"            make_test_instance([extension.Extension(\u0027fake\u0027, None,"},{"line_number":55,"context_line":"                                                    FakeExtension,"},{"line_number":56,"context_line":"                                                    fake_extension)])"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.agent.execute_command(\u0027fake.do_something\u0027, foo\u003d\u0027bar\u0027)"},{"line_number":59,"context_line":"        do_something_impl.assert_called_once_with(\u0027do_something\u0027, foo\u003d\u0027bar\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FeIc%3D","line":56,"in_reply_to":"AAAAW3%2F%2FnpE%3D","updated":"2014-04-14 12:05:53.000000000","message":"Done","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"d0842ce7f51b3caad422f770d5289223be334cdd","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        fake_ext.execute \u003d mock.Mock()"},{"line_number":77,"context_line":"        fake_ext.execute.return_value \u003d expected_result"},{"line_number":78,"context_line":"        result \u003d self.agent.execute_command(\u0027fake.sleep\u0027,"},{"line_number":79,"context_line":"                                                      sleep_info\u003d{\"time\": 1})"},{"line_number":80,"context_line":"        self.assertEqual(expected_result, result)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def test_execute_command_invalid_content(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FnpA%3D","line":79,"updated":"2014-04-11 17:13:55.000000000","message":"nit: indentation is off here","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"},{"author":{"_account_id":8003,"name":"Aleksandr Gordeev","email":"agordeev@mirantis.com","username":"agordeev"},"change_message_id":"4af8c8fef0abab90df7ffa3bc794c8a04b986898","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        fake_ext.execute \u003d mock.Mock()"},{"line_number":77,"context_line":"        fake_ext.execute.return_value \u003d expected_result"},{"line_number":78,"context_line":"        result \u003d self.agent.execute_command(\u0027fake.sleep\u0027,"},{"line_number":79,"context_line":"                                                      sleep_info\u003d{\"time\": 1})"},{"line_number":80,"context_line":"        self.assertEqual(expected_result, result)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def test_execute_command_invalid_content(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FeIY%3D","line":79,"in_reply_to":"AAAAW3%2F%2FnpA%3D","updated":"2014-04-14 12:05:53.000000000","message":"Done","commit_id":"8f13abb90d0793b15bbf2218374cee0a91c01cd5"}]}
