)]}'
{"keystone/common/strict_abc.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d2e44c3d7f87455bbea818d5f84e29ee5e88a234","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from keystone.i18n import _"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def _assert_method_signature_match(name, cls, base_cls):"},{"line_number":21,"context_line":"    cls_argspec \u003d inspect.getargspec(getattr(cls, name))"},{"line_number":22,"context_line":"    base_argspec \u003d inspect.getargspec(getattr(base_cls, name))"},{"line_number":23,"context_line":"    # TODO(morganfainberg): Support decorated methods. Right now this check"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_bd7ab474","line":20,"updated":"2015-01-26 18:33:34.000000000","message":"This could be moved to the metaclass for better encapsulation.","commit_id":"9124df558d47c0691d65e6035b0707256d44499f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c4db7f7459e3614136171e40d929323d9fe26a51","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                if getattr(value, \u0027__isabstractmethod__\u0027, False):"},{"line_number":57,"context_line":"                    # This is not an abstract method and is abstract on the"},{"line_number":58,"context_line":"                    # current base. Ensure the signature matches. This will"},{"line_number":59,"context_line":"                    # traverse the entire tree."},{"line_number":60,"context_line":"                    _assert_method_signature_match(name, cls, base)"},{"line_number":61,"context_line":"        return cls"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_7d9dacbb","line":59,"updated":"2015-01-26 18:32:30.000000000","message":"This comment could be more clear. _assert_method_signature_match does the lifting on validating the argspecs. This logic doesn\u0027t know that it isn\u0027t abstract on the \"cls\" object.","commit_id":"9124df558d47c0691d65e6035b0707256d44499f"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"76e2b20f42b3d125815338a5bcd7517d8fbf26cc","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    return six.add_metaclass(StrictABCMeta)(cls)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"abstractmethod \u003d abc.abstractmethod"},{"line_number":81,"context_line":"abstractproperty \u003d abc.abstractproperty"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_72984a75","line":80,"updated":"2015-02-12 19:02:32.000000000","message":"I\u0027m generally not in favor of importing bits of another API as though they come from this module. It\u0027s not clear as a user of strict_abc that abstractmethod comes from the abc module, which means you end up having to document and support it. \n\nIf you ever end up wanting a different abstractmethod implementation later, you would be locked in to this version\u0027s API anyway.","commit_id":"f43f378e1729e67169cef43bb9580345a7fa7005"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9cb0229c1fa7a13334e337fc046d51701e87b6a3","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    return six.add_metaclass(StrictABCMeta)(cls)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"abstractmethod \u003d abc.abstractmethod"},{"line_number":81,"context_line":"abstractproperty \u003d abc.abstractproperty"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_855568fb","line":80,"in_reply_to":"da86d52c_72984a75","updated":"2015-02-13 02:10:34.000000000","message":"My thought here was to avoid having to tell people to use\n\n@strict_abc.abstractclass\n\nand also require importing abc and then using @abc.abstractmethod\n\nNot sure which one of these is the better/worse model.","commit_id":"f43f378e1729e67169cef43bb9580345a7fa7005"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"acf3c0925a814ee3315128c0c5fae789bbae9c02","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    return six.add_metaclass(StrictABCMeta)(cls)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"abstractmethod \u003d abc.abstractmethod"},{"line_number":81,"context_line":"abstractproperty \u003d abc.abstractproperty"}],"source_content_type":"text/x-python","patch_set":11,"id":"da9b358b_43141b43","line":80,"in_reply_to":"da86d52c_855568fb","updated":"2015-03-30 22:03:44.000000000","message":"I would prefer that people use abc.* so that they understand what is actually happening.","commit_id":"f43f378e1729e67169cef43bb9580345a7fa7005"}],"keystone/tests/unit/common/test_strict_abc.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"72c6d28ccbe8a22d5dddffa903aa61af12f67ec2","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        def override_method(self, arg1, arg2, kwarg\u003d\u0027default\u0027):"},{"line_number":39,"context_line":"            pass"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        base_cls \u003d _class_factory(name\u003duuid.uuid4().hex)"},{"line_number":42,"context_line":"        _class_factory(name\u003d\u0027WorkingClass\u0027, baseclass\u003dbase_cls,"},{"line_number":43,"context_line":"                       method\u003doverride_method)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_84250ac4","line":41,"updated":"2015-01-22 21:51:59.000000000","message":"nit: name probably doesn\u0027t need to be passed in as a keyword argument since its required and the _class_factory signature doesn\u0027t default it.","commit_id":"313fbeb5783e43d5b722734edb31fa826970cad5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5a726944767390dfbcdfb90d0f951ec372fe1ad2","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        def override_method(self, arg1, arg2, kwarg\u003d\u0027default\u0027):"},{"line_number":39,"context_line":"            pass"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        base_cls \u003d _class_factory(name\u003duuid.uuid4().hex)"},{"line_number":42,"context_line":"        _class_factory(name\u003d\u0027WorkingClass\u0027, baseclass\u003dbase_cls,"},{"line_number":43,"context_line":"                       method\u003doverride_method)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_0177473b","line":41,"in_reply_to":"1a930d6b_84250ac4","updated":"2015-01-22 21:52:20.000000000","message":"Done","commit_id":"313fbeb5783e43d5b722734edb31fa826970cad5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"72c6d28ccbe8a22d5dddffa903aa61af12f67ec2","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        def override_method(self, arg1, arg2):"},{"line_number":50,"context_line":"            pass"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        base_cls \u003d _class_factory(name\u003duuid.uuid4().hex)"},{"line_number":53,"context_line":"        self.assertRaises(strict_abc.MethodSignatureMismatch, _class_factory,"},{"line_number":54,"context_line":"                          name\u003d\u0027NonWorkingClass\u0027, baseclass\u003dbase_cls,"},{"line_number":55,"context_line":"                          method\u003doverride_method)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_a42046b1","line":52,"updated":"2015-01-22 21:51:59.000000000","message":"same comment here","commit_id":"313fbeb5783e43d5b722734edb31fa826970cad5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5a726944767390dfbcdfb90d0f951ec372fe1ad2","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        def override_method(self, arg1, arg2):"},{"line_number":50,"context_line":"            pass"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        base_cls \u003d _class_factory(name\u003duuid.uuid4().hex)"},{"line_number":53,"context_line":"        self.assertRaises(strict_abc.MethodSignatureMismatch, _class_factory,"},{"line_number":54,"context_line":"                          name\u003d\u0027NonWorkingClass\u0027, baseclass\u003dbase_cls,"},{"line_number":55,"context_line":"                          method\u003doverride_method)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_21728349","line":52,"in_reply_to":"1a930d6b_a42046b1","updated":"2015-01-22 21:52:20.000000000","message":"Done","commit_id":"313fbeb5783e43d5b722734edb31fa826970cad5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"72c6d28ccbe8a22d5dddffa903aa61af12f67ec2","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        def subclass_method(self, arg1, arg2, kwarg\u003d\u0027default\u0027):"},{"line_number":66,"context_line":"            pass"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        base_cls \u003d _class_factory(name\u003duuid.uuid4().hex)"},{"line_number":69,"context_line":"        base_cls \u003d _class_factory(\u0027ASubClass\u0027, baseclass\u003dbase_cls,"},{"line_number":70,"context_line":"                                  method\u003dmethod)"},{"line_number":71,"context_line":"        _class_factory(name\u003d\u0027WorkingSubSubClass\u0027, baseclass\u003dbase_cls,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_4f0a5b22","line":68,"updated":"2015-01-22 21:51:59.000000000","message":"same comment","commit_id":"313fbeb5783e43d5b722734edb31fa826970cad5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5a726944767390dfbcdfb90d0f951ec372fe1ad2","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        def subclass_method(self, arg1, arg2, kwarg\u003d\u0027default\u0027):"},{"line_number":66,"context_line":"            pass"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        base_cls \u003d _class_factory(name\u003duuid.uuid4().hex)"},{"line_number":69,"context_line":"        base_cls \u003d _class_factory(\u0027ASubClass\u0027, baseclass\u003dbase_cls,"},{"line_number":70,"context_line":"                                  method\u003dmethod)"},{"line_number":71,"context_line":"        _class_factory(name\u003d\u0027WorkingSubSubClass\u0027, baseclass\u003dbase_cls,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_41906f43","line":68,"in_reply_to":"1a930d6b_4f0a5b22","updated":"2015-01-22 21:52:20.000000000","message":"Done","commit_id":"313fbeb5783e43d5b722734edb31fa826970cad5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"72c6d28ccbe8a22d5dddffa903aa61af12f67ec2","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        base_cls \u003d _class_factory(name\u003duuid.uuid4().hex)"},{"line_number":69,"context_line":"        base_cls \u003d _class_factory(\u0027ASubClass\u0027, baseclass\u003dbase_cls,"},{"line_number":70,"context_line":"                                  method\u003dmethod)"},{"line_number":71,"context_line":"        _class_factory(name\u003d\u0027WorkingSubSubClass\u0027, baseclass\u003dbase_cls,"},{"line_number":72,"context_line":"                       method\u003dsubclass_method)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def test_strict_abc_subclass_signature_mismatch(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_6f0d5737","line":71,"updated":"2015-01-22 21:51:59.000000000","message":"same comment here","commit_id":"313fbeb5783e43d5b722734edb31fa826970cad5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5a726944767390dfbcdfb90d0f951ec372fe1ad2","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        base_cls \u003d _class_factory(name\u003duuid.uuid4().hex)"},{"line_number":69,"context_line":"        base_cls \u003d _class_factory(\u0027ASubClass\u0027, baseclass\u003dbase_cls,"},{"line_number":70,"context_line":"                                  method\u003dmethod)"},{"line_number":71,"context_line":"        _class_factory(name\u003d\u0027WorkingSubSubClass\u0027, baseclass\u003dbase_cls,"},{"line_number":72,"context_line":"                       method\u003dsubclass_method)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def test_strict_abc_subclass_signature_mismatch(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_6193ab4f","line":71,"in_reply_to":"1a930d6b_6f0d5737","updated":"2015-01-22 21:52:20.000000000","message":"Done","commit_id":"313fbeb5783e43d5b722734edb31fa826970cad5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"72c6d28ccbe8a22d5dddffa903aa61af12f67ec2","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        def subclass_method(self, arg1, kwarg\u003d\u0027default\u0027):"},{"line_number":83,"context_line":"            pass"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        base_cls \u003d _class_factory(name\u003duuid.uuid4().hex)"},{"line_number":86,"context_line":"        base_cls \u003d _class_factory(\u0027SubClass\u0027, baseclass\u003dbase_cls,"},{"line_number":87,"context_line":"                                  method\u003dmethod)"},{"line_number":88,"context_line":"        self.assertRaises(strict_abc.MethodSignatureMismatch, _class_factory,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_ef186777","line":85,"updated":"2015-01-22 21:51:59.000000000","message":"same comment here","commit_id":"313fbeb5783e43d5b722734edb31fa826970cad5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5a726944767390dfbcdfb90d0f951ec372fe1ad2","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        def subclass_method(self, arg1, kwarg\u003d\u0027default\u0027):"},{"line_number":83,"context_line":"            pass"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        base_cls \u003d _class_factory(name\u003duuid.uuid4().hex)"},{"line_number":86,"context_line":"        base_cls \u003d _class_factory(\u0027SubClass\u0027, baseclass\u003dbase_cls,"},{"line_number":87,"context_line":"                                  method\u003dmethod)"},{"line_number":88,"context_line":"        self.assertRaises(strict_abc.MethodSignatureMismatch, _class_factory,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a930d6b_819a5761","line":85,"in_reply_to":"1a930d6b_ef186777","updated":"2015-01-22 21:52:20.000000000","message":"Done","commit_id":"313fbeb5783e43d5b722734edb31fa826970cad5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"acf3c0925a814ee3315128c0c5fae789bbae9c02","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import six"},{"line_number":14,"context_line":"import uuid"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common import strict_abc"},{"line_number":17,"context_line":"from keystone import tests"}],"source_content_type":"text/x-python","patch_set":11,"id":"da9b358b_433bfbd1","line":14,"updated":"2015-03-30 22:03:44.000000000","message":"Imports are incorrect here...","commit_id":"f43f378e1729e67169cef43bb9580345a7fa7005"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"76e2b20f42b3d125815338a5bcd7517d8fbf26cc","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \"\"\"A Test class that has the StrictABCMeta class as a Metaclass.\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"@strict_abc.abstractclass"},{"line_number":26,"context_line":"class _HelperDecoratorStrictABCTestBaseClass(object):"},{"line_number":27,"context_line":"    \"\"\"A class that has the StrictABCMeta applied via the helper decorator.\"\"\""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_32a0928f","line":25,"updated":"2015-02-12 19:02:32.000000000","message":"If the decorator or meta-class ever raise an exception this module won\u0027t be importable, which will break test discovery rather than reporting a test failure. It would be better to define the classes under test at runtime inside a function (setUp would be a good choice).","commit_id":"f43f378e1729e67169cef43bb9580345a7fa7005"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9cb0229c1fa7a13334e337fc046d51701e87b6a3","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \"\"\"A Test class that has the StrictABCMeta class as a Metaclass.\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"@strict_abc.abstractclass"},{"line_number":26,"context_line":"class _HelperDecoratorStrictABCTestBaseClass(object):"},{"line_number":27,"context_line":"    \"\"\"A class that has the StrictABCMeta applied via the helper decorator.\"\"\""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_a5218c9f","line":25,"in_reply_to":"da86d52c_32a0928f","updated":"2015-02-13 02:10:34.000000000","message":"Sure thing!","commit_id":"f43f378e1729e67169cef43bb9580345a7fa7005"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"76e2b20f42b3d125815338a5bcd7517d8fbf26cc","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class TestStrictABC(tests.TestCase):"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    abstract_base_class \u003d _StrictABCTestBaseClass"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def test_strict_abc_method_signature_matches(self):"},{"line_number":44,"context_line":"        \"\"\"Test classes based on StrictABC with matching signatures."}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_b2e2c2d2","line":41,"updated":"2015-02-12 19:02:32.000000000","message":"You could use testscenarios instead of separate classes with a single attribute.","commit_id":"f43f378e1729e67169cef43bb9580345a7fa7005"}]}
