)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"6fc18fc5b29f031448c515573b7e8d1f4aff00a4","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"It is very useful for new projects, who can just place"},{"line_number":13,"context_line":"needed files into appropriate dirs without changing"},{"line_number":14,"context_line":"tempest core files, to run tests againt new project."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Also, existing files can be separated to different"},{"line_number":17,"context_line":"files, as it done in this patch."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAUH%2F%2B4LU%3D","line":14,"updated":"2014-01-21 07:00:53.000000000","message":"s/againt/against","commit_id":"ebaada6521cf45410213e195b505755615c71637"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"d14904a4282db28f93b1075ef443fb2478ec86a0","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"It is very useful for new projects, who can just place"},{"line_number":13,"context_line":"needed files into appropriate dirs without changing"},{"line_number":14,"context_line":"tempest core files, to run tests againt new project."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Also, existing files can be separated to different"},{"line_number":17,"context_line":"files, as it done in this patch."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAUH%2F%2B3T4%3D","line":14,"in_reply_to":"AAAAUH%2F%2B4LU%3D","updated":"2014-01-21 10:18:01.000000000","message":"Done","commit_id":"ebaada6521cf45410213e195b505755615c71637"}],"tempest/api/ext_example/__init__.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Mirantis Inc."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tS0%3D","line":1,"updated":"2013-12-22 08:22:37.000000000","message":"Please be empty this file.\nWe don\u0027t need to have vim-setting, license header for an empty file.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Mirantis Inc."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rm8%3D","line":1,"in_reply_to":"AAAATn%2F8tS0%3D","updated":"2013-12-23 11:51:09.000000000","message":"Done","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}],"tempest/api/ext_example/test_ext.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest import clients"},{"line_number":19,"context_line":"from tempest import exceptions"},{"line_number":20,"context_line":"from tempest.test import attr"},{"line_number":21,"context_line":"from tempest.test import BaseTestCase"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tOM%3D","line":20,"updated":"2013-12-22 08:22:37.000000000","message":"Hacking says import only modules. So I think this line should be \u0027from tempest import test\u0027.\nhttp://docs.openstack.org/developer/hacking/\nWe have many violations now. But I think we should be valid in a new file/module at least.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest import clients"},{"line_number":19,"context_line":"from tempest import exceptions"},{"line_number":20,"context_line":"from tempest.test import attr"},{"line_number":21,"context_line":"from tempest.test import BaseTestCase"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rnI%3D","line":20,"in_reply_to":"AAAATn%2F8tOM%3D","updated":"2013-12-23 11:51:09.000000000","message":"Done","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from tempest import clients"},{"line_number":19,"context_line":"from tempest import exceptions"},{"line_number":20,"context_line":"from tempest.test import attr"},{"line_number":21,"context_line":"from tempest.test import BaseTestCase"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class ExtTestJSON(BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tN8%3D","line":21,"updated":"2013-12-22 08:22:37.000000000","message":"diito","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from tempest import clients"},{"line_number":19,"context_line":"from tempest import exceptions"},{"line_number":20,"context_line":"from tempest.test import attr"},{"line_number":21,"context_line":"from tempest.test import BaseTestCase"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class ExtTestJSON(BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rnE%3D","line":21,"in_reply_to":"AAAATn%2F8tN8%3D","updated":"2013-12-23 11:51:09.000000000","message":"Done","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}],"tempest/clients.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                    ):"},{"line_number":359,"context_line":"                    setattr(self, name, obj[interface](*client_args))"},{"line_number":360,"context_line":"        del interfaces"},{"line_number":361,"context_line":"        del ext_clients"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"class AltManager(Manager):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tPk%3D","line":361,"updated":"2013-12-22 08:22:37.000000000","message":"Why do we need to del these variables?","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                    ):"},{"line_number":359,"context_line":"                    setattr(self, name, obj[interface](*client_args))"},{"line_number":360,"context_line":"        del interfaces"},{"line_number":361,"context_line":"        del ext_clients"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"class AltManager(Manager):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rd4%3D","line":361,"in_reply_to":"AAAATn%2F8tPk%3D","updated":"2013-12-23 11:51:09.000000000","message":"Because these entities are needed only in previous cycle.\n\nYes, \u0027interfaces\u0027 is little and static, but \u0027ext_clients\u0027 can be very big.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}],"tempest/clients/server_client.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"6fc18fc5b29f031448c515573b7e8d1f4aff00a4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from tempest.services.compute.json import servers_client as scjson"},{"line_number":2,"context_line":"from tempest.services.compute.xml import servers_client as scxml"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"servers_client \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2B4V8%3D","line":1,"updated":"2014-01-21 07:00:53.000000000","message":"I think this source file can have a apache2 license header because this is an original code of OpenStack. Pep8(hacking) skips this because of \u003c 10 lines, though.","commit_id":"ebaada6521cf45410213e195b505755615c71637"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"d14904a4282db28f93b1075ef443fb2478ec86a0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from tempest.services.compute.json import servers_client as scjson"},{"line_number":2,"context_line":"from tempest.services.compute.xml import servers_client as scxml"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"servers_client \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2B3UY%3D","line":1,"in_reply_to":"AAAAUH%2F%2B4V8%3D","updated":"2014-01-21 10:18:01.000000000","message":"Done","commit_id":"ebaada6521cf45410213e195b505755615c71637"}],"tempest/clients/server_v3_client.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"6fc18fc5b29f031448c515573b7e8d1f4aff00a4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from tempest.services.compute.v3.json import servers_client as scjson"},{"line_number":2,"context_line":"from tempest.services.compute.v3.xml import servers_client as scxml"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"servers_v3_client \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2B4WM%3D","line":1,"updated":"2014-01-21 07:00:53.000000000","message":"ditto server_client.py","commit_id":"ebaada6521cf45410213e195b505755615c71637"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"d14904a4282db28f93b1075ef443fb2478ec86a0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from tempest.services.compute.v3.json import servers_client as scjson"},{"line_number":2,"context_line":"from tempest.services.compute.v3.xml import servers_client as scxml"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"servers_v3_client \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2B3UQ%3D","line":1,"in_reply_to":"AAAAUH%2F%2B4WM%3D","updated":"2014-01-21 10:18:01.000000000","message":"Done","commit_id":"ebaada6521cf45410213e195b505755615c71637"}],"tempest/common/utils/module_utils.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"cb813e840770fb3ea8350adf7d162fb3841e6d70","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def import_submodules(parent_module, exclude_submodules\u003d\"\"):"},{"line_number":20,"context_line":"    \"\"\""},{"line_number":21,"context_line":"    This method imports level 1 submodules, that branched"},{"line_number":22,"context_line":"    from \u0027parent_module\u0027, into your globals()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2BENA%3D","line":19,"updated":"2014-01-30 14:49:27.000000000","message":"I\u0027m worried about this function. I think this function import modules into the caller. So users can\u0027t import a module, what they just see. Is this behavior a normal thing in python? My concern is that users may be confused \u0027where are the exceptions?\u0027 \nFor example, in this patch, the user can use NotFound exception with \u0027tempest.exceptions.NotFound\u0027. But tempest.exceptions module doesn\u0027t have NotFound class directly.\n\nAnd can\u0027t we use them directly like this?\n from tempest.exceptions import http_exceptions\n ###\n ###\n raise http_exceptions.NotFound()\n\nDo I misunderstand this function?","commit_id":"a2bb27eacc2b9f37b538052d65456720caf67fb7"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"e1368b35fbc0c1185205edfd667d7b2a270b83c7","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def import_submodules(parent_module, exclude_submodules\u003d\"\"):"},{"line_number":20,"context_line":"    \"\"\""},{"line_number":21,"context_line":"    This method imports level 1 submodules, that branched"},{"line_number":22,"context_line":"    from \u0027parent_module\u0027, into your globals()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9%2FxY%3D","line":19,"in_reply_to":"AAAAUH%2F%2BAhY%3D","updated":"2014-01-31 07:27:39.000000000","message":"Current exceptions module contains everything related to exceptions - base classes, exceptions used all over the tempest.\nIf new project needs to use its own exception, it should modify this single module, to add into not sorted exceptions mess its own classes.\n\nPluggability allows us to add new files, without messing.\n\nIn situation with new files, it definitely will inherit some of base classes. Having base classes and all other exceptions in one module disallows us to import main exceptions module for pluggable submodules (cross-import).\n\nSo, first point - base classes should be removed to submodule, to be able import it for potential pluggable submodules. \n\nSeparation of http exceptions to new submodule is example, how works pluggability, without breaking currently existing tests.\n\nI do not propose to use both possible variants of call. We use it as it was, only \u0027tempest.exceptions\u0027 module, and have separated submodules for base classes, project classes and common exceptions classes.\n\nSo, if we do not use this function to import submodules, do not used submodules at all, we have no pluggability and this patch makes no sense. \n\nNew projects should still modify this one module, which is everything-in-one. So if we do pluggability, we should do it for everything, that will be used with new project.","commit_id":"a2bb27eacc2b9f37b538052d65456720caf67fb7"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"cc0c8b284daaa6fa6dcaedddc817a75d240b719b","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def import_submodules(parent_module, exclude_submodules\u003d\"\"):"},{"line_number":20,"context_line":"    \"\"\""},{"line_number":21,"context_line":"    This method imports level 1 submodules, that branched"},{"line_number":22,"context_line":"    from \u0027parent_module\u0027, into your globals()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2BAhY%3D","line":19,"in_reply_to":"AAAAUH%2F%2BEF0%3D","updated":"2014-01-31 01:47:22.000000000","message":"Thank you for your reply. There is a little python magic in this patch and I\u0027m worried about that we can use exceptions by 2 ways with this patch (\u0027http_exceptions.NotFound()\u0027 and \u0027exceptions.NotFound()\u0027). I think this confuses developers.\n\nSo my suggestion is\n 1. Just move exceptions.py to exceptions/__init__.py\n 2. Do not split current exceptions(do not create http_exceptions.py)\n\nThis import_submodules() is useful for clients in your another patch. But it\u0027s unnecessary for exceptions, IMO.","commit_id":"a2bb27eacc2b9f37b538052d65456720caf67fb7"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"0ef5ed10bd0d88d35db80a3591e133fabe6bb511","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def import_submodules(parent_module, exclude_submodules\u003d\"\"):"},{"line_number":20,"context_line":"    \"\"\""},{"line_number":21,"context_line":"    This method imports level 1 submodules, that branched"},{"line_number":22,"context_line":"    from \u0027parent_module\u0027, into your globals()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2BEF0%3D","line":19,"in_reply_to":"AAAAUH%2F%2BENA%3D","updated":"2014-01-30 16:11:19.000000000","message":"This function has been moved to separate module, because it can be used by any another module (clients, config, ...).\n\nOne of the main features of Python is dynamic handling of objects.\n\nSo, tempest.exceptions module will have NotFound class directly in its globals, in runtime.\n\nIf you use call \"http_exceptions.NotFound()\" it won\u0027t be the same as call of \u0027exceptions.NotFound()\u0027, and all currently existing \u0027assertRaises\u0027 will fail.\n\nSo, with current structure, it doesn\u0027t break work of all currently existing tests, and makes pluggability. \n\nWith your example, all submodules will be imported with explicitly set names, but pluggability assumes mechanism without knowing module names...\n\nHope, I answered your question.","commit_id":"a2bb27eacc2b9f37b538052d65456720caf67fb7"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"934a44d79486331c56c13e402ed988fdef5103c3","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def import_submodules(parent_module, exclude_submodules\u003d\"\"):"},{"line_number":20,"context_line":"    \"\"\""},{"line_number":21,"context_line":"    This method imports level 1 submodules, that branched"},{"line_number":22,"context_line":"    from \u0027parent_module\u0027, into your globals()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F97Oo%3D","line":19,"in_reply_to":"AAAAUH%2F9%2FxY%3D","updated":"2014-02-01 01:47:59.000000000","message":"I agree with your direction. And I think separating the exceptions is good as refactoring/cleaning up.\nBut I disagree with using import_submodules() for exceptions.\n\nMy another concern is namespace conflict.\nIf an project-A developer and a project-B developer want to create a same naming exception (e.g. InvalidID) at the same time, the namespace conflict can occur easily.\nDo I misunderstand or overthink?\n\nIIUC, can we use modules directly without using this import_submodule()? That is:\n 1. Just move exceptions.py to tempest/exceptions/__init__.py\n 2.  New project developers will create an exception module (ex. tempest/exceptions/project_a_exc.py). And use it like this\n  from tempest.exceptions import project_a_exc\n  :\n  raise project_a_exc.NotFound()\nThis has enough pluggability for me.\nOf course, we should have a README document for new projects.","commit_id":"a2bb27eacc2b9f37b538052d65456720caf67fb7"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"412fc5996de54ad250bb35a0d6eb9bd7e6aa45d0","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def import_submodules(parent_module, exclude_submodules\u003d\"\"):"},{"line_number":20,"context_line":"    \"\"\""},{"line_number":21,"context_line":"    This method imports level 1 submodules, that branched"},{"line_number":22,"context_line":"    from \u0027parent_module\u0027, into your globals()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F96mg%3D","line":19,"in_reply_to":"AAAAUH%2F97Oo%3D","updated":"2014-02-01 08:53:27.000000000","message":"If collision/conflict exists, exception will be raised. So, any developer gets know about problem immediately (with autoimport).\n\nIf separation for sublodules is used without autoimport, possibility to use samenamed classes in different submodules appears, but there is no possibility to use several samenamed exceptions with current design and won\u0027t be with patch.\n\nIt should be decided, do we allow having samenamed exception classes in different submodules or not? And why? This patch doesn\u0027t change that logic, it remains it as disallowed.","commit_id":"a2bb27eacc2b9f37b538052d65456720caf67fb7"}],"tempest/exceptions.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":196,"context_line":"import tempest.external.exceptions as external"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"# iterate submodules of imported external module"},{"line_number":199,"context_line":"for mod_name, mod in inspect.getmembers(external):"},{"line_number":200,"context_line":"    if inspect.ismodule(mod):"},{"line_number":201,"context_line":"        for name, obj in inspect.getmembers(mod):"},{"line_number":202,"context_line":"            # add classes to exceptions"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tPY%3D","line":199,"updated":"2013-12-22 08:22:37.000000000","message":"\u0027mod_name\u0027 is not used. So this can be changed to \u0027_\u0027.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":196,"context_line":"import tempest.external.exceptions as external"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"# iterate submodules of imported external module"},{"line_number":199,"context_line":"for mod_name, mod in inspect.getmembers(external):"},{"line_number":200,"context_line":"    if inspect.ismodule(mod):"},{"line_number":201,"context_line":"        for name, obj in inspect.getmembers(mod):"},{"line_number":202,"context_line":"            # add classes to exceptions"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rec%3D","line":199,"in_reply_to":"AAAATn%2F8tPY%3D","updated":"2013-12-23 11:51:09.000000000","message":"Done","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}],"tempest/exceptions/README.rst":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"0c2efbbff6d3dd23b60a2636fc8ee5f2785fee8f","unresolved":false,"context_lines":[{"line_number":3,"context_line":""},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"What are these exceptions?"},{"line_number":6,"context_line":"--------------------------"},{"line_number":7,"context_line":"These exceptions are used by Tempest for covering OpenStack specific exceptional"},{"line_number":8,"context_line":"cases."},{"line_number":9,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAU3%2F%2F6PU%3D","line":6,"updated":"2014-02-24 05:32:42.000000000","message":"I\u0027m wondering if it should have a blank line after this line.","commit_id":"b25aac595dd2a40f0f0225dc03cee29ed99daf94"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"2ef5a3e0d4ee7546c9b21e8e8b5bab3439b98f3d","unresolved":false,"context_lines":[{"line_number":3,"context_line":""},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"What are these exceptions?"},{"line_number":6,"context_line":"--------------------------"},{"line_number":7,"context_line":"These exceptions are used by Tempest for covering OpenStack specific exceptional"},{"line_number":8,"context_line":"cases."},{"line_number":9,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAU3%2F%2F1Sw%3D","line":6,"in_reply_to":"AAAAU3%2F%2F4%2Fs%3D","updated":"2014-02-24 15:42:30.000000000","message":"Done","commit_id":"b25aac595dd2a40f0f0225dc03cee29ed99daf94"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"fe8ff0c48b2373f6c0e817ba542917f6ad8859c4","unresolved":false,"context_lines":[{"line_number":3,"context_line":""},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"What are these exceptions?"},{"line_number":6,"context_line":"--------------------------"},{"line_number":7,"context_line":"These exceptions are used by Tempest for covering OpenStack specific exceptional"},{"line_number":8,"context_line":"cases."},{"line_number":9,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAU3%2F%2F4%2Fs%3D","line":6,"in_reply_to":"AAAAU3%2F%2F5mE%3D","updated":"2014-02-24 08:53:27.000000000","message":"Yeah, I think just a consistency thing in this file.","commit_id":"b25aac595dd2a40f0f0225dc03cee29ed99daf94"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"07f69345646f46f332df0e51b7304058ca2856c7","unresolved":false,"context_lines":[{"line_number":3,"context_line":""},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"What are these exceptions?"},{"line_number":6,"context_line":"--------------------------"},{"line_number":7,"context_line":"These exceptions are used by Tempest for covering OpenStack specific exceptional"},{"line_number":8,"context_line":"cases."},{"line_number":9,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAU3%2F%2F5mE%3D","line":6,"in_reply_to":"AAAAU3%2F%2F6PU%3D","updated":"2014-02-24 07:14:58.000000000","message":"I have tested it on own repo looking at resulted web-view, it is the same as for blocks with blank lines.","commit_id":"b25aac595dd2a40f0f0225dc03cee29ed99daf94"}],"tempest/external/README.rst":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"8784167e0808828107b98091b4dd96cc525ba4c4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Tempest external files"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"AAAATn%2F8%2Boc%3D","line":1,"updated":"2013-12-18 06:50:38.000000000","message":"Please add more 2 \u0027\u003d\u0027 for matching to below string length.","commit_id":"6b47ceae37d107b04c802cdb69d1386a72f38f5b"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"8784167e0808828107b98091b4dd96cc525ba4c4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Tempest external files"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"The \u0027external\u0027 directory contains project dispatch files that are called"},{"line_number":6,"context_line":"by \u0027clients.py\u0027, \u0027config.py\u0027, \u0027exceptions.py\u0027 and \u0027cli/__init__.py\u0027."}],"source_content_type":"text/x-rst","patch_set":3,"id":"AAAATn%2F8%2BoY%3D","line":3,"updated":"2013-12-18 06:50:38.000000000","message":"ditto","commit_id":"6b47ceae37d107b04c802cdb69d1386a72f38f5b"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"8784167e0808828107b98091b4dd96cc525ba4c4","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Example:"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    from tempest.services.some.json.some_client import SomeClientJSON"},{"line_number":19,"context_line":"    "},{"line_number":20,"context_line":"    from tempest.services.some.xml.some_client import SomeClientXML"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    some_client \u003d {\"json\": SomeClientJSON, \"xml\": SomeClientXML}"}],"source_content_type":"text/x-rst","patch_set":3,"id":"AAAATn%2F8%2BoI%3D","line":19,"updated":"2013-12-18 06:50:38.000000000","message":"Please remove unnecessary white spaces.","commit_id":"6b47ceae37d107b04c802cdb69d1386a72f38f5b"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"8784167e0808828107b98091b4dd96cc525ba4c4","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def some(self, action, flags\u003d\u0027\u0027, params\u003d\u0027\u0027, admin\u003dTrue, fail_ok\u003dFalse):"},{"line_number":33,"context_line":"        \"\"\"Executes some command for the given action.\"\"\""},{"line_number":34,"context_line":"        "},{"line_number":35,"context_line":"        return self.cmd_with_auth(\u0027glance\u0027, action, flags, params, admin, fail_ok)"}],"source_content_type":"text/x-rst","patch_set":3,"id":"AAAATn%2F8%2BoA%3D","line":34,"updated":"2013-12-18 06:50:38.000000000","message":"ditto","commit_id":"6b47ceae37d107b04c802cdb69d1386a72f38f5b"}],"tempest/external/cli/__init__.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import sys"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from tempest.external import import_submodules"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import_submodules(sys.modules[__name__])"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tNU%3D","line":24,"updated":"2013-12-22 08:22:37.000000000","message":"Hacking says we should import only modules.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import sys"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from tempest.external import import_submodules"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import_submodules(sys.modules[__name__])"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rnM%3D","line":24,"in_reply_to":"AAAATn%2F8tNU%3D","updated":"2013-12-23 11:51:09.000000000","message":"Done","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}],"tempest/external/clients/__init__.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import sys"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from tempest.external import import_submodules"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"import_submodules(sys.modules[__name__])"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tNQ%3D","line":28,"updated":"2013-12-22 08:22:37.000000000","message":"ditto,\nwe should import only modules.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import sys"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from tempest.external import import_submodules"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"import_submodules(sys.modules[__name__])"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rnY%3D","line":28,"in_reply_to":"AAAATn%2F8tNQ%3D","updated":"2013-12-23 11:51:09.000000000","message":"Done","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}],"tempest/external/config/__init__.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import sys"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from tempest.external import import_submodules"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import_submodules(sys.modules[__name__])"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tNM%3D","line":25,"updated":"2013-12-22 08:22:37.000000000","message":"ditto,\nwe should import only modules.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import sys"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from tempest.external import import_submodules"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import_submodules(sys.modules[__name__])"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rnc%3D","line":25,"in_reply_to":"AAAATn%2F8tNM%3D","updated":"2013-12-23 11:51:09.000000000","message":"Done","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}],"tempest/external/config/ext_example_config.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg as config"},{"line_number":24,"context_line":"#from tempest.config import register_opt_group"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def register_opt_group(conf, opt_group, options):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tRA%3D","line":24,"updated":"2013-12-22 08:22:37.000000000","message":"Please remove this line.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg as config"},{"line_number":24,"context_line":"#from tempest.config import register_opt_group"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def register_opt_group(conf, opt_group, options):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rng%3D","line":24,"in_reply_to":"AAAATn%2F8tRA%3D","updated":"2013-12-23 11:51:09.000000000","message":"Done","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}],"tempest/external/exceptions/__init__.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sys"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from tempest.external import import_submodules"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"import_submodules(sys.modules[__name__])"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tNI%3D","line":23,"updated":"2013-12-22 08:22:37.000000000","message":"ditto,\nwe should import only modules.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sys"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from tempest.external import import_submodules"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"import_submodules(sys.modules[__name__])"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rnk%3D","line":23,"in_reply_to":"AAAATn%2F8tNI%3D","updated":"2013-12-23 11:51:09.000000000","message":"Done","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}],"tempest/external/exceptions/ext_example_exceptions.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":19,"context_line":"# that you want to add as methods"},{"line_number":20,"context_line":"# to CLI service client \u0027ClientTestBase\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from tempest.exceptions import TempestException"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class ExtExampleException(TempestException):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tNE%3D","line":22,"updated":"2013-12-22 08:22:37.000000000","message":"ditto,\nwe should import only modules.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":19,"context_line":"# that you want to add as methods"},{"line_number":20,"context_line":"# to CLI service client \u0027ClientTestBase\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from tempest.exceptions import TempestException"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class ExtExampleException(TempestException):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8rn4%3D","line":22,"in_reply_to":"AAAATn%2F8tNE%3D","updated":"2013-12-23 11:51:09.000000000","message":"It was so, due to cross-reference.\n\nSo, I fix it, with little refactor of \u0027exceptions\u0027 module, where all base classes separated into \u0027base\u0027 submodule of \u0027exceptions\u0027 module.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}],"tempest/services/ext_example/ext_client.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7efbc617bf6477ea2ce8330b41e4bb4364dfe000","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest.common.rest_client import RestClient"},{"line_number":19,"context_line":"from tempest import exceptions"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8tNA%3D","line":18,"updated":"2013-12-22 08:22:37.000000000","message":"ditto,\nwe should import only modules.","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from tempest.common.rest_client import RestClient"},{"line_number":19,"context_line":"from tempest import exceptions"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8roM%3D","line":18,"in_reply_to":"AAAATn%2F8tNA%3D","updated":"2013-12-23 11:51:09.000000000","message":"Done","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6b7e5f71a7894be27cd1a5424918e6573ccfb5bd","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class ExtClientJSON(RestClient):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def __init__(self, config, username, password, auth_url, tenant_name\u003dNone):"},{"line_number":25,"context_line":"        super(ExtClientJSON, self).__init__(config, username, password,"},{"line_number":26,"context_line":"                                            auth_url, tenant_name)"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F8roI%3D","line":24,"updated":"2013-12-23 11:51:09.000000000","message":"Removed as redundant","commit_id":"782036ff344bff43d1aeffae150a1fc686c9d16a"}]}
